这是因为在您的代码中,您试图使用没有by
参数的Expr.rolling()
(奇怪的是,文档中在check_sorted
参数下提到了它-它只是还没有实现吗?),而不是DataFrame.rolling()
.
如果您重新构造代码以使用后者,那么它可以很好地工作:
(
df.rolling(
index_column="day", by="type", period="2i"
)
.agg(
pl.col('value').sum().alias("rolling_sum")
)
)
┌──────┬─────┬─────────────┐
│ type ┆ day ┆ rolling_sum │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞══════╪═════╪═════════════╡
│ a ┆ 1 ┆ 1 │
│ a ┆ 2 ┆ 1 │
│ a ┆ 4 ┆ 3 │
│ a ┆ 5 ┆ 7 │
│ b ┆ 2 ┆ 2 │
│ b ┆ 3 ┆ 4 │
│ b ┆ 5 ┆ 0 │
│ b ┆ 6 ┆ 1 │
└──────┴─────┴─────────────┘
如果你需要在结果中有value
列,你可以使用Expr.rolling_sum()
和Expr.over()
的组合来代替(假设你的DataFrame已经按照day
排序):
df.with_columns(
pl.col("value")
.rolling_sum(window_size=2,min_periods=0)
.over("type")
.alias('rolling_sum')
)
┌─────┬──────┬───────┬─────────────┐
│ day ┆ type ┆ value ┆ rolling_sum │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 ┆ i64 │
╞═════╪══════╪═══════╪═════════════╡
│ 1 ┆ a ┆ 1 ┆ 1 │
│ 2 ┆ a ┆ 0 ┆ 1 │
│ 4 ┆ a ┆ 3 ┆ 3 │
│ 5 ┆ a ┆ 4 ┆ 7 │
│ 2 ┆ b ┆ 2 ┆ 2 │
│ 3 ┆ b ┆ 2 ┆ 4 │
│ 5 ┆ b ┆ 0 ┆ 2 │
│ 6 ┆ b ┆ 1 ┆ 1 │
└─────┴──────┴───────┴─────────────┘
理想情况下,我可能希望Expr.rolling
和Expr.over
一起工作:
# something like this
df.with_columns(
pl.col("value")
.rolling(index_column="day", period="2i")
.sum()
.over("type")
.alias('rolling_sum')
)
# or this
df.set_sorted(['type','day']).with_columns(
pl.col("value")
.sum()
.over('type')
.rolling(index_column="day", period="2i")
.alias('rolling_sum')
)
但不幸的是,它没有
InvalidOperationError: rolling expression not allowed in aggregation
Update
如果您计划以天/周等为基础的窗口,则使用rolling_sum()
可能不是您想要的.
在这种情况下,您仍然可以使用DataFrame.rolling()
,并将其与GroupBy.agg()
内部的Expr.last()
组合,以获得窗口中的最后一个值:
(
df.rolling(
index_column="day", by="type", period="2i"
)
.agg(
pl.col('value').last(),
pl.col('value').sum().alias("rolling_sum")
)
)
┌──────┬─────┬───────┬─────────────┐
│ type ┆ day ┆ value ┆ rolling_sum │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 │
╞══════╪═════╪═══════╪═════════════╡
│ a ┆ 1 ┆ 1 ┆ 1 │
│ a ┆ 2 ┆ 0 ┆ 1 │
│ a ┆ 4 ┆ 3 ┆ 3 │
│ a ┆ 5 ┆ 4 ┆ 7 │
│ b ┆ 2 ┆ 2 ┆ 2 │
│ b ┆ 3 ┆ 2 ┆ 4 │
│ b ┆ 5 ┆ 0 ┆ 0 │
│ b ┆ 6 ┆ 1 ┆ 1 │
└──────┴─────┴───────┴─────────────┘