2014-09-28 1 views
5

Chcę obliczyć współczynniki autokorelacji długości opóźnienia pośród kolumn ramki danych Pandas DataFrame. Fragment moich danych wynosi:Obliczanie autokorelacji pandasów DataFrame wzdłuż każdej kolumny

  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 

Wraz roku, chcę obliczyć autokorelacji lag jednym dla każdej kolumny (RF, PC, etc ...).

Aby obliczyć autokorelacje, wyodrębniłem dwie serie czasowe dla każdej kolumny, której dane początkowe i końcowe różniły się o jeden rok, a następnie obliczone współczynniki korelacji z numpy.corrcoef.

Na przykład, napisałem:

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

(cała DataFrame nazywa data).
Jednakże polecenie niestety wrócił:

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

Może ktoś łaskawie mi doradzić, w jaki sposób obliczyć autokorelacji?

Odpowiedz

2

należy użyć:

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

df[['C']] reprezentuje dataframe tylko z jednej kolumny, natomiast df['C'] to seria zawierająca wartości w kolumnie C.

4

.autocorr na Series, a nie DataFrames. Można użyć .apply zastosować do DataFrame:

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 

Można również obliczyć toczenia autokorelacji z określonym oknie następująco (jest to co .autocorr robi pod maską):

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