Skip to content

Logistic growth benchmarks ​

52 of 52 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.
  • Flagged cases match, but the two libraries stopped their fitting search at slightly different points. The case page shows the internal numbers.
About this run
  • Run 2026-10-20T174321-690Z-27b7ec98 on 2026-10-20, commit 27b7ec9
  • Both libraries ran in linux/arm64 containers 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.

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 rows80.572780.5727< 0.0001%Fit and predict31.5 ms60.1 ms
Explicit US control, additive96 rows80.572780.5727< 0.0001%Fit and predict30.7 ms54.4 ms
US holidays, multiplicative96 rows86.008586.0085< 0.0001%Fit and predict44.0 ms66.0 ms
Explicit US control, multiplicative96 rows86.008586.0085< 0.0001%Fit and predict43.3 ms62.9 ms

Default settings ​

fit(history, { growth: "logistic" }) against Prophet(growth="logistic").fit(df) with nothing else set. Each library decides on its own which seasonal patterns, changepoints and optimizer to use.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Defaults, three months of daily data96 rows105.2798105.2798< 0.0001%Fit102 ms123 ms
Defaults, eight months of daily data256 rows113.0552113.05520.0012%Fit37.7 ms42.7 ms
Defaults, a year with changing growth365 rows193.9557193.95230.0086%Fit133 ms121 ms

Growth curves and changepoints ​

An S-shaped curve rising toward a slowly changing ceiling, with no changepoints, one hand-picked changepoint or automatic ones, under both target scalings. Three cases sit either side of 100 rows, where both libraries switch from Newton to L-BFGS.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
No changepoints, absmax scaling96 rows105.2742105.2742< 0.0001%Fit6.78 ms12.7 ms
One hand-picked changepoint, absmax scaling96 rows105.2754105.2754< 0.0001%Fit8.59 ms15.2 ms
Three automatic changepoints, absmax scaling96 rows105.2760105.2760< 0.0001%Fit19.0 ms30.2 ms
No changepoints, minmax scaling96 rows106.7569106.7569< 0.0001%Fit8.51 ms15.8 ms
One hand-picked changepoint, minmax scaling96 rows105.7871105.7871< 0.0001%Fit16.8 ms24.2 ms
Three automatic changepoints, minmax scaling96 rows105.5809105.5809< 0.0001%Fit9.52 ms18.0 ms
No changepoints, loose prior, absmax scaling96 rows99.666699.6666< 0.0001%Fit116 ms128 ms
No changepoints, loose prior, minmax scaling96 rows93.116893.1168< 0.0001%Fit15.2 ms20.5 ms
99 rows: just under the optimizer switch99 rows105.3754105.3754< 0.0001%Fit16.9 ms26.5 ms
100 rows: just over the optimizer switch100 rows105.4111105.4111< 0.0001%Fit1.85 ms7.74 ms
Eight months of daily data256 rows113.6759113.6759< 0.0001%Fit2.82 ms7.89 ms
Weekly pattern, absmax scaling96 rows71.778671.7786< 0.0001%Fit and predict18.9 ms32.6 ms
Weekly pattern, minmax scaling96 rows71.906071.9060< 0.0001%Fit and predict20.5 ms34.5 ms
Weekly pattern, automatic changepoints96 rows71.900071.9000< 0.0001%Fit and predict18.9 ms32.6 ms
Weekly pattern, eight months256 rows98.080498.0804< 0.0001%Fit and predict4.32 ms12.9 ms

Floors and ceilings ​

Histories with an explicit floor as well as a ceiling, both changing over time. Values are measured from the floor, as in Prophet.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Explicit floor, absmax scaling96 rows105.8329105.8329< 0.0001%Fit7.75 ms13.8 ms
Explicit floor, minmax scaling96 rows105.8329105.8329< 0.0001%Fit11.6 ms19.2 ms
Explicit floor with a regressor, absmax scaling96 rows72.219072.2190< 0.0001%Fit and predict21.5 ms35.9 ms
Explicit floor with a regressor, minmax scaling96 rows72.219072.2190< 0.0001%Fit and predict18.5 ms30.1 ms

Seasonality, events and regressors ​

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.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Weekly pattern96 rows105.2764105.2764< 0.0001%Fit15.6 ms27.5 ms
Switchable weekly pattern96 rows105.2763105.2763< 0.0001%Fit16.2 ms28.3 ms
Event with a window96 rows105.2751105.2751< 0.0001%Fit9.09 ms17.9 ms
Additive regressor96 rows105.2753105.2753< 0.0001%Fit7.94 ms15.8 ms
Multiplicative regressor96 rows105.2751105.2751< 0.0001%Fit11.3 ms18.6 ms
Everything at once, absmax scaling96 rows105.8453105.8453< 0.0001%Fit29.0 ms46.6 ms
Everything at once, minmax scaling96 rows105.8453105.8453< 0.0001%Fit25.3 ms44.0 ms

Unusual data ​

Shuffled rows, repeated dates, a falling curve, a curve pinned at its ceiling, a perfectly constant series and values outside the bounds.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Shuffled rows96 rows105.2754105.2754< 0.0001%Fit8.28 ms17.9 ms
Repeated dates96 rows103.2373103.2373< 0.0001%Fit6.01 ms16.7 ms
Falling curve96 rows4.24794.2479< 0.0001%Fit8.25 ms16.2 ms
Pinned at the ceiling96 rows109.5200109.5200< 0.0001%Fit10.9 ms20.3 ms
Perfectly constant96 rows49.930149.93017.9e-12Fit17.8 ms26.7 ms
Values outside the bounds96 rows106.0168106.0168< 0.0001%Fit9.04 ms16.6 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.

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Defaults, ranges with changing growth365 rows193.9557193.95230.0086%Simulate uncertainty23.5 ms282 ms
Defaults, ranges with changing growth, second seed365 rows193.9557193.95230.0086%Simulate uncertainty23.1 ms288 ms
Samples, weekly pattern96 rows71.906071.9060< 0.0001%Simulate uncertainty1.22 ms80.7 ms
Ranges, eight months256 rows98.080498.0804< 0.0001%Simulate uncertainty861 µs26.6 ms
Ranges with an explicit floor96 rows72.219072.2190< 0.0001%Simulate uncertainty945 µs89.0 ms
Samples with an explicit floor96 rows72.219072.2190< 0.0001%Simulate uncertainty563 µs26.0 ms
Ranges with mixed effects96 rows72.227072.2270< 0.0001%Simulate uncertainty629 µs34.6 ms
Samples with mixed effects96 rows72.227072.2270< 0.0001%Simulate uncertainty794 µs27.5 ms

Cross-validation and choosing settings ​

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

CaseInputEffect outputPython outputLargest differenceTimed stepEffect timePython time
Cross-validation and metrics96 rows59.134559.1345< 0.0001%Cross-validate16.6 ms60.2 ms
Cross-validation with ranges96 rows59.134559.1345< 0.0001%Cross-validate with ranges18.5 ms64.8 ms
Choosing settings and a final holdout96 rows59.134559.1345< 0.0001%Search settings36.8 ms123 ms
Cross-validation, eight months256 rows88.536788.52140.034%Cross-validate14.2 ms42.2 ms
Cross-validation with ranges, eight months256 rows88.536788.52140.034%Cross-validate with ranges16.1 ms56.8 ms

Inspired by Prophet from Meta. Not affiliated with Meta.