Pandas 1.5.0中rolling的step参数在corr方法中无法使用的解决咨询
解决滚动相关系数的step参数问题
问题原因
Pandas的rolling.corr()方法目前不支持step参数,即使rolling对象本身支持step,这就是你遇到NotImplementedError的核心原因。
两种可行实现方式
方式1:手动遍历窗口索引
直接生成符合step要求的窗口起始位置,逐个计算窗口内的相关系数:
import pandas as pd # 获取数据总长度 n = len(df) # 生成窗口起始索引(确保窗口结束不超出数据范围) start_indices = range(0, n - 125 + 1, 20) # 存储结果与对应索引 corr_results = [] corr_index = [] for i in start_indices: # 截取当前窗口的目标列数据 window_data = df.iloc[i:i+125][['600028.SS', '600121.SS']] # 计算两列的皮尔逊相关系数 corr = window_data['600028.SS'].corr(window_data['600121.SS']) corr_results.append(corr) # 记录窗口结束位置的索引(可根据需求改为起始位置) corr_index.append(df.index[i+124]) # 转为Series方便后续分析 corr_series = pd.Series(corr_results, index=corr_index) print(corr_series)
方式2:使用rolling.apply()自定义计算
利用rolling.apply()支持step参数的特性,自定义相关系数计算逻辑:
import pandas as pd # 定义窗口内相关系数计算函数 def window_corr(window_df): # window_df为每个滚动窗口的DataFrame return window_df['600028.SS'].corr(window_df['600121.SS']) # 执行滚动计算,必须设置raw=False以传递DataFrame而非数组 corr_series = df[['600028.SS', '600121.SS']].rolling( window=125, step=20 ).apply(window_corr, raw=False) # 过滤无有效计算结果的NaN行 corr_series = corr_series.dropna() print(corr_series)
注意事项
- 确保你的Pandas版本≥1.5.0,否则
step参数本身不被支持; - 方式2中
raw=False是必要设置,否则函数会收到numpy数组,无法通过列名索引数据; - 结果索引默认对应窗口的结束位置,可根据业务需求调整为起始位置。
内容的提问来源于stack exchange,提问作者Jonas Burkart
相关产品推荐
相关产品推荐

