我目前正在从 pandas“转换”为 Polars,因为我真的很喜欢这个 api。这个问题是我之前的问题的一个更普遍的问题(请参阅此处)
我有以下数据框
# Dummy data
df = pl.DataFrame({
"Buy_Signal": [1, 0, 1, 0, 1, 0, 0],
"Returns": [0.01, 0.02, 0.03, 0.02, 0.01, 0.00, -0.01],
})
我想最终Returns
对不同间隔的列条件进行聚合 - 由 column 给出Buy_Signal
。在上述情况下,长度是从每个 1 到数据帧的末尾。因此,生成的数据框应如下所示
| group | Returns |
|------: |--------: |
| u32 | f64 |
| 1 | 0.01 |
| 1 | 0.02 |
| 1 | 0.03 |
| 1 | 0.02 |
| 1 | 0.01 |
| 1 | 0.0 |
| 1 | -0.01 |
| 2 | 0.03 |
| 2 | 0.02 |
| 2 | 0.01 |
| 2 | 0.0 |
| 2 | -0.01 |
| 3 | 0.01 |
| 3 | 0.0 |
| 3 | -0.01 |
作为我上一个问题的答案发布的一种方法如下:
# Build overlapping group index
idx = df.select(index=
pl.when(pl.col("Buy_Signal") == 1)
.then(pl.int_ranges(pl.int_range(pl.len()), pl.len() ))
).explode(pl.col("index")).drop_nulls().cast(pl.UInt32)
# Join index with original data
df = (df.with_row_index()
.join(idx, on="index")
.with_columns(group = (pl.col("index") == pl.col("index").max())
.shift().cum_sum().backward_fill() + 1)
.select(["group", "Returns"])
)
df
问:这个问题还有其他好的解决办法吗?
我所说的“好”是指(i)可读和/或(ii)快速。
我的实际问题包含更大的数据集。
谢谢