计算DataFrame的所有列与另一个DataFrame的所有列之间的相关性?

时间:2015-03-08 21:24:37

标签: python python-3.x pandas

我有一个填充了股票回报的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) } )

执行此操作的昂贵方法是合并两个DataFrame对象,计算相关性,然后将所有库存和库存以及行业相关性抛弃。有没有更有效的方法来做到这一点?

4 个答案:

答案 0 :(得分:17)

这是一个单行,在列上使用render并避免嵌套的for循环。主要好处是StaticRenderer在DataFrame中构建结果。

public async Task<ActionResult> Download()
    {
        Session["IsDownloading"]  = true;            
        await ServeFiles();
        return View("Index");
    }

public ActionResult CheckStatus()
    {
        var message = Session["IsDownloading"] ?? "Null";
        return Content(message.ToString());
    }
private async Task ServeFiles()
{
   try
   {    //Download async
   }
   finaly
   {
      Session["IsDownloading"] = false;
   }
}

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

编辑添加:请注意@ 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

答案 3 :(得分:0)

很晚了,但是更通用的解决方案:

zsh