Cómo configurar correctamente los parámetros de inicio / finalización de statsmodels.tsa.ar_model.AR.predict

Tengo una estructura de datos de los costos del proyecto de una serie de tiempo espaciada irregularmente en la que me gustaría intentar aplicar el modelo de statsmodel AR .

Esta es una muestra de los datos en su dataframe:

  cost date 2015-07-16 35.98 2015-08-11 25.00 2015-08-11 43.94 2015-08-13 26.25 2015-08-18 15.38 2015-08-24 77.72 2015-09-09 40.00 2015-09-09 20.00 2015-09-09 65.00 2015-09-23 70.50 2015-09-29 59.00 2015-11-03 19.25 2015-11-04 19.97 2015-11-10 26.25 2015-11-12 19.97 2015-11-12 23.97 2015-11-12 21.88 2015-11-23 23.50 2015-11-23 33.75 2015-11-23 22.70 2015-11-23 33.75 2015-11-24 27.95 2015-11-24 27.95 2015-11-24 27.95 ... 2017-03-31 21.93 2017-04-06 22.45 2017-04-06 26.85 2017-04-12 60.40 2017-04-12 37.00 2017-04-12 20.00 2017-04-12 66.00 2017-04-12 60.00 2017-04-13 41.95 2017-04-13 25.97 2017-04-13 29.48 2017-04-19 41.00 2017-04-19 58.00 2017-04-19 78.00 2017-04-19 12.00 2017-04-24 51.05 2017-04-26 21.88 2017-04-26 50.05 2017-04-28 21.00 2017-04-28 30.00 

Me cuesta entender cómo usar el start y el end en la función de predict .

Según los documentos :

start: int, str o datetime Número de observación de índice cero en el que comenzar el pronóstico, es decir, el primer> pronóstico es el inicio. También puede ser una cadena de fecha para analizar o un tipo de fecha y hora.

end: int, str o datetime Número de observación de índice cero en el que finalizar el pronóstico, es decir, el primer pronóstico es el inicio. También puede ser una cadena de fecha para analizar o un tipo de fecha y hora.

Creo un dataframe que tiene una serie de tiempo diaria vacía, le agrego mis datos de series de tiempo espaciados irregularmente y luego trato de aplicar el modelo.

 data = pd.read_csv('data.csv', index_col=1, parse_dates=True) df = pd.DataFrame(index=pd.date_range(start=datetime(2015, 1, 1), end=datetime(2017, 12, 31), freq='d')) df = df.join(data) df.cost.interpolate(inplace=True) ar_model = sm.tsa.AR(df, missing='drop', freq='D') ar_res = ar_model.fit(maxlag=9, method='mle', disp=-1) pred = ar_res.predict(start='2016', end='2016') 

La función de predict da como resultado un error de pandas.tslib.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 605-12-31 00:00:00 de pandas.tslib.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 605-12-31 00:00:00

Si trato de usar una fecha más específica, obtengo el mismo tipo de error:

 pred = ar_res.predict(start='2016-01-01', end='2016-06-01') 

Si trato de usar enteros, obtengo un error diferente:

 pred = ar_res.predict(start=0, end=len(data)) Wrong number of items passed 202, placement implies 197 

Si realmente uso un datetime , recibo un error que no rule for interpreting end lee no rule for interpreting end .

Estoy golpeando una pared tan fuerte aquí que pienso que debe haber algo que me estoy perdiendo.

En última instancia, me gustaría usar el modelo para obtener predicciones fuera de muestra (como una predicción para el próximo trimestre).

Esto funciona si pasa un datetime (en lugar de una date ):

 from datetime import datetime ... pred = ar_res.predict(start=datetime(2015, 1, 1), end=datetime(2017,12,31)) In [21]: pred.head(2) # my dummy numbers from data Out[21]: 2015-01-01 35 2015-01-02 23 Freq: D, dtype: float64 In [22]: pred.tail(2) Out[22]: 2017-12-30 44 2017-12-31 44 Freq: D, dtype: float64 

Así que estaba creando un índice diario para tener en cuenta el requisito de series de tiempo igualmente espaciadas, pero todavía no era único (comentario de @ user333700).

groupby una función groupby para sumr las fechas duplicadas, y luego podría ejecutar la función predict usando objetos de datetime y datetime (respuesta por @ andy-hayden).

 df = df.groupby(pd.TimeGrouper(freq='D')).sum() ... ar_res.predict(start=min(df.index), end=datetime(2018,12,31)) 

Con la función de predict que proporciona un resultado, ahora puedo analizar los resultados y modificar los parámetros para obtener algo útil.