如何计算含不同位移的输入序列的滚动相关系数数组?
滚动窗口下多位移序列相关系数计算解法
问题分析
你需要计算滚动窗口内,x序列不同位移与y序列的相关系数,结果以位移为列、时间为行。之前的rolling+apply方法失败,原因在于:
- 自定义
apply函数仅处理单个位移,无法生成多列结果 - 窗口内
shift操作会引入大量NaN,导致计算逻辑不符合需求 - 自定义Python函数在大数据集上效率极低
可行解法
利用Pandas内置的shift和rolling.corr实现向量化计算,效率远高于自定义apply,且逻辑清晰:
import pandas as pd import numpy as np # 原始数据 data = pd.DataFrame( data=[[0.1, 0.4], [0.6, 0.9], [0.5, 0.3], [0.3, 0.2], [0.1, 0.2], [0.9, 0.5], [0.5, 0.6]], index=['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06', '2021-01-07'], columns=['x', 'y'] ) # 参数设置 window_size = 3 max_shift = 2 # 生成所有位移的滚动相关系数,合并为结果DataFrame corr_series_list = [ data['x'].shift(d).rolling(window_size).corr(data['y']) for d in range(max_shift + 1) ] result = pd.concat(corr_series_list, axis=1, keys=range(max_shift + 1)) # 格式化输出(保留4位小数) print(result.round(4))
结果验证
运行上述代码后,输出结果与预期完全一致:
0 1 2 2021-01-01 NaN NaN NaN 2021-01-02 NaN NaN NaN 2021-01-03 0.5291 NaN NaN 2021-01-04 0.8358 -0.9484 NaN 2021-01-05 0.8660 0.7559 -0.9820 2021-01-06 0.9707 -0.8660 -0.9449 2021-01-07 0.7206 0.5000 -0.9608
原理说明
- 对每个位移
d,将x序列向后平移d位(data['x'].shift(d)),实现序列位移 - 使用
rolling(window_size).corr(data['y'])计算平移后x与y在滚动窗口内的皮尔逊相关系数 - 自动处理NaN:当窗口内存在NaN(如前几个时间点或位移过大时),相关系数返回NaN,符合需求
性能优势
该方法基于Pandas内置的向量化操作,避免了Python循环与自定义函数的开销,在大数据集、大窗口、多位移场景下,性能远优于rolling+apply方案。
内容的提问来源于stack exchange,提问作者ric
相关产品推荐
相关产品推荐

