From ebea4484f6184e8b0b3ec2b3c75b8ae2f279b733 Mon Sep 17 00:00:00 2001 From: mproszewska Date: Tue, 5 May 2020 01:53:36 +0200 Subject: [PATCH 1/7] BUG: Use kwargs in apply in window --- pandas/core/window/rolling.py | 1 + pandas/tests/window/test_apply.py | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/pandas/core/window/rolling.py b/pandas/core/window/rolling.py index 3b14921528890..8b348db397665 100644 --- a/pandas/core/window/rolling.py +++ b/pandas/core/window/rolling.py @@ -1300,6 +1300,7 @@ def apply( use_numba_cache=engine == "numba", raw=raw, original_func=func, + kwargs=kwargs, ) def _generate_cython_apply_func(self, args, kwargs, raw, offset, func): diff --git a/pandas/tests/window/test_apply.py b/pandas/tests/window/test_apply.py index 7132e64c1191c..5162da2457757 100644 --- a/pandas/tests/window/test_apply.py +++ b/pandas/tests/window/test_apply.py @@ -138,3 +138,12 @@ def test_invalid_kwargs_nopython(): Series(range(1)).rolling(1).apply( lambda x: x, kwargs={"a": 1}, engine="numba", raw=True ) + +def test_apply_kwargs(): + def foo(x, par): + return np.sum(x + par) + + df = DataFrame({"gr": [1, 1], "a": [1, 2]}) + result = df.groupby("gr")["a"].rolling(1).apply(foo, kwargs={"par": 10}) + expected = np.array([11.,12.]) + np.testing.assert_array_equal(result.values, expected) From e2b0f56728ebfa056cb79b8b53192f583e7731d5 Mon Sep 17 00:00:00 2001 From: mproszewska Date: Tue, 5 May 2020 02:00:33 +0200 Subject: [PATCH 2/7] Run black --- pandas/tests/window/test_apply.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/tests/window/test_apply.py b/pandas/tests/window/test_apply.py index 5162da2457757..8a1b9f6b08937 100644 --- a/pandas/tests/window/test_apply.py +++ b/pandas/tests/window/test_apply.py @@ -139,11 +139,12 @@ def test_invalid_kwargs_nopython(): lambda x: x, kwargs={"a": 1}, engine="numba", raw=True ) + def test_apply_kwargs(): def foo(x, par): return np.sum(x + par) df = DataFrame({"gr": [1, 1], "a": [1, 2]}) result = df.groupby("gr")["a"].rolling(1).apply(foo, kwargs={"par": 10}) - expected = np.array([11.,12.]) + expected = np.array([11.0, 12.0]) np.testing.assert_array_equal(result.values, expected) From 1c279bb553c7b37a70aa42afa4875e815b7ce33a Mon Sep 17 00:00:00 2001 From: mproszewska Date: Tue, 5 May 2020 03:11:40 +0200 Subject: [PATCH 3/7] Change unwanted pattern --- pandas/tests/window/test_apply.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/window/test_apply.py b/pandas/tests/window/test_apply.py index 8a1b9f6b08937..76951d4c7731e 100644 --- a/pandas/tests/window/test_apply.py +++ b/pandas/tests/window/test_apply.py @@ -147,4 +147,4 @@ def foo(x, par): df = DataFrame({"gr": [1, 1], "a": [1, 2]}) result = df.groupby("gr")["a"].rolling(1).apply(foo, kwargs={"par": 10}) expected = np.array([11.0, 12.0]) - np.testing.assert_array_equal(result.values, expected) + tm.assert_numpy_array_equal(result.values, expected) From 6c43f616aa87fdfc20546d748d08fdb850ba1f86 Mon Sep 17 00:00:00 2001 From: mproszewska Date: Sun, 10 May 2020 19:05:05 +0200 Subject: [PATCH 4/7] Include args and modify test --- pandas/core/window/rolling.py | 1 + pandas/tests/window/test_apply.py | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pandas/core/window/rolling.py b/pandas/core/window/rolling.py index 8b348db397665..a61ff94e4c445 100644 --- a/pandas/core/window/rolling.py +++ b/pandas/core/window/rolling.py @@ -1300,6 +1300,7 @@ def apply( use_numba_cache=engine == "numba", raw=raw, original_func=func, + args=args, kwargs=kwargs, ) diff --git a/pandas/tests/window/test_apply.py b/pandas/tests/window/test_apply.py index 76951d4c7731e..40c842ed23af6 100644 --- a/pandas/tests/window/test_apply.py +++ b/pandas/tests/window/test_apply.py @@ -3,7 +3,7 @@ import pandas.util._test_decorators as td -from pandas import DataFrame, Series, Timestamp, date_range +from pandas import DataFrame, MultiIndex, Series, Timestamp, date_range import pandas._testing as tm @@ -141,10 +141,15 @@ def test_invalid_kwargs_nopython(): def test_apply_kwargs(): + # GH 33433 def foo(x, par): return np.sum(x + par) + midx = MultiIndex.from_tuples([(1,0),(1,1)], names=["gr", None]) + expected = Series([11.0, 12.0], index=midx, name="a") + df = DataFrame({"gr": [1, 1], "a": [1, 2]}) result = df.groupby("gr")["a"].rolling(1).apply(foo, kwargs={"par": 10}) - expected = np.array([11.0, 12.0]) - tm.assert_numpy_array_equal(result.values, expected) + tm.assert_series_equal(result, expected) + result = df.groupby("gr")["a"].rolling(1).apply(foo, args=(10,)) + tm.assert_series_equal(result, expected) From f3b2c17b27349aa177daaed13b40ac646527f55a Mon Sep 17 00:00:00 2001 From: mproszewska Date: Sun, 10 May 2020 19:32:13 +0200 Subject: [PATCH 5/7] Add whatsnew note and test without groupby --- doc/source/whatsnew/v1.1.0.rst | 5 +++++ pandas/tests/window/test_apply.py | 25 +++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index cd1cb0b64f74a..7f0481f1de8e5 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -610,6 +610,11 @@ Groupby/resample/rolling - Bug in :meth:`DataFrame.groupby` where a ``ValueError`` would be raised when grouping by a categorical column with read-only categories and ``sort=False`` (:issue:`33410`) - Bug in :meth:`GroupBy.first` and :meth:`GroupBy.last` where None is not preserved in object dtype (:issue:`32800`) +Groupby/rolling +^^^^^^^^^^^^^^^^^^^^^^^^ + +- Bug in :meth:`GroupBy.rolling.apply` ignores args and kwargs parameters (:issue:`33433`) + Reshaping ^^^^^^^^^ diff --git a/pandas/tests/window/test_apply.py b/pandas/tests/window/test_apply.py index 40c842ed23af6..9990157fd27c6 100644 --- a/pandas/tests/window/test_apply.py +++ b/pandas/tests/window/test_apply.py @@ -3,7 +3,7 @@ import pandas.util._test_decorators as td -from pandas import DataFrame, MultiIndex, Series, Timestamp, date_range +from pandas import DataFrame, Index, MultiIndex, Series, Timestamp, date_range import pandas._testing as tm @@ -140,16 +140,29 @@ def test_invalid_kwargs_nopython(): ) -def test_apply_kwargs(): +def test_rolling_apply_args_kwargs(): # GH 33433 def foo(x, par): return np.sum(x + par) - midx = MultiIndex.from_tuples([(1,0),(1,1)], names=["gr", None]) + df = DataFrame({"gr": [1, 1], "a": [1, 2]}) + + idx = Index(["gr", "a"]) + expected = DataFrame([[11.0, 11.0], [11.0, 12.0]], columns=idx) + + result = df.rolling(1).apply(foo, kwargs={"par": 10}) + tm.assert_frame_equal(result, expected) + + result = df.rolling(1).apply(foo, args=(10,)) + tm.assert_frame_equal(result, expected) + + midx = MultiIndex.from_tuples([(1, 0), (1, 1)], names=["gr", None]) expected = Series([11.0, 12.0], index=midx, name="a") - df = DataFrame({"gr": [1, 1], "a": [1, 2]}) - result = df.groupby("gr")["a"].rolling(1).apply(foo, kwargs={"par": 10}) + gb_rolling = df.groupby("gr")["a"].rolling(1) + + result = gb_rolling.apply(foo, kwargs={"par": 10}) tm.assert_series_equal(result, expected) - result = df.groupby("gr")["a"].rolling(1).apply(foo, args=(10,)) + + result = gb_rolling.apply(foo, args=(10,)) tm.assert_series_equal(result, expected) From f112b7c96d432dc35fed7bfaede14216e6d41f61 Mon Sep 17 00:00:00 2001 From: mproszewska Date: Fri, 15 May 2020 13:30:00 +0200 Subject: [PATCH 6/7] Add requested changes --- doc/source/whatsnew/v1.1.0.rst | 5 +---- pandas/tests/window/test_apply.py | 11 ++++------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index f4ae39d9cbd5e..d4cdce9368faf 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -803,12 +803,9 @@ Groupby/resample/rolling - Bug in :meth:`DataFrame.groupby` where a ``ValueError`` would be raised when grouping by a categorical column with read-only categories and ``sort=False`` (:issue:`33410`) - Bug in :meth:`GroupBy.first` and :meth:`GroupBy.last` where None is not preserved in object dtype (:issue:`32800`) - Bug in :meth:`Rolling.min` and :meth:`Rolling.max`: Growing memory usage after multiple calls when using a fixed window (:issue:`30726`) - -Groupby/rolling -^^^^^^^^^^^^^^^^^^^^^^^^ - - Bug in :meth:`GroupBy.rolling.apply` ignores args and kwargs parameters (:issue:`33433`) + Reshaping ^^^^^^^^^ diff --git a/pandas/tests/window/test_apply.py b/pandas/tests/window/test_apply.py index 731adbda65ae6..bc38634da8941 100644 --- a/pandas/tests/window/test_apply.py +++ b/pandas/tests/window/test_apply.py @@ -141,7 +141,8 @@ def test_invalid_kwargs_nopython(): ) -def test_rolling_apply_args_kwargs(): +@pytest.mark.parametrize("args_kwargs", [[None, {"par": 10}], [(10,), None]]) +def test_rolling_apply_args_kwargs(args_kwargs): # GH 33433 def foo(x, par): return np.sum(x + par) @@ -151,19 +152,15 @@ def foo(x, par): idx = Index(["gr", "a"]) expected = DataFrame([[11.0, 11.0], [11.0, 12.0]], columns=idx) - result = df.rolling(1).apply(foo, kwargs={"par": 10}) + result = df.rolling(1).apply(foo, args=args_kwargs[0], kwargs=args_kwargs[1]) tm.assert_frame_equal(result, expected) result = df.rolling(1).apply(foo, args=(10,)) - tm.assert_frame_equal(result, expected) midx = MultiIndex.from_tuples([(1, 0), (1, 1)], names=["gr", None]) expected = Series([11.0, 12.0], index=midx, name="a") gb_rolling = df.groupby("gr")["a"].rolling(1) - result = gb_rolling.apply(foo, kwargs={"par": 10}) - tm.assert_series_equal(result, expected) - - result = gb_rolling.apply(foo, args=(10,)) + result = gb_rolling.apply(foo, args=args_kwargs[0], kwargs=args_kwargs[1]) tm.assert_series_equal(result, expected) From cbd5aa9ba29c8810763a0097f10c1d2729642ca1 Mon Sep 17 00:00:00 2001 From: mproszewska Date: Fri, 15 May 2020 13:35:09 +0200 Subject: [PATCH 7/7] Resolve conflict --- doc/source/whatsnew/v1.1.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index d4cdce9368faf..2a235ec53c8cd 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -803,6 +803,7 @@ Groupby/resample/rolling - Bug in :meth:`DataFrame.groupby` where a ``ValueError`` would be raised when grouping by a categorical column with read-only categories and ``sort=False`` (:issue:`33410`) - Bug in :meth:`GroupBy.first` and :meth:`GroupBy.last` where None is not preserved in object dtype (:issue:`32800`) - Bug in :meth:`Rolling.min` and :meth:`Rolling.max`: Growing memory usage after multiple calls when using a fixed window (:issue:`30726`) +- Bug in :meth:`GroupBy.agg`, :meth:`GroupBy.transform`, and :meth:`GroupBy.resample` where subclasses are not preserved (:issue:`28330`) - Bug in :meth:`GroupBy.rolling.apply` ignores args and kwargs parameters (:issue:`33433`)