我的数据框架看起来是这样的。我的目标是根据event_id
1 和 event_id
2 的数据来预测 event_id
3。
ds tickets_sold y event_id
3/12/19 90 90 1
3/13/19 40 130 1
3/14/19 13 143 1
3/15/19 8 151 1
3/16/19 13 164 1
3/17/19 14 178 1
3/20/19 10 188 1
3/20/19 15 203 1
3/20/19 13 216 1
3/21/19 6 222 1
3/22/19 11 233 1
3/23/19 12 245 1
3/12/19 30 30 2
3/13/19 23 53 2
3/14/19 43 96 2
3/15/19 24 120 2
3/16/19 3 123 2
3/17/19 5 128 2
3/20/19 3 131 2
3/20/19 25 156 2
3/20/19 64 220 2
3/21/19 6 226 2
3/22/19 4 230 2
3/23/19 63 293 2
我想预测接下来10天的销售数据:
ds tickets_sold y event_id
3/24/19 20 20 3
3/25/19 30 50 3
3/26/19 20 70 3
3/27/19 12 82 3
3/28/19 12 94 3
3/29/19 12 106 3
3/30/19 12 118 3
到目前为止,我的模型是这样的。然而,我没有告诉模型这些是两个独立的事件。考虑到这些事件都属于同一个组织者,因此将不同事件的所有数据都考虑在内会提供比单个事件更多的信息。Prophet是否支持这种类型的拟合?
# 加载数据
df = pd.read_csv('event_data_prophet.csv')
df.drop(columns=['tickets_sold'], inplace=True, axis=0)
df.head()
# 需要注意的是,每行数据都必须指定cap,并且cap不必是常数。如果市场规模在增长,cap可以是一个递增序列。
df['cap'] = 500
# growth: 字符串 'linear' 或 'logistic',指定线性或逻辑趋势。
m = Prophet(growth='linear')
m.fit(df)
# periods 是未来要查看的天数
future = m.make_future_dataframe(periods=20)
future['cap'] = 500
future.tail()
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
fig1 = m.plot(forecast)
回答:
事件的开始日期似乎会引起高峰。你可以通过将每个事件的开始日期设置为假日来使用holidays
参数。这会让Prophet了解这些事件(及其高峰)。我注意到事件1和事件2有重叠。我认为你可以有多种方法来处理这个问题。你需要问自己每个事件与事件3的预测价值是什么。你的数据量并不多,这将是主要问题。如果它们具有相同的价值,你可以更改其中一个事件的日期。例如提前11天。不等值的情况可能意味着你需要删除一个事件。
events = pd.DataFrame({
'holiday': 'events',
'ds': pd.to_datetime(['2019-03-24', '2019-03-12', '2019-03-01']),
'lower_window': 0,
'upper_window': 1,
})
m = Prophet(growth='linear', holidays=events)
m.fit(df)
我还注意到你对累积和进行了预测。我认为你的事件是平稳的,因此Prophet可能更适合预测每日门票销售量而不是累积和。