如何改进极坐标延迟扫描和旋转操作?

问题描述 投票:0回答:1

我有一个管道,我使用

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个数据帧),但最后的枢轴操作的计算成本非常高且缓慢,我不确定我可以偷懒吗?

python group-by pivot python-polars
1个回答
0
投票

如果

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 │
└─────────────────────┴───────────┴───────────┴──────┘
© www.soinside.com 2019 - 2024. All rights reserved.