最近学习时间序列,学习到ARIMA模型时,采用了前人的教程(在此感谢),但在新的版本上运行出现错误。
Python == 3.9
statsmodels == 0.13.2
具体代码如下:
# 定阶
df['销量'] = df['销量'].astype(float) # 转换为float类型
pmax = int(len(d_data) / 10)
qmax = int(len(d_data) / 10)
bic_matrix = [] # bic矩阵
for p in range(pmax + 1):
tmp = []
for q in range(qmax + 1):
try:
tmp.append(ARIMA(df, (p, 1, q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
print('*'*20)
print(bic_matrix)
bic_matrix = pd.DataFrame(bic_matrix)
# bic_matrix
print('-'*20)
print(bic_matrix)
p, q = bic_matrix.stack().astype('float64').idxmin()
print('BIC最小的p值和q值为:%s. %s' % (p, q))
其结果为None
********************
[[None, None, None, None], [None, None, None, None], [None, None, None, None], [None, None, None, None]]
--------------------
0 1 2 3
0 None None None None
1 None None None None
2 None None None None
3 None None None None
在寻找解决方案过程中,查询资料,发现问题如下:
NotImplementedError:statsmodels.tsa.arima_model.ARMA 和 statsmodels.tsa.arima_model.ARIMA 已被删除,
以支持 statsmodels.tsa.arima.model.ARIMA(注意 arima 和模型之间的 .)和 statsmodels.tsa.SARIMAX。
statsmodels.tsa.arima.model.ARIMA 使用状态空间框架,并且经过良好测试和维护。 它还提供了替代的专用参数估计器。
因此第一步是修改引用
from statsmodels.tsa.arima.model import ARIMA
查询官网
statsmodels.tsa.arima.model.ARIMA¶
class statsmodels.tsa.arima.model.ARIMA(endog, exog=None, order=(0, 0, 0), seasonal_order=(0, 0, 0, 0), trend=None, enforce_stationarity=True, enforce_invertibility=True, concentrate_scale=False, trend_offset=1, dates=None, freq=None, missing='none', validate_specification=True)[source]¶
因此在具体代码使用中,要调整参数表达方式,加上“order=”:
tmp.append(ARIMA(df, order=(p, 1, q)).fit().bic)
运行代码后,看到一堆警告,过了
......
tsa_model.py:471: ValueWarning: No frequency information was provided, so inferred frequency D will be used.
self._init_dates(dates, freq)
********************
[[438.40889266001903, 424.35050659189903, 427.6535595828169, 426.41822085730945], [422.817414883257, 426.3013233712491, 428.1513898166602, 429.74690851750046], [426.3390714267073, 426.66022693563957, 429.95381925396936, 433.2141304102066], [429.54731418552717, 429.82566773256326, 433.28396726406226, 432.60892135741256]]
--------------------
0 1 2 3
0 438.408893 424.350507 427.653560 426.418221
1 422.817415 426.301323 428.151390 429.746909
2 426.339071 426.660227 429.953819 433.214130
3 429.547314 429.825668 433.283967 432.608921
BIC最小的p值和q值为:1. 0
附上该部分的完整代码供各位参考:
from statsmodels.tsa.arima.model import ARIMA
# 定阶
df['销量'] = df['销量'].astype(float) # 转换为float类型
pmax = int(len(d_data) / 10)
qmax = int(len(d_data) / 10)
bic_matrix = [] # bic矩阵
for p in range(pmax + 1):
tmp = []
for q in range(qmax + 1):
try:
tmp.append(ARIMA(df, order=(p, 1, q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
print('*'*20)
print(bic_matrix)
bic_matrix = pd.DataFrame(bic_matrix)
# bic_matrix
print('-'*20)
print(bic_matrix)
p, q = bic_matrix.stack().astype('float64').idxmin()
print('BIC最小的p值和q值为:%s. %s' % (p, q))
在他人基础上修改的完整代码和数据文件可在GitHub获取。具体代码出处已记不清楚,在此感谢。
链接:https://github.com/flyhawksz/Time-Series-Study