时间序列分析实例
作者:互联网
时间序列分析简介
可参考链接:
时间序列详解
时间序列针对不同曲线情况的预测方式
时间序列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])
标签:分析,plt,ARIMA,value,实例,Value,序列,output,data 来源: https://blog.csdn.net/wazmen/article/details/123226358