Seasonality, events and regressors benchmarks
35 of 35 cases match Python Prophet.
Custom and switchable seasonal patterns, events with windows, extra regressors, and additive and multiplicative effects together, on every trend type.
Each case runs the same input through Effect Prophet and Python Prophet 1.4.0, then compares every forecast row, the trend, each component and the fitted noise. A case matches when all of them agree within its tolerances, and only matching cases are timed.
Each case's dot shows its result: matches, matches with internal differences flagged, intentional difference, doesn't match. Hover over a dot for details.
How to read the tables:
- Effect output and Python output are each library's final forecast value. Open a case to see every row side by side.
- Largest difference is the biggest gap between the two forecasts, as a share of the input data's range.
- Effect time and Python time are the median time for the timed step, usually fitting and predicting. Open a case for every step, including first-run and save/load times.
- Flagged cases match, but the two libraries stopped their fitting search at slightly different points. The case page shows the internal numbers.
About these runs
Each trend's cases come from that trend's own run.
Linear growth
- Run
2026-10-20T170110-379Z-27b7ec98on 2026-10-20, commit27b7ec9 - Both libraries ran in
linux/arm64containers on Apple M4 Pro - effect-prophet 0.0.0
- effect 4.0.0
- prophet 1.4.0
- Full benchmark report
Flat growth
- Run
2026-10-20T171807-628Z-27b7ec98on 2026-10-20, commit27b7ec9 - Both libraries ran in
linux/arm64containers on Apple M4 Pro - effect-prophet 0.0.0
- effect 4.0.0
- prophet 1.4.0
- Full benchmark report
Logistic growth
- Run
2026-10-20T174321-690Z-27b7ec98on 2026-10-20, commit27b7ec9 - Both libraries ran in
linux/arm64containers on Apple M4 Pro - effect-prophet 0.0.0
- effect 4.0.0
- prophet 1.4.0
- Full benchmark report
Timings come from one machine and describe this workload only. They are not a general speed ranking. Where Python is faster, it is often because Python runs Stan's optimizer as compiled C++, while Effect Prophet runs the same algorithm as WebAssembly with narrower vector instructions. The gap is widest for Newton's method on short histories with many parameters.
Linear growth
Custom and switchable seasonal patterns, events with windows, extra regressors, and additive and multiplicative effects mixed together. All linear growth benchmarks →
| Case | Input | Effect output | Python output | Largest difference | Timed step | Effect time | Python time |
|---|---|---|---|---|---|---|---|
| Weekly pattern on irregular dates | 192 rows | 108.5119 | 108.5118 | < 0.0001% | Fit and predict | 1.49 ms | 11.3 ms |
| Two switchable weekly patterns | 256 rows | 139.4380 | 139.4353 | 0.0028% | Fit and predict | 3.11 ms | 15.7 ms |
| Events with windows | 96 rows | 54.2821 | 54.2821 | < 0.0001% | Fit and predict | 6.77 ms | 33.1 ms |
| Four regressors | 256 rows | 138.7457 | 138.7426 | 0.0032% | Fit and predict | 2.96 ms | 13.6 ms |
| Everything at once, small | 24 rows | 21.2025 | 21.2025 | < 0.0001% | Fit and predict | 1.65 ms | 16.6 ms |
| Everything at once, two years | 768 rows | 54.2706 | 54.2657 | 0.015% | Fit and predict | 12.9 ms | 43.1 ms |
| Additive and multiplicative together | 96 rows | 44.5183 | 44.5183 | < 0.0001% | Fit and predict | 4.91 ms | 31.8 ms |
| Repeated timestamps with features | 96 rows | 18.2191 | 18.2200 | 0.017% | Fit | 32.6 ms | 112 ms |
Flat growth
Weekly patterns, events and regressors on a flat trend: with a switchable multiplicative weekly pattern at full length and cut to the history lengths cross-validation uses, with every effect additive, and with regressors that move almost or exactly in step with the level or the yearly pattern. All flat growth benchmarks →
| Case | Input | Effect output | Python output | Largest difference | Timed step | Effect time | Python time |
|---|---|---|---|---|---|---|---|
| Weekly pattern, absmax scaling | 96 rows | 35.0039 | 35.0039 | < 0.0001% | Fit | 155 ms | 603 ms |
| Weekly pattern, minmax scaling | 96 rows | 35.0039 | 35.0039 | < 0.0001% | Fit | 4.23 ms | 20.4 ms |
| Mixed effects, minmax scaling | 96 rows | 35.0283 | 35.0283 | < 0.0001% | Fit and predict | 1.41 ms | 12.4 ms |
| Mixed effects, absmax scaling | 96 rows | 35.0127 | 35.0127 | < 0.0001% | Fit | 1.58 ms | 7.92 ms |
| Mixed effects, eight months, minmax scaling | 256 rows | 19.5305 | 19.5305 | < 0.0001% | Fit and predict | 2.23 ms | 13.7 ms |
| Additive effects, minmax scaling | 96 rows | 35.0127 | 35.0127 | < 0.0001% | Fit and predict | 4.67 ms | 26.9 ms |
| Additive effects, eight months, minmax scaling | 256 rows | 28.9196 | 28.9196 | < 0.0001% | Fit and predict | 2.12 ms | 13.3 ms |
| Mixed effects, both libraries on default settings | 96 rows | 35.0012 | 35.0127 | 0.073% | Fit and predict | 3.17 ms | 48.4 ms |
| Regressors that track other effects | 730 rows | 56.9753 | 56.9753 | < 0.0001% | Fit and predict | 5.42 ms | 29.6 ms |
| Mixed effects, eight months, absmax scaling | 256 rows | 28.9196 | 28.9196 | < 0.0001% | Fit | 3.82 ms | 8.99 ms |
| First 63 days, absmax scaling | 63 rows | 24.0826 | 24.0826 | < 0.0001% | Fit | 2.24 ms | 7.62 ms |
| First 63 days, minmax scaling | 63 rows | 7.1798 | 7.1798 | < 0.0001% | Fit | 2.21 ms | 7.61 ms |
| First 70 days, absmax scaling | 70 rows | 24.0795 | 24.0795 | < 0.0001% | Fit | 2.10 ms | 7.44 ms |
| First 70 days, minmax scaling | 70 rows | 7.1718 | 7.1718 | < 0.0001% | Fit | 2.04 ms | 7.85 ms |
| First 77 days, absmax scaling | 77 rows | 24.0746 | 24.0746 | < 0.0001% | Fit | 2.52 ms | 7.51 ms |
| First 77 days, minmax scaling | 77 rows | 7.1594 | 7.1594 | < 0.0001% | Fit | 2.16 ms | 8.16 ms |
| First 225 days, absmax scaling | 225 rows | 34.9960 | 34.9960 | < 0.0001% | Fit | 3.48 ms | 8.67 ms |
| First 225 days, minmax scaling | 225 rows | 34.9891 | 34.9891 | < 0.0001% | Fit | 3.17 ms | 8.79 ms |
| First 232 days, absmax scaling | 232 rows | 34.9930 | 34.9930 | < 0.0001% | Fit | 2.98 ms | 8.86 ms |
| First 232 days, minmax scaling | 232 rows | 34.9807 | 34.9807 | < 0.0001% | Fit | 3.20 ms | 8.89 ms |
Logistic growth
Each supported effect on its own, then all of them together: a weekly pattern, a switchable weekly pattern, an event with a window, and additive and multiplicative regressors. All logistic growth benchmarks →
| Case | Input | Effect output | Python output | Largest difference | Timed step | Effect time | Python time |
|---|---|---|---|---|---|---|---|
| Weekly pattern | 96 rows | 105.2764 | 105.2764 | < 0.0001% | Fit | 15.6 ms | 27.5 ms |
| Switchable weekly pattern | 96 rows | 105.2763 | 105.2763 | < 0.0001% | Fit | 16.2 ms | 28.3 ms |
| Event with a window | 96 rows | 105.2751 | 105.2751 | < 0.0001% | Fit | 9.09 ms | 17.9 ms |
| Additive regressor | 96 rows | 105.2753 | 105.2753 | < 0.0001% | Fit | 7.94 ms | 15.8 ms |
| Multiplicative regressor | 96 rows | 105.2751 | 105.2751 | < 0.0001% | Fit | 11.3 ms | 18.6 ms |
| Everything at once, absmax scaling | 96 rows | 105.8453 | 105.8453 | < 0.0001% | Fit | 29.0 ms | 46.6 ms |
| Everything at once, minmax scaling | 96 rows | 105.8453 | 105.8453 | < 0.0001% | Fit | 25.3 ms | 44.0 ms |