2015-03-11 27 views
6

Supponendo che io abbia un dataframe simile al seguente, come potrei ottenere la correlazione tra 2 colonne specifiche e quindi raggruppare per colonna 'ID'? Credo che il metodo 'corr' di Pandas trovi la correlazione tra tutte le colonne. Se possibile vorrei anche sapere come posso trovare la correlazione 'groupby' usando la funzione .agg (cioè np.correlate).Correlazione panda Groupby

quello che ho:

ID Val1 Val2 OtherData OtherData 
A 5 4 x x 
A 4 5 x x 
A 6 6 x x 
B 4 1 x x 
B 8 2 x x 
B 7 9 x x 
C 4 8 x x 
C 5 5 x x 
C 2 1 x x 

quello che mi serve:

ID Correlation_Val1_Val2 
A 0.12 
B 0.22 
C 0.05 

Grazie!

risposta

8

È praticamente capito tutti i pezzi, solo bisogno di combinarli:

In [441]: df.groupby('ID')[['Val1','Val2']].corr() 
Out[441]: 
      Val1  Val2 
ID       
A Val1 1.000000 0.500000 
    Val2 0.500000 1.000000 
B Val1 1.000000 0.385727 
    Val2 0.385727 1.000000 

Nel tuo caso, la stampa di un 2x2 per ogni ID è eccessivamente prolisso. Non vedo un'opzione per stampare una correlazione scalare invece che l'intera matrice, ma si può fare qualcosa di simile:

In [442]:df.groupby('ID')[['Val1','Val2']].corr().ix[0::2,'Val2'] 
Out[442]: 
ID  
A Val1 0.500000 
B Val1 0.385727 

e quindi rinominare e immagazzinare le cose come volete.

+0

Come dovrei cambiarlo in "rolling_corr()" in modo che la correlazione continua venga calcolata ogni 10 giorni? – bsheehy

Problemi correlati