Pandas滚动窗口自定义聚合函数的命名实现方法咨询
问题原因与解决方案
你遇到的报错为Pandas版本兼容性导致:Pandas 1.3版本之前,Rolling.aggregate()/Rolling.agg()方法不支持和groupby.agg()一致的命名传参语法(包括pd.NamedAgg、关键字参数传(列, 聚合函数)元组两种写法),传入的关键字参数无法被识别,因此触发缺少func位置参数的错误。
方案1:升级Pandas版本(推荐)
升级到Pandas 1.3及以上版本后,你原本的两种写法都可以正常运行,无需修改代码。
查看当前Pandas版本的命令:
import pandas as pd print(pd.__version__)
方案2:兼容Pandas 1.3以下版本
如果暂时无法升级Pandas,可以用以下两种方式实现自定义列名:
单独计算指标后合并
先实例化滚动窗口对象避免重复计算,分别计算每个指标、重命名后按列拼接:
# 实例化滚动窗口对象 rolling_obj = df.rolling(f"{num_days_window + 1}D", min_periods=day_length) # 逐个计算自定义指标并重命名 time_mean = rolling_obj["time"].apply(lambda w: window_daily_stats(w, np.mean)).rename("time_mean") time_std = rolling_obj["time"].apply(lambda w: window_daily_stats(w, np.std)).rename("time_std") # 拼接得到最终结果 result = pd.concat([time_mean, time_std], axis=1)
聚合后统一重命名列
先用字典格式批量聚合,完成后直接覆盖列名为自定义名称:
result = df.rolling(f"{num_days_window + 1}D", min_periods=day_length).agg( {"time": [ lambda w: window_daily_stats(w, np.mean), lambda w: window_daily_stats(w, np.std) ]} ) # 手动设置列名 result.columns = ["time_mean", "time_std"]
内容的提问来源于stack exchange,提问作者Grinjero
相关产品推荐
相关产品推荐

