Dates in timeseries modelsΒΆ

Link to Notebook GitHub

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.