关注我,可以代做
这个博主写的非常细了
(https://blog.csdn.net/qq_29831163/article/details/89440215?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161865557316780274118767%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161865557316780274118767&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-89440215.first_rank_v2_pc_rank_v29&utm_term=%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E6%A8%A1%E5%9E%8B)
只不过我发现他做的热力图没有显示d,这里要说一下d呢其实应该是最开始就要先确定的但是呢有许多小伙伴比较懒包括我在内,干脆直接来一个循环得到热力图确定p,q,d,这里面确定的d还需要返回去检验是不是真的是平稳序列,很重要哦。
同时我又加上了热力图的一些显示不完全更正的代码与保存,这里直接放那部分。
ps:循环这种方法是很粗暴的是不可取的,不过我当时受够了根据acf和pacf图确定p,q得不到模型的烦恼,又懒得一个个比较数想整个高端的图于是就弄了热力图。
这里要说一下因为是循环所以运行时间就会变长,建议!边循环边存储到本地csv,这里我没有编写存储,鄙人当时比较懒。
#设置遍历循环的初始条件,以热力图的形式展示,跟AIC定阶作用一样
p_min = 0
q_min = 0
d_min = 0
d_max = 5
p_max = 10
q_max = 12
results_aic = pd.DataFrame(index=['AR{}'.format(i) \
for i in range(p_min,p_max+1)],\
columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])
result_dist = dict(zip([_ for _ in range(d_min,d_max+1)],[results_aic for _ in range(d_min,d_max+1)]))
# itertools.product 返回p,q中的元素的笛卡尔积的元组
for p,d,q in itertools.product(range(p_min,p_max+1),\
range(d_min,d_max+1),range(q_min,q_max+1)):
if p==0 and q==0:
results_aic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nan
continue
try:
model = sm.tsa.ARIMA(Data, order=(p, d, q))
results = model.fit()
#返回不同pq下的model的BIC值
result_dist.get(d).loc['AR{}'.format(p), 'MA{}'.format(q)] = results.aic
except:
continue
for _ in range(d_min,d_max+1):
results_aic = result_dist.get(_)
results_aic = results_aic[results_aic.columns].astype(float)
fig, ax = plt.subplots(figsize=(12,8))
ax = sns.heatmap(results_aic,
#mask=results_aic.isnull(),
ax=ax,
annot=True, #将数字显示在热力图上
fmt='.2f'
)
ax.set_title('AIC')
bottom, top = ax.get_ylim()
ax.set_ylim(bottom + 0.5, top - 0.5)
plt.savefig("img\\时间序列模型\\aic_d%s.png"%str(_),dpi = 2000)
plt.close()