Dee*_*ets 12 python python-3.x pandas
我有一个stocks
填充股票回报的DataFrame对象.我有另一个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) } )
Run Code Online (Sandbox Code Playgroud)
执行此操作的昂贵方法是合并两个DataFrame对象,计算相关性,然后将所有库存和库存以及行业相关性抛弃.有没有更有效的方法来做到这一点?
yts*_*aig 20
这是一个apply
在列上使用的单行并避免嵌套for循环.主要好处是apply
在DataFrame 中构建结果.
df1.apply(lambda s: df2.corrwith(s))
Run Code Online (Sandbox Code Playgroud)
小智 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])
Run Code Online (Sandbox Code Playgroud)
编辑添加:我会把这个答案留给后代,但会推荐后面的答案。特别是,如果您想要最简单的答案,请使用@ytsaig's,但如果您想要更快的答案,请使用@failwhales's(在某些快速计时中,我使用 OP 中的数据似乎比 @ytsaig's 快约 5 倍,并且速度与矿)。
原始答案:您可以使用与熊猫numpy.corrcoef()
基本相同的方法corr
,但语法可能更适合您想要的。
for s in ['s1','s2']:
for i in ['i1','i2']:
print( 'corrcoef',s,i,np.corrcoef(df1[s],df2[i])[0,1] )
Run Code Online (Sandbox Code Playgroud)
那打印:
corrcoef s1 i1 -0.00416977553597
corrcoef s1 i2 -0.0096393047035
corrcoef s2 i1 -0.026278689352
corrcoef s2 i2 -0.00402030582064
Run Code Online (Sandbox Code Playgroud)
或者,您可以将结果加载到带有适当标签的数据框中:
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]))
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
corrcoef
s1_i1 -0.004170
s1_i2 -0.009639
s2_i1 -0.026279
s2_i2 -0.004020
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16153 次 |
最近记录: |