非每日数据

子日数据

Prophet可以通过在ds列中传递带有时间戳的数据框来预测时间序列。时间戳的格式应该是YYYY-MM-DD HH: MM:SS-请参阅此处的示例csv。当使用子日数据时,每日季节性将自动匹配。这里我们将Prophet拟合为5分钟分辨率的数据(约塞米蒂的每日温度):

# Python
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_yosemite_temps.csv')
m = Prophet(changepoint_prior_scale=0.01).fit(df)
future = m.make_future_dataframe(periods=300, freq='H')
fcst = m.predict(future)
fig = m.plot(fcst)

image
每日季节性将显示在组件图中:

# Python
fig = m.plot_components(fcst)

image

经常有缺口的数据

# Python
df2 = df.copy()
df2['ds'] = pd.to_datetime(df2['ds'])
df2 = df2[df2['ds'].dt.hour < 6]
m = Prophet().fit(df2)
future = m.make_future_dataframe(periods=300, freq='H')
fcst = m.predict(future)
fig = m.plot(fcst)

image
预测似乎相当糟糕,未来的波动比历史上看到的要大得多。这里的问题是,我们将每日周期与只有一天中部分时间(12a到6a)的数据的时间序列相匹配。因此,在一天的剩余时间里,每日季节性不受约束,也没有得到很好的估计。解决方案是只对有历史数据的时间窗口进行预测。在这里,这意味着将未来的数据帧限制在12a到6a之间:

# Python
future2 = future.copy()
future2 = future2[future2['ds'].dt.hour < 6]
fcst = m.predict(future2)
fig = m.plot(fcst)

image
同样的原则也适用于数据中有规律缺口的其他数据集。例如,如果历史仅包含工作日,则应仅对工作日进行预测,因为周末的每周季节性无法很好地估计。

月度数据

您可以使用Prophet来拟合月度数据。但是,底层模型是连续时间的,这意味着如果您将模型拟合到月度数据,然后要求提供每日预测,您可能会得到奇怪的结果。在这里,我们预测了未来10年的美国零售额:

# Python
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_retail_sales.csv')
m = Prophet(seasonality_mode='multiplicative').fit(df)
future = m.make_future_dataframe(periods=3652)
fcst = m.predict(future)
fig = m.plot(fcst)

image
这与上面的问题相同,数据集有规律的差距。当我们拟合年度季节性时,它只有每个月第一天的数据,其余日子的季节性组件无法识别和过度拟合。这可以通过做MCMC来查看季节性中的不确定性来清楚地看到:

# Python
m = Prophet(seasonality_mode='multiplicative', mcmc_samples=300).fit(df, show_progress=False)
fcst = m.predict(future)
fig = m.plot_components(fcst)

WARNING:pystan:481 of 600 iterations saturated the maximum tree depth of 10 (80.2 %)
WARNING:pystan:Run again with max_treedepth larger than 10 to avoid saturation

image
季节性在每个月初有数据点的地方不确定性很低,但在两者之间有非常高的后验方差。当将Prophet拟合到月度数据时,只进行月度预测,这可以通过将频率传递到make_future_dataframe来完成:

# Python
future = m.make_future_dataframe(periods=120, freq='MS')
fcst = m.predict(future)
fig = m.plot(fcst)

image
在Python中,频率可以是这里的pandas字符串列表中的任何内容:https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases。 请注意,这里使用的MS是月开始,这意味着数据点放置在每个月的开始。
在月度数据中,年度季节性也可以用二元额外回归来建模。特别是,该模型可以使用12个额外回归,如is_jan、is_feb等。如果日期在1月,is_jan为1,否则为0。这种方法将避免上面看到的月内不可识别性。如果添加了每月额外回归,请务必使用yearly_seasonality=False。

假期聚合数据

假期效果应用于指定假期的特定日期。对于已聚合到每周或每月频率的数据,不属于数据中使用的特定日期的假期将被忽略:例如,每周时间序列中的周一假期,其中每个数据点都在周日。要在模型中包含假期效果,需要将假期移动到历史数据框中所需效果的日期。请注意,对于每周或每月聚合数据,许多假期效果将被年度季节性很好地捕获,因此添加假期可能只需要用于在整个时间序列中不同周发生的假期。

posted @ 2023-06-13 09:19  明天OoO你好  阅读(129)  评论(0编辑  收藏  举报