You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars中group_by_dynamic(every≠period)时.get表达式在agg中异常

Polars group_by_dynamic中get()方法异常问题

在Polars的group_by_dynamic方法中,当every参数与period参数取值不同时,直接使用.get()方法在agg聚合操作中无法正确获取分组内指定索引的元素。

最小复现代码

import polars as pl

df = pl.DataFrame({
    'time':pl.date_range(pl.date(2021,1,1), pl.date(2021,1,8), eager=True),
    'data': pl.arange(8, eager=True)
})

df_grouped = df.group_by_dynamic(
    index_column="time", 
    every="2d", 
    period="3d",
    start_by='datapoint',
).agg(
    data=pl.col('data'),
    get_1_bad=pl.col('data').get(1),
    get_1_good=pl.col('data').shift(-1).get(0),
)

print(df, df_grouped)

输出结果

┌────────────┬──────┐
│ time       ┆ data │
│ ---        ┆ ---  │
│ date       ┆ i64  │
╞════════════╪══════╡
│ 2021-01-01 ┆ 0    │
│ 2021-01-02 ┆ 1    │
│ 2021-01-03 ┆ 2    │
│ 2021-01-04 ┆ 3    │
│ 2021-01-05 ┆ 4    │
│ 2021-01-06 ┆ 5    │
│ 2021-01-07 ┆ 6    │
│ 2021-01-08 ┆ 7    │
└────────────┴──────┘
┌────────────┬───────────┬───────────┬────────────┐
│ time       ┆ data      ┆ get_1_bad ┆ get_1_good │
│ ---        ┆ ---       ┆ ---       ┆ ---        │
│ date       ┆ list[i64] ┆ i64       ┆ i64        │
╞════════════╪═══════════╪═══════════╪════════════╡
│ 2021-01-01 ┆ [0, 1, 2] ┆ 1         ┆ 1          │
│ 2021-01-03 ┆ [2, 3, 4] ┆ 2         ┆ 3          │
│ 2021-01-05 ┆ [4, 5, 6] ┆ 4         ┆ 5          │
│ 2021-01-07 ┆ [6, 7]    ┆ 5         ┆ 7          │
└────────────┴───────────┴───────────┴────────────┘

分析与结论

从输出可见:

  • get_1_bad列结果不符合预期:第二组data为[2,3,4],get(1)应返回3,实际返回2;第四组data为[6,7],get(1)应返回7,实际返回5。
  • get_1_good列通过.shift(-1).get(0)实现了正确取值,说明shift()结合get(0)/get(-1)能正常工作。

这并非使用错误,而是Polars 0.20.25版本的bug。问题出在动态分组(滑动窗口模式,every≠period)的聚合过程中,.get(n)方法没有基于当前分组的本地索引取值,而是错误引用了全局索引或历史分组的残留值。

临时解决方案除了.shift(-n).get(0),也可以先将分组后的列转为列表类型,再调用list.get(n):

get_1_fix=pl.col('data').list.get(1)

内容的提问来源于stack exchange,提问作者Ilya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:44:50