详尽分享用Python进行时间序列预测的7种方法

简介: 详尽分享用Python进行时间序列预测的7种方法

数据准备

数据集(JetRail高铁的乘客数量)下载.

假设要解决一个时序问题:根据过往两年的数据(2012 年 8 月至 2014 年 8月),需要用这些数据预测接下来 7 个月的乘客数量。

import //代码效果参考:http://www.zidongmutanji.com/bxxx/173258.html

pandas as pd

import numpy as np

import matplotlib.pyplot as plt

df = pd.read_csv('train.csv')

df.head()

df.shape

依照上面的代码,我们获得了 2012-2014 年两年每个小时的乘客数量。为了解释每种方法的不同之处,以每天为单位构造和聚合了一个数据集。

从 2012 年 8 月- 2013 年 12 月的数据中构造一个数据集。

创建 train and test 文件用于建模。前 14 个月( 2012 年 8 月- 2013 年 10 月)用作训练数据,后两个月(2013 年 11 月 – 2013 年 12 月)用作测试数据。

以每天为单位聚合数据集。

import pandas as pd

import matplotlib.pyplot as plt

# Subsetting the dataset

# Index 11856 marks the end of year 2013

df = pd.read_csv('train.csv', nrows=11856)

# Creating train and test set

# Index 10392 marks the end of October 2013

train = df【0:10392】

test = df【10392:】

# Aggregating the dataset at daily level

df【'Timestamp'】 = pd.to_datetime(df【'Datetime'】, format='%d-%m-%Y %H:%M') # 4位年用Y,2位年用y

df.index = df【'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()

#Plotting data

train.Count.plot(figsize=(15,8), title= 'Daily Ridership', fontsize=14)

test.Count.plot(figsize=(15,8), title= 'Daily Ridership', fontsize=14)

plt.show()

我们将数据可视化(训练数据和测试数据一起),从而得知在一段时间内数据是如何变化的。

方法1:朴素法

假设 y 轴表示物品的价格,x 轴表示时间(天)

如果数据集在一段时间内都很稳定,我们想预测第二天的价格,可以取前面一天的价格,预测第二天的值。这种假设第一个预测点和上一个观察点相等的预测方法就叫朴素法。即 ^yt+1=ytyt+1^=yt\hat{y_{t+1}} = y_t

dd = np.asarray(train【'Count'】)

y_hat = test.copy()

y_hat【'naive'】 = dd【len(dd) - 1】

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()

朴素法并不适合变化很大的数据集,最适合稳定性很高的数据集。我们计算下均方根误差,检查模型在测试数据集上的准确率:

from sklearn.metrics import mean_squared_error

from math import sqrt

rms = sqrt(mean_squared_error(test【'Count'】, y_hat【'naive'】))

print(rms)

最终均方误差RMS为:43.91640614391676

方法2:简单平均法

物品价格会随机上涨和下跌,平均价格会保持一致。我们经常会遇到一些数据集,虽然在一定时期内出现小幅变动,但每个时间段的平均值确实保持不变。这种情况下,我们可以预测出第二天的价格大致和过去天数的价格平均值一致。这种将预期值等同于之前所有观测点的平均值的预测方法就叫简单平均法。即^yx+1=1xx∑i=1yiy^x+1=1x∑i=1xyi\displaystyle \hat{y}{x+1} = \frac{1}{x} \sum{i=1}^xy_i

y_hat_avg = test.copy()

y_hat_avg【'avg_forecast'】 = train【'Count'】.mean()

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()

方法3:移动平均法

物品价格在一段时间内大幅上涨,但后来又趋于平稳。我们也经常会遇到这种数据集,比如价格或销售额某段时间大幅上升或下降。如果我们这时用之前的简单平均法,就得使用所有先前数据的平均值,但在这里使用之前的所有数据是说不通的,因为用开始阶段的价格值会大幅影响接下来日期的预测值。因此,我们只取最近几个时期的价格平均值。很明显这里的逻辑是只有最近的值最要紧。这种用某些窗口期计算平均值的预测方法就叫移动平均法。

计算移动平均值涉及到一个有时被称为“滑动窗口”的大小值p。使用简单的移动平均模型,我们可以根据之前数值的固定有限数p的平均值预测某个时序中的下一个值。这样,对于所有的 i p:

^yl=1p(yi?1+<span id="MJXc-

相关文章
|
4天前
|
Python
Python面向对象基础与魔法方法详解
Python面向对象基础与魔法方法详解
|
3天前
|
监控 安全 虚拟化
深入浅出Python沙箱越狱:原理、方法与防范
今天我们来聊一个有趣的话题 - Python沙箱越狱。在我们开始之前,先来搞清楚什么是Python沙箱吧。 简单来,Python沙箱就像是一个虚拟的"游乐场"。在这个游乐场里,你可以尽情地玩耍(运行Python代码),但是不能伤害到外面的世界(不能访问系统资源或执行危险操作)。这个"游乐场"有围栏(限制),有规则(安全策略),目的就是让你玩得开心,又不会搞出什么大乱子。
|
4天前
|
Python
python之字符串定义、切片、连接、重复、遍历、字符串方法
python之字符串定义、切片、连接、重复、遍历、字符串方法
6 0
python之字符串定义、切片、连接、重复、遍历、字符串方法
|
2天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
使用Python实现深度学习模型:策略梯度方法
使用Python实现深度学习模型:策略梯度方法
4 0
|
2天前
|
关系型数据库 MySQL 数据库
Python中使用MySQL模糊查询的方法
(1)同样需要将your_username、your_password、your_database替换为我们的MySQL数据库的实际用户名、密码和数据库名。 (2)在mysql.connector.connect()中,我们没有直接指定字符集和游标类型,因为mysql-connector-python的默认配置通常已经足够好。但是,如果需要,我们可以添加这些配置选项。 (3)使用cursor.close()和cnx.close()来确保游标和连接都被正确关闭。 (4)mysql-connector-python也支持使用上下文管理器(即with语句)来自动管理游标和连接的关闭,但这需要创建一个
|
2天前
|
Web App开发 JSON 程序员
老程序员分享:Python有哪些好用的语言翻译方法
老程序员分享:Python有哪些好用的语言翻译方法
|
3天前
|
索引 Python 容器
深入探索Python字符串:技巧、方法与实战
深入探索Python字符串:技巧、方法与实战
|
3天前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
|
3天前
|
程序员 数据处理 Python
Python 中的主要循环结构和迭代方法
在 Python 编程中,循环结构是一种重要的控制流工具,用于重复执行代码块或遍历数据集合。Python 提供了多种循环结构和迭代方法,让程序员能够根据不同的需求选择最合适的方式来处理数据和逻辑。本文将介绍 Python 中的主要循环结构和迭代方法,并提供相应的示例代码。
|
4天前
|
分布式计算 API 开发者
编写高质量Python代码的方法
编写高质量Python代码的方法
16 0