如何从 Prophet 中提取季节性趋势

Posted

技术标签:

【中文标题】如何从 Prophet 中提取季节性趋势【英文标题】:How to extract seasonal trends from Prophet 【发布时间】:2018-05-12 02:03:48 【问题描述】:

我一直在使用 Facebook 的 Prophet,到目前为止,它已经产生了一些很好的结果。

查看文档和谷歌搜索后,似乎没有一种自动方法可以从模型中提取季节性趋势作为数据框或字典,例如:

weekly_trends =  1 : monday_trend, 2 : tuesday_trend, ... , 7 : sunday_trend  

yearly_trends =  1 : day_1_trend, 2 : day_2_trend, ... , 365 : day_365_trend  

目前我可以使用更手动的方式将这些提取出来,但只是想知道我是否错过了更优雅的东西?

【问题讨论】:

你更手动的方式是什么? 只是通过过滤整个日历年,给我一张一年中第 num 天到相应季节部分的地图。然后通过只选择一年中的第一个完整周对每周做同样的事情,然后我有一个周到周组件的第 num 天地图 【参考方案1】:

经过训练的模型数据框包含所有季节性、趋势和节假日信息。 - 看看它的专栏。以下是如何在 Python 中查看它:

m = Prophet()
m.fit(ts)
future = m.make_future_dataframe()
forecast = m.predict(future)
print(forecast['weekly'])

从该系列中抽出 7 天。这将为您提供每个工作日的附加每周调整的规模。年度季节性类似。

【讨论】:

感谢您的回答,这基本上是我现在正在做的,但它并不像我希望的那样优雅,也许他们将来会解决这个问题 是的,抱歉,错过了您对 OP 的评论【参考方案2】:

您可以在模型拟合期间指定每日每周每年季节性

    m = Prophet(changepoint_prior_scale=0.01, weekly_seasonality=False, holidays=holidays, interval_width=0.90, yearly_seasonality=True, mcmc_samples=300)
    m.add_seasonality(name='weekly', period=7, fourier_order=3)
    m.add_seasonality(name='monthly', period=30.5, fourier_order=8)
    m.fit(X)

【讨论】:

这实际上并不能让您提取季节性值,它只是使用这些季节性分量进行建模。我有兴趣优雅地提取组件,而不是建模本身【参考方案3】:

在拟合模型时,Prophet 将保存一个包含季节性的OrderedDict

您可以使用m.seasonalities 检索它们。

例子:

m = Prophet()
m.fit(ts)
print(m.seasonalities)

会输出如下内容:


  "yearly": 
    "period": 365.25,
    "fourier_order": 10,
    "prior_scale": 10,
    "mode": "additive",
    "condition_name": null
  ,
  "weekly": 
    "period": 7,
    "fourier_order": 3,
    "prior_scale": 10,
    "mode": "additive",
    "condition_name": null
  

然后您可以迭代密钥(每年、每周、每天)并获取周期数或其他有用信息。

【讨论】:

以上是关于如何从 Prophet 中提取季节性趋势的主要内容,如果未能解决你的问题,请参考以下文章

R 笔记 prophet

时间序列预测初探:Kats,SARIMA,Prophet,deepAR 等

时间序列预测初探:Kats,SARIMA,Prophet,deepAR 等

python | prophet的案例实践:趋势检验突变点检验等

python | prophet的案例实践:趋势检验突变点检验等

python | prophet的案例实践:趋势检验突变点检验等