我正在尝试在 Polars 中编写一个脚本,该脚本可以扁平化每个日期和分钟的价格列表。问题是我想逐步聚合到列中并将值归零。例如。想法是,如果可能的话,使该解决方案矢量化,以提高其性能。
df = pl.DataFrame({
"date": ["2022-01-01", "2022-01-01", "2022-01-02", "2022-01-02",
"2022-01-02", "2022-01-03", "2022-01-03", "2022-01-03"],
"minute": [1, 2, 1, 2, 3, 1, 2, 3],
"price": [10, 20, 15, 10, 20, 30, 60, 70]
})
应构建以下数据框。
-------------------------------------------------------
| date | minute | 1_price | 2_price | 3_price
-------------------------------------------------------
| "2022-01-01" | 1 | 10 | 0 | 0
| "2022-01-01" | 2 | 10 | 20 | 0
| "2022-01-02" | 1 | 15 | 0 | 0
| "2022-01-02" | 2 | 15 | 10 | 0
| "2022-01-02" | 3 | 15 | 10 | 20
| "2022-01-03" | 1 | 30 | 0 | 0
| "2022-01-03" | 2 | 30 | 60 | 0
| "2022-01-03" | 3 | 30 | 60 | 70
这似乎有效
df.join(
df.pivot('price', 'date','minute','first'),
on='date') \
.select("date", "minute",
**{f"{x}_price":pl.when(pl.lit(x)<=pl.col('minute'))
.then(pl.col(f"{x}"))
.otherwise(0)
for x in df['minute'].unique().sort()})
shape: (8, 5)
┌────────────┬────────┬─────────┬─────────┬─────────┐
│ date ┆ minute ┆ 1_price ┆ 2_price ┆ 3_price │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞════════════╪════════╪═════════╪═════════╪═════════╡
│ 2022-01-01 ┆ 1 ┆ 10 ┆ 0 ┆ 0 │
│ 2022-01-01 ┆ 2 ┆ 10 ┆ 20 ┆ 0 │
│ 2022-01-02 ┆ 1 ┆ 15 ┆ 0 ┆ 0 │
│ 2022-01-02 ┆ 2 ┆ 15 ┆ 10 ┆ 0 │
│ 2022-01-02 ┆ 3 ┆ 15 ┆ 10 ┆ 20 │
│ 2022-01-03 ┆ 1 ┆ 30 ┆ 0 ┆ 0 │
│ 2022-01-03 ┆ 2 ┆ 30 ┆ 60 ┆ 0 │
│ 2022-01-03 ┆ 3 ┆ 30 ┆ 60 ┆ 70 │
└────────────┴────────┴─────────┴─────────┴─────────┘
您的示例显示的不仅仅是展平,但您似乎正在寻找的是,只要 x 大于分钟列中的任何值,x_price 列就应该为 0。这就是通过枢轴、自连接以及何时/那么/其他方式实现的。