使用prophet库分析航空出行人次规律

Python爬虫与Stata应用能力提升与实证前沿  寒假工作坊

Author: Greg Rafferty Title: Forecasting in Python with Facebook Prophet-How to tune and optimize Prophet using domain knowledge to add greater control to your forecasts. Site https://towardsdatascience.com/forecasting-in-python-with-facebook-prophet-29810eb57e66

网络上有很多prophet教程,但大多都比较肤浅,没有教程教我们如何优化Prophet模型,也没有说清楚如何结合分析师经验进行分析预测。在本篇教程中,我试图在这两个问题上多下点功夫。

之前我分享过用ARIMA算法来预测美国商业飞行市场乘客数。ARIMA能很好的预测短期趋势,但是Facebook的工程师构建的Prophet框架还能做ARIMA做不了的事情。Prophet底层是STAN语言,这是一种概率编程语言。这使Prophet具有贝叶斯统计提供的许多优势,包括季节性,领域知识的和使用置信区间来进行风险估计。

安装

!pip3 install fbprophet

文章末尾会有jupyter notebook下载方式

航空乘客数据集

prophet需要传入的时间序列数据有两个字段

  • ds 日期

  • y 所在日期对应的值

import pandas as pd
passengers = pd.read_csv('data/AirPassengers.csv', 
                         header=0,
                         names=['ds', 'y'])
passengers['ds']=pd.to_datetime(passengers['ds'])
passengers.head()

import matplotlib.pyplot as plt
import seaborn as sns
sns.lineplot(x='ds', y='y', data=passengers)

简单的绘图,趋势是上升的,我们想了解更多,这里就需要用到prophet库。

Prophet参数解读

这里看不懂可以先跳过去,之后看到实际例子再回来瞅瞅

Prophet(growth='linear', 
        changepoints=None, 
        n_changepoints=25, 
        changepoint_range=0.8, 
        yearly_seasonality='auto', 
        weekly_seasonality='auto', 
        daily_seasonality='auto', 
        holidays=None, 
        seasonality_mode='additive', 
        seasonality_prior_scale=10.0, 
        holidays_prior_scale=10.0, 
        changepoint_prior_scale=0.05, 
        mcmc_samples=0, 
        interval_width=0.8, 
        uncertainty_samples=1000)
  • growth: 趋势默认为线性增长'linear', 还有 'logistic'

  • changepoints: 默认不指定改变点,prophet会根据趋势自动搜寻潜在的改变点

  • n_changepoints:如果changepoints设置了,该参数不起作用;如果changepoints没有设置,那么改变点将在changepointrange范围内搜寻。默认设置为25

  • changepoint_range: 范围0-1,表示改变点落在趋势中的可能的范围。

  • yearly_seasonality: 即数据存在年度周期性变化,拟合年度趋势。参数有'auto', 参数有'auto'、True和False

  • weekly_seasonality: 同上,拟合周度趋势,默认为auto, 参数有'auto'、True和False

  • daily_seasonality: 同上,拟合日度趋势,默认为auto, 参数有'auto'、True和False

  • holidays:默认为None,如果要指定传入节假日数据,数据格式为dataframe,有两个指定的字段holiday和ds,其中holiday列的数据为字符串, ds列为date数据类型

  • seasonality_mode: 趋势模式有'additive'和'multiplicative',默认为加法'additive'

  • seasonality_prior_scale: 趋势缩放系数,如果该参数大,会让后续趋势波动变大。如果系数较小,会抑制趋势甚至熨平趋势。默认参数设置为10

  • holiday_prior_scale: 类似于seasonalitypriorscale参数的作用,主要用于解释节假日对趋势波动幅度起到熨平或者加大波动强度对作用。默认也是10

  • changepoint_prior_scale:类似于seasonalitypriorscale参数的作用,主要用于解释改变点对趋势波动幅度起到熨平或者加大波动强度对作用。默认是0.05

  • mcmc_samples:参数为整数。如果大于0, 模型使用贝叶斯推断;如果设置为0,使用最大后验概率估计(MAP)

  • interval_width:浮点数类型,为预测提供不确定性区间的宽度。如果mcmcsamples = 0,则模型使只使用MAP估计得出的趋势中的不确定性;如果mcmc.samples> 0,则将对所有模型参数进行积分,其中将包括季节性不确定性。

  • uncertainty_samples:用于估计不确定性间隔的模拟次数,默认为1000

趋势分解

我们想看看乘客出行的规律,比如

  • 乘客出行的总体趋势是上升还是下降

  • 每周的星期几是出行高峰

  • 12个月份是否存在季度或者月份区别

这里我做一个6年的预测,频率是月份,即未来 6*12=72 期的预测。

from fbprophet import Prophet
import matplotlib.pyplot as plt
#Prophet默认禁用了周度,这里将其打开,设置为True
prophet = Prophet(weekly_seasonality=True)
#prophet模型对passengers数据进行拟合
prophet.fit(passengers)
#构造未来72期(12年,月度,共72期)
future = prophet.make_future_dataframe(periods=12*6, freq='M')
fig = prophet.plot_components(forecast)
plt.show()

看图总结

  • 航空出行的总体趋势是稳步发展。

  • 每周的周五是出行高峰期,这跟我们的常识一致。

  • 每年年度范围内,2月, 678航空乘客较多。

还有一个要注意的地方, 而且我们发现在1954-1956之前趋势有转折,在此之后增长加快了一些。这说明在1954-1956年区间段有较大的转折,可能是政策发生改变。

标注改变

add_changepoints_to_plot(ax, 
                         m, 
                         fcst)

在趋势图中加入改变的标注

  • ax: 趋势图,这里我们输入的fig.gca() gca是get current axis的意思

  • m:prophet模型

  • fcst: prophet的预测

这里我们可以在图中标注改变点,使用到 addchangepointsto_plot 函数

from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot
#Prophet默认禁用了周度和,这里将其打开,设置为True
prophet = Prophet(weekly_seasonality=True)
#prophet模型对passengers数据进行拟合
prophet.fit(passengers)
#构造未来72期(12年,月度,共72期)
future = prophet.make_future_dataframe(periods=12*6, freq='M')
#预测
forecast = prophet.predict(future)
#forecast趋势中有过去真实对数据,也有未来72期的预测值
fig = prophet.plot(forecast)
#在趋势图中加入断点标注
a = add_changepoints_to_plot(fig.gca(), prophet, forecast)
a

近期文章

精选课程 | Python数据分析实战(学术)

Python爬虫与Stata应用能力提升与实证前沿  寒假工作坊

使用Python读取图片中的文本数据

Loughran&McDonald金融文本情感分析库

股评师分析报告文本情感分析预测股价

如何使用seaborn绘制组合图

代码不到40行的超燃动态排序图

使用Python自动生成事件分析图谱

使用分析师报告中含有的情感信息预测上市公司股价变动

日期数据操作第1期 datetime库

日期数据操作第2期 pandas库

史上最大规模1.4亿中文知识图谱开源下载

【公开视频课】Python语法快速入门

【公开视频课】Python爬虫快速入门

文本数据分析文章汇总(2016-至今)

当文本分析遇到乱码(ง'⌣')ง怎么办?

当pandas遇上数据类型问题

如何理解pandas中的transform函数

一行pandas代码生成哑变量

Python最被低估的库,用好了效率提升10倍!

课件获取方式,请在公众号后台回复关键词“20191214

觉得本文有用,请不吝点赞评论转发~谢谢支持~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值