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.
- Factor de inflación varianza en Python
- Ajuste binomial negativo en python
- Regresión de Fama Macbeth en Python (Pandas o Statsmodels)
- ¿Errores estándar de Newey-West para OLS en Python?
- Statsmodels da diferentes resultados de ANOVA a SPSS
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.