我有一个填充了股票回报的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对象,计算相关性,然后将所有库存和库存以及行业相关性抛弃。有没有更有效的方法来做到这一点?
答案 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