python - 组件图与每月季节性的 df_pred 不一致
问题描述
背景
我用时间序列进行季节性分解。在我的用例中,我有趋势/每周(7 天)/每月(如先知文档建议的 30.5 天)组件。
对我来说,我想获取每个组件图的数据,以便我可以知道每个工作日/每月一天的估计量。
我制作了一个合成数据集来重现我的发现。
import pandas as pd
from prophet import Prophet
###### data genaration
ds = pd.date_range(start = '2020-05-01', end = '2021-05-01', freq = 'D')
synthetic_data = pd.DataFrame({'ds':ds})
# linear trend
synthetic_data['trend'] = synthetic_data.index*0.05 + 1
# weekly seasonality
synthetic_data['weekly'] = 10*np.sin(synthetic_data.ds.dt.weekday/7*2*np.pi)
# monthly seasonality
synthetic_data['monthly'] = 1*synthetic_data.ds.dt.day
# add noise to get additive ts
synthetic_data['y'] = synthetic_data['trend'] + synthetic_data['weekly'] + synthetic_data['monthly'] + np.random.normal(0,5)
###### model fitting and components plot
m = Prophet(seasonality_mode='additive',
# changepoint_prior_scale = 0.005,
# holidays_prior_scale= 20,
# yearly_seasonality= 1,
weekly_seasonality= 1,
daily_seasonality= 0
)
m.add_seasonality('monthly', period= 30.5,fourier_order = 5)
m.fit(synthetic_data)
future = m.make_future_dataframe(periods= 0, freq = 'd')
df_pred = m.predict(future)
fig = m.plot_components(df_pred)
plt.suptitle('components plots is inconsistent with df_pred on monthly seasonality',y= 1.02,fontsize = 20)
plt.show()
我的尝试
我不知道在每个组件图中获取数据点,因此我基于df_pred = m.predict(future)
.
它可能适用于内置的每周季节性
我想我可以使用以下代码获取每周季节性组件的数据点:
# 6 for Sunday, 0 for Monday. This weekly predicted result is consistent with components plot.
df_pred.groupby(df_pred.ds.dt.weekday).weekly.mean()
ds 0 0.150872 1 7.748597 2 9.511470 3 4.112012 4 -4.383875 5 -9.578614 6 -7.560462 名称:每周,dtype:float64
如果我们比较代码输出和每周组件图,我们可以发现它们是一致的。
不适用于自定义的每月季节性
然后我也计算每月的季节性df_pred
。
# I think that 1 for First day, 31 for Lastday. This monthly predicted result is nonconsistent with components plot.
df_pred.groupby(df_pred.ds.dt.day).monthly.mean()
ds 1 -3.567997 2 -10.775579 3 -13.482367 4 -12.816576 5 -10.644709 6 -8.886286 7 -8.210471 8 -7.986831 9 -7.286549 10 -5.873002 11 -4.305186 12 -3.227050 13 -2.673673 14 -2.097752 15 -1.015542 16 0.460024 17 1.766795 18 2.539023 19 3.032579 20 3.850227 21 5.250232 22 6.802167 23 7.821215 24 8.174247 25 25 8.571022 26 9.883497 27 12.022506 27 12.022506 28
但是,我发现每月季节性的结果不一致:
- 合成数据中的每月季节性为 1*synthetic_data.ds.dt.day,是简单的线性关系。在组件图中,每月的季节性不是线性的。
- 每月的季节性与我的计算不同
df_pred.monthly
我的问题摘要
- 在模型拟合期间我做错了什么吗?例如,声明错误的每月季节性 (
m.add_seasonality('monthly', period= 30.5,fourier_order = 5)
)。这样我就得到了错误的每月分量图。 - 如何在组件图中获取数据点?我在每周组件上做得对吗?自定义每月组件有什么问题?从源代码中,我知道
m.plot_components
处理内置的每周季节性和自定义每月季节性不同。
解决方案
推荐阅读
- tensorflow - 从 TensorFlow 到 Onnx 的转换
- javascript - 渲染中的反应开关:div子没有样式
- node.js - https和http响应后的执行时间差
- javascript - Vue路由器放在文件夹中时找不到模块
- .net - C# - 检测是否打开了 Windows 功能(尤其是 Windows Media Player)
- sql-server - 如何在不创建临时表的情况下根据条件删除重复行
- c# - 读取表格[列]并在控制台中显示
- android - 用于仅测试依赖项的 Gradle 变体感知依赖项管理
- django - requirements.txt 在 AWS Elastic Beanstalk 上部署 Django 时出现的问题
- angular - FirebaseError:“权限缺失或不足。” 无服务器应用程序中的子集合查询