当前位置: 首页 > 工具软件 > bic > 使用案例 >

解决:ARIMA模型,用BIC矩阵确定p、q参数的时候BIC矩阵输出全是None

卫博学
2023-12-01

ARIMA模型,用BIC矩阵确定p、q参数的时候BIC矩阵输出全是None

最近学习时间序列,学习到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

 类似资料: