2014-09-28 9 views
5

Ich möchte die Autokorrelationskoeffizienten der Verzögerungszeit eins unter den Spalten eines Pandas DataFrame berechnen. Ein Ausschnitt meiner Daten ist:Autokorrelation von Pandas DataFrame entlang jeder Spalte berechnen

  RF  PC   C   D  PN  DN   P 
year                  
1890  NaN  NaN  NaN  NaN  NaN  NaN  NaN 
1891 -0.028470 -0.052632 0.042254 0.081818 -0.045541 0.047619 -0.016974 
1892 -0.249084 0.000000 0.027027 0.067227 0.099404 0.045455 0.122337 
1893 0.653659 0.000000 0.000000 0.039370 -0.135624 0.043478 -0.142062 

Entlang Jahr, ich will für jede Spalte (, RF PC, etc ...) eine Autokorrelationen Verzögerung berechnen.

Um die Autokorrelationen zu berechnen, extrahierte ich für jede Spalte zwei Zeitreihen, deren Start- und Enddaten sich um ein Jahr unterschieden, und berechnete dann die Korrelationskoeffizienten mit numpy.corrcoef.

Zum Beispiel schrieb ich:

numpy.corrcoef(data[['C']][1:-1],data[['C']][2:])

(der gesamte Datenrahmen genannt wird data).
jedoch leider der Befehl zurückgegeben:

array([[ nan, nan, nan, ..., nan, nan, nan], 
     [ nan, nan, nan, ..., nan, nan, nan], 
     [ nan, nan, nan, ..., nan, nan, nan], 
     ..., 
     [ nan, nan, nan, ..., nan, nan, nan], 
     [ nan, nan, nan, ..., nan, nan, nan], 
     [ nan, nan, nan, ..., nan, nan, nan]]) 

Kann jemand freundlicherweise mir raten, wie Autokorrelationen berechnen?

Antwort

2

sollten Sie verwenden:

numpy.corrcoef(df['C'][1:-1], df['C'][2:]) 

df[['C']] stellt einen Datenrahmen mit nur einer Spalte, während df['C'] eine Reihe der Werte in Ihrem C-Säule, die ist.

4

.autocorrapplies zu Serie, nicht DataFrames. Sie .apply verwenden können, um einen Datenrahmen anzuwenden:

def df_autocorr(df, lag=1, axis=0): 
    """Compute full-sample column-wise autocorrelation for a DataFrame.""" 
    return df.apply(lambda col: col.autocorr(lag), axis=axis) 
d1 = DataFrame(np.random.randn(100, 6)) 

df_autocorr(d1) 
Out[32]: 
0 0.141 
1 -0.028 
2 -0.031 
3 0.114 
4 -0.121 
5 0.060 
dtype: float64 

Sie auch Autokorrelationen mit einem bestimmten Fenster berechnen könnten rollen wie folgt (das ist, was .autocorr ist unter der Haube zu tun):

def df_rolling_autocorr(df, window, lag=1): 
    """Compute rolling column-wise autocorrelation for a DataFrame.""" 

    return (df.rolling(window=window) 
     .corr(df.shift(lag))) # could .dropna() here 

df_rolling_autocorr(d1, window=21).dropna().head() 
Out[38]: 
     0  1  2  3  4  5 
21 -0.173 -0.367 0.142 -0.044 -0.080 0.012 
22 0.015 -0.341 0.250 -0.036 0.023 -0.012 
23 0.038 -0.329 0.279 -0.026 0.075 -0.121 
24 -0.025 -0.361 0.319 0.117 0.031 -0.120 
25 0.119 -0.320 0.181 -0.011 0.038 -0.111 
Verwandte Themen