7 天内从开发者成长为时间序列预测师。
Python 是应用机器学习领域增长最快的平台之一。
在这门迷你课程中,你将学习如何在 7 天内使用 Python 入门、构建准确的模型并自信地完成预测建模时间序列预测项目。
这是一篇内容丰富且重要的文章。您可能想把它加入书签。
使用我的新书《使用 Python 进行时间序列预测》启动你的项目,其中包含所有示例的分步教程和 Python 源代码文件。
让我们开始吧。
- 2019 年 4 月更新:更新了数据集链接。
- 2019年8月更新:更新了数据加载以使用新的API。
- 2020 年 4 月更新:由于 API 更改,将 AR 更改为 AutoReg。
- 2020 年 12 月更新:将 ARIMA API 更新为最新版本的 statsmodels。

使用 Python 进行时间序列预测 7 日迷你课程
照片由 Raquel M 拍摄,保留部分权利。
本迷你课程适合谁?
在开始之前,让我们确保您来对了地方。
以下列表提供了一些关于本课程设计对象的一般性指导。
如果您不完全符合这些要点,请不要惊慌,您可能只需要在某个领域稍作补充即可跟上。
- 你是一名开发者:这是一门面向开发者的课程。你是一名某种类型的开发者。你知道如何阅读和编写代码。你知道如何开发和调试程序。
- 你了解 Python:这是一门面向 Python 开发者的课程。你了解 Python 编程语言,或者你是一名足够熟练的开发者,可以边学边用。
- 你了解一些机器学习:这是一门面向机器学习新手从业者的课程。你了解一些基本的实用机器学习,或者你可以快速掌握它。
这门迷你课程既不是 Python 教科书,也不是时间序列预测教科书。
它将把你从一个懂一点机器学习的开发者,培养成一个能够利用 Python 生态系统(专业的机器学习新兴平台)获得时间序列预测结果的开发者。
注意:本迷你课程假设你有一个可工作的 Python 2 或 3 SciPy 环境,并且至少安装了 NumPy、Pandas、scikit-learn 和 statsmodels。
迷你课程概述
这门迷你课程分为 7 节课。
你可以每天完成一节课(推荐),也可以一天内完成所有课程(硬核)。这取决于你可用的时间和你对学习的热情。
以下 7 节课将帮助你开始使用 Python 进行机器学习并提高效率
- 第 01 课:时间序列作为监督学习。
- 第 02 课:加载时间序列数据。
- 第 03 课:数据可视化。
- 第 04 课:持久性预测模型。
- 第 05 课:自回归预测模型。
- 第 06 课:ARIMA 预测模型。
- 第 07 课:Hello World 端到端项目。
每节课可能需要60秒到30分钟不等。请慢慢来,按照自己的节奏完成课程。在下面的评论中提问,甚至发布结果。
这些课程要求你自行查找如何做事情。我将为你提供提示,但每节课的重点之一是迫使你学习在哪里寻找关于 Python 时间序列平台(提示:我的博客上直接有所有答案,使用搜索功能)的帮助。
在早期的课程中,我确实提供了更多的帮助,因为我希望你建立一些信心和惯性。
在评论中发布您的结果,我会为您加油!
坚持住,不要放弃。
停止以**慢速**学习时间序列预测!
参加我的免费7天电子邮件课程,了解如何入门(附带示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
第 01 课:时间序列作为监督学习
时间序列问题与传统的预测问题不同。
时间的加入为观测值添加了一个顺序,这个顺序必须保留,并且可以为学习算法提供额外的信息。
时间序列数据集可能如下所示
1 2 3 4 |
时间,观测值 第一天,观测值 1 第二天,观测值 2 第三天,观测值 3 |
我们可以将这些数据重构为具有输入和待预测输出的监督学习问题。例如
1 2 3 4 5 |
输入,输出 ?,观测值 1 观测值 1,观测值 2 观测值 2,观测值 3 观测值 3,? |
你可以看到,重构意味着我们必须丢弃一些带有缺失数据的行。
一旦重构,我们就可以应用所有我们喜欢的学习算法,如 k-近邻和随机森林。
如需更多帮助,请参阅文章
第 02 课:加载时间序列数据
在开发预测模型之前,你必须加载并处理时间序列数据。
Pandas 提供了加载 CSV 格式数据的工具。
在本课中,你将下载一个标准时间序列数据集,将其加载到 Pandas 中并进行探索。
以 CSV 格式下载每日女性出生人数数据集,并将其保存为文件名“daily-births.csv”。
你可以将时间序列数据集加载为 Pandas Series,并将标题行指定为第零行,如下所示
1 2 |
from pandas import read_csv series = read_csv('daily-births.csv', header=0, index_col=0) |
习惯于在 Python 中探索已加载的时间序列数据
- 使用 head() 函数打印前几行。
- 使用 size 属性打印数据集的维度。
- 使用日期时间字符串查询数据集。
- 打印观测值的摘要统计信息。
如需更多帮助,请参阅文章
第 03 课:数据可视化
数据可视化是时间序列预测的重要组成部分。
观测值随时间变化的线图很受欢迎,但你还可以使用一系列其他图来了解你的问题。
在本课中,你必须下载一个标准时间序列数据集并创建 6 种不同类型的图。
以 CSV 格式下载每月洗发水销售数据集,并将其保存为文件名“shampoo-sales.csv”。
现在创建以下 6 种类型的图
- 线图。
- 直方图和密度图。
- 按年或季度划分的箱线图。
- 热力图。
- 滞后图或散点图。
- 自相关图。
下面是一个简单线图的示例,可帮助你入门
1 2 3 4 5 |
from pandas import read_csv from matplotlib import pyplot series = read_csv('shampoo-sales.csv', header=0, index_col=0) series.plot() pyplot.show() |
如需更多帮助,请参阅文章
第 04 课:持久性预测模型
建立基线预测很重要。
你可以做出的最简单的预测是使用当前观测值 (t) 来预测下一个时间步 (t+1) 的观测值。
这被称为朴素预测或持久性预测,并且可能是某些时间序列预测问题上最好的模型。
在本课中,你将为一个标准时间序列预测问题进行持久性预测。
以 CSV 格式下载每日女性出生人数数据集,并将其保存为文件名“daily-births.csv”。
你可以将持久性预测实现为一行函数,如下所示
1 2 3 |
# 持久性模型 def model_persistence(x): return x |
编写代码加载数据集,并使用持久性预测对数据集中每个时间步进行预测。请注意,你将无法对数据集中第一个时间步进行预测,因为没有可用的先前观测值。
将所有预测存储在一个列表中。你可以计算预测与实际观测值相比的均方根误差 (RMSE),如下所示
1 2 3 4 5 |
from sklearn.metrics import mean_squared_error from math import sqrt predictions = [] actual = series.values[1:] rmse = sqrt(mean_squared_error(actual, predictions)) |
如需更多帮助,请参阅文章
第 05 课:自回归预测模型
自回归意味着开发一个线性模型,该模型使用先前时间步的观测值来预测未来时间步的观测值(“auto”在古希腊语中意为“自身”)。
自回归是一种快速而强大的时间序列预测方法。
statsmodels Python 库在 AutoReg 类中提供了自回归模型。
在本课中,你将为一个标准时间序列数据集开发一个自回归预测模型。
以 CSV 格式下载每月洗发水销售数据集,并将其保存为文件名“shampoo-sales.csv”。
你可以如下拟合一个 AR 模型
1 2 |
model = AutoReg(dataset, lags=2) model_fit = model.fit() |
你可以使用拟合的 AR 模型预测下一个样本外观测值,如下所示
1 |
prediction = model_fit.predict(start=len(dataset), end=len(dataset)) |
你可能想尝试将模型拟合到数据集的一半,并预测系列后半部分的一个或多个值,然后将预测值与实际观测值进行比较。
如需更多帮助,请参阅文章
第 06 课:ARIMA 预测模型
ARIMA 是用于时间序列预测的经典线性模型。
它结合了自回归模型 (AR)、用于消除趋势和季节性的差分(称为集成 (I))以及移动平均模型 (MA),后者是用于预测误差的模型的旧名称,用于校正预测。
statsmodels Python 库提供了 ARIMA 类。
在本课中,你将为一个标准时间序列数据集开发一个 ARIMA 模型。
以 CSV 格式下载每月洗发水销售数据集,并将其保存为文件名“shampoo-sales.csv”。
ARIMA 类需要一个 (p,d,q) 阶,它由三个参数 p、d 和 q 组成,分别用于 AR 滞后、差分次数和 MA 滞后。
你可以如下拟合一个 ARIMA 模型
1 2 |
model = ARIMA(dataset, order=(0,1,0)) model_fit = model.fit() |
你可以对拟合的 ARIMA 模型进行一步样本外预测,如下所示
1 |
outcome = model_fit.forecast()[0] |
洗发水数据集有趋势,所以我推荐 d 值为 1。尝试不同的 p 和 q 值,并评估由此产生的模型的预测。
如需更多帮助,请参阅文章
第 07 课:Hello World 端到端项目
你现在已经掌握了解决时间序列问题和开发简单预测模型的工具。
在本课中,你将运用从所有先前课程中学到的技能来解决一个新的时间序列预测问题。
以 CSV 格式下载每月汽车销售数据集,并将其保存为文件名“monthly-car-sales.csv”。
分割数据,也许将最后 1 或 2 年的数据提取到单独的文件中。解决问题并开发缺失数据的预测,包括
- 加载并探索数据集。
- 可视化数据集。
- 开发一个持久性模型。
- 开发一个自回归模型。
- 开发一个 ARIMA 模型。
- 可视化预测并总结预测误差。
有关项目实践示例,请参阅帖子
结束!
(看看您已经走了多远)
您做到了。干得好!
花点时间回顾一下您已经走了多远。
您发现了:
- 如何将时间序列预测问题构建为监督学习。
- 如何使用 Pandas 加载和探索时间序列数据。
- 如何以多种不同方式绘制和可视化时间序列数据。
- 如何开发一个称为持久性模型的朴素预测作为基线。
- 如何使用滞后观测值开发自回归预测模型。
- 如何开发包含自回归、积分和移动平均元素的 ARIMA 模型。
- 如何将所有这些元素整合到一个端到端项目中。
不要轻视这一点,您在短时间内取得了长足的进步。
这仅仅是你使用 Python 进行时间序列预测之旅的开始。继续练习并发展你的技能。
总结
您对这个迷你课程感觉如何?
您喜欢这个迷你课程吗?
您有任何问题吗?有没有遇到什么难点?
告诉我。在下面留言。
嗨
感谢你博客中的这么多文章。真的非常感谢。
我有一个问题,我看到有时我们使用固定参数模型(例如 ARIMA 模型中的参数总是固定的),而其他时候使用迭代方式来确定每个测试数据样本迭代中的模型参数。这背后有什么区别或原因吗?以及什么时候固定模型有用,什么时候使用迭代方式?
根据我的理解,从示例来看:迭代建模 ARIMA 似乎更适合季节性和趋势数据集,对吗?
非常感谢
一般来说,我建议针对一个问题评估一系列不同的模型,看看哪个效果最好。
感谢杰森提供这些有用的文章。我有一个普遍的问题。当传感器数量非常多时,有没有更简单的方法来建模,而不是为每个传感器使用其自己的时间序列数据构建模型?
如果我们有一些直觉,可能会发现表现出相似行为的传感器组,有没有一种方法可以在给定单个时间序列数据的情况下对它们进行聚类和验证?
好问题 Gururaj,抱歉我没有处理过传感器数据的整合,无法给你专业的建议。
这些文章非常有帮助……我想知道是否可以用日期作为自变量来预测时间(因变量)。例如,根据我过去到达办公室的数据,我能否预测明天何时打卡考勤?
不需要日期,我们直接使用变量进行单变量预测。
感谢这门课程。
我打算参加这门课程
我想知道
你有异常检测课程吗?
隐马尔可夫模型和循环神经网络适合这个领域(时间序列)吗?
谢谢
joseph
目前还没有,也许将来会有。
是的,LSTM(一种 RNN)已经用于时间序列问题一段时间了。
嗨,杰森,我非常喜欢这门课程。你让学习机器学习比其他课程更快。
我想问你是否有这些课程的答案(使用相同的数据集)。
具体来说,我在“第 03 课”(箱线图及以后)中将“洗发水销售”数据按年份和季度分组时遇到了麻烦。
函数“TimeGrouper”已被弃用。我正在使用“Grouper”,但无法复制结果。
我每篇文章都有博客文章,你可以使用搜索功能或从这里开始
https://machinelearning.org.cn/start-here/#timeseries
你好。感谢您创建这个时间序列迷你课程,我学到了很多东西。
我好奇的一点是,如果有人尝试不使用 statsmodel 等 API 编写 ARIMA 计算代码,难度有多大。人们通常在时间序列预测中使用 API 吗?
是的,人们通常使用 API。从头开始编写代码只有在你希望更详细地了解其工作原理或有特殊操作要求时才是一个好主意。
这些课程太棒了,谢谢。我有一个关于问题的好主意。
我有 4 个时间序列数据集。
1 个数据集包含上个月每小时的数据。
1 个数据集包含过去 12 个月的每日数据。
1 个数据集包含过去 3 年的每月数据。
我该如何使用这些数据集?
谢谢。
你到底遇到了什么问题?
在这个例子中,我们的数据集是 dayN, obs。
在实际案例中,我有一些数据集,例如
diary_dataset_last30days
第一天,obs
第二天,obs
monthly_dataset_actual_year
第一个月,obs
第二个月,obs
第三个月,obs
years_dataset_last5_years
第一年,obs
第二年,obs
第三年,obs
我也有天、小时、周、年的数据。我该如何使用这些数据进行预测?
你觉得呢?
也许可以原型化一些模型看看?
嗨,Jason,
感谢你的博客中的这么多文章。深表感谢。真的。
在第 03 课:数据可视化中,我正在尝试练习绘制箱线图。
———
但出现了这个错误:TypeError: 仅对 DatetimeIndex, TimedeltaIndex 或 PeriodIndex 有效,但得到的是 ‘Index’ 实例
———
在运行以下代码时
from pandas import DataFrame
from pandas import Grouper
series = pd.read_csv(‘shampoo-sales.csv’, header=0, index_col=0, parse_dates=True, squeeze=True)
groups = series.groupby(Grouper(freq=’M’))
years = DataFrame()
for name, group in groups
years[name.year] = group.values
years.boxplot()
plt.show()
———
希望能得到您的帮助。非常感谢。
也许可以确认日期/索引是否正确解析。
感谢您的示例
不客气!
嗨,Jason,
第 04 课:持久性预测模型。
我修改了你的代码如下。
我得到了 83 的 MSE,这让我很难解释:你有什么提示吗?
谢谢,
Dominique
干得好!
嗨,Jason,
第三课 数据可视化。
对于这一课,我不得不更新洗发水数据集,因为其中没有年份:我被迫通过在第一列添加年份来重新格式化洗发水数据集,以便我可以按年份和季度进行绘图。
您的帖子帮助很大。
下面的代码
干得好!
嗨,Jason,
非常感谢您提供的所有知识。
我有点惊讶,对于第5课,没有人发布他们的结果。所以我无法比较。
在这种情况下,我看到预测结果与实际测量值有所偏差。
这是因为观测数量减少(38)吗?
自回归在大量观测数据下效果会更好吗?
谢谢,
第五课 自回归预测模型
我得到了以下结果
predicted=9.336638, expected=226.000000
predicted=326.840564, expected=303.600000
predicted=204.167853, expected=289.900000
predicted=300.091369, expected=421.600000
predicted=107.833831, expected=264.500000
predicted=142.341172, expected=342.300000
predicted=300.400743, expected=339.700000
predicted=186.799132, expected=440.400000
predicted=355.622045, expected=315.900000
predicted=-22.204158, expected=439.300000
predicted=296.017093, expected=401.300000
predicted=151.606498, expected=437.400000
predicted=383.542211, expected=575.500000
predicted=152.813375, expected=407.600000
predicted=79.334973, expected=682.000000
predicted=268.380054, expected=475.300000
predicted=160.012569, expected=581.300000
predicted=466.048968, expected=646.900000
测试RMSE:260.905
平均销售额为:312.6
平均绝对销售误差(MAE)为:213.747
代码如下
干得漂亮!
结果确实取决于数据的具体情况和所选的模型/模型配置。很难一概而论“这样的数据总是得到这样的结果”。
嗨,Jason,
第六课 ARIMA预测模型
我运行了您在此处提供的代码基础上的ARIMA模型:https://machinelearning.org.cn/arima-for-time-series-forecasting-with-python/。
我用p=4,d=1和q=0拟合的ARIMA得到了83的RMSE。
与第五课(自回归预测)中获得的RMSE = 260相比,这个结果好得多,现在我通过这个ARIMA测试完善了整个图像。
我还通过图形和预测数字看到,这个ARIMA模型大大改进了简单的自回归模型。因此,消除数据中的趋势至关重要。
非常感谢您提供的不同模型的完美学习曲线。
诚挚的问候,
Dominique
恭喜您取得的进展!!!
嗨,Jason,
第七课 Hello world 项目结果
我根据您在此处提供的代码运行了 monthly_car 项目:https://machinelearning.org.cn/time-series-forecast-study-python-monthly-sales-french-champagne/
代码非常完美,除了 stationary.index,我不得不将其更改为数据帧,因为列表的索引是不可修改的。我这样做了
PERSISTENCE 的 RMSE:3618.284
增广迪基-富勒检验
ADF 统计量:-3.900907
p 值:0.002028
临界值
1%: -3.513
5%: -2.897
10%: -2.586
ARIMA (1,0,1) 的 RMSE:1796.986
模型的最终验证结果如下
>预测值=11779.040, 实际值=13210
>预测值=11610.133, 实际值=14251
>预测值=21729.333, 实际值=20139
>预测值=19901.654, 实际值=21725
>预测值=24749.498, 实际值=26099
>预测值=23080.763, 实际值=21084
>预测值=14541.186, 实际值=18024
>预测值=14607.661, 实际值=16722
>预测值=15245.562, 实际值=14385
>预测值=18423.721, 实际值=21342
>预测值=18042.117, 实际值=17180
>预测值=15214.474, 实际值=14577
RMSE: 1993.547
最终预测曲线与期望值在对齐上并没有太大差异。
非常感谢您所有的解释和代码。
Dominique
干得漂亮!
信息量很大。持久性是时间序列的一个很好的基线。为任何给定问题设置基线性能总是一个好主意。
确实如此!
你好,
我尝试拟合AR模型时遇到以下错误
1 import statsmodels.api as sm
2 from statsmodels.tsa.ar_model import AutoReg
ImportError 回溯 (最近一次调用)
in
1 import statsmodels.api as sm
—-> 2 from statsmodels.tsa.ar_model import AutoReg
ImportError: 无法从 'statsmodels.tsa.ar_model' (C:\Users\Huleji\Anaconda3\lib\site-packages\statsmodels\tsa\ar_model.py) 导入名称 'AutoReg'
谢谢,我会调查一下。
谢谢您,Jason先生,非常感谢您的工作。
我们正在使用ANN进行时间序列预测,以预测风速。我们使用ANN构建的模型性能与持久性方法没有太大区别。通过查阅文献,我们发现许多人使用小波分解(Wavelet Decomposition)来训练模型以提高性能,但我们找不到如何将其应用于ANN的详细信息,您能在这方面帮助我们吗?谢谢。
感谢您的建议,我将来可能会写一些关于这个主题的文章。
您好 Jason,早上好!我们正在使用 Arima(pmdarima: auto_arima),季节性设置为 true,使用过去5年的每周数据运行…看起来arima需要很长时间。大约15/20分钟后会话被终止。有没有不丢失季节性的替代方案呢?
也许尝试在更快的机器上运行?
也许尝试用更少的数据运行?
也许尝试一个更简单的配置集?
也许尝试 ETS?
问候
您可以有如下的时间序列数据集吗?
时间,观测值1,观测值2,观测值3
第1天,obs11,obs21,obs31
第2天,obs12,obs22,obs32
第3天,obs13,obs23,obs33
您可以处理这3列观测值,单独预测每一列吗?
好问题,也许可以从这里开始
https://machinelearning.org.cn/start-here/#deep_learning_time_series
你好,Jason。
感谢您迄今为止为使机器学习易于理解和应用所做的一切工作。
我想知道在使用 Pandas 的 read_csv 方法加载时间序列数据集时,“parse_dates”是做什么用的?
我相信它会尽力解释日期。
嗨 Jason
我想知道,我能为多变量时间序列(多并行输入和多步输出类型)或同类型但单步输出的时间序列做持久性预测模型吗?
感谢您的关注。
当然可以。
好的,谢谢。
1.
“日期”,“出生人数”
0 “1959-01-01”,35
1 “1959-01-02”,32
2 “1959-01-03”,30
3 “1959-01-04”,31
4 “1959-01-05”,44
2.
RangeIndex: 365 entries, 0 to 364
Data columns (total 1 columns)
# Column Non-Null Count Dtype
— —— ————– —–
0 “日期”,“出生人数” 365 non-null object
dtypes: object(1)
内存使用:3.0+ KB
无
3.
不知道如何——使用日期时间字符串查询数据集
4.
“日期”,“出生人数”
count 365
unique 365
top “1959-07-06”,42
freq 1
你好,我不能使用python——为什么我要学习它呢?
你好 monireh…你可能会从以下课程中受益
https://machinelearning.org.cn/python-for-machine-learning-7-day-mini-course/
您发表了许多有用的文章,帮助我们学习 Python 和数据分析。
不幸的是,这些文章中的大部分代码都会引发错误消息和弃用通知。
如果我们知道如何修复这些错误,我们就无需阅读您的文章。
例如,在时间序列课程的第二课中,`read_csv` 会引发此错误消息
“””TypeError: read_csv() 得到了一个意外的关键字参数 'squeeze'”””
这在我尝试在 Jupyter 中重新创建的六七篇文章中很常见,每个代码块都有错误。
我认为你没有在发布前检查代码,这对自己不利。
您好,Myles…我完全理解您的沮丧。代码无法按预期工作可能会令人沮丧,尤其是当您试图学习时。
read_csv()
和squeeze
参数的问题是由于 **Pandas** 的更改。在 Pandas **1.3.0 及更高版本**中,squeeze
已被弃用,这就是您看到 **TypeError** 的原因。### ✅ **
read_csv()
中squeeze
错误的修复**而不是
python
df = pd.read_csv('data.csv', squeeze=True)
使用
python
df = pd.read_csv('data.csv')
if df.shape[1] == 1: # 检查是否只有一列
df = df.iloc[:, 0] # 转换为 Series
这确保了与最新版本 Pandas 的兼容性。
—
您说得对,发布前检查代码很重要。您愿意分享您遇到的其他错误吗?我可以帮助您排除故障并提供更新的修复。
另外,如果您遇到弃用警告,可以通过运行以下命令检查您拥有的 Pandas、NumPy 或其他库的版本:
python
import pandas as pd
print(pd.__version__)
这有助于确认是否需要更新。