我有一个管道,我使用
pl.scan_ipc
来延迟扫描羽毛文件的集合,每个文件对应于具有唯一 'market'
值的数据帧。我想计算每个加载的数据帧的值,并将其作为输出中的一列,并将其市场价值作为列名称。
# sample_paths = ['market1.fth', 'market2.fth', 'market3.fth']
query = (
pl.scan_ipc(sample_paths, memory_map=False)
.filter(some_condition)
.select(pl.col('time'), pl.col('market'), pl.col('value').do_something())
.collect()
.pivot(index='time', columns='market', values='value')
)
┌─────────────────────┬───────────┬───────────┬──────┐
│ time ┆ m1 ┆ m2 ┆ m3 │
│ --- ┆ --- ┆ --- ┆ --- │
│ datetime[ms] ┆ f64 ┆ f64 ┆ f64 │
╞═════════════════════╪═══════════╪═══════════╪══════╡
│ 2023-03-10 08:00:00 ┆ 0.023035 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:01:00 ┆ 0.023 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:02:00 ┆ 0.023 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:03:00 ┆ 0.023034 ┆ 0.0001255 ┆ null │
│ 2023-03-10 08:04:00 ┆ 0.0232051 ┆ 0.000125 ┆ null │
└─────────────────────┴───────────┴───────────┴──────┘
此操作适用于少量输入,并且我可以成功收集所有输入的系列(〜1_000_000行的〜500个数据帧),但最后的枢轴操作的计算成本非常高且缓慢,我不确定我可以偷懒吗?
如果
pivot()
操作本身导致内存不足,您可以尝试使用 DataFrame.partition_by()
将 DataFrame 拆分为块,然后 .concat()
将块旋转在一起。
类似这样的:
df = pl.from_repr("""
┌─────────────────────┬───────────┬───────────┬──────┐
│ time ┆ m1 ┆ m2 ┆ m3 │
│ --- ┆ --- ┆ --- ┆ --- │
│ datetime[ms] ┆ f64 ┆ f64 ┆ f64 │
╞═════════════════════╪═══════════╪═══════════╪══════╡
│ 2023-03-10 08:00:00 ┆ 0.023035 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:01:00 ┆ 0.023 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:02:00 ┆ 0.023 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:03:00 ┆ 0.023034 ┆ 0.0001255 ┆ null │
│ 2023-03-10 08:04:00 ┆ 0.0232051 ┆ 0.000125 ┆ null │
└─────────────────────┴───────────┴───────────┴──────┘
""")
chunks = df.partition_by(time)
pl.concat(
ch.pivot(index='time', columns='market', values='value') for ch in chunks
)
┌─────────────────────┬───────────┬───────────┬──────┐
│ time ┆ m1 ┆ m2 ┆ m3 │
│ --- ┆ --- ┆ --- ┆ --- │
│ datetime[ms] ┆ f64 ┆ f64 ┆ f64 │
╞═════════════════════╪═══════════╪═══════════╪══════╡
│ 2023-03-10 08:00:00 ┆ 0.023035 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:01:00 ┆ 0.023 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:02:00 ┆ 0.023 ┆ 0.000126 ┆ null │
│ 2023-03-10 08:03:00 ┆ 0.023034 ┆ 0.0001255 ┆ null │
│ 2023-03-10 08:04:00 ┆ 0.0232051 ┆ 0.000125 ┆ null │
└─────────────────────┴───────────┴───────────┴──────┘