#!/usr/bin/env python3 """ Convert NQ.FUT DBN file to Parquet format. Agent: W12-08 Input: test_data/NQ_FUT_180d.dbn (Zstandard compressed) Output: test_data/NQ_FUT_180d.parquet (Snappy compressed) """ import os import sys import databento as db import pyarrow.parquet as pq INPUT_FILE = "test_data/NQ_FUT_180d.dbn" OUTPUT_FILE = "test_data/NQ_FUT_180d.parquet" def main(): """Convert NQ.FUT DBN to Parquet.""" print("=" * 80) print("NQ.FUT DBN → Parquet Converter (Agent W12-08)") print("=" * 80) print() # Check input file if not os.path.exists(INPUT_FILE): print(f"❌ ERROR: Input file not found: {INPUT_FILE}") sys.exit(1) input_size = os.path.getsize(INPUT_FILE) print(f"📁 Input: {INPUT_FILE} ({input_size / (1024*1024):.2f} MB)") print(f"📂 Output: {OUTPUT_FILE}") print() # Load DBN file try: print("⚙️ Loading DBN file...") store = db.DBNStore.from_file(INPUT_FILE) # Convert to DataFrame print("⚙️ Converting to DataFrame...") df = store.to_df() bar_count = len(df) print(f"✅ Loaded {bar_count:,} bars") print() # Show sample data print("📊 Data Preview:") print(f" Columns: {list(df.columns)}") print(f" First timestamp: {df.index[0]}") print(f" Last timestamp: {df.index[-1]}") print(f" Price range: ${df['close'].min():.2f} - ${df['close'].max():.2f}") print(f" Total volume: {df['volume'].sum():,.0f}") print() # Convert to Parquet print("⚙️ Writing Parquet file...") df.to_parquet(OUTPUT_FILE, compression='snappy', engine='pyarrow') output_size = os.path.getsize(OUTPUT_FILE) compression_ratio = (1 - output_size / input_size) * 100 print() print("=" * 80) print("✅ SUCCESS: Conversion complete!") print("=" * 80) print() print(f"📊 Conversion Results:") print(f" Bar count: {bar_count:,}") print(f" Input size: {input_size / (1024*1024):.2f} MB") print(f" Output size: {output_size / (1024*1024):.2f} MB") print(f" Compression: {compression_ratio:.1f}% smaller") print() print(f"📦 Output file ready for ML training:") print(f" {OUTPUT_FILE}") print() except Exception as e: print() print(f"❌ Conversion failed: {e}") import traceback traceback.print_exc() sys.exit(1) if __name__ == "__main__": main()