时间序列(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的时间序列预测

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,699评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,124评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,127评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,342评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,356评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,057评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,654评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,572评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,205评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,343评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,015评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,704评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,196评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,690评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,348评论 2 358

推荐阅读更多精彩内容