alkaline-ml / pmdarima

A statistical library designed to fill the void in Python's time series analysis capabilities, including the equivalent of R's auto.arima function.
https://www.alkaline-ml.com/pmdarima
MIT License
1.58k stars 234 forks source link

'ARIMA' object has no attribute 'forecast' #145

Closed JuanFT closed 5 years ago

JuanFT commented 5 years ago

Description

I have created a function with the Auto Arima together with the model fit and the forecast (predict??). It works ok, but when I put it in the for loop it shows up this error. I tried also changing to model.fit(disp=0), instead of model.fit(train), but it shows a different error "fit() missing 1 required argument 'y'. AttributeError: 'ARIMA' object has no attribute 'forecast'

Steps/Code to Reproduce

def AutoARIMAForecasting(Actual):
    model_def = auto_arima(dataImport_sel1, start_p=1, start_q=1,
                           max_p=3, max_q=3, m=12,
                           start_P=0, seasonal=True,
                           d=1, D=1, trace=True,
                           error_action='ignore',  
                           suppress_warnings=True, 
                           stepwise=True)
    #model_fit_def = model_def.fit(disp=0)
    model_fit_def = model_def.fit(train)
    forecast_def,stderr_def,conf_int_def = model_fit_def.forecast()[0]
    return forecast_def,stderr_def

X = dataImport_sel.values #we select only the values, droping the index.
split_point=len(X)-144 #we take 24 hours of the last day of data to test 24*6=144
train, test = X[0:split_point], X[split_point:len(X)] #slice data into train and test

#new arrays to store actual and predictions
history = [x for x in train]
predictions = list()

#in a for loop, predict values using Auto-ARIMA model
for t in range(len(test)):
    obs = test[t] # observed value
    forecast_def,stderr_def=AutoARIMAForecasting(history)
    print('Actual=%f, Predicted=%f' % (obs, forecast_def))
    predictions.append(forecast_def)
    history.append(obs)
error = mean_squared_error(test, predictions)
print('Test MSE: %.3f' % error)
# plot
#pyplot.plot(X)
pyplot.plot(test)
pyplot.plot(predictions, color='red')
pyplot.show()
13 forecast_def,stderr_def=AutoARIMAForecasting(history) 14 print('Actual=%f, Predicted=%f' % (obs, forecast_def)) 15 predictions.append(forecast_def) in AutoARIMAForecasting(Actual) 10 #model_fit_def = model_def.fit(disp=0) 11 model_fit_def = model_def.fit(train) ---> 12 forecast_def,stderr_def,conf_int_def = model_fit_def.forecast()[0] 13 return forecast_def,stderr_def 14 #The ARIMA model can be used to forecast future time steps. AttributeError: 'ARIMA' object has no attribute 'forecast' #### Versions pip freeze alabaster==0.7.12 anaconda-client==1.7.2 anaconda-navigator==1.9.7 anaconda-project==0.8.2 appnope==0.1.0 appscript==1.0.1 asn1crypto==0.24.0 astroid==2.1.0 astropy==3.1 atomicwrites==1.2.1 attrs==18.2.0 Babel==2.6.0 backcall==0.1.0 backports.os==0.1.1 backports.shutil-get-terminal-size==1.0.0 beautifulsoup4==4.6.3 bitarray==0.8.3 bkcharts==0.2 blaze==0.11.3 bleach==3.0.2 bokeh==1.0.2 boto==2.49.0 Bottleneck==1.2.1 certifi==2019.3.9 cffi==1.11.5 chardet==3.0.4 Click==7.0 cloudpickle==0.6.1 clyent==1.2.2 colorama==0.4.1 conda==4.6.14 conda-build==3.17.6 conda-verify==3.1.1 contextlib2==0.5.5 cryptography==2.3.1 cycler==0.10.0 Cython==0.29.2 cytoolz==0.9.0.1 dask==1.0.0 datashape==0.5.4 decorator==4.3.0 defusedxml==0.5.0 distributed==1.25.1 docutils==0.14 entrypoints==0.2.3 et-xmlfile==1.0.1 fastcache==1.0.2 filelock==3.0.10 Flask==1.0.2 Flask-Cors==3.0.7 future==0.17.1 gevent==1.3.7 glob2==0.6 gmpy2==2.0.8 greenlet==0.4.15 h5py==2.8.0 heapdict==1.0.0 html5lib==1.0.1 idna==2.8 imageio==2.4.1 imagesize==1.1.0 importlib-metadata==0.6 ipykernel==5.1.0 ipython==7.2.0 ipython-genutils==0.2.0 ipywidgets==7.4.2 isort==4.3.4 itsdangerous==1.1.0 jdcal==1.4 jedi==0.13.2 Jinja2==2.10 jsonschema==2.6.0 jupyter==1.0.0 jupyter-client==5.2.4 jupyter-console==6.0.0 jupyter-core==4.4.0 jupyterlab==0.35.3 jupyterlab-server==0.2.0 keyring==17.0.0 kiwisolver==1.0.1 lazy-object-proxy==1.3.1 libarchive-c==2.8 lief==0.9.0 llvmlite==0.26.0 locket==0.2.0 lxml==4.2.5 MarkupSafe==1.1.0 matplotlib==3.0.2 mccabe==0.6.1 mistune==0.8.4 mkl-fft==1.0.6 mkl-random==1.0.2 more-itertools==4.3.0 mpmath==1.1.0 msgpack==0.5.6 multipledispatch==0.6.0 navigator-updater==0.2.1 nbconvert==5.4.0 nbformat==4.4.0 NeoBase==0.19 networkx==2.2 nltk==3.4 nose==1.3.7 notebook==5.7.4 numba==0.41.0 numexpr==2.6.8 numpy==1.16.4 numpydoc==0.8.0 odo==0.5.1 olefile==0.46 openpyxl==2.5.12 packaging==18.0 pandas==0.23.4 pandocfilters==1.4.2 parso==0.3.1 partd==0.3.9 path.py==11.5.0 pathlib2==2.3.3 patsy==0.5.1 pep8==1.7.1 pexpect==4.6.0 pickleshare==0.7.5 Pillow==5.3.0 pkginfo==1.4.2 pluggy==0.8.0 ply==3.11 pmdarima==1.2.0 prometheus-client==0.5.0 prompt-toolkit==2.0.7 psutil==5.4.8 ptyprocess==0.6.0 py==1.7.0 pycodestyle==2.4.0 pycosat==0.6.3 pycparser==2.19 pycrypto==2.6.1 pycurl==7.43.0.2 pyflakes==2.0.0 Pygments==2.3.1 pylint==2.2.2 pyodbc==4.0.25 pyOpenSSL==18.0.0 pyparsing==2.3.0 PySocks==1.6.8 pytest==4.0.2 pytest-arraydiff==0.3 pytest-astropy==0.5.0 pytest-doctestplus==0.2.0 pytest-openfiles==0.3.1 pytest-remotedata==0.3.1 python-dateutil==2.7.5 pytz==2018.7 PyWavelets==1.0.1 PyYAML==3.13 pyzmq==17.1.2 QtAwesome==0.5.3 qtconsole==4.4.3 QtPy==1.5.2 requests==2.21.0 rope==0.11.0 ruamel-yaml==0.15.46 scikit-image==0.14.1 scikit-learn==0.20.1 scipy==1.3.0 seaborn==0.9.0 Send2Trash==1.5.0 simplegeneric==0.8.1 singledispatch==3.4.0.3 six==1.12.0 snowballstemmer==1.2.1 sortedcollections==1.0.1 sortedcontainers==2.1.0 Sphinx==1.8.2 sphinxcontrib-websupport==1.1.0 spyder==3.3.2 spyder-kernels==0.3.0 SQLAlchemy==1.2.15 statsmodels==0.9.0 sympy==1.3 tables==3.4.4 tblib==1.3.2 terminado==0.8.1 testpath==0.4.2 toolz==0.9.0 tornado==5.1.1 tqdm==4.28.1 traitlets==4.3.2 unicodecsv==0.14.1 urllib3==1.24.1 wcwidth==0.1.7 webencodings==0.5.1 Werkzeug==0.14.1 widgetsnbextension==3.4.2 wrapt==1.10.11 wurlitzer==1.0.2 xlrd==1.2.0 XlsxWriter==1.1.2 xlwings==0.15.1 xlwt==1.3.0 zict==0.1.3
tgsmith61591 commented 5 years ago

First of all, we don't define a forecast method, so I'm not sure where that expectation came from... second, it looks like you are mixing up statsmodels code and our package. There are a lot of errors and inconsistencies in your code:

  1. You don't need to fit your auto-arima model as it's already been fit:
model_def = auto_arima(dataImport_sel1, start_p=1, start_q=1,
                           max_p=3, max_q=3, m=12,
                           start_P=0, seasonal=True,
                           d=1, D=1, trace=True,
                           error_action='ignore',  
                           suppress_warnings=True, 
                           stepwise=True)
model_fit_def = model_def.fit(train)  # you don't need to do this.
  1. Even if we defined a forecast method, this would break, as you're trying to unpack a tuple after indexing out the first element:
forecast_def,stderr_def,conf_int_def = model_fit_def.forecast()[0]

I think you're looking at statsmodels examples and trying to use pmdarima, which isn't going to work. Check out our examples of use and the API documentation for the ARIMA class.

Namely, we try to be scikit-learn-esque. Meaning predict for inference, fit for train. To get in-sample predictions, you'd use predict_in_sample.

JuanFT commented 5 years ago

Thank you Taylor, that is very useful information. However, I'm still struggling to understand why the fit is not necessary, as you said, "it's already been fit".

I see examples of Auto Arima with fit

I see examples of Auto Arima without fit

My goal is to create a model (i) prove that it is accurate splitting data between train and test, (ii) forecast future values (iii) when I get new values, compare the forecast with the new values and (iv) show if it is within the confidence interval.

Any guideline will be much appreciated. Thank you!

tgsmith61591 commented 5 years ago

Because the auto arima function calls fit internally. The examples you show that explicitly call it were either calling it directly on the ARIMA object or on the pipeline. Feel free to dig through the source to grok it better. pmdarima/arima/auto.py