我想计算rolling_sum
,但不是在当前行上方的x行上,而是在当前行下方的x行上.
我的解决方案是在应用rolling_sum
之前使用descending=True
对数据帧进行排序,然后再对descending=False
进行排序.
My solution:个
import polars as pl
# Dummy dataset
df = pl.DataFrame({
"Date": [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
"Close": [-1, 1, 2, 3, 4, 4, 3, 2, 1, -1],
"Company": ["A", "A", "A","A", "A", "B", "B", "B", "B", "B"]
})
# Solution using sort twice
(
df
.sort(by=["Company", "Date"], descending=[True, True])
.with_columns(
pl.col("Close").rolling_sum(3).over("Company").alias("Cumsum_lead")
)
.sort(by=["Company", "Date"], descending=[False, False])
)
Is there a better solution?个
更好的意思是:
- 更高效的计算和/或
- 代码更少/更易于阅读
谢谢!
EDIT:个
我刚刚想到了另一个解决方案,它完全避免了对列进行排序/反转:使用shift
(
df
.with_columns(
pl.col("Close")
.rolling_sum(3)
.shift(-2)
.over("Company").alias("Cumsum_lead"))
)