diff --git a/doc/examples/quick_start_example.ipynb b/doc/examples/quick_start_example.ipynb index 76992e831..7e94dc0b9 100644 --- a/doc/examples/quick_start_example.ipynb +++ b/doc/examples/quick_start_example.ipynb @@ -18,7 +18,9 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -74,7 +76,9 @@ { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# this is a dataset from R\n", @@ -110,7 +114,9 @@ { "cell_type": "code", "execution_count": 3, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "from pyramid.arima import ARIMA\n", @@ -128,7 +134,9 @@ { "cell_type": "code", "execution_count": 4, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "fit = ARIMA(order=(1, 1, 1), seasonal_order=None).fit(y=wineind)" @@ -146,8 +154,70 @@ { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "metadata": { + "collapsed": false + }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fitting ARIMA: order=(1, 1, 2) seasonal_order=(0, 1, 1, 12); AIC=3066.771, BIC=3085.794\n", + "Fitting ARIMA: order=(1, 1, 1) seasonal_order=(0, 1, 1, 12); AIC=3066.811, BIC=3082.663\n", + "Fitting ARIMA: order=(1, 1, 1) seasonal_order=(1, 1, 1, 12); AIC=3067.666, BIC=3086.688\n", + "Fitting ARIMA: order=(1, 1, 2) seasonal_order=(1, 1, 1, 12); AIC=3068.086, BIC=3090.280\n", + "Fitting ARIMA: order=(1, 1, 2) seasonal_order=(0, 1, 2, 12); AIC=3067.766, BIC=3089.959\n", + "Fitting ARIMA: order=(1, 1, 3) seasonal_order=(0, 1, 1, 12); AIC=3068.842, BIC=3091.036\n", + "Fitting ARIMA: order=(1, 1, 1) seasonal_order=(2, 1, 1, 12); AIC=3070.302, BIC=3092.495\n", + "Fitting ARIMA: order=(1, 1, 1) seasonal_order=(1, 1, 2, 12); AIC=3068.757, BIC=3090.951\n", + "Fitting ARIMA: order=(1, 1, 1) seasonal_order=(0, 1, 2, 12); AIC=3067.669, BIC=3086.692\n", + "Fitting ARIMA: order=(1, 1, 3) seasonal_order=(1, 1, 1, 12); AIC=3070.214, BIC=3095.578\n", + "Fitting ARIMA: order=(1, 1, 2) seasonal_order=(2, 1, 1, 12); AIC=3069.948, BIC=3095.312\n", + "Fitting ARIMA: order=(2, 1, 1) seasonal_order=(0, 1, 1, 12); AIC=3067.485, BIC=3086.508\n", + "Fitting ARIMA: order=(1, 1, 2) seasonal_order=(1, 1, 2, 12); AIC=3069.717, BIC=3095.081\n", + "Fitting ARIMA: order=(2, 1, 1) seasonal_order=(1, 1, 1, 12); AIC=3068.672, BIC=3090.865\n", + "Fitting ARIMA: order=(1, 1, 1) seasonal_order=(2, 1, 2, 12); AIC=3070.103, BIC=3095.467\n", + "Fitting ARIMA: order=(2, 1, 1) seasonal_order=(0, 1, 2, 12); AIC=3068.503, BIC=3090.696\n", + "Fitting ARIMA: order=(1, 1, 3) seasonal_order=(0, 1, 2, 12); AIC=3069.854, BIC=3095.218\n", + "Fitting ARIMA: order=(2, 1, 2) seasonal_order=(0, 1, 1, 12); AIC=3068.701, BIC=3090.895\n", + "Fitting ARIMA: order=(2, 1, 1) seasonal_order=(2, 1, 1, 12); AIC=3070.641, BIC=3096.005\n", + "Fitting ARIMA: order=(2, 1, 2) seasonal_order=(1, 1, 1, 12); AIC=3070.025, BIC=3095.389\n", + "Fitting ARIMA: order=(1, 1, 3) seasonal_order=(2, 1, 1, 12); AIC=3072.048, BIC=3100.582\n", + "Fitting ARIMA: order=(1, 1, 3) seasonal_order=(1, 1, 2, 12); AIC=3071.758, BIC=3100.293\n", + "Fitting ARIMA: order=(1, 1, 2) seasonal_order=(2, 1, 2, 12); AIC=3069.992, BIC=3098.526\n", + "Fitting ARIMA: order=(2, 1, 1) seasonal_order=(1, 1, 2, 12); AIC=3070.503, BIC=3095.866\n", + "Fitting ARIMA: order=(2, 1, 3) seasonal_order=(0, 1, 1, 12); AIC=3070.642, BIC=3096.006\n", + "Fitting ARIMA: order=(2, 1, 2) seasonal_order=(0, 1, 2, 12); AIC=3069.726, BIC=3095.090\n", + "Fitting ARIMA: order=(2, 1, 3) seasonal_order=(1, 1, 1, 12); AIC=3071.523, BIC=3100.057\n", + "Fitting ARIMA: order=(2, 1, 2) seasonal_order=(2, 1, 1, 12); AIC=3071.901, BIC=3100.435\n", + "Fitting ARIMA: order=(2, 1, 2) seasonal_order=(1, 1, 2, 12); AIC=3071.683, BIC=3100.218\n", + "Fitting ARIMA: order=(1, 1, 3) seasonal_order=(2, 1, 2, 12); AIC=3072.042, BIC=3103.747\n", + "Fitting ARIMA: order=(3, 1, 1) seasonal_order=(0, 1, 1, 12); AIC=3069.393, BIC=3091.586\n", + "Fitting ARIMA: order=(3, 1, 1) seasonal_order=(1, 1, 1, 12); AIC=3070.667, BIC=3096.031\n", + "Fitting ARIMA: order=(2, 1, 1) seasonal_order=(2, 1, 2, 12); AIC=3071.047, BIC=3099.581\n", + "Fitting ARIMA: order=(3, 1, 1) seasonal_order=(0, 1, 2, 12); AIC=3070.436, BIC=3095.800\n", + "Fitting ARIMA: order=(2, 1, 3) seasonal_order=(0, 1, 2, 12); AIC=3071.600, BIC=3100.135\n", + "Fitting ARIMA: order=(3, 1, 2) seasonal_order=(0, 1, 1, 12); AIC=nan, BIC=nan\n", + "Fitting ARIMA: order=(3, 1, 2) seasonal_order=(0, 1, 2, 12); AIC=nan, BIC=nan\n", + "Fitting ARIMA: order=(3, 1, 2) seasonal_order=(1, 1, 1, 12); AIC=nan, BIC=nan\n", + "Fitting ARIMA: order=(3, 1, 2) seasonal_order=(1, 1, 2, 12); AIC=nan, BIC=nan\n", + "Fitting ARIMA: order=(3, 1, 2) seasonal_order=(2, 1, 1, 12); AIC=nan, BIC=nan\n", + "Fitting ARIMA: order=(3, 1, 2) seasonal_order=(2, 1, 2, 12); AIC=nan, BIC=nan\n", + "Fitting ARIMA: order=(3, 1, 3) seasonal_order=(0, 1, 1, 12); AIC=3072.626, BIC=3101.160\n", + "Fitting ARIMA: order=(3, 1, 1) seasonal_order=(2, 1, 1, 12); AIC=3072.617, BIC=3101.151\n", + "Fitting ARIMA: order=(3, 1, 1) seasonal_order=(1, 1, 2, 12); AIC=3072.395, BIC=3100.930\n", + "Fitting ARIMA: order=(2, 1, 2) seasonal_order=(2, 1, 2, 12); AIC=3072.043, BIC=3103.748\n", + "Fitting ARIMA: order=(3, 1, 3) seasonal_order=(1, 1, 1, 12); AIC=3073.539, BIC=3105.244\n", + "Fitting ARIMA: order=(2, 1, 3) seasonal_order=(1, 1, 2, 12); AIC=3073.554, BIC=3105.259\n", + "Fitting ARIMA: order=(2, 1, 3) seasonal_order=(2, 1, 1, 12); AIC=3073.517, BIC=3105.222\n", + "Fitting ARIMA: order=(3, 1, 3) seasonal_order=(0, 1, 2, 12); AIC=3073.580, BIC=3105.285\n", + "Fitting ARIMA: order=(2, 1, 3) seasonal_order=(2, 1, 2, 12); AIC=3074.239, BIC=3109.114\n", + "Fitting ARIMA: order=(3, 1, 1) seasonal_order=(2, 1, 2, 12); AIC=3072.623, BIC=3104.328\n", + "Fitting ARIMA: order=(3, 1, 3) seasonal_order=(2, 1, 1, 12); AIC=3075.530, BIC=3110.405\n", + "Fitting ARIMA: order=(3, 1, 3) seasonal_order=(1, 1, 2, 12); AIC=3075.561, BIC=3110.437\n", + "Fitting ARIMA: order=(3, 1, 3) seasonal_order=(2, 1, 2, 12); AIC=3077.492, BIC=3115.537\n" + ] + }, { "data": { "text/html": [ @@ -163,7 +233,7 @@ " Date: Fri, 02 Jun 2017 AIC 3066.771 \n", "\n", "\n", - " Time: 11:21:21 BIC 3085.794 \n", + " Time: 12:36:29 BIC 3085.794 \n", "\n", "\n", " Sample: 0 HQIC 3074.487 \n", @@ -212,17 +282,51 @@ " Prob(H) (two-sided): 0.54 Kurtosis: 4.31 \n", "\n", "" + ], + "text/plain": [ + "\n", + "\"\"\"\n", + " Statespace Model Results \n", + "==========================================================================================\n", + "Dep. Variable: y No. Observations: 176\n", + "Model: SARIMAX(1, 1, 2)x(0, 1, 1, 12) Log Likelihood -1527.386\n", + "Date: Fri, 02 Jun 2017 AIC 3066.771\n", + "Time: 12:36:29 BIC 3085.794\n", + "Sample: 0 HQIC 3074.487\n", + " - 176 \n", + "Covariance Type: opg \n", + "==============================================================================\n", + " coef std err z P>|z| [0.025 0.975]\n", + "------------------------------------------------------------------------------\n", + "intercept -100.7446 72.306 -1.393 0.164 -242.462 40.973\n", + "ar.L1 -0.5139 0.390 -1.319 0.187 -1.278 0.250\n", + "ma.L1 -0.0791 0.403 -0.196 0.844 -0.869 0.710\n", + "ma.L2 -0.4438 0.223 -1.988 0.047 -0.881 -0.006\n", + "ma.S.L12 -0.4021 0.054 -7.448 0.000 -0.508 -0.296\n", + "sigma2 7.663e+06 7.3e+05 10.500 0.000 6.23e+06 9.09e+06\n", + "===================================================================================\n", + "Ljung-Box (Q): 48.66 Jarque-Bera (JB): 21.62\n", + "Prob(Q): 0.16 Prob(JB): 0.00\n", + "Heteroskedasticity (H): 1.18 Skew: -0.61\n", + "Prob(H) (two-sided): 0.54 Kurtosis: 4.31\n", + "===================================================================================\n", + "\n", + "Warnings:\n", + "[1] Covariance matrix calculated using the outer product of gradients (complex-step).\n", + "[2] Covariance matrix is singular or near-singular, with condition number 8.15e+14. Standard errors may be unstable.\n", + "\"\"\"" ] }, - "output_type": "execute_result", - "metadata": {} + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "from pyramid.arima import auto_arima\n", "\n", "fit = auto_arima(wineind, start_p=1, start_q=1, max_p=3, max_q=3, m=12,\n", - " start_P=0, seasonal=True, n_jobs=-1, d=1, D=1,\n", + " start_P=0, seasonal=True, n_jobs=-1, d=1, D=1, trace=True,\n", " error_action='ignore', # don't want to know if an order does not work\n", " suppress_warnings=True) # don't want convergence warnings\n", "\n", @@ -240,8 +344,10 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, + "execution_count": 6, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -255,9 +361,9 @@ " 16734.91315808])" ] }, - "execution_count": 9, - "output_type": "execute_result", - "metadata": {} + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -274,8 +380,10 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, + "execution_count": 7, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -283,15 +391,102 @@ "\n", "
\n", " \n", - " Loading BokehJS ...\n", + " Loading BokehJS ...\n", "
" ] }, - "output_type": "execute_result", - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "metadata": {} + "data": { + "application/javascript": [ + "\n", + "(function(global) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " if (typeof (window._bokeh_onload_callbacks) === \"undefined\") {\n", + " window._bokeh_onload_callbacks = [];\n", + " }\n", + "\n", + " function run_callbacks() {\n", + " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", + " delete window._bokeh_onload_callbacks\n", + " console.info(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(js_urls, callback) {\n", + " window._bokeh_onload_callbacks.push(callback);\n", + " if (window._bokeh_is_loading > 0) {\n", + " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " window._bokeh_is_loading = js_urls.length;\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " var s = document.createElement('script');\n", + " s.src = url;\n", + " s.async = false;\n", + " s.onreadystatechange = s.onload = function() {\n", + " window._bokeh_is_loading--;\n", + " if (window._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", + " run_callbacks()\n", + " }\n", + " };\n", + " s.onerror = function() {\n", + " console.warn(\"failed to load library \" + url);\n", + " };\n", + " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", + " }\n", + " };\n", + "\n", + " var js_urls = ['https://cdn.pydata.org/bokeh/release/bokeh-0.12.0.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.0.min.js', 'https://cdn.pydata.org/bokeh/release/bokeh-compiler-0.12.0.min.js'];\n", + "\n", + " var inline_js = [\n", + " function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + " \n", + " function(Bokeh) {\n", + " Bokeh.$(\"#f70c02e8-0cb9-476a-ae7e-b303861dadc3\").text(\"BokehJS successfully loaded\");\n", + " },\n", + " function(Bokeh) {\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.0.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.0.min.css\");\n", + " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.0.min.css\");\n", + " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.0.min.css\");\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i](window.Bokeh);\n", + " }\n", + " }\n", + "\n", + " if (window._bokeh_is_loading === 0) {\n", + " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(js_urls, function() {\n", + " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(this));" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -301,8 +496,10 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, + "execution_count": 8, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -310,7 +507,7 @@ "\n", "\n", "
\n", - "
\n", + "
\n", "
\n", "" ] }, - "output_type": "execute_result", - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { "data": { "text/html": [ - "

<Bokeh Notebook handle for In[11]>

" + "

<Bokeh Notebook handle for In[8]>

" + ], + "text/plain": [ + "" ] }, - "output_type": "execute_result", - "metadata": {} + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -453,11 +654,11 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], - "source": [ - "" - ] + "source": [] } ], "metadata": { @@ -470,7 +671,7 @@ "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2.0 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", @@ -482,4 +683,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} \ No newline at end of file +} diff --git a/pyramid/arima/auto.py b/pyramid/arima/auto.py index f739f4dd9..bc9ccf442 100644 --- a/pyramid/arima/auto.py +++ b/pyramid/arima/auto.py @@ -413,14 +413,11 @@ def generator(): def _fit_arima(x, xreg, order, seasonal_order, start_params, trend, method, transparams, solver, maxiter, disp, callback, fit_params, suppress_warnings, trace, error_action): - if trace: - print('Fitting ARIMA: %s' % _fmt_order_info(order, seasonal_order)) - try: - return ARIMA(order=order, seasonal_order=seasonal_order, start_params=start_params, - trend=trend, method=method, transparams=transparams, - solver=solver, maxiter=maxiter, disp=disp, - callback=callback, suppress_warnings=suppress_warnings)\ + fit = ARIMA(order=order, seasonal_order=seasonal_order, start_params=start_params, + trend=trend, method=method, transparams=transparams, + solver=solver, maxiter=maxiter, disp=disp, + callback=callback, suppress_warnings=suppress_warnings)\ .fit(x, exogenous=xreg, **fit_params) # for non-stationarity errors, return None @@ -430,8 +427,16 @@ def _fit_arima(x, xreg, order, seasonal_order, start_params, trend, method, tran elif error_action == 'raise': raise v # otherwise it's 'ignore' - return None + fit = None + + # do trace + if trace: + print('Fit ARIMA: %s; AIC=%.3f, BIC=%.3f' + % (_fmt_order_info(order, seasonal_order), + fit.aic() if fit is not None else np.nan, + fit.bic() if fit is not None else np.nan)) + return fit def _fmt_order_info(order, seasonal_order): return 'order=(%i, %i, %i)%s' \