时间序列分析实例

时间序列分析简介

可参考链接:
时间序列详解
时间序列针对不同曲线情况的预测方式
时间序列python实例
python建立时间序列分析
理解ACF 和PACF
ADF检验理解
ADF检验补充

实例

某段时间日活预测
历史数据为2022-01-13至2022-02-27的日活数据,大致画出曲线,该曲线不够平滑
历史数据
1、进行ADF检验

from statsmodels.tsa.stattools import adfuller  #adf检验
temp = np.array(data['日活'])
t = adfuller(temp)  # ADF检验
output=pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used","Critical Value(1%)","Critical Value(5%)","Critical Value(10%)"],columns=['value'])
output['value']['Test Statistic Value'] = t[0]
output['value']['p-value'] = t[1]
output['value']['Lags Used'] = t[2]
output['value']['Number of Observations Used'] = t[3]
output['value']['Critical Value(1%)'] = t[4]['1%']
output['value']['Critical Value(5%)'] = t[4]['5%']
output['value']['Critical Value(10%)'] = t[4]['10%']
output

得到一下结果,p值较大,原假设为曲线为非平稳曲线,接受原假设,且t-statistic 为 -2.28747大于5%,此曲线非平稳
ADF检验具体参数见 时间序列分析之ADF检验
在这里插入图片描述
2、进行白噪声检验,曲线非白噪声

#白噪声检验,如果序列是白噪声,则没有研究意义,返回的是统计量和p值,原假设是有白噪声
from statsmodels.stats.diagnostic import acorr_ljungbox
print(acorr_ljungbox(data["日活"], lags=1)) 

3、对日活值进行一阶差分
画出差分处理后的曲线图并进行ADF检验,该差分曲线为平稳曲线
在这里插入图片描述
在这里插入图片描述
4、画出acf和pacf图来确定p、q值

AR模型对应p,根据偏自相关图的截尾位置确定p,ACF与PACF图的横轴均从0开始,如果PACF在2时还在置信区间以外,从3开始之后均在置信区间以内,则定p为2。MA模型对应q,根据自相关图的截尾位置确定q,确定方法同p

确定p、q皆为7。详细可见 ARIMA算法解析与Python实现

import statsmodels.api as sm     #acf,pacf图

fig = plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(data2,lags=18,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(data2,lags=18,ax=ax2)
plt.show()

在这里插入图片描述
5、建立ARIMA模型

注意日期要改为索引不然后面会报错
data = data.set_index(['日期'],drop=True)
data['日活'] = data['日活'].astype('float64')

from statsmodels.tsa.arima_model import ARIMA  
model=ARIMA(data,(7,1,7)).fit(method='css')  #ARIMA(data, (p, 1, q))

画出预测出来的差分和实际差分作比较

predictions_ARIMA_diff = pd.Series(model.fittedvalues, copy=True)
plt.figure(figsize=(10, 6))
plt.plot(data2,label = 'real')
plt.plot(predictions_ARIMA_diff,label = 'forecast')
plt.legend()
plt.show()

在这里插入图片描述
6、将预测值加到实际值上去预测后一天
这里注意差分值和实际值的匹配

predictions = [i + j for i, j in zip(list(predictions_ARIMA_diff), list(data["日活"][7:45]))]
prediction_sales = pd.DataFrame(data=predictions,index=data.index[8:46],columns=['差分'])

plt.figure(figsize=(10, 6))
plt.plot(prediction_sales,label="forecast")
plt.plot(data,label="real")
plt.xlabel('日期',fontsize=12,verticalalignment='top')
plt.ylabel('销量',fontsize=14,horizontalalignment='center')
plt.legend()
plt.show()

在这里插入图片描述
对后续进行预测
返回预测结果, 标准误差, 和置信区间

pridict = list(model.forecast(5)[0])

在这里插入图片描述

如果考虑季节性因素,分析方法可参考季节性ARIMA模型
季节指数计算方式:excel处理季节性指数

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值