Python——多变量时间序列的建模与预测_数据可视化

1: 数据准备

在使用数据建立时间序列预测模型之前,使用下面的程序导入数据后,可以发现数据中一共有三列数据,分别是时间数据Date,用户数量变量number,以及流量波动变量PDCP。

## 数据导入与可视化
tsdf = pd.read_csv("data/chap08/时序波动.csv",parse_dates=["Date"])
print(tsdf.head())
                 Date  number   PDCP
0 2021-08-28 00:00:00   83.40  74.63
1 2021-08-28 01:00:00   62.40  41.93
2 2021-08-28 02:00:00   64.40  40.28
3 2021-08-28 03:00:00   59.86  28.92
4 2021-08-28 04:00:00   54.13  15.06

针对这两个时序数据,可以通过可视化的方式观察数据的波动情况,更好的分析数据的趋势。因此,运行下面的程序可获得两个序列取值随时间的变化情况,从图像中可以发现:两个事件序列有很强的周期性,而且这个周期可以认为是以24小时一个周期。

## 可视化两个时间序列的变化情况
ax = plt.subplot(1,1,1)
tsdf.plot(x = "Date",y = "number",style = "b-o",figsize=(14,6),
          ax = ax,markersize = 3)
tsdf.plot(x = "Date",y = "PDCP",style = "r-s",figsize=(14,6),
          ax = ax,markersize = 3)
plt.title("时间序列数据的波动情况")
plt.ylabel("Value")
plt.show()

Python——多变量时间序列的建模与预测_数据可视化_02

2: VAR多变量时间序列的建模与预测

下面使用VAR模型,对两个时间序列同时进行建模和预测,希望能够获得更好的预测精度。建立VAR模型会用到kats库用于VARModel(),首先需要使用该库中的TimeSeriesData()对数据进行预处理,同样使用后面的40个样本作为测试集,数据准备程序如下所示:

## 数据准备
usedf = tsdf.copy(deep = True)
usedf.columns = ["time","number","PDCP"]
## 数据切分为训练集和测试机
train =usedf.iloc[0:-40,:]
test = usedf.iloc[-40:,:]
train = TimeSeriesData(train)
test = TimeSeriesData(test)
train

Python——多变量时间序列的建模与预测_Python_03

在数据准备好后开始建立VAR模型,使用训练集进行训练获得varmodel,并使用varmodel.predict()方法预测未来的40个数据,并且将两个序列的预测结果和真实的数据进行比较,输出每个指标的绝对值误差。

## Vector autoregression (VAR)模型
params = VARParams(maxlags = 100)
varmodel = VARModel(train, params)
varmodel.fit()   # 模型训练
forecast = varmodel.predict(steps=40,freq = "H")  ## 模型预测
# 计算预测结果和真实值的误差
pre = forecast["number"].to_dataframe()["fcst"]
lab = test.to_dataframe()["number"]
print("VAR模型预测的绝对值误差:",mean_absolute_error(lab,pre))
pre = forecast["PDCP"].to_dataframe()["fcst"]
lab = test.to_dataframe()["PDCP"]
print("VAR模型预测的绝对值误差:",mean_absolute_error(lab,pre))

VAR模型预测的绝对值误差: 6.8978
VAR模型预测的绝对值误差: 12.5172

针对使用VAR模型获得的预测效果,可以使用可视化的方式进行分析,下面的程序则是将对两个序列的预测值进行可视化,从而和真实值进行可视化对比。从可视化结果可以发现:模型对序列的周期性以及变化趋势,都进行了很好的拟合和预测。

Python——多变量时间序列的建模与预测_机器学习_04

3: VARMA多变量时间序列的建模与预测

下面使用VARMA模型同时预测用户数量和流量的数据波动情况,针对VARMA模型可以使用statsmodels库中的VARMAX()进行建模和预测。同样需要先对数据进行预处理和切分,使用后40个样本作为测试集。

In[27]:## 数据准备
usedf = tsdf[["number","PDCP"]]
usedf.index = tsdf["Date"]
## 数据切分为训练集和测试集
train =usedf.iloc[0:-40,:]
test = usedf.iloc[-40:,:]

针对准备好的数据,使用下面的程序建立VARMA模型,并计算模型在测试集的预测值和真实值之间的差异,从计算的结果可以发现,VARMA模型获得的预测精度,与VAR模型相比精度有增强。

## 建立模型
model = VARMAX(train,order=(25, 1))
results = model.fit(disp=False)
forecast = results.forecast(steps=40)
# 计算预测结果和真实值的误差
pre = forecast["number"]
lab = test["number"]
print("VAR模型预测的绝对值误差:",mean_absolute_error(lab,pre))
pre = forecast["PDCP"]
lab = test["PDCP"]
print("VAR模型预测的绝对值误差:",mean_absolute_error(lab,pre))

VAR模型预测的绝对值误差: 6.291206815995321
VAR模型预测的绝对值误差: 12.19874578453821

下面同样使用可视化的方式,可视化出在测试集上的预测值和真实值之间的差异,运行下面的程序可获得可视化图像。从图像中可以发现模型的预测效果很好。

Python——多变量时间序列的建模与预测_机器学习_05

参考书籍:《Python机器学习:基础、算法与实战》

Python——多变量时间序列的建模与预测_数据可视化_06

欢迎加入我们的QQ读者交流群:837977579,434693903

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励和肯定!