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
相关产品推荐
相关产品推荐

