2015-03-08 40 views
7

Ho un oggetto DataFrame stocks pieno di resi di magazzino. Ho un altro oggetto DataFrame industries pieno di ritorni di settore. Voglio trovare la correlazione di ogni azione con ogni settore.Come si calcola la correlazione tra tutte le colonne in un DataFrame e tutte le colonne in un altro DataFrame?

Il modo più costoso per fare ciò è di unire i due oggetti DataFrame, calcolare la correlazione e quindi gettare tutti gli stock a magazzino e le correlazioni tra settore e industria. C'è un modo più efficiente per farlo?

Grazie!

+1

La mia risposta è attualmente selezionata ma è la risposta più semplice e veloce. Seleziona quella come migliore risposta se sei d'accordo. – JohnE

risposta

2

(Modifica per aggiungere: invece di questa risposta si prega di consultare la risposta di @ YT che è stato aggiunto in seguito, ma è chiaramente migliore.)

si potrebbe andare con numpy.corrcoef() che è sostanzialmente la stessa di corr in panda, ma la sintassi potrebbe essere più adatta a ciò che desideri.

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

che le stampe:

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

In alternativa si potrebbe caricare i risultati in un dataframe con etichette appropriate:

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

che assomiglia a questo:

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

Ecco una risposta leggermente più semplice er di JohnE che utilizza i panda in modo nativo invece di usare numpy.corrcoef. Come bonus aggiuntivo, non è necessario recuperare il valore di correlazione da una stupida matrice di correlazione 2x2, poiché la funzione di correlazione serie-serie di panda restituisce semplicemente un numero, non una matrice.

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

Ed ecco una battuta che utilizza apply sulle colonne ed evita la cicli for innestati. Il vantaggio principale è che apply crea il risultato in un DataFrame.

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

questa è facilmente la risposta migliore e merita più voti. Potresti considerare di mostrare un output che potrebbe rendere più ovvia questa è la migliore risposta. – JohnE

Problemi correlati