计算一个数据帧的所有列和另一个数据帧的所有列之间的相关性?

2024-05-18 19:55:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个DataFrame对象stocks填充了股票收益。我有另一个DataFrame对象industries填充了行业返回。我想找出每只股票与每个行业的相关性。

import numpy as np
np.random.seed(123)

df1=pd.DataFrame( {'s1':np.random.randn(10000), 's2':np.random.randn(10000) } )
df2=pd.DataFrame( {'i1':np.random.randn(10000), 'i2':np.random.randn(10000) } )

要做到这一点,代价高昂的方法是合并这两个数据帧对象,计算相关性,然后抛出所有股票到股票和行业到行业的相关性。有没有更有效的方法来做到这一点?


Tags: 对象方法importnumpydataframeasnprandom
3条回答

编辑以添加:请查看@yt的答案,该答案稍后添加,但显然更好。)

您可以使用numpy.corrcoef(),这与pandas中的corr基本相同,但是语法可能更适合您想要的内容。

for s in ['s1','s2']:
    for i in ['i1','i2']:
        print( 'corrcoef',s,i,np.corrcoef(df1[s],df2[i])[0,1] )

上面印着:

corrcoef s1 i1 -0.00416977553597
corrcoef s1 i2 -0.0096393047035
corrcoef s2 i1 -0.026278689352
corrcoef s2 i2 -0.00402030582064

或者,可以将结果加载到具有适当标签的数据帧中:

cc = pd.DataFrame()     
for s in ['s1','s2']:
    for i in ['i1','i2']:
        cc = cc.append( pd.DataFrame(
             { 'corrcoef':np.corrcoef(df1[s],df2[i])[0,1] }, index=[s+'_'+i]))

看起来是这样的:

       corrcoef
s1_i1 -0.004170
s1_i2 -0.009639
s2_i1 -0.026279
s2_i2 -0.004020

这是一个在列上使用apply并避免嵌套for循环的单行程序。主要好处是apply在数据帧中生成结果。

df1.apply(lambda s: df2.corrwith(s))

这里有一个比JohnE的答案稍微简单一点的答案,JohnE的答案是本地使用熊猫,而不是使用numpy.corrcoef。作为额外的好处,您不必从一个愚蠢的2x2相关矩阵中检索相关值,因为pandas的序列到序列相关函数只返回一个数字,而不是一个矩阵。

In [133]: for s in ['s1','s2']:
     ...:     for i in ['i1','i2']:
     ...:         print df1[s].corr(df2[i])

相关问题 更多 >

    热门问题