Skip to content

Flat growth benchmarks ​

72 of 72 cases match Python Prophet.

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.
  • A timed step marked different work calls public operations that produce different outputs in the two libraries, so its times aren't a speed comparison. The case page explains the difference.
About this run
  • Run 2026-11-07T181422-912Z-3a5a6cec on 2026-11-07, commit 3a5a6ce
  • Both libraries ran in linux/arm64 containers on Apple M4 Pro
  • effect-prophet 0.0.0
  • effect 4.0.6
  • 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.

Country holiday calendars ​

Pinned country calendars, matching explicit-event controls, dynamic future years and portable saved models. Known-gap opt-in is partial provider output, not a completeness guarantee.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
US holidays, additive96 rows21.444721.44460.0048%Fit and predict14.0 ms50.3 ms
Explicit US control, additive96 rows21.444721.44460.0048%Fit and predict13.3 ms46.4 ms
US holidays, multiplicative96 rows21.445921.4459< 0.0001%Fit and predict3.25 ms21.7 ms
Explicit US control, multiplicative96 rows21.445921.4459< 0.0001%Fit and predict2.90 ms17.6 ms
Observed spillovers and unseen future names96 rows23.035023.0350< 0.0001%Fit and predict21.5 ms71.3 ms
Deliberately empty country96 rows20.047320.0473< 0.0001%Fit and predict1.46 ms12.7 ms
No-calendar empty control96 rows20.047320.0473< 0.0001%Fit and predict1.21 ms10.8 ms
Singapore estimated-name transition96 rows20.015120.0151< 0.0001%Fit and predict20.7 ms69.0 ms
India with explicit known-gap opt-in96 rows20.051020.0510< 0.0001%Fit and predict3.40 ms20.3 ms
Country, custom events and mixed features96 rows20.745120.74500.00062%Fit and predict17.1 ms61.4 ms
SE calendar, 730 training rows730 rows20.002620.0026< 0.0001%Fit8.74 ms21.1 ms
SE calendar, 2190 training rows2190 rows20.003320.0033< 0.0001%Fit14.0 ms42.7 ms
CN calendar, 730 training rows730 rows20.004820.0048< 0.0001%Fit9.34 ms24.8 ms
CN calendar, 2190 training rows2190 rows20.004420.00440.0082%Fit21.3 ms84.6 ms
Sweden with a smaller prediction batch2190 rows20.003320.0033< 0.0001%Fit13.3 ms43.0 ms
No-calendar control, 730 training rows / 512 prediction rows730 rows20.012120.0121< 0.0001%Fit3.01 ms8.23 ms
Explicit SE events, 730 training rows / 512 prediction rows730 rows20.002620.0026< 0.0001%Fit5.93 ms18.9 ms
Explicit CN events, 730 training rows / 512 prediction rows730 rows20.004820.0048< 0.0001%Fit5.89 ms21.1 ms
No-calendar control, 2,190 training rows / 512 prediction rows2190 rows20.012120.0121< 0.0001%Fit6.85 ms15.6 ms
Explicit SE events, 2,190 training rows / 512 prediction rows2190 rows20.003320.0033< 0.0001%Fit15.4 ms40.5 ms
Explicit CN events, 2,190 training rows / 512 prediction rows2190 rows20.004420.00440.0082%Fit20.1 ms79.5 ms
No-calendar control, 2,190 training rows / 32 prediction rows2190 rows20.012120.0121< 0.0001%Fit7.56 ms15.5 ms
Explicit SE events, 2,190 training rows / 32 prediction rows2190 rows20.003320.0033< 0.0001%Fit13.1 ms38.8 ms

Default settings ​

fit(history, { growth: "flat" }) against Prophet(growth="flat").fit(df) with nothing else set. Each library decides on its own which seasonal patterns to use. Warm-start cases fit the first rows, then refit the whole history from the parameters of that fit, as when new data arrives.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Defaults, steady level96 rows35.002535.0025< 0.0001%Fit and predict1.48 ms12.2 ms
Defaults, weekly pattern96 rows35.002535.0025< 0.0001%Fit and predict105 ms398 ms
Refit after a week of new data96 rows35.002535.00250.00019%Refit from an earlier fit6.38 ms8.52 ms
Defaults, negative values96 rows-34.9975-34.9975< 0.0001%Fit and predict1.58 ms12.1 ms

Steady levels ​

A single constant level with no seasonal patterns: noisy, perfectly constant, below zero, and every row on the same date. Each runs with both target scalings.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Noisy level, absmax scaling96 rows35.001935.0019< 0.0001%Fit1.92 ms7.48 ms
Noisy level, minmax scaling96 rows35.001535.0015< 0.0001%Fit3.85 ms19.8 ms
Perfectly constant, absmax scaling96 rows35.000035.00000Fit1.23 ms3.10 ms
Perfectly constant, minmax scaling96 rows35.000035.00000Fit1.20 ms3.08 ms
Negative level, absmax scaling96 rows-34.9989-34.9989< 0.0001%Fit1.79 ms7.23 ms
Negative level, minmax scaling96 rows-34.9985-34.9985< 0.0001%Fit3.90 ms20.1 ms
Every row on the same date, different values3 rows4.32864.32890.0059%Fit937 µs5.39 ms
Every row on the same date, same value3 rows2.00002.00000Fit496 µs2.87 ms

Seasonality, events and regressors ​

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.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Weekly pattern, absmax scaling96 rows35.003935.0039< 0.0001%Fit159 ms630 ms
Weekly pattern, minmax scaling96 rows35.003935.0039< 0.0001%Fit4.35 ms20.7 ms
Mixed effects, minmax scaling96 rows35.028335.0283< 0.0001%Fit and predict1.38 ms12.3 ms
Mixed effects, absmax scaling96 rows35.012735.0127< 0.0001%Fit2.00 ms8.16 ms
Mixed effects, eight months, minmax scaling256 rows19.530519.5305< 0.0001%Fit and predict2.20 ms14.3 ms
Additive effects, minmax scaling96 rows35.012735.0127< 0.0001%Fit and predict4.82 ms27.5 ms
Additive effects, eight months, minmax scaling256 rows28.919628.9196< 0.0001%Fit and predict2.15 ms13.8 ms
Mixed effects, both libraries on default settings96 rows35.001235.01270.073%Fit and predict3.11 ms48.8 ms
Regressors that track other effects730 rows56.975356.9753< 0.0001%Fit and predict6.06 ms29.2 ms
A regressor forecast by its own model730 rows24.024824.02470.0020%Fit and predict24.5 ms127 ms
Mixed effects, eight months, absmax scaling256 rows28.919628.9196< 0.0001%Fit2.57 ms9.07 ms
First 63 days, absmax scaling63 rows24.082624.0826< 0.0001%Fit1.83 ms7.36 ms
First 63 days, minmax scaling63 rows7.17987.1798< 0.0001%Fit1.77 ms7.74 ms
First 70 days, absmax scaling70 rows24.079524.0795< 0.0001%Fit2.15 ms8.05 ms
First 70 days, minmax scaling70 rows7.17187.1718< 0.0001%Fit1.72 ms7.54 ms
First 77 days, absmax scaling77 rows24.074624.0746< 0.0001%Fit2.01 ms7.52 ms
First 77 days, minmax scaling77 rows7.15947.1594< 0.0001%Fit2.24 ms7.68 ms
First 225 days, absmax scaling225 rows34.996034.9960< 0.0001%Fit2.24 ms9.04 ms
First 225 days, minmax scaling225 rows34.989134.9891< 0.0001%Fit2.23 ms8.94 ms
First 232 days, absmax scaling232 rows34.993034.9930< 0.0001%Fit2.60 ms8.74 ms
First 232 days, minmax scaling232 rows34.980734.9807< 0.0001%Fit2.80 ms8.87 ms

Uncertainty ranges ​

Both libraries simulate possible futures with random draws, so individual simulated values never match. Each range must still match Python's within the variation expected from that many draws. Anomaly cases also check that both libraries flag the outliers in a history.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Country calendar uncertainty replay96 rows21.444721.44460.0048%Simulate uncertainty (different work)341 µs14.7 ms
Ranges with a forecast regressor730 rows24.024824.02470.0020%Simulate uncertainty (different work)18.1 ms277 ms
Anomalies in a history180 rows34.057934.0579< 0.0001%Fit and find anomalies10.4 ms133 ms
Defaults, ranges with a weekly pattern96 rows35.002535.0025< 0.0001%Simulate uncertainty (different work)4.83 ms129 ms
Ranges with mixed effects96 rows35.028335.0283< 0.0001%Simulate uncertainty (different work)985 µs72.1 ms
Samples, eight months256 rows19.530519.5305< 0.0001%Simulate uncertainty (different work)860 µs20.2 ms

Full Bayesian fitting ​

fit(history, { mcmc: { samples, seed } }) against Prophet(mcmc_samples=...) and fit(df, seed=...): both run Stan's NUTS sampler with the same settings. Their chains can't match draw for draw, so each forecast, component and coefficient, a posterior mean, must agree within 0.15 of the narrowest 80% range, and each range bound within the variation expected from that many posterior draws. Divergences and R-hat are reported, and flagged when Effect's chains mix clearly worse than Python's.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Mixed features, two chains96 rows35.028535.03050.022%Simulate uncertainty (different work)2.02 ms130 ms

Cross-validation and choosing settings ​

Rolling-origin cross-validation, metrics, baselines, settings search and a final holdout check on flat models.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Cross-validation with a forecast regressor730 rows45.043545.03560.094%Cross-validate (different work)60.3 ms227 ms
Cross-validation with a forecast regressor and ranges730 rows45.043545.03560.094%Cross-validate with ranges (different work)61.8 ms291 ms
Cross-validation and metrics96 rows24.074624.0746< 0.0001%Cross-validate (different work)4.50 ms46.2 ms
Cross-validation with ranges96 rows24.074624.0746< 0.0001%Cross-validate with ranges (different work)5.57 ms61.3 ms
Choosing settings and a final holdout96 rows24.074624.0746< 0.0001%Search settings (different work)12.3 ms146 ms
Cross-validation, eight months256 rows34.993034.9930< 0.0001%Cross-validate (different work)6.27 ms39.0 ms
Cross-validation with ranges, eight months256 rows34.993034.9930< 0.0001%Cross-validate with ranges (different work)8.36 ms49.1 ms
Twelve folds, sequential and parallel256 rows35.000835.0008< 0.0001%Cross-validate (different work)27.6 ms184 ms
Monthly, custom and scaled metrics256 rows49.856149.8561< 0.0001%———

Inspired by Prophet from Meta. Not affiliated with Meta.