2015-03-08 129 views
7

我有一個DataFrame對象stocks充滿股票回報。我有另一個充滿行業回報的DataFrame對象industries。我想找到每個股票與每個行業的關聯。如何計算DataFrame中所有列與另一個DataFrame中所有列之間的相關性?

昂貴的方式做,這是合併這兩個數據框的對象,計算相關,然後扔掉了所有的股票,以股票和行業而相關性。有沒有更有效的方法來做到這一點?

謝謝!

+1

我的答案是當前選中的,但是yt的答案是最簡單和最快的答案。如果您同意,請選擇一個作爲最佳答案。 – JohnE 2017-07-24 01:52:36

回答

2

編輯補充:不是這個答案的請出這是後來添加的,但顯然是更好@ YT的答案。)

你可以用numpy.corrcoef()去基本上是一樣的corr的大熊貓,但是語法可能更適合你想要的東西。

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) }) 

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 
6

這裏的一個稍微簡單的回答呃比JohnE的本地使用熊貓而不是使用numpy.corrcoef。作爲一個額外的好處,你不必從一個愚蠢的2x2相關矩陣中檢索相關值,因爲熊貓的系列到系列相關函數只是返回一個數字,而不是矩陣。

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

而這裏的一班輪使用的列apply,並避免嵌套的for循環。主要優點是apply在DataFrame中生成結果。

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

這很容易就是最好的答案,值得擁有更多的選票。您可能想要考慮顯示可能使其更明顯的輸出,這是最佳答案。 – JohnE 2017-07-24 01:39:42

相關問題