Pandas / Statsmodel OLS prediciendo valores futuros

He estado tratando de obtener una predicción de valores futuros en un modelo que he creado. He probado tanto OLS en pandas como statsmodels. Esto es lo que tengo en statsmodels:

import statsmodels.api as sm endog = pd.DataFrame(dframe['monthly_data_smoothed8']) smresults = sm.OLS(dframe['monthly_data_smoothed8'], dframe['date_delta']).fit() sm_pred = smresults.predict(endog) sm_pred 

La longitud de la matriz devuelta es igual a la cantidad de registros en mi dataframe original, pero los valores no son los mismos. Cuando hago lo siguiente usando pandas, no obtengo ningún valor.

 from pandas.stats.api import ols res1 = ols(y=dframe['monthly_data_smoothed8'], x=dframe['date_delta']) res1.predict 

(Tenga en cuenta que no hay una función .fit para OLS en Pandas) ¿Podría alguien arrojar alguna luz sobre cómo podría obtener predicciones futuras de mi modelo OLS en pandas o statsmodel? Me doy cuenta de que no debo usar .predict correctamente y lea los otros problemas que ha tenido la gente pero no parecen aplicarse a mi caso.

edit creo que ‘endog’ como está definido es incorrecto; debería pasar los valores que quiero predecir; por lo tanto, he creado un intervalo de fechas de 12 períodos después del último valor registrado. Pero todavía me falta algo porque me sale el error:

 matrices are not aligned 

La edición aquí es un fragmento de datos, la última columna (en rojo) de números es la fecha delta, que es una diferencia en meses desde la primera fecha:

 month monthly_data monthly_data_smoothed5 monthly_data_smoothed8 monthly_data_smoothed12 monthly_data_smoothed3 date_delta 0 2011-01-31 3.711838e+11 3.711838e+11 3.711838e+11 3.711838e+11 3.711838e+11 0.000000 1 2011-02-28 3.776706e+11 3.750759e+11 3.748327e+11 3.746975e+11 3.755084e+11 0.919937 2 2011-03-31 4.547079e+11 4.127964e+11 4.083554e+11 4.059256e+11 4.207653e+11 1.938438 3 2011-04-30 4.688370e+11 4.360748e+11 4.295531e+11 4.257843e+11 4.464035e+11 2.924085 

Creo que su problema aquí es que statsmodels no agrega una intercepción por defecto, por lo que su modelo no logra un gran ajuste. Resolverlo en tu código sería algo como esto:

 dframe = pd.read_clipboard() # your sample data dframe['intercept'] = 1 X = dframe[['intercept', 'date_delta']] y = dframe['monthly_data_smoothed8'] smresults = sm.OLS(y, X).fit() dframe['pred'] = smresults.predict() 

Además, para lo que vale la pena, creo que la api de fórmula de statsmodel es mucho más agradable para trabajar cuando se trabaja con DataFrames, y agrega una intercepción de forma predeterminada (agregue un - 1 para eliminar). Ver más abajo, debe dar la misma respuesta.

 import statsmodels.formula.api as smf smresults = smf.ols('monthly_data_smoothed8 ~ date_delta', dframe).fit() dframe['pred'] = smresults.predict() 

Editar:

Para predecir valores futuros, solo pase datos nuevos a .predict() Por ejemplo, usando el primer modelo:

 In [165]: smresults.predict(pd.DataFrame({'intercept': 1, 'date_delta': [0.5, 0.75, 1.0]})) Out[165]: array([ 2.03927604e+11, 2.95182280e+11, 3.86436955e+11]) 

En la intersección: no hay nada codificado en el número 1 , solo se basa en la matemática de OLS (una intersección es perfectamente análoga a un regresor que siempre es igual a 1), por lo que puede extraer el valor del resumen. En cuanto a los documentos de statsmodels, una forma alternativa de agregar una intersección sería:

 X = sm.add_constant(X)