时间序列模型

关注我,可以代做FF工作室

这个博主写的非常细了
(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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值