介绍
在以前的教程中,我们展示了如何可视化和操作时间序列数据 ,以及如何利用ARIMA方法从时间序列数据中产生预测 。 我们注意到ARIMA模型的正确参数化可能是一个复杂的手工过程,需要一定的时间。
其他统计编程语言,如R
提供了自动化的方式来解决这个问题,但尚未正式移植到Python。 幸运的是,Facebook的核心数据科学团队最近发布了一种名为Prophet
的新方法,使数据分析师和开发人员能够在Python 3中进行大规模的预测。
先决条件
本指南将介绍如何在本地桌面或远程服务器上进行时间序列分析。 使用大型数据集可能是内存密集型的,所以在这两种情况下,计算机将至少需要2GB的内存来执行本指南中的一些计算。
对于本教程,我们将使用Jupyter Notebook来处理数据。 如果您还没有,您应该遵循我们的教程安装和设置Jupyter Notebook for Python 3 。
第1步 - 拉数据集和安装软件包
为了建立我们与先知时间序列预测的环境,我们首先进入本地编程环境或基于服务器的编程环境:
cd environments
. my_env/bin/activate
从这里,我们为我们的项目创建一个新的目录。 我们会将其称为时间timeseries
,然后进入目录。 如果您将项目称为不同的名称,请务必在整个指南中将您的名称timeseries
为timeseries
序列:
mkdir timeseries
cd timeseries
我们将与Box和Jenkins(1976) 航空公司旅客数据集合使用 ,其中包含1949年至1960年间每月航空公司Passenger人数的时间序列数据。您可以使用带有-O
标志的curl
命令来保存数据将输出写入文件并下载CSV文件:
curl -O https://assets.digitalocean.com/articles/eng_python/prophet/AirPassengers.csv
本教程将需要pandas
, matplotlib
, numpy
, cython
和fbprophet
库。 像大多数其他Python软件包一样,我们可以使用pip安装pandas
, numpy
, cython
和matplotlib
库:
pip install pandas matplotlib numpy cython
为了计算其预测, fbprophet
图书馆依靠STAN
编程语言,以纪念数学家Stanislaw Ulam为名 。 在安装fbprophet
之前,我们需要确保安装了STAN
的pystan
Python包装器:
pip install pystan
一旦这样做,我们可以使用pip安装Prophet:
pip install fbprophet
现在我们都设置好了,我们可以开始使用已安装的软件包。
第2步 - 导入包和加载数据
要开始使用我们的数据,我们将启动Jupyter Notebook:
jupyter notebook
要创建新的笔记本文件,请从右上角的下拉菜单中选择新建 > Python 3 :
这将打开一个笔记本,使我们能够加载所需的库。
最好的做法是从笔记本电脑顶部输入您需要的库(注意用于引用pandas
, matplotlib
和statsmodels
的标准statsmodels
):
%matplotlib inline
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
请注意,我们如何也为我们的地块定义了五彩的matplotlib
风格 。
在本教程中的每个代码块之后,您应该键入ALT + ENTER
运行代码并移动到笔记本内的新代码块。
我们从阅读我们的时间序列数据开始吧。 我们可以加载CSV文件,并使用以下命令打印出前5行:
df = pd.read_csv('AirPassengers.csv')
df.head(5)
我们的DataFrame显然包含Month
和AirPassengers
列。 先知图书馆期望输入一个DataFrame,其中一列包含时间信息,另一列包含我们希望预测的指标。 重要的是,时间列预计是datetime
类型,所以我们来检查列的类型:
df.dtypes
OutputMonth object
AirPassengers int64
dtype: object
因为Month
列不是datetime
类型,我们需要转换它:
df['Month'] = pd.DatetimeIndex(df['Month'])
df.dtypes
OutputMonth datetime64[ns]
AirPassengers int64
dtype: object
我们现在看到我们的Month
列是正确的datetime
类型。
先知还强调了输入列被命名为ds
(时间列)和y
(指标列)的严格条件,所以我们重命名DataFrame中的列:
df = df.rename(columns={'Month': 'ds',
'AirPassengers': 'y'})
df.head(5)
我们将要使用的数据可视化是好的做法,所以我们来绘制我们的时间序列:
ax = df.set_index('ds').plot(figsize=(12, 8))
ax.set_ylabel('Monthly Number of Airline Passengers')
ax.set_xlabel('Date')
plt.show()
我们的数据现在已经准备好了,我们准备使用先知图书馆来预测我们的时间序列。
第3步 - 与先知的时间序列预测
在本节中,我们将介绍如何使用先知图书馆预测我们时间序列的未来价值。 先知的作者已经抽象出了时间序列预测的许多固有的复杂性,并使分析师和开发人员更直观地处理时间序列数据。
首先,我们必须实例化一个新的先知对象。 先知使我们能够指定一些论点。 例如,我们可以通过设置interval_width
参数来指定不确定性间隔的期望范围。
# set the uncertainty interval to 95% (the Prophet default is 80%)
my_model = Prophet(interval_width=0.95)
现在我们的Prophet模型已被初始化,我们可以使用DataFrame作为输入来调用它的fit
方法。 模型配件不应超过几秒钟。
my_model.fit(df)
你应该收到类似的输出:
Output<fbprophet.forecaster.Prophet at 0x110204080>
为了获得我们的时间序列的预测,我们必须向Prophet提供一个新的DataFrame,其中包含一个ds
列,该列包含我们想要预测的日期。 方便的是,我们不需要自己手动创建这个DataFrame,因为Prophet提供了make_future_dataframe
帮助函数:
future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
future_dates.tail()
在上面的代码块中,我们指示先知将来生成36个日期戳。
在与先知一起工作时,重要的是考虑我们时间序列的频率。 因为我们正在处理每月数据,所以我们明确指定了时间戳的期望频率(在这种情况下, MS
是月初)。 因此,make_future_dataframe为我们生成36个月份时间戳。 换句话说,我们正在预测未来3年时间序列的未来价值。
然后将未来日期的DataFrame用作我们拟合模型的predict
方法的输入。
forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
Prophet返回一个有很多有趣列的大型DataFrame,但是我们将输出分组到与预测最相关的列,这些列是:
-
ds
:预测值的日期戳 -
yhat
:我们度量的预测值(在统计学中,yhat
是传统上用于表示值y
的预测值的符号) -
yhat_lower
:我们预测的下限 -
yhat_upper
:我们预测的上限
由于先知依靠马尔可夫链蒙特卡罗(MCMC)方法来产生其预测,所以预计来自上述产出的价值变化。 MCMC是一个随机过程,所以价值观每次都会有所不同。
先知还提供了一个方便的功能来快速绘制我们的预测结果:
my_model.plot(forecast,
uncertainty=True)
先知绘制了我们的时间序列(黑点),预测值(蓝线)和我们的预测(蓝色阴影区域)的不确定性间隔的观测值。
先知的另一个特别强大的特征就是它有能力返回我们预测的组成部分。 这可以帮助揭示时间序列的每日,每周和每年的模式如何有助于总体预测值:
my_model.plot_components(forecast)
上面的情节提供了有趣的见解。 第一幅图显示,航空公司Passenger的月度数量随时间呈线性增长。 第二个情节突出表明,每周的Passenger数量在周末和星期六达到顶峰,而第三个情节则显示,七月和八月的假日期间交通量最多。
结论
在本教程中,我们描述了如何使用Prophet库来执行Python中的时间序列预测。 我们一直在使用开箱即用的参数,但是Prophet使我们能够指定更多的参数。 特别是,先知提供了将自己的时间序列知识带到桌面上的功能。
以下是您可以尝试的其他一些事情:
- 通过在假日月份包括您的先前知识来评估假期的效果(例如,我们知道12月份是假日月份)。 关于模拟假期的官方文件将会有所帮助。
- 更改不确定性间隔的范围,或进一步预测未来。
对于更多的实践,您还可以尝试加载另一个时间序列数据集以产生您自己的预测。 总而言之,先知提供了许多令人信服的功能,包括根据用户要求定制预测模型的机会。