Building your own crypto data pipeline helps you evaluate dataset quality, debug problems, and extend to new assets. This article covers the core stages from raw compressed files to a consolidated Parquet master.
Stage 1: Downloading with Resume Capability
import requests
from pathlib import Path
def download_file(url: str, dest: Path) -> bool:
if dest.exists():
return True # already downloaded
dest.parent.mkdir(parents=True, exist_ok=True)
r = requests.get(url, stream=True, timeout=30)
if r.status_code == 404:
return False
r.raise_for_status()
with open(dest, "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
return True
Stage 2: Auditing Before Consolidation
import pandas as pd, zipfile
def audit_file(path: Path) -> dict:
with zipfile.ZipFile(path) as z:
df = pd.read_csv(z.open(z.namelist()[0]), header=None)
ts = df.iloc[0, 4]
return {
"rows": len(df),
"timestamp_unit": "ms" if ts < 10**14 else "us",
"columns": df.shape[1],
}
Stage 3: Streaming Consolidation with PyArrow
import pyarrow as pa, pyarrow.parquet as pq, zipfile
import pandas as pd
from pathlib import Path
def consolidate(raw_dir: Path, output: Path):
writer = None
for f in sorted(raw_dir.glob("*.zip")):
with zipfile.ZipFile(f) as z:
df = pd.read_csv(z.open(z.namelist()[0]), header=None)
if df.iloc[0, 4] > 10**14:
df.iloc[:, 4] = df.iloc[:, 4] // 1000 # fix us->ms
table = pa.Table.from_pandas(df, preserve_index=False)
if writer is None:
writer = pq.ParquetWriter(output, table.schema, compression="zstd")
writer.write_table(table)
if writer: writer.close()
Stage 4: Verifying Without Loading Everything
import pyarrow.parquet as pq
pf = pq.ParquetFile("master.parquet")
print(f"Rows: {pf.metadata.num_rows:,}")
print(f"Row groups: {pf.metadata.num_row_groups}")
Skip the pipeline. Pre-built, audited Parquet masters for 10 crypto assets — available now. → Browse the catalog
Summary
Four stages: download with resume, audit before consolidating, stream-consolidate with PyArrow, verify with metadata. The most important and most skipped stage is the audit — it is where timestamp bugs and schema changes are caught before they corrupt your master.