Dates in timeseries modelsΒΆ
In [1]:
from __future__ import print_function
import statsmodels.api as sm
import numpy as np
import pandas as pd
Getting started
In [2]:
data = sm.datasets.sunspots.load()
Right now an annual date series must be datetimes at the end of the year.
In [3]:
from datetime import datetime
dates = sm.tsa.datetools.dates_from_range('1700', length=len(data.endog))
Using Pandas
Make a pandas TimeSeries or DataFrame
In [4]:
endog = pd.TimeSeries(data.endog, index=dates)
Instantiate the model
In [5]:
ar_model = sm.tsa.AR(endog, freq='A')
pandas_ar_res = ar_model.fit(maxlag=9, method='mle', disp=-1)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-287-9645410370ec> in <module>() 1 ar_model = sm.tsa.AR(endog, freq='A') ----> 2 pandas_ar_res = ar_model.fit(maxlag=9, method='mle', disp=-1) /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/tsa/ar_model.pyc in fit(self, maxlag, method, ic, trend, transparams, start_params, solver, maxiter, full_output, disp, callback, **kwargs) 578 method=solver, maxiter=maxiter, 579 full_output=full_output, disp=disp, --> 580 callback=callback, **kwargs) 581 582 params = mlefit.params /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/base/model.pyc in fit(self, start_params, method, maxiter, full_output, disp, fargs, callback, retall, skip_hessian, **kwargs) 423 callback=callback, 424 retall=retall, --> 425 full_output=full_output) 426 427 #NOTE: this is for fit_regularized and should be generalized /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/base/optimizer.pyc in _fit(self, objective, gradient, start_params, fargs, kwargs, hessian, method, maxiter, full_output, disp, callback, retall) 182 disp=disp, maxiter=maxiter, callback=callback, 183 retall=retall, full_output=full_output, --> 184 hess=hessian) 185 186 # this is stupid TODO: just change this to something sane /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/base/optimizer.pyc in _fit_lbfgs(f, score, start_params, fargs, kwargs, disp, maxiter, callback, retall, full_output, hess) 380 callback=callback, args=fargs, 381 bounds=bounds, disp=disp, --> 382 **extra_kwargs) 383 384 if full_output: /usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.pyc in fmin_l_bfgs_b(func, x0, fprime, args, approx_grad, bounds, m, factr, pgtol, epsilon, iprint, maxfun, maxiter, disp, callback, maxls) 191 192 res = _minimize_lbfgsb(fun, x0, args=args, jac=jac, bounds=bounds, --> 193 **opts) 194 d = {'grad': res['jac'], 195 'task': res['message'], /usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.pyc in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, maxls, **unknown_options) 328 # minimization routine wants f and g at the current x 329 # Overwrite f and g: --> 330 f, g = func_and_grad(x) 331 elif task_str.startswith(b'NEW_X'): 332 # new iteration /usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.pyc in func_and_grad(x) 271 if jac is None: 272 def func_and_grad(x): --> 273 f = fun(x, *args) 274 g = _approx_fprime_helper(x, fun, epsilon, args=args, f0=f) 275 return f, g /usr/lib/python2.7/dist-packages/scipy/optimize/optimize.pyc in function_wrapper(*wrapper_args) 287 def function_wrapper(*wrapper_args): 288 ncalls[0] += 1 --> 289 return function(*(wrapper_args + args)) 290 291 return ncalls, function_wrapper /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/base/model.pyc in <lambda>(params, *args) 401 402 nobs = self.endog.shape[0] --> 403 f = lambda params, *args: -self.loglike(params, *args) / nobs 404 score = lambda params: -self.score(params) / nobs 405 try: /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/tsa/ar_model.pyc in loglike(self, params) 351 352 else: --> 353 return self._loglike_mle(params) 354 355 def score(self, params): /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/tsa/ar_model.pyc in _loglike_mle(self, params) 301 302 # get inv(Vp) Hamilton 5.3.7 --> 303 Vpinv = self._presample_varcov(params) 304 305 diffpVpinv = np.dot(np.dot(diffp.T, Vpinv), diffp).item() /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/tsa/ar_model.pyc in _presample_varcov(self, params) 258 for i in range(1, p1): 259 Vpinv[i-1, i-1:] = np.correlate(params0, params0[:i], --> 260 old_behavior=False)[:-1] 261 Vpinv[i-1, i-1:] -= np.correlate(params0[-i:], params0, 262 old_behavior=False)[:-1] TypeError: correlate() got an unexpected keyword argument 'old_behavior'
Out-of-sample prediction
In [6]:
pred = pandas_ar_res.predict(start='2005', end='2015')
print(pred)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-288-81ba69e2b7f0> in <module>() ----> 1 pred = pandas_ar_res.predict(start='2005', end='2015') 2 print(pred) NameError: name 'pandas_ar_res' is not defined
Using explicit dates
In [7]:
ar_model = sm.tsa.AR(data.endog, dates=dates, freq='A')
ar_res = ar_model.fit(maxlag=9, method='mle', disp=-1)
pred = ar_res.predict(start='2005', end='2015')
print(pred)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-289-bddd2fb1643c> in <module>() 1 ar_model = sm.tsa.AR(data.endog, dates=dates, freq='A') ----> 2 ar_res = ar_model.fit(maxlag=9, method='mle', disp=-1) 3 pred = ar_res.predict(start='2005', end='2015') 4 print(pred) /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/tsa/ar_model.pyc in fit(self, maxlag, method, ic, trend, transparams, start_params, solver, maxiter, full_output, disp, callback, **kwargs) 578 method=solver, maxiter=maxiter, 579 full_output=full_output, disp=disp, --> 580 callback=callback, **kwargs) 581 582 params = mlefit.params /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/base/model.pyc in fit(self, start_params, method, maxiter, full_output, disp, fargs, callback, retall, skip_hessian, **kwargs) 423 callback=callback, 424 retall=retall, --> 425 full_output=full_output) 426 427 #NOTE: this is for fit_regularized and should be generalized /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/base/optimizer.pyc in _fit(self, objective, gradient, start_params, fargs, kwargs, hessian, method, maxiter, full_output, disp, callback, retall) 182 disp=disp, maxiter=maxiter, callback=callback, 183 retall=retall, full_output=full_output, --> 184 hess=hessian) 185 186 # this is stupid TODO: just change this to something sane /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/base/optimizer.pyc in _fit_lbfgs(f, score, start_params, fargs, kwargs, disp, maxiter, callback, retall, full_output, hess) 380 callback=callback, args=fargs, 381 bounds=bounds, disp=disp, --> 382 **extra_kwargs) 383 384 if full_output: /usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.pyc in fmin_l_bfgs_b(func, x0, fprime, args, approx_grad, bounds, m, factr, pgtol, epsilon, iprint, maxfun, maxiter, disp, callback, maxls) 191 192 res = _minimize_lbfgsb(fun, x0, args=args, jac=jac, bounds=bounds, --> 193 **opts) 194 d = {'grad': res['jac'], 195 'task': res['message'], /usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.pyc in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, maxls, **unknown_options) 328 # minimization routine wants f and g at the current x 329 # Overwrite f and g: --> 330 f, g = func_and_grad(x) 331 elif task_str.startswith(b'NEW_X'): 332 # new iteration /usr/lib/python2.7/dist-packages/scipy/optimize/lbfgsb.pyc in func_and_grad(x) 271 if jac is None: 272 def func_and_grad(x): --> 273 f = fun(x, *args) 274 g = _approx_fprime_helper(x, fun, epsilon, args=args, f0=f) 275 return f, g /usr/lib/python2.7/dist-packages/scipy/optimize/optimize.pyc in function_wrapper(*wrapper_args) 287 def function_wrapper(*wrapper_args): 288 ncalls[0] += 1 --> 289 return function(*(wrapper_args + args)) 290 291 return ncalls, function_wrapper /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/base/model.pyc in <lambda>(params, *args) 401 402 nobs = self.endog.shape[0] --> 403 f = lambda params, *args: -self.loglike(params, *args) / nobs 404 score = lambda params: -self.score(params) / nobs 405 try: /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/tsa/ar_model.pyc in loglike(self, params) 351 352 else: --> 353 return self._loglike_mle(params) 354 355 def score(self, params): /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/tsa/ar_model.pyc in _loglike_mle(self, params) 301 302 # get inv(Vp) Hamilton 5.3.7 --> 303 Vpinv = self._presample_varcov(params) 304 305 diffpVpinv = np.dot(np.dot(diffp.T, Vpinv), diffp).item() /statsmodels-0.6.1/debian/python-statsmodels/usr/lib/python2.7/dist-packages/statsmodels/tsa/ar_model.pyc in _presample_varcov(self, params) 258 for i in range(1, p1): 259 Vpinv[i-1, i-1:] = np.correlate(params0, params0[:i], --> 260 old_behavior=False)[:-1] 261 Vpinv[i-1, i-1:] -= np.correlate(params0[-i:], params0, 262 old_behavior=False)[:-1] TypeError: correlate() got an unexpected keyword argument 'old_behavior'
This just returns a regular array, but since the model has date information attached, you can get the prediction dates in a roundabout way.
In [8]:
print(ar_res.data.predict_dates)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-290-19edfc1685b6> in <module>() ----> 1 print(ar_res.data.predict_dates) NameError: name 'ar_res' is not defined
Note: This attribute only exists if predict has been called. It holds the dates associated with the last call to predict.
