# -*- coding: utf-8 -*- # # Handle inconsistencies in the statsmodels API versions from collections.abc import Iterable from packaging.version import Version import statsmodels as sm __all__ = [ 'bind_df_model' ] _sm_version = sm.__version__ def bind_df_model(model_fit, arima_results): """Set model degrees of freedom. Older versions of statsmodels don't handle this issue. Sets the model degrees of freedom in place if not already present. Parameters ---------- model_fit : ARMA, ARIMA or SARIMAX The fitted model. arima_results : ModelResultsWrapper The results wrapper. """ if not hasattr(arima_results, 'df_model'): df_model = model_fit.k_exog + model_fit.k_trend + \ model_fit.k_ar + model_fit.k_ma + \ model_fit.k_seasonal_ar + model_fit.k_seasonal_ma setattr(arima_results, 'df_model', df_model) def check_seasonal_order(order): """Check the seasonal order Statsmodels 0.11.0 introduced a check for seasonal order == 1 that can raise a ValueError, but some of our old defaults allow for m == 1 in an otherwise null seasonal order. Parameters ---------- order : tuple The existing seasonal order """ # If order[0] is an iterable, but not a string then we don't perform check. # Otherwise we perform the check and override order if it satisfies check. # See issue#370: https://github.com/alkaline-ml/pmdarima/issues/370 if isinstance(order[0], Iterable) and not isinstance(order[0], str): return order else: if sum(order[:3]) == 0 and order[-1] == 1: order = (0, 0, 0, 0) # user's order may be invalid, but we'll let statsmodels' validation # handle that. return order def _use_sm13(): return Version(sm.__version__) >= Version("0.13.0")