我有一个类型的数据框架:

df = pl.LazyFrame({"day": [1,2,4,5,2,3,5,6], 'type': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], "value": [1, 0, 3, 4, 2, 2, 0, 1]})


day type    value
i64 str i64
1   "a" 1
2   "a" 0
4   "a" 3
5   "a" 4
2   "b" 2
3   "b" 2
5   "b" 0
6   "b" 1

我试图创建一个滚动和变量,为每种不同的"类型",在两天窗口中的值求和.理想情况下,生成的数据集如下:

day type value rolling_sum
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 0
6 b 1 1

我试着使用以下代码:

df = df.with_columns(pl.col("value")
                     .rolling(index_column="day", by="type", period="2i")
                     .sum().alias("rolling_sum"))

但是我得到了错误:"TypeError:rolling()got an unexpected keyword argument 'by'.

你能帮我修一下吗?

推荐答案

这是因为在您的代码中,您试图使用没有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.rollingExpr.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           │
└──────┴─────┴───────┴─────────────┘

Python相关问答推荐

Pystata:从Python并行运行stata实例

Python中的嵌套Ruby哈希

两个pandas的平均值按元素的结果串接元素.为什么?

如何将多进程池声明为变量并将其导入到另一个Python文件

使用密钥字典重新配置嵌套字典密钥名

如何在Python中找到线性依赖mod 2

不能使用Gekko方程'

Pandas:计算中间时间条目的总时间增量

合并与拼接并举

当条件满足时停止ODE集成?

polars:有效的方法来应用函数过滤列的字符串

如何强制向量中的特定元素在Gekko中处于优化解决方案中

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

如何编辑此代码,使其从多个EXCEL文件的特定工作表中提取数据以显示在单独的文件中

Pandas:计数器的滚动和,复位

将相应的值从第2列合并到第1列(Pandas )

EST格式的Azure数据库笔记本中的当前时间戳

极点用特定值替换前n行

Pandas ,快速从词典栏中提取信息到新栏

Pandas 数据框自定义排序功能