如何计算固定Series与滚动DataFrame的相关系数并解决NaN问题?
问题分析与解决
问题根源
出现NaN的核心原因是滚动窗口生成的子Series与固定Series df 的索引不匹配:
- 滚动窗口的子数据保留了原
df1的索引(比如索引4对应的窗口是df1.loc[2:4,'A'],索引为2、3、4),而df的索引是0、1、2。 - pandas的
corr()方法默认按索引对齐数据,无重叠索引时直接返回NaN。
解决方法
修改自定义函数,跳过索引对齐,直接基于数值计算相关系数。可以用numpy.corrcoef实现:
import pandas as pd import numpy as np df = pd.Series([2,3,4]) df1 = pd.DataFrame({'A':[1,2,3,4,5,6,7], 'B':[10,20,30,40,50,60,70], 'C':[100,200,300,400,500,600,700]}) def x(y): # 直接用数值计算相关系数,避免索引对齐问题 return np.corrcoef(y.values, df.values)[0, 1] df2 = df1.rolling(window=len(df), min_periods=1).apply(x)
运行结果
A B C 0 NaN NaN NaN 1 1.0 1.0 1.0 2 1.0 1.0 1.0 3 1.0 1.0 1.0 4 1.0 1.0 1.0 5 1.0 1.0 1.0 6 1.0 1.0 1.0
另一种思路:重置索引对齐
也可以在函数内重置滚动窗口子数据的索引,和df对齐后再计算相关系数:
def x(y): return y.reset_index(drop=True).corr(df)
内容的提问来源于stack exchange,提问作者stvlam22
相关产品推荐
相关产品推荐

