Pandillas de datos extrapolables

Es fácil interpolar valores en un Pandas.DataFrame usando Series.interpolate , ¿cómo se puede hacer la extrapolación?

Por ejemplo, dado un DataFrame como se muestra, ¿cómo podemos extrapolarlo 14 meses más para 2014-12-31? La extrapolación lineal está bien.

 X1 = range(10) X2 = map(lambda x: x**2, X1) df = pd.DataFrame({'x1': X1, 'x2': X2}, index=pd.date_range('20130101',periods=10,freq='M')) 

Estoy pensando que primero debe crearse un nuevo DataFrame, con el DateTimeIndex a partir del 2013-11-31 y que se extenderá por 14 períodos M más. Más allá de eso estoy atascado.

introduzca la descripción de la imagen aquí

Extrapolación de un DataFrame con un índice DatetimeIndex

Esto se puede hacer con dos pasos:

  1. Extienda el DatetimeIndex
  2. Extrapolar los datos

Ampliar el índice

Sobrescriba df con un nuevo DataFrame donde los datos se vuelven a muestrear en un nuevo índice extendido basado en el inicio, el período y la frecuencia del índice original. Esto permite que el df original provenga de cualquier lugar, como en el caso del ejemplo csv . ¡Con esto las columnas se llenan convenientemente con NaNs !

 # Fake DataFrame for example (could come from anywhere) X1 = range(10) X2 = map(lambda x: x**2, X1) df = pd.DataFrame({'x1': X1, 'x2': X2}, index=pd.date_range('20130101',periods=10,freq='M')) # Number of months to extend extend = 5 # Extrapolate the index first based on original index df = pd.DataFrame( data=df, index=pd.date_range( start=df.index[0], periods=len(df.index) + extend, freq=df.index.freq ) ) # Display print df 

  x1 x2 2013-01-31 0 0 2013-02-28 1 1 2013-03-31 2 4 2013-04-30 3 9 2013-05-31 4 16 2013-06-30 5 25 2013-07-31 6 36 2013-08-31 7 49 2013-09-30 8 64 2013-10-31 9 81 2013-11-30 NaN NaN 2013-12-31 NaN NaN 2014-01-31 NaN NaN 2014-02-28 NaN NaN 2014-03-31 NaN NaN 

Extrapolar los datos

La mayoría de los extrapoladores requerirán que las entradas sean numéricas en lugar de fechas. Esto se puede hacer con

 # Temporarily remove dates and make index numeric di = df.index df = df.reset_index().drop('index', 1) 

Consulte esta respuesta para DataFrame cómo extrapolar los valores de cada columna de un DataFrame con un polinomio de tercer orden .

Fragmento de respuesta

 # Curve fit each column for col in fit_df.columns: # Get x & y x = fit_df.index.astype(float).values y = fit_df[col].values # Curve fit column and get curve parameters params = curve_fit(func, x, y, guess) # Store optimized parameters col_params[col] = params[0] # Extrapolate each column for col in df.columns: # Get the index values for NaNs in the column x = df[pd.isnull(df[col])].index.astype(float).values # Extrapolate those points with the fitted function df[col][x] = func(x, *col_params[col]) 

Una vez extrapoladas las columnas, volver a poner las fechas.

 # Put date index back df.index = di # Display print df 

 x1 x2 2013-01-31 0 0 2013-02-28 1 1 2013-03-31 2 4 2013-04-30 3 9 2013-05-31 4 16 2013-06-30 5 25 2013-07-31 6 36 2013-08-31 7 49 2013-09-30 8 64 2013-10-31 9 81 2013-11-30 10 100 2013-12-31 11 121 2014-01-31 12 144 2014-02-28 13 169 2014-03-31 14 196