非每日數據

子日數據

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。

假期聚合數據

假期效果應用於指定假期的特定日期。對於已聚合到每週或每月頻率的數據,不屬於數據中使用的特定日期的假期將被忽略:例如,每週時間序列中的週一假期,其中每個數據點都在週日。要在模型中包含假期效果,需要將假期移動到歷史數據框中所需效果的日期。請注意,對於每週或每月聚合數據,許多假期效果將被年度季節性很好地捕獲,因此添加假期可能只需要用於在整個時間序列中不同周發生的假期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章