Static reorder models miss event-driven demand spikes (Seahawks games, PAX West, Mariners season), causing stockouts during events and excess carrying cost in the quiet weeks between. A weekly-updating Prophet forecast with Seattle event regressors feeds directly into dynamic safety stock and reorder point calculations, replacing static tables with forward-looking signals.
Prophet with an event-calendar regressor consistently beats XGBoost on this problem: it handles the weekly/annual seasonality and event spikes directly, where XGBoost needs hand-engineered lag features to catch up.
| SKU | Prophet MAPE | XGBoost MAPE | Stockout Reduction |
|---|---|---|---|
| Beverages | 7.8% | 11.2% | 33% |
| Snacks | 8.1% | 12.4% | 28% |
| Merchandise | 9.2% | 13.8% | 41% |
| Accessories | 8.0% | 11.9% | 35% |
| Apparel | 8.6% | 14.1% | 29% |
| Average | 8.3% | 12.7% | 33% |
Stockout reduction by SKU category, dynamic reorder point vs. static baseline (bar length relative to Merchandise, the largest reduction).
Forecasts alone don't prevent stockouts. The forecast has to feed a reorder policy. Safety stock is computed at a 95% service level: SS = Z × σ_LT × √LT, and the dynamic reorder point is ROP = (avg daily demand × LT) + SS, using the Prophet forecast's demand estimate instead of a trailing historical average, so the reorder point moves ahead of known events instead of reacting after the fact.
End-to-end pipeline from event calendar to ops dashboard, reproducible via run_pipeline.py.
Seattle Special Events Office listings + team schedules (Seahawks, Mariners, PAX) compiled into a 55-event calendar with attendance figures, used as external regressors. WSDOT traffic volume data serves as an attendance proxy where official figures aren't published.
Per-SKU Prophet models with the event calendar as an external regressor, compared against an XGBoost baseline with hand-engineered lag and calendar features. Evaluated on an 8-week held-out test window per SKU.
Forecast demand and its uncertainty feed the safety-stock formula directly, replacing a static reorder table with a reorder point that moves ahead of known event-driven demand.
Both policies (static ROP vs. dynamic ROP) are simulated against the same 8-week held-out demand to produce a like-for-like stockout-event comparison per SKU.
Streamlit + Plotly dashboard surfacing the current forecast, reorder recommendations, and stockout risk, built for an operations manager, not a data scientist.
data/generate_data.py and any analyst can substitute real data without changing the pipeline.