66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
# -*- 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")
|