Cálculo de autocorrelación de Pandas DataFrame a lo largo de cada columna

Quiero calcular los coeficientes de autocorrelación de la longitud de retardo uno entre las columnas de un DataFrame de Pandas. Un fragmento de mis datos es:

RF PC CD 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 

A lo largo del año , quiero calcular las autocorrelaciones de retraso uno para cada columna ( RF , PC , etc.).

Para calcular las autocorrelaciones, extraje dos series de tiempo para cada columna cuyos datos de inicio y fin diferían en un año y luego numpy.corrcoef coeficientes de correlación con numpy.corrcoef .

Por ejemplo, escribí:

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

(todo el DataFrame se llama data ).
Sin embargo, desafortunadamente el comando regresó:

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

¿Alguien me puede aconsejar amablemente cómo calcular las autocorrelaciones?

Deberías usar:

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

df[['C']] representa un dataframe con una sola columna, mientras que df['C'] es una serie que contiene los valores en su columna C.

Esta es una respuesta tardía, pero para futuros usuarios, también puede usar pandas.Series.autocorr (), que calcula la autocorrelación de lag-N (predeterminado = 1) en la serie:

 df['C'].autocorr(lag=1) 

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.autocorr.html#pandas.Series.autocorr

.autocorr aplica a Series, no a DataFrames. Puede usar .apply para aplicar a un 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 

También puede calcular las autocorrelaciones sucesivas con una ventana específica de la siguiente manera (esto es lo que está haciendo .autocorr bajo el capó):

 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