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

如何计算含不同位移的输入序列的滚动相关系数数组?

滚动窗口下多位移序列相关系数计算解法

问题分析

你需要计算滚动窗口内,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:31:50