2015-03-08 8 views
7

Mam obiekt DataFrame stocks wypełniony zwroty stock. Mam inny obiekt DataFrame industries wypełniony zwrotami branżowymi. Chcę znaleźć korelację każdego stada z każdą branżą.Jak obliczyć korelację między wszystkimi kolumnami w DataFrame i wszystkich kolumnach w innym DataFrame?

Droższym sposobem na to jest połączenie dwóch obiektów DataFrame, obliczenie korelacji, a następnie wyrzucenie wszystkich zapasów do zapasów i przemysłu do korelacji branżowych. Czy istnieje skuteczniejszy sposób na zrobienie tego?

Dziękujemy!

+1

Moja odpowiedź jest aktualnie wybrana, ale odpowiedź jest najprostsza i najszybsza. Wybierz tę najlepszą odpowiedź, jeśli się zgadzasz. – JohnE

Odpowiedz

2

(Edytuj, aby dodać: Zamiast tej odpowiedzi proszę sprawdzić odpowiedź @ YT, która została dodana później, ale jest wyraźnie lepsza.)

Można iść z numpy.corrcoef() który jest w zasadzie taka sama jak corr w pand, ale składnia może być bardziej podatna na to, co chcesz.

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

która drukuje:

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

Alternatywnie można załadować wyniki do dataframe z odpowiednimi etykietami:

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

który wygląda tak:

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

tutaj nieco prostsze odpowiedzi er niż JohnE's, który używa pandy natywnie zamiast używać numpy.corrcoef. Dodatkową korzyścią jest to, że nie trzeba odzyskiwać wartości korelacji z głupiej matrycy korelacji 2x2, ponieważ funkcja korelacji szeregów szeregu pandy po prostu zwraca liczbę, a nie macierz.

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

A oto jedna wkładka, która wykorzystuje apply na kolumnach i unika zagnieżdżonych pętli. Główną zaletą jest to, że apply buduje wynik w DataFrame.

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

jest to z pewnością najlepsza odpowiedź i zasługuje na więcej głosów. Możesz rozważyć wyświetlenie wyniku, co może sprawić, że stanie się bardziej oczywiste, że jest to najlepsza odpowiedź. – JohnE

Powiązane problemy