详尽分享用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-

相关文章
|
1月前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
WK
|
19天前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
67 36
|
30天前
|
机器学习/深度学习 数据采集 数据挖掘
11种经典时间序列预测方法:理论、Python实现与应用
本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。
63 2
11种经典时间序列预测方法:理论、Python实现与应用
|
22天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
50 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
26天前
|
开发者 Python
Python中的魔法方法与运算符重载
在Python的奇妙世界里,魔法方法(Magic Methods)和运算符重载(Operator Overloading)是两个强大的特性,它们允许开发者以更自然、更直观的方式操作对象。本文将深入探讨这些概念,并通过实例展示如何利用它们来增强代码的可读性和表达力。
|
1月前
|
存储 编译器 索引
Python 序列类型(2)
【10月更文挑战第8天】
Python 序列类型(2)
|
1月前
|
存储 C++ 索引
Python 序列类型(1)
【10月更文挑战第8天】
|
1月前
|
Python
Python中的push方法详解与实例
Python中的push方法详解与实例
|
1月前
|
存储 Python
python列表操作和方法
python列表操作和方法
30 1
|
1月前
|
存储 索引 Python
反转Python列表的4种方法
反转Python列表的4种方法