From 8e0346137e3993b2265cd3fddbda515c2f3b501c Mon Sep 17 00:00:00 2001 From: ihsan Date: Sun, 7 Jul 2019 16:06:39 +0300 Subject: [PATCH 01/16] ENH: Raise ValueError for unsupported Window functions --- pandas/core/window.py | 22 ++++++++++++++++++++++ pandas/tests/test_window.py | 11 +++++++++++ 2 files changed, 33 insertions(+) diff --git a/pandas/core/window.py b/pandas/core/window.py index 27588249b1b3c..ba106bf854181 100644 --- a/pandas/core/window.py +++ b/pandas/core/window.py @@ -659,6 +659,26 @@ def validate(self): else: raise ValueError("Invalid window {0}".format(window)) + def _validate_aggregate(self, arg, *args, **kwargs): + # supported weighted window functions + valid_ops = ["mean", "sum"] + + def validate_str(op): + if op not in valid_ops: + raise ValueError( + "{op} function is not supported " + "for weighted windows.".format(op=op) + ) + + if isinstance(arg, str): + validate_str(arg) + elif isinstance(arg, (list, tuple, dict)): + ops = arg.values() if isinstance(arg, dict) else arg + + for op in ops: + if isinstance(op, str): + validate_str(op) + def _prep_window(self, **kwargs): """ Provide validation for our window type, return the window @@ -815,6 +835,8 @@ def f(arg, *args, **kwargs): ) @Appender(_shared_docs["aggregate"]) def aggregate(self, arg, *args, **kwargs): + self._validate_aggregate(arg) + result, how = self._aggregate(arg, *args, **kwargs) if result is None: diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index 27700d778df19..e495271f88758 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -480,6 +480,17 @@ def test_numpy_compat(self, method): with pytest.raises(UnsupportedFunctionCall, match=msg): getattr(w, method)(dtype=np.float64) + @pytest.mark.parametrize( + "arg", ["std", ["mean", "std"], ("mean", "std"), {"A": "mean", "B": "std"}] + ) + def test_agg_function_support(self, arg): + ser = pd.DataFrame({"A": np.arange(5), "B": np.arange(5)}) + roll = ser.rolling(2, win_type="triang") + + msg = "std function is not supported for weighted windows." + with pytest.raises(ValueError, match=msg): + roll.agg(arg) + class TestRolling(Base): def setup_method(self, method): From b6714846de8ec04390e98cce54aec68e42b80a4c Mon Sep 17 00:00:00 2001 From: ihsan Date: Sun, 7 Jul 2019 16:15:49 +0300 Subject: [PATCH 02/16] Improve docs for win_type --- pandas/core/window.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/core/window.py b/pandas/core/window.py index ba106bf854181..10f62d3a09908 100644 --- a/pandas/core/window.py +++ b/pandas/core/window.py @@ -511,6 +511,7 @@ class Window(_Window): Set the labels at the center of the window. win_type : str, default None Provide a window type. If ``None``, all points are evenly weighted. + Other types are only applicable for `mean` and `sum` functions. See the notes below for further information. on : str, optional For a DataFrame, column on which to calculate From 693c9d1c8bb75cbe887dfa8d9bc0ab7c18b3b111 Mon Sep 17 00:00:00 2001 From: ihsan Date: Sun, 7 Jul 2019 16:23:28 +0300 Subject: [PATCH 03/16] Add whatsnew --- doc/source/whatsnew/v0.25.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/whatsnew/v0.25.0.rst b/doc/source/whatsnew/v0.25.0.rst index 101addfa097f8..17708510159da 100644 --- a/doc/source/whatsnew/v0.25.0.rst +++ b/doc/source/whatsnew/v0.25.0.rst @@ -1130,6 +1130,7 @@ Groupby/resample/rolling - Bug in :meth:`pandas.core.window.Rolling.median` and :meth:`pandas.core.window.Rolling.quantile` where incorrect results are returned with ``closed='left'`` and ``closed='neither'`` (:issue:`26005`) - Improved :class:`pandas.core.window.Rolling`, :class:`pandas.core.window.Window` and :class:`pandas.core.window.EWM` functions to exclude nuisance columns from results instead of raising errors and raise a ``DataError`` only if all columns are nuisance (:issue:`12537`) - Bug in :meth:`pandas.core.window.Rolling.max` and :meth:`pandas.core.window.Rolling.min` where incorrect results are returned with an empty variable window`` (:issue:`26005`) +- Raise a helpful exception when an unsupported weighted window function is used as an argument of :meth:`pandas.core.window.Window.aggregate` (:issue:`26597`) Reshaping ^^^^^^^^^ From e8b62b60191a1c194a0edc7adb13763acff064cd Mon Sep 17 00:00:00 2001 From: ihsan Date: Sun, 7 Jul 2019 19:05:58 +0300 Subject: [PATCH 04/16] Catch AttributeError and raise ValueError instead --- pandas/core/base.py | 11 +++++++---- pandas/core/window.py | 22 ---------------------- pandas/tests/test_window.py | 2 +- 3 files changed, 8 insertions(+), 27 deletions(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index 15baf1bed0ecd..16457242e94cd 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -314,7 +314,13 @@ def _try_aggregate_string_function(self, arg, *args, **kwargs): f = getattr(np, arg, None) if f is not None: - return f(self, *args, **kwargs) + try: + return f(self, *args, **kwargs) + except AttributeError: + raise ValueError( + "'{arg}' is not a valid function for " + "'{cls}' object".format(arg=arg, cls=type(self).__name__) + ) raise ValueError("{arg} is an unknown string function".format(arg=arg)) @@ -603,9 +609,6 @@ def _aggregate_multiple_funcs(self, arg, _level, _axis): keys.append(col) except (TypeError, DataError): pass - except ValueError: - # cannot aggregate - continue except SpecificationError: raise diff --git a/pandas/core/window.py b/pandas/core/window.py index 10f62d3a09908..d0a25c26dcacf 100644 --- a/pandas/core/window.py +++ b/pandas/core/window.py @@ -660,26 +660,6 @@ def validate(self): else: raise ValueError("Invalid window {0}".format(window)) - def _validate_aggregate(self, arg, *args, **kwargs): - # supported weighted window functions - valid_ops = ["mean", "sum"] - - def validate_str(op): - if op not in valid_ops: - raise ValueError( - "{op} function is not supported " - "for weighted windows.".format(op=op) - ) - - if isinstance(arg, str): - validate_str(arg) - elif isinstance(arg, (list, tuple, dict)): - ops = arg.values() if isinstance(arg, dict) else arg - - for op in ops: - if isinstance(op, str): - validate_str(op) - def _prep_window(self, **kwargs): """ Provide validation for our window type, return the window @@ -836,8 +816,6 @@ def f(arg, *args, **kwargs): ) @Appender(_shared_docs["aggregate"]) def aggregate(self, arg, *args, **kwargs): - self._validate_aggregate(arg) - result, how = self._aggregate(arg, *args, **kwargs) if result is None: diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index e495271f88758..0fc88686075ff 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -487,7 +487,7 @@ def test_agg_function_support(self, arg): ser = pd.DataFrame({"A": np.arange(5), "B": np.arange(5)}) roll = ser.rolling(2, win_type="triang") - msg = "std function is not supported for weighted windows." + msg = "'std' is not a valid function for 'Window' object" with pytest.raises(ValueError, match=msg): roll.agg(arg) From b65b9e5feee0b85595862662c4d4cdca665608f9 Mon Sep 17 00:00:00 2001 From: ihsan Date: Mon, 8 Jul 2019 18:20:23 +0300 Subject: [PATCH 05/16] Hangle list-like args --- pandas/core/base.py | 14 +++++++++++++- pandas/tests/test_window.py | 7 ++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index 16457242e94cd..513f48335f605 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -560,7 +560,16 @@ def is_any_frame(): return result, True elif is_list_like(arg): # we require a list, but not an 'str' - return self._aggregate_multiple_funcs(arg, _level=_level, _axis=_axis), None + try: + return self._aggregate_multiple_funcs(arg, _level=_level, _axis=_axis), None + + # if no results + except ValueError: + raise ValueError( + "'{arg}' is not a valid set of functions for " + "'{cls}' object".format(arg=", ".join(arg), cls=type(self).__name__) + ) + else: result = None @@ -609,6 +618,9 @@ def _aggregate_multiple_funcs(self, arg, _level, _axis): keys.append(col) except (TypeError, DataError): pass + except ValueError: + # cannot aggregate + continue except SpecificationError: raise diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index 0fc88686075ff..7f7abd04ef697 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -487,7 +487,12 @@ def test_agg_function_support(self, arg): ser = pd.DataFrame({"A": np.arange(5), "B": np.arange(5)}) roll = ser.rolling(2, win_type="triang") - msg = "'std' is not a valid function for 'Window' object" + if isinstance(arg, (list, tuple)): + msg = ("'{arg}' is not a valid set of functions for " + "'Window' object".format(arg=", ".join(arg))) + else: + msg = "'std' is not a valid function for 'Window' object" + with pytest.raises(ValueError, match=msg): roll.agg(arg) From 6be036f92b2c51bb2e12fc7e65369c1d4bba5025 Mon Sep 17 00:00:00 2001 From: ihsan Date: Mon, 8 Jul 2019 18:57:44 +0300 Subject: [PATCH 06/16] Skip if no scipy --- pandas/tests/test_window.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index 7f7abd04ef697..dbdf813ab7e31 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -480,6 +480,7 @@ def test_numpy_compat(self, method): with pytest.raises(UnsupportedFunctionCall, match=msg): getattr(w, method)(dtype=np.float64) + @td.skip_if_no_scipy @pytest.mark.parametrize( "arg", ["std", ["mean", "std"], ("mean", "std"), {"A": "mean", "B": "std"}] ) From 5fd5f5063314d68bcf872146d7ec31330d7687a0 Mon Sep 17 00:00:00 2001 From: ihsan Date: Mon, 8 Jul 2019 21:13:22 +0300 Subject: [PATCH 07/16] Format using black --- pandas/core/base.py | 5 ++++- pandas/tests/test_window.py | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index 513f48335f605..7d99a5a46f3d1 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -561,7 +561,10 @@ def is_any_frame(): elif is_list_like(arg): # we require a list, but not an 'str' try: - return self._aggregate_multiple_funcs(arg, _level=_level, _axis=_axis), None + return ( + self._aggregate_multiple_funcs(arg, _level=_level, _axis=_axis), + None, + ) # if no results except ValueError: diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index dbdf813ab7e31..95ab04033fa1d 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -489,8 +489,10 @@ def test_agg_function_support(self, arg): roll = ser.rolling(2, win_type="triang") if isinstance(arg, (list, tuple)): - msg = ("'{arg}' is not a valid set of functions for " - "'Window' object".format(arg=", ".join(arg))) + msg = ( + "'{arg}' is not a valid set of functions for " + "'Window' object".format(arg=", ".join(arg)) + ) else: msg = "'std' is not a valid function for 'Window' object" From 3988dab2b6b1de7dee00b1a3905e51e9f83fad6e Mon Sep 17 00:00:00 2001 From: ihsan Date: Wed, 10 Jul 2019 12:36:35 +0300 Subject: [PATCH 08/16] Raise AttributeError instead of conflicting ValueError --- pandas/core/base.py | 15 ++------------- pandas/tests/test_window.py | 11 ++--------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index 7d99a5a46f3d1..87092f4802fc9 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -317,7 +317,7 @@ def _try_aggregate_string_function(self, arg, *args, **kwargs): try: return f(self, *args, **kwargs) except AttributeError: - raise ValueError( + raise AttributeError( "'{arg}' is not a valid function for " "'{cls}' object".format(arg=arg, cls=type(self).__name__) ) @@ -560,18 +560,7 @@ def is_any_frame(): return result, True elif is_list_like(arg): # we require a list, but not an 'str' - try: - return ( - self._aggregate_multiple_funcs(arg, _level=_level, _axis=_axis), - None, - ) - - # if no results - except ValueError: - raise ValueError( - "'{arg}' is not a valid set of functions for " - "'{cls}' object".format(arg=", ".join(arg), cls=type(self).__name__) - ) + return self._aggregate_multiple_funcs(arg, _level=_level, _axis=_axis), None else: result = None diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index 95ab04033fa1d..cc518aa8857d4 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -488,15 +488,8 @@ def test_agg_function_support(self, arg): ser = pd.DataFrame({"A": np.arange(5), "B": np.arange(5)}) roll = ser.rolling(2, win_type="triang") - if isinstance(arg, (list, tuple)): - msg = ( - "'{arg}' is not a valid set of functions for " - "'Window' object".format(arg=", ".join(arg)) - ) - else: - msg = "'std' is not a valid function for 'Window' object" - - with pytest.raises(ValueError, match=msg): + msg = "'std' is not a valid function for 'Window' object" + with pytest.raises(AttributeError, match=msg): roll.agg(arg) From 1bf2e2ad14e6f5778c60e1c7810d87ec297282c8 Mon Sep 17 00:00:00 2001 From: ihsan Date: Wed, 10 Jul 2019 15:26:42 +0300 Subject: [PATCH 09/16] Remove ' from whatsnew --- doc/source/whatsnew/v0.25.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.25.0.rst b/doc/source/whatsnew/v0.25.0.rst index e72350bbe858e..71fcc9039870f 100644 --- a/doc/source/whatsnew/v0.25.0.rst +++ b/doc/source/whatsnew/v0.25.0.rst @@ -1133,7 +1133,7 @@ Groupby/resample/rolling - Bug in :meth:`pandas.core.window.Rolling.median` and :meth:`pandas.core.window.Rolling.quantile` where MemoryError is raised with empty window (:issue:`26005`) - Bug in :meth:`pandas.core.window.Rolling.median` and :meth:`pandas.core.window.Rolling.quantile` where incorrect results are returned with ``closed='left'`` and ``closed='neither'`` (:issue:`26005`) - Improved :class:`pandas.core.window.Rolling`, :class:`pandas.core.window.Window` and :class:`pandas.core.window.EWM` functions to exclude nuisance columns from results instead of raising errors and raise a ``DataError`` only if all columns are nuisance (:issue:`12537`) -- Bug in :meth:`pandas.core.window.Rolling.max` and :meth:`pandas.core.window.Rolling.min` where incorrect results are returned with an empty variable window`` (:issue:`26005`) +- Bug in :meth:`pandas.core.window.Rolling.max` and :meth:`pandas.core.window.Rolling.min` where incorrect results are returned with an empty variable window (:issue:`26005`) - Raise a helpful exception when an unsupported weighted window function is used as an argument of :meth:`pandas.core.window.Window.aggregate` (:issue:`26597`) Reshaping From 03b4dae809eadb56403e281a1a23805e88528945 Mon Sep 17 00:00:00 2001 From: ihsan Date: Wed, 10 Jul 2019 22:18:50 +0300 Subject: [PATCH 10/16] Change ValueError with AttributeError and catch TypeError AttributeError is raised since it is conflicting with the one when list-like arg is provided. TypeError is catched since it is raised when 'median' is passed as an arg --- pandas/core/base.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index 87092f4802fc9..e7c893c478aed 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -316,13 +316,14 @@ def _try_aggregate_string_function(self, arg, *args, **kwargs): if f is not None: try: return f(self, *args, **kwargs) - except AttributeError: + + except (AttributeError, TypeError): raise AttributeError( "'{arg}' is not a valid function for " "'{cls}' object".format(arg=arg, cls=type(self).__name__) ) - raise ValueError("{arg} is an unknown string function".format(arg=arg)) + raise AttributeError("'{arg}' is an unknown string function".format(arg=arg)) def _aggregate(self, arg, *args, **kwargs): """ From a3e81ccef16d15c80446ae86de077c7f44dc44d3 Mon Sep 17 00:00:00 2001 From: ihsan Date: Wed, 10 Jul 2019 22:22:06 +0300 Subject: [PATCH 11/16] Test each function one by one --- pandas/tests/test_window.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index 04341c17d7090..ab1d58a3625f9 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -481,17 +481,22 @@ def test_numpy_compat(self, method): getattr(w, method)(dtype=np.float64) @td.skip_if_no_scipy - @pytest.mark.parametrize( - "arg", ["std", ["mean", "std"], ("mean", "std"), {"A": "mean", "B": "std"}] - ) + @pytest.mark.parametrize("arg", ["median", "var", "std"]) def test_agg_function_support(self, arg): - ser = pd.DataFrame({"A": np.arange(5), "B": np.arange(5)}) - roll = ser.rolling(2, win_type="triang") + df = pd.DataFrame({"A": np.arange(5)}) + roll = df.rolling(2, win_type="triang") - msg = "'std' is not a valid function for 'Window' object" + msg = ("'{arg}' is not a valid function for " + "'Window' object").format(arg=arg) with pytest.raises(AttributeError, match=msg): roll.agg(arg) + with pytest.raises(AttributeError, match=msg): + roll.agg([arg]) + + with pytest.raises(AttributeError, match=msg): + roll.agg({"A": arg}) + class TestRolling(Base): def setup_method(self, method): From 69ae66d3963e8ba42c32ded3777e30c3ec49b92f Mon Sep 17 00:00:00 2001 From: ihsan Date: Wed, 10 Jul 2019 22:24:03 +0300 Subject: [PATCH 12/16] Test unknown function --- pandas/tests/test_window.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index ab1d58a3625f9..184fa898b78b3 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -979,6 +979,20 @@ def test_numpy_compat(self, method): with pytest.raises(UnsupportedFunctionCall, match=msg): getattr(e, method)(dtype=np.float64) + def test_agg_unknown(self): + df = pd.DataFrame({"A": np.arange(5)}) + roll = df.rolling(2) + + msg = "'foo' is an unknown string function" + with pytest.raises(AttributeError, match=msg): + roll.agg("foo") + + with pytest.raises(AttributeError, match=msg): + roll.agg(["foo"]) + + with pytest.raises(AttributeError, match=msg): + roll.agg({"A": "foo"}) + # gh-12373 : rolling functions error on float32 data # make sure rolling functions works for different dtypes From d3b989e37506c1104221b3610d518980b169eb82 Mon Sep 17 00:00:00 2001 From: ihsan Date: Wed, 10 Jul 2019 22:25:50 +0300 Subject: [PATCH 13/16] Format --- pandas/tests/test_window.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index 184fa898b78b3..0a414399903ff 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -486,8 +486,7 @@ def test_agg_function_support(self, arg): df = pd.DataFrame({"A": np.arange(5)}) roll = df.rolling(2, win_type="triang") - msg = ("'{arg}' is not a valid function for " - "'Window' object").format(arg=arg) + msg = "'{arg}' is not a valid function for " "'Window' object".format(arg=arg) with pytest.raises(AttributeError, match=msg): roll.agg(arg) From 546479b0500adcc257f2b33cc9f421f39d824c51 Mon Sep 17 00:00:00 2001 From: ihsan Date: Thu, 11 Jul 2019 18:35:17 +0300 Subject: [PATCH 14/16] Raise single error for invalid functions --- pandas/core/base.py | 10 +++++----- pandas/tests/window/test_window.py | 16 +--------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index e7c893c478aed..d4558a396ed13 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -318,12 +318,12 @@ def _try_aggregate_string_function(self, arg, *args, **kwargs): return f(self, *args, **kwargs) except (AttributeError, TypeError): - raise AttributeError( - "'{arg}' is not a valid function for " - "'{cls}' object".format(arg=arg, cls=type(self).__name__) - ) + pass - raise AttributeError("'{arg}' is an unknown string function".format(arg=arg)) + raise AttributeError( + "'{arg}' is not a valid function for " + "'{cls}' object".format(arg=arg, cls=type(self).__name__) + ) def _aggregate(self, arg, *args, **kwargs): """ diff --git a/pandas/tests/window/test_window.py b/pandas/tests/window/test_window.py index 0761c28d7924e..3945a8aaa8b87 100644 --- a/pandas/tests/window/test_window.py +++ b/pandas/tests/window/test_window.py @@ -440,7 +440,7 @@ def test_numpy_compat(self, method): getattr(w, method)(dtype=np.float64) @td.skip_if_no_scipy - @pytest.mark.parametrize("arg", ["median", "var", "std"]) + @pytest.mark.parametrize("arg", ["median", "var", "std", "kurt", "skew"]) def test_agg_function_support(self, arg): df = pd.DataFrame({"A": np.arange(5)}) roll = df.rolling(2, win_type="triang") @@ -937,20 +937,6 @@ def test_numpy_compat(self, method): with pytest.raises(UnsupportedFunctionCall, match=msg): getattr(e, method)(dtype=np.float64) - def test_agg_unknown(self): - df = pd.DataFrame({"A": np.arange(5)}) - roll = df.rolling(2) - - msg = "'foo' is an unknown string function" - with pytest.raises(AttributeError, match=msg): - roll.agg("foo") - - with pytest.raises(AttributeError, match=msg): - roll.agg(["foo"]) - - with pytest.raises(AttributeError, match=msg): - roll.agg({"A": "foo"}) - @pytest.mark.filterwarnings("ignore:can't resolve package:ImportWarning") class TestMoments(Base): From 0a03b00e458962663aee142fb45f1f2003915c4e Mon Sep 17 00:00:00 2001 From: ihsan Date: Thu, 11 Jul 2019 18:37:02 +0300 Subject: [PATCH 15/16] Remove from doc --- pandas/core/window.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/core/window.py b/pandas/core/window.py index 9a6c77e6390fc..0c1f6a1a6dace 100644 --- a/pandas/core/window.py +++ b/pandas/core/window.py @@ -511,7 +511,6 @@ class Window(_Window): Set the labels at the center of the window. win_type : str, default None Provide a window type. If ``None``, all points are evenly weighted. - Other types are only applicable for `mean` and `sum` functions. See the notes below for further information. on : str, optional For a DataFrame, a datetime-like column on which to calculate the rolling From 9b8baa0fe613c5231633b044f0c2a337046b2d7a Mon Sep 17 00:00:00 2001 From: ihsan Date: Thu, 11 Jul 2019 18:38:40 +0300 Subject: [PATCH 16/16] Remove new line --- pandas/core/base.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index d4558a396ed13..9480e2e425f79 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -562,7 +562,6 @@ def is_any_frame(): elif is_list_like(arg): # we require a list, but not an 'str' return self._aggregate_multiple_funcs(arg, _level=_level, _axis=_axis), None - else: result = None