diff --git a/python/prophet/forecaster.py b/python/prophet/forecaster.py index 261776c85..7f404b4c4 100644 --- a/python/prophet/forecaster.py +++ b/python/prophet/forecaster.py @@ -914,6 +914,10 @@ def add_seasonality( ps = float(prior_scale) if ps <= 0: raise ValueError('Prior scale must be > 0') + if not period > 0: + # Also rejects NaN. period divides the Fourier frequencies, so 0 + # only failed later in fit with a ZeroDivisionError. + raise ValueError('Period must be > 0') if fourier_order <= 0: raise ValueError('Fourier Order must be > 0') if mode is None: diff --git a/python/prophet/tests/test_prophet.py b/python/prophet/tests/test_prophet.py index 0c5e9d0e2..2488308b3 100644 --- a/python/prophet/tests/test_prophet.py +++ b/python/prophet/tests/test_prophet.py @@ -688,6 +688,14 @@ def test_custom_fourier_order(self, backend): with pytest.raises(ValueError): m.add_seasonality(name="weekly", period=7, fourier_order=-1) + def test_custom_period(self, backend): + """Period must be > 0""" + m = Prophet(stan_backend=backend) + for period in [0, 0.0, -7, float("nan")]: + with pytest.raises(ValueError, match="Period must be > 0"): + m.add_seasonality(name="custom", period=period, fourier_order=3) + assert "custom" not in m.seasonalities + def test_custom_priors(self, daily_univariate_ts, backend): holidays = pd.DataFrame( {