查找数据框中相应列的相关性
问题描述:
我有两个数据框,每列200列。为了说明,我在这里只使用3列。查找数据框中相应列的相关性
数据帧DF1为:
A B C
1/4/2017 5 6 6
1/5/2017 5 2 1
1/6/2017 6 2 10
1/9/2017 1 9 10
1/10/2017 6 6 4
1/11/2017 6 1 1
1/12/2017 1 7 10
1/13/2017 8 9 6
数据帧DF2:
A D B
1/4/2017 8 10 2
1/5/2017 2 1 8
1/6/2017 6 6 6
1/9/2017 1 8 1
1/10/2017 10 6 2
1/11/2017 10 2 4
1/12/2017 5 4 10
1/13/2017 5 2 8
我要计算的下列相关矩阵为df1
和df2
对应列:使用
A B
1/4/2017
1/5/2017
1/6/2017 0.19 -0.94
1/9/2017 0.79 -0.96
1/10/2017 0.90 -0.97
1/11/2017 1.00 -1.00
1/12/2017 1.00 0.42
1/13/2017 0.24 0.84
即追踪同一列的3天历史数据和df2
,我需要找到相关矩阵。
所以,我计算corr([5, 5, 6], [8, 2, 6]) = 0.19
其中[5,5,6]
是df1['A']
和[8,2,6]
为df2['A']
因为,我有200列,每列我发现它非常麻烦运行一个for循环两次。首先循环遍历列,然后使用尾随3天滞后数据。
答
这是你所需要的?
l=[]
id=df1.columns.intersection(df2.columns)
for x in id:
l.append(pd.rolling_corr(df1[x],df2[x],window=3))# notice you should change it to `l.append(df1[x].rolling(3).corr(df2[x]))`
pd.concat(l,axis=1)
Out[13]:
A B
1/4/2017 NaN NaN
1/5/2017 NaN NaN
1/6/2017 0.188982 -0.944911
1/9/2017 0.785714 -0.960769
1/10/2017 0.896258 -0.968620
1/11/2017 1.000000 -0.998906
1/12/2017 1.000000 0.423415
1/13/2017 0.240192 0.838628
答
选项1
我建立了一个发生器和包裹在pd.concat
def rolling_corrwith(d1, d2, window):
d1, d2 = d1.align(d2, 'inner')
for i in range(len(d1) - window + 1):
j = i + window
yield d1.iloc[i:j].corrwith(d2.iloc[i:j]).rename(d1.index[j-1])
pd.concat(list(rolling_corrwith(df1, df2, 3)), axis=1).T
A B
1/6/2017 0.188982 -0.944911
1/9/2017 0.785714 -0.960769
1/10/2017 0.896258 -0.968620
1/11/2017 1.000000 -0.998906
1/12/2017 1.000000 0.423415
1/13/2017 0.240192 0.838628
选项2
使用numpy的进展。我不推荐这种方法。但值得一提的是那些有兴趣的人。
from numpy.lib.stride_tricks import as_strided as strided
def sprp(v, w):
s0, s1 = v.strides
n, m = v.shape
return strided(v, (n + 1 - w, w, m), (s0, s0, s1))
def rolling_corrwith2(d1, d2, window):
d1, d2 = d1.align(d2, 'inner')
s1 = sprp(d1.values, window)
s2 = sprp(d2.values, window)
m1 = s1.mean(1, keepdims=1)
m2 = s2.mean(1, keepdims=1)
z1 = s1.std(1)
z2 = s2.std(1)
c = ((s1 - m1) * (s2 - m2)).sum(1)/z1/z2/window
return pd.DataFrame(c, d1.index[window - 1:], d1.columns)
rolling_corrwith2(df1, df2, 3)
A B
1/6/2017 0.188982 -0.944911
1/9/2017 0.785714 -0.960769
1/10/2017 0.896258 -0.968620
1/11/2017 1.000000 -0.998906
1/12/2017 1.000000 0.423415
1/13/2017 0.240192 0.838628
您可能会喜欢我发布的第二个选项。 – piRSquared
@piRSquared看看,总是喜欢学习numpy的方法!! 1 – Wen