时间序列(time series)系列2—Prophet

1.Prophet简介

Prophet是Facebook开源的一个关于时间序列的框架。Prophet功能完善,既可以做未来预测,也可以填补缺失值,并且可以检测异常。
Prophet的整体框架,整个过程分为四部分:Modeling、Forecast Evaluation、Surface Problems以及Visually Inspect Forecasts

  • a.Modeling:建立时间序列模型。分析师根据预测问题的背景选择一个合适的模型。
  • b.Forecast Evaluation:模型评估。根据模型对历史数据进行仿真,在模型的参数不确定的情况下,我们可以进行多种尝试,并根据对应的仿真效果评估哪种模型更适合。
  • c.Surface Problems:呈现问题。如果尝试了多种参数后,模型的整体表现依然不理想,这个时候可以将误差较大的潜在原因呈现给分析师。
  • d.Visually Inspect Forecasts:以可视化的方式反馈整个预测结果。当问题反馈给分析师后,分析师考虑是否进一步调整和构建模型。

2.Prophet流程

Prophet 采取类似 Sklearn 模式的 API,先创建一个Prophet的实例,然后调用它的 fit 和 predict 方法。
输入是一个DataFrame,必须包含这两列:ds 和 y。ds 必须是一个 date 或者 datetime。y 必须是数字,代表我们需要预测的序列的值。构造效果如下:

index ds y
0 2000-01-01 1
1 2000-01-03 2
2 2000-01-04 3
... ... ...

然后在代入prophet模型进行拟合,最后预测。因为模型使用方式比较简单,直接附上代码。
原始data:数据如下,5min粒度


在这里插入图片描述
import pandas as pd
import numpy as np
from fbprophet import Prophet
import matplotlib.pyplot as plt
#配置matplotlib
plt.rcParams['figure.figsize'] = (20, 10)
plt.style.use('ggplot')
df = pd.read_csv("../data.csv")
dataf = df[0:len(df)-1*288]#取前面为训练数据,后288个为测试数据
#按照prophet格式更改数据名称
df = df.rename(columns={"sump":"y", "time":"ds"})

Prophet可以添加特殊的额外因素,不如国庆节等。

#设定特殊节假日
special_days = pd.DataFrame({
  'holiday': 'big_date',
  'ds': pd.to_datetime(['2018-10-01', '2018-10-02', '2018-10-03',
                        '2018-10-04', '2018-10-05', '2018-10-06', '2018-10-07']),
  'lower_window': 0,
  'upper_window': 1,
})
normal_days = pd.DataFrame({
    "holiday":"small_date",
    "ds":pd.to_datetime(["2018-10-13","2018-10-14", "2018-10-20",
                         "2018-10-21","2018-10-27","2018-10-28","2018-11-03","2018-11-04" ]),
    "lower_window":-1,
    "upper_window":0,
})
holidays = special_days
#prophet拟合
model = Prophet(holidays= holidays)
model.fit(dataf)
#预测后288个数据
future = model.make_future_dataframe(periods = 288, freq = "5min")
forecast = model.predict(future)
forecast.tail()#显示预测结果
model.plot(forecast)
model.plot_components(forecast)

Prophet能很好的将数据的特性进行分解。可以看到整体的trend,数据在每周,每天的变化情况,以及节假日的影响等。


在这里插入图片描述

预测结果如下:ds为时间,trend为预测,yhat_lower,yhat_upper为置信区间。


预测结果
#计算error
def mean_absolute_percentage_error(y_true, y_pred):
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
error = mean_absolute_percentage_error(df.y[-288*1:].values,
                                       forecast.yhat[-288*1:].values)
print(error)

预测值与真实值对比

#预测与真实对比显示
plt.figure(figsize = (16,6))
plt.plot(forecast.yhat[-288*1:].reset_index())#预测
plt.plot(df.y[-288*1:].reset_index())#真实
plt.plot(forecast.yhat_lower[-288*1:].reset_index())#预测下限
plt.plot(forecast.yhat_upper[-288*1:].reset_index())#预测上限
在这里插入图片描述

3.学习资料

不同时间序列预测问题的解决方案也各有不用。Prophet适用于有如下特征的业务问题:
a.有至少几个月(最好是一年)的每小时、每天或每周观察的历史数据;
b.有多种人类规模级别的较强的季节性趋势:每周的一些天和每年的一些时间;
c.有事先知道的以不定期的间隔发生的重要节假日(比如国庆节);
d.缺失的历史数据或较大的异常数据的数量在合理范围内;
e.有历史趋势的变化(比如因为产品发布);
f.对于数据中蕴含的非线性增长的趋势都有一个自然极限或饱和状态。

上述内容,只是大概叙述了Prophte的使用,没有特别具体的函数等内容。下面提供一些链接,有助于大家深入了解Prophet。
Prophet简介及示例
Seasonality, Holiday Effects, And Regressors | Prophet
Forecasting Time Series data with Prophet - Jupyter Notebook - Python Data
基于Prophet的时间序列预测

你可能感兴趣的:(时间序列(time series)系列2—Prophet)