diff --git a/doc/source/whatsnew/v2.1.0.rst b/doc/source/whatsnew/v2.1.0.rst index 45b5c16415f9d..a60d4806252dd 100644 --- a/doc/source/whatsnew/v2.1.0.rst +++ b/doc/source/whatsnew/v2.1.0.rst @@ -187,6 +187,7 @@ Plotting Groupby/resample/rolling ^^^^^^^^^^^^^^^^^^^^^^^^ - Bug in :meth:`DataFrameGroupBy.idxmin`, :meth:`SeriesGroupBy.idxmin`, :meth:`DataFrameGroupBy.idxmax`, :meth:`SeriesGroupBy.idxmax` return wrong dtype when used on empty DataFrameGroupBy or SeriesGroupBy (:issue:`51423`) +- Bug in weighted rolling aggregations when specifying ``min_periods=0`` (:issue:`51449`) - Reshaping diff --git a/pandas/core/window/rolling.py b/pandas/core/window/rolling.py index 97b3f23d65b44..46ce5950a1465 100644 --- a/pandas/core/window/rolling.py +++ b/pandas/core/window/rolling.py @@ -1204,7 +1204,11 @@ def homogeneous_func(values: np.ndarray): def calc(x): additional_nans = np.array([np.nan] * offset) x = np.concatenate((x, additional_nans)) - return func(x, window, self.min_periods or len(window)) + return func( + x, + window, + self.min_periods if self.min_periods is not None else len(window), + ) with np.errstate(all="ignore"): # Our weighted aggregations return memoryviews diff --git a/pandas/tests/window/test_win_type.py b/pandas/tests/window/test_win_type.py index 8438e0727c174..a0d052257ec6b 100644 --- a/pandas/tests/window/test_win_type.py +++ b/pandas/tests/window/test_win_type.py @@ -321,16 +321,16 @@ def test_cmov_window_frame(f, xp, step): tm.assert_frame_equal(xp, rs) +@pytest.mark.parametrize("min_periods", [0, 1, 2, 3, 4, 5]) @td.skip_if_no_scipy -def test_cmov_window_na_min_periods(step): - # min_periods +def test_cmov_window_na_min_periods(step, min_periods): vals = Series(np.random.randn(10)) vals[4] = np.nan vals[8] = np.nan - xp = vals.rolling(5, min_periods=4, center=True, step=step).mean() + xp = vals.rolling(5, min_periods=min_periods, center=True, step=step).mean() rs = vals.rolling( - 5, win_type="boxcar", min_periods=4, center=True, step=step + 5, win_type="boxcar", min_periods=min_periods, center=True, step=step ).mean() tm.assert_series_equal(xp, rs)