fbprophet:预测未来的假期
fbprophet: Predict a future holiday
我有包含假期的时间序列数据。我希望我的模型能够预测即将到来的假期。但是,我的模型似乎是在预测总体趋势,并没有在有假期的地方分配增加。
有没有办法让我将未来的日期指定为假期?我认为将它添加到 holiday 变量中可以确保它在 model/forecast.
中
这里有一些要测试的虚拟数据:
我有从 2017 年 1 月 1 日到今天(2018 年 11 月 16 日)的数据。每两个月有假期(销售)。即将到来的假期(促销)是在 12 月。我想预测即将到来的 12 月假期。该代码过于冗长,但希望它有助于清晰。
%matplotlib inline
import numpy as np
import pandas as pd
from fbprophet import Prophet
times = pd.date_range('2017-01-01', '2018-11-16')
annual_cycle = np.sin(2 * np.pi * (times.dayofyear.values / 366 - 0.28))
noise = 15 * np.random.rand(annual_cycle.size)
data = 10 + (5 * annual_cycle) + noise
s = pd.Series(data, index=times)
# Add holiday data in
s.loc['2017-02-01':'2017-02-03'] = s.loc['2017-02-01':'2017-02-03'] * 3
s.loc['2017-04-01':'2017-04-03'] = s.loc['2017-04-01':'2017-04-03'] * 3
s.loc['2017-06-01':'2017-06-03'] = s.loc['2017-06-01':'2017-06-03'] * 3
s.loc['2017-08-01':'2017-08-03'] = s.loc['2017-08-01':'2017-08-03'] * 3
s.loc['2017-10-01':'2017-10-03'] = s.loc['2017-10-01':'2017-10-03'] * 3
s.loc['2017-12-01':'2017-12-03'] = s.loc['2017-12-01':'2017-12-03'] * 3
s.loc['2018-02-01':'2018-02-03'] = s.loc['2018-02-01':'2018-02-03'] * 3
s.loc['2018-04-01':'2018-04-03'] = s.loc['2018-04-01':'2018-04-03'] * 3
s.loc['2018-06-01':'2018-06-03'] = s.loc['2018-06-01':'2018-06-03'] * 3
s.loc['2018-08-01':'2018-08-03'] = s.loc['2018-08-01':'2018-08-03'] * 3
s.loc['2018-10-01':'2018-10-03'] = s.loc['2018-10-01':'2018-10-03'] * 3
# s.plot()
df = s.to_frame().reset_index()
df = df.rename(columns={"index": "ds", 0: "y"})
# Specify a holidays Series
hol1 = pd.DataFrame({'holiday': 'hol1',
'ds': pd.date_range(start='2/01/2017', end='2/03/2017')})
hol2 = pd.DataFrame({'holiday': 'hol2',
'ds': pd.date_range(start='4/01/2017', end='4/03/2017')})
hol3 = pd.DataFrame({'holiday': 'hol3',
'ds': pd.date_range(start='6/01/2017', end='6/03/2017')})
hol4 = pd.DataFrame({'holiday': 'hol4',
'ds': pd.date_range(start='8/01/2017', end='8/03/2017')})
hol5 = pd.DataFrame({'holiday': 'hol5',
'ds': pd.date_range(start='10/01/2017', end='10/03/2017')})
hol6 = pd.DataFrame({'holiday': 'hol6',
'ds': pd.date_range(start='12/01/2017', end='12/03/2017')})
hol7 = pd.DataFrame({'holiday': 'hol7',
'ds': pd.date_range(start='2/01/2018', end='2/03/2018')})
hol8 = pd.DataFrame({'holiday': 'hol8',
'ds': pd.date_range(start='4/01/2018', end='4/03/2018')})
hol9 = pd.DataFrame({'holiday': 'hol9',
'ds': pd.date_range(start='6/01/2018', end='6/03/2018')})
hol10 = pd.DataFrame({'holiday': 'hol10',
'ds': pd.date_range(start='8/01/2018', end='8/03/2018')})
hol11 = pd.DataFrame({'holiday': 'hol11',
'ds': pd.date_range(start='10/01/2018', end='10/03/2018')})
# Future holiday
hol12 = pd.DataFrame({'holiday': 'hol12',
'ds': pd.date_range(start='12/01/2018', end='12/03/2018')})
holidays = pd.concat([hol1, hol2, hol3, hol4, hol5, hol6, hol7, hol8, hol9, hol10, hol11, hol12])
m = Prophet(holidays=holidays)
m.fit(df)
# Predict up until the end of the next holiday
future = m.make_future_dataframe(periods=17)
future.tail()
forecast = m.predict(future)
fig1 = m.plot(forecast)
您的错误是,您被告知每个日期都是一个单独的假期,方法是将每个假期放在一个单独的列中。所以它认为你在 2018 年 12 月的新假期是一个独立的事件,与之前的任何一个都无关。
您需要将所有相关的假期(或销售活动)全部放在数据框的一列中。
我有包含假期的时间序列数据。我希望我的模型能够预测即将到来的假期。但是,我的模型似乎是在预测总体趋势,并没有在有假期的地方分配增加。
有没有办法让我将未来的日期指定为假期?我认为将它添加到 holiday 变量中可以确保它在 model/forecast.
中这里有一些要测试的虚拟数据: 我有从 2017 年 1 月 1 日到今天(2018 年 11 月 16 日)的数据。每两个月有假期(销售)。即将到来的假期(促销)是在 12 月。我想预测即将到来的 12 月假期。该代码过于冗长,但希望它有助于清晰。
%matplotlib inline
import numpy as np
import pandas as pd
from fbprophet import Prophet
times = pd.date_range('2017-01-01', '2018-11-16')
annual_cycle = np.sin(2 * np.pi * (times.dayofyear.values / 366 - 0.28))
noise = 15 * np.random.rand(annual_cycle.size)
data = 10 + (5 * annual_cycle) + noise
s = pd.Series(data, index=times)
# Add holiday data in
s.loc['2017-02-01':'2017-02-03'] = s.loc['2017-02-01':'2017-02-03'] * 3
s.loc['2017-04-01':'2017-04-03'] = s.loc['2017-04-01':'2017-04-03'] * 3
s.loc['2017-06-01':'2017-06-03'] = s.loc['2017-06-01':'2017-06-03'] * 3
s.loc['2017-08-01':'2017-08-03'] = s.loc['2017-08-01':'2017-08-03'] * 3
s.loc['2017-10-01':'2017-10-03'] = s.loc['2017-10-01':'2017-10-03'] * 3
s.loc['2017-12-01':'2017-12-03'] = s.loc['2017-12-01':'2017-12-03'] * 3
s.loc['2018-02-01':'2018-02-03'] = s.loc['2018-02-01':'2018-02-03'] * 3
s.loc['2018-04-01':'2018-04-03'] = s.loc['2018-04-01':'2018-04-03'] * 3
s.loc['2018-06-01':'2018-06-03'] = s.loc['2018-06-01':'2018-06-03'] * 3
s.loc['2018-08-01':'2018-08-03'] = s.loc['2018-08-01':'2018-08-03'] * 3
s.loc['2018-10-01':'2018-10-03'] = s.loc['2018-10-01':'2018-10-03'] * 3
# s.plot()
df = s.to_frame().reset_index()
df = df.rename(columns={"index": "ds", 0: "y"})
# Specify a holidays Series
hol1 = pd.DataFrame({'holiday': 'hol1',
'ds': pd.date_range(start='2/01/2017', end='2/03/2017')})
hol2 = pd.DataFrame({'holiday': 'hol2',
'ds': pd.date_range(start='4/01/2017', end='4/03/2017')})
hol3 = pd.DataFrame({'holiday': 'hol3',
'ds': pd.date_range(start='6/01/2017', end='6/03/2017')})
hol4 = pd.DataFrame({'holiday': 'hol4',
'ds': pd.date_range(start='8/01/2017', end='8/03/2017')})
hol5 = pd.DataFrame({'holiday': 'hol5',
'ds': pd.date_range(start='10/01/2017', end='10/03/2017')})
hol6 = pd.DataFrame({'holiday': 'hol6',
'ds': pd.date_range(start='12/01/2017', end='12/03/2017')})
hol7 = pd.DataFrame({'holiday': 'hol7',
'ds': pd.date_range(start='2/01/2018', end='2/03/2018')})
hol8 = pd.DataFrame({'holiday': 'hol8',
'ds': pd.date_range(start='4/01/2018', end='4/03/2018')})
hol9 = pd.DataFrame({'holiday': 'hol9',
'ds': pd.date_range(start='6/01/2018', end='6/03/2018')})
hol10 = pd.DataFrame({'holiday': 'hol10',
'ds': pd.date_range(start='8/01/2018', end='8/03/2018')})
hol11 = pd.DataFrame({'holiday': 'hol11',
'ds': pd.date_range(start='10/01/2018', end='10/03/2018')})
# Future holiday
hol12 = pd.DataFrame({'holiday': 'hol12',
'ds': pd.date_range(start='12/01/2018', end='12/03/2018')})
holidays = pd.concat([hol1, hol2, hol3, hol4, hol5, hol6, hol7, hol8, hol9, hol10, hol11, hol12])
m = Prophet(holidays=holidays)
m.fit(df)
# Predict up until the end of the next holiday
future = m.make_future_dataframe(periods=17)
future.tail()
forecast = m.predict(future)
fig1 = m.plot(forecast)
您的错误是,您被告知每个日期都是一个单独的假期,方法是将每个假期放在一个单独的列中。所以它认为你在 2018 年 12 月的新假期是一个独立的事件,与之前的任何一个都无关。
您需要将所有相关的假期(或销售活动)全部放在数据框的一列中。