时间序列预测的七种方法-python复现

Posted iuk11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间序列预测的七种方法-python复现相关的知识,希望对你有一定的参考价值。

前提:数据集为JetRail高铁的乘客数量,网上搜一下可以找到。数据集共18288行有效数据,第一列对应 ID ;第二列为Datatime,格式为日-月-年+时间,时间间隔为一小时;第三列为Count,表示该时段内乘客数量。

测试数据是否正确读入

import pandas as pd #pands别名pd
df = pd.read_csv('train.csv') #读取csv文件
print(df.head(5)) #读取前5行数据

数据可视化

x x x轴表示时间, y y y轴表示乘客数量。

将数据拆分成两部分,[1,14]作为训练集,[15,16]作为测试集,测试集将与预测集进行均方根误差计算,检查预测的准确率。误差值越小,说明预测越准确。

df['Timestamp']=pd.to_datetime(df['Datetime'],format="%d-%m-%Y %H:%M")
代码解释:
argdf['Datetime'],表示要转换为日期时间的对象
format,str,改变格式,解析时间的strftime
其它参数未用到,想了解可以查看pd.to_datetime()官方文档

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df=pd.read_csv('train.csv',nrows=11856)
train=df[0:10392]#训练集
test=df[10392:]#测试集
df['Timestamp']=pd.to_datetime(df['Datetime'],format="%d-%m-%Y %H:%M")
df.index=df['Timestamp']  #在train文档中新增加一列Timestamp
df=df.resample('D').mean() #按天采样,计算均值

train['Timestamp']=pd.to_datetime(train['Datetime'],format="%d-%m-%Y %H:%M")
train.index=train['Timestamp']
train=train.resample('D').mean()

test['Timestamp']=pd.to_datetime(test['Datetime'],format="%d-%m-%Y %H:%M")
test.index=test['Timestamp']
test=test.resample('D').mean()

#数据可视化
train.Count.plot(figsize=(15,7),title='Daily xxx',fontsize=14)
test.Count.plot(figsize=(15,7),title='Daily xxx',fontsize=14)
plt.show()

(一)朴素法

应用情境:稳定性高的数据集。
应用方法:以最后一个训练点为预测值的一条水平直线。
该数据集的均方根误差RMS为43.91640614391676

plt.plot()函数说明
plt.plot(x, y, 'bs', label='xxx')
横轴为 x x x轴,纵轴为 y y y轴。 b s bs bs表示蓝色方块点。 l a b e l label label表示标题。

公式为: y t + 1 ^ = y t \\hat{y_{t+1}} = y_t yt+1^=yt
该代码需要连接上方数据预处理(拆分,改变格式)代码才能正常运行。

import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from math import sqrt
#
dd=np.asarray(train['Count']) #将train中的Count列转化为array(数组)形式
y_hat=test.copy()
y_hat['naive']=dd[len(dd)-1] #预测数据均为test的最后一个数值
plt.figure(figsize=(12,8))
plt.plot(train.index,train['Count'],label='Train')
plt.plot(test.index,test['Count'],label='Test')
plt.plot(y_hat.index,y_hat['naive'],label='Naive Forecast')
plt.legend(loc='best')
plt.title("Naive Forecast")
plt.show()
#均方根误差计算
rms = sqrt(mean_squared_error(test['Count'], y_hat['naive']))
print(rms)

(二)简单平均法

应用情境:每个时间段内的平均值基本保持不变的数据集。
应用方法:预测的价格和过去天(已知数据的)平均值的价格一致。
该数据集的均方根误差RMS为109.88526527082863

公式为: y ^ x + 1 = 1 x ∑ i = 1 x y i \\hat{y}_{x+1} = \\frac{1}{x}\\sum_{i=1}^{x}y_{i} y^x+1=x1i=1xyi
该代码需要连接上方数据预处理(拆分,改变格式)代码才能正常运行。

y_hat_avg=test.copy()
y_hat_avg['avg_forecast']=train['Count'].mean() #取train中Count列的平均值
plt.figure(figsize=(12,8))
plt.plot(train['Count'],label='Train')
plt.plot(test['Count'],label='Test')
plt.plot(y_hat_avg['avg_forecast'],label='Average Forecast')
plt.legend(loc='best') #对性能图做出一些补充说明的问题
plt.show()

rms = sqrt(mean_squared_error(test['Count'], y_hat_avg['avg_forecast']))
print(rms)

(三)移动平均法

应用情境:最后一个时间段内的平均值基本保持不变(平稳)的数据集。
应用方法:预测的价格和最近时期的平均值的价格一致。
该数据集的均方根误差RMS为46.72840725106963

因为取最近时期的平均值,我们必须知道最近的时期是多少天(多长),引入滑动窗口的概念,我们规定最近时期长度为 p p p ,对于所有的 i > p i>p i>p y ^ l = 1 p ( y i − 1 + y i − 2 + y i − 3 + … + y i − p ) \\hat{y}_{l} = \\frac{1}{p}(y_{i-1}+y_{i-2}+y_{i-3}+…+y_{i-p}) y^l=p1(yi1+yi2+yi3++yip)
图示滑动窗口概念理解:


该代码需要连接上方数据预处理(拆分,改变格式)代码才能正常运行。

y_hat_avg = test.copy()
y_hat_avg['moving_avg_forecast']=train['Count'].rolling(60).mean().iloc[-1] #以p=60计算滚动平均值
plt.figure(figsize=(16,8))
plt.plot(train['Count'], label='Train')
plt.plot(test['Count'], label='Test')
plt.plot(y_hat_avg['moving_avg_forecast'], label='Moving Average Forecast')
plt.legend(loc='best')
plt.show()

rms = sqrt(mean_squared_error(test['Count'], y_hat_avg['moving_avg_forecast']))
print(rms)

(四)简单指数平滑法(SES)

应用情境:没有明显趋势或季节规律的预测数据。简单平均法和加权移动平均法的折中方法。
应用方法:预测的价值为每个时间段乘以该时间段的权重和,越接近当下(预测)的时间段赋予的权重越大。
该数据集的均方根误差RMS为43.357625225228155,α=0.6。(最终均方根误差可根据α的调节而降低)

权重的赋予方式:从早到晚的每个时间段值的权重参数呈指数级下降。 y ^ T + 1 ∣ T = α y T + α ( 1 − α ) y T − 1 + α ( 1 − α ) 2 y T − 2 + … \\hat{y}_{T+1|T}=\\alpha y_T+\\alpha(1-\\alpha)y_{T-1}+\\alpha(1-\\alpha)^{2}y_{T-2}+… y^T+1T=αyT+α(1α)yT1+α(1α)2yT2+其中 0≤α≤1 为平滑参数; y T + 1 y_{T+1} yT+1 y 1 y_1 y1~ y t y_t yt的值的加权平均值;预测值 y ^ x \\hat{y}_x y^x α ⋅ y t \\alpha \\cdot y_t αyt ( 1 − α ) ⋅ y ^ x (1-\\alpha) \\cdot \\hat{y}_x (1α)y^x的和。即上述公式也可以写成: y ^ t + 1 ∣ t = α y t + ( 1 − α ) y ^ t − 1 ∣ t \\hat{y}_{t+1|t}=\\alpha y_t+(1-\\alpha)\\hat{y}_{t-1|t} y^t+1t=αyPython 炫技操作:合并字典的七种方法

90%人不知道的Python炫技操作:合并字典的七种方法

python 添加字符串的七种方法

Python 炫技操作:合并字典的七种方法

Python 炫技操作:条件语句的七种写法

Python 炫技操作:条件语句的七种写法