Angolin Docs
Download / OHLCV

Wide schema

Layout

One row per timestamp, with one column per asset and field. The asset and the field are joined in the column name: BTC_close, ETH_open… close_ts is the first column.

close_tsBTC_openBTC_highBTC_lowBTC_closeBTC_base_volumeBTC_quote_volumeETH_openETH_highETH_lowETH_closeETH_base_volumeETH_quote_volume
2026-10-01T01:00:00Z63412.563610.063380.263530.1412.8326202856.782471.22480.42466.92476.856105.415104912.23
2026-10-01T02:00:00Z63530.163575.463340.863388.7389.1224693321.732476.852479.32461.52468.15872.914520598.43
2026-10-01T03:00:00Z63388.763655.963371.063601.4455.6728932789.432468.12486.02465.22481.956390.215815904.75

Use it for cross-asset work at each timestamp: spreads, correlations, portfolio returns. All assets are aligned on the same rows, and adding an asset adds columns. Columns are plain strings, so it works the same in pandas, Polars, SQL engines, or feature pipelines for machine learning.

Wide is offered for fixed bases only, not for a download by universe: with hundreds of assets it would have thousands of mostly empty columns. To mask a wide file of your own bases by the universe, use the wide universe schema.

One column per asset and field, named BTC_close, ETH_close… There is no index to handle: select columns by name in pandas or in Polars.

pandas

Pass columns to read only the series you need.

import pandas as pd

df = pd.read_parquet(
    "ohlcv_usdt_1h.parquet",
    columns=["close_ts", "BTC_close", "ETH_close"],
)

Polars

Select by name, or by regex across all assets.

import polars as pl

df = pl.read_parquet("ohlcv_usdt_1h.parquet")
closes = df.select("close_ts", pl.col("^.*_close$"))

Polars (lazy)

Chain your operations, then call collect() last. Only the selected columns are read from disk when it runs.

import polars as pl

lf = pl.scan_parquet("ohlcv_usdt_1h.parquet")

# Nothing is read yet: do whatever you want on lf
# (filter, select, group_by, with_columns, ...)

df = lf.collect()