Skip to content

Commit 23c53bb

Browse files
authored
DEPR: args and kwargs in rolling, expanding, and ewm ops (#47851)
1 parent 1ff651f commit 23c53bb

File tree

11 files changed

+206
-30
lines changed

11 files changed

+206
-30
lines changed

doc/source/whatsnew/v1.5.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,7 @@ Other Deprecations
773773
- Deprecated :class:`Series` and :class:`Resampler` reducers (e.g. ``min``, ``max``, ``sum``, ``mean``) raising a ``NotImplementedError`` when the dtype is non-numric and ``numeric_only=True`` is provided; this will raise a ``TypeError`` in a future version (:issue:`47500`)
774774
- Deprecated :meth:`Series.rank` returning an empty result when the dtype is non-numeric and ``numeric_only=True`` is provided; this will raise a ``TypeError`` in a future version (:issue:`47500`)
775775
- Deprecated argument ``errors`` for :meth:`Series.mask`, :meth:`Series.where`, :meth:`DataFrame.mask`, and :meth:`DataFrame.where` as ``errors`` had no effect on this methods (:issue:`47728`)
776+
- Deprecated arguments ``*args`` and ``**kwargs`` in :class:`Rolling`, :class:`Expanding`, and :class:`ExponentialMovingWindow` ops. (:issue:`47836`)
776777

777778
.. ---------------------------------------------------------------------------
778779
.. _whatsnew_150.performance:

pandas/core/window/common.py

+38
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33

44
from collections import defaultdict
55
from typing import cast
6+
import warnings
67

78
import numpy as np
89

10+
from pandas.util._exceptions import find_stack_level
11+
912
from pandas.core.dtypes.generic import (
1013
ABCDataFrame,
1114
ABCSeries,
@@ -167,3 +170,38 @@ def prep_binary(arg1, arg2):
167170
X = arg1 + 0 * arg2
168171
Y = arg2 + 0 * arg1
169172
return X, Y
173+
174+
175+
def maybe_warn_args_and_kwargs(cls, kernel: str, args, kwargs) -> None:
176+
"""
177+
Warn for deprecation of args and kwargs in rolling/expanding functions.
178+
179+
Parameters
180+
----------
181+
cls : type
182+
Class to warn about.
183+
kernel : str
184+
Operation name.
185+
args : tuple or None
186+
args passed by user. Will be None if and only if kernel does not have args.
187+
kwargs : dict or None
188+
kwargs passed by user. Will be None if and only if kernel does not have kwargs.
189+
"""
190+
warn_args = args is not None and len(args) > 0
191+
warn_kwargs = kwargs is not None and len(kwargs) > 0
192+
if warn_args and warn_kwargs:
193+
msg = "args and kwargs"
194+
elif warn_args:
195+
msg = "args"
196+
elif warn_kwargs:
197+
msg = "kwargs"
198+
else:
199+
msg = ""
200+
if msg != "":
201+
warnings.warn(
202+
f"Passing additional {msg} to {cls.__name__}.{kernel} has "
203+
"no impact on the result and is deprecated. This will "
204+
"raise a TypeError in a future version of pandas.",
205+
category=FutureWarning,
206+
stacklevel=find_stack_level(),
207+
)

pandas/core/window/doc.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,18 @@ def create_section_header(header: str) -> str:
4343
args_compat = dedent(
4444
"""
4545
*args
46-
For NumPy compatibility and will not have an effect on the result.\n
46+
For NumPy compatibility and will not have an effect on the result.
47+
48+
.. deprecated:: 1.5.0\n
4749
"""
4850
).replace("\n", "", 1)
4951

5052
kwargs_compat = dedent(
5153
"""
5254
**kwargs
53-
For NumPy compatibility and will not have an effect on the result.\n
55+
For NumPy compatibility and will not have an effect on the result.
56+
57+
.. deprecated:: 1.5.0\n
5458
"""
5559
).replace("\n", "", 1)
5660

pandas/core/window/ewm.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@
4242
get_jit_arguments,
4343
maybe_use_numba,
4444
)
45-
from pandas.core.window.common import zsqrt
45+
from pandas.core.window.common import (
46+
maybe_warn_args_and_kwargs,
47+
zsqrt,
48+
)
4649
from pandas.core.window.doc import (
4750
_shared_docs,
4851
args_compat,
@@ -546,6 +549,7 @@ def mean(
546549
engine_kwargs=None,
547550
**kwargs,
548551
):
552+
maybe_warn_args_and_kwargs(type(self), "mean", args, kwargs)
549553
if maybe_use_numba(engine):
550554
if self.method == "single":
551555
func = generate_numba_ewm_func
@@ -603,6 +607,7 @@ def sum(
603607
engine_kwargs=None,
604608
**kwargs,
605609
):
610+
maybe_warn_args_and_kwargs(type(self), "sum", args, kwargs)
606611
if not self.adjust:
607612
raise NotImplementedError("sum is not implemented with adjust=False")
608613
if maybe_use_numba(engine):
@@ -658,6 +663,7 @@ def sum(
658663
agg_method="std",
659664
)
660665
def std(self, bias: bool = False, numeric_only: bool = False, *args, **kwargs):
666+
maybe_warn_args_and_kwargs(type(self), "std", args, kwargs)
661667
nv.validate_window_func("std", args, kwargs)
662668
if (
663669
numeric_only
@@ -702,6 +708,7 @@ def vol(self, bias: bool = False, *args, **kwargs):
702708
agg_method="var",
703709
)
704710
def var(self, bias: bool = False, numeric_only: bool = False, *args, **kwargs):
711+
maybe_warn_args_and_kwargs(type(self), "var", args, kwargs)
705712
nv.validate_window_func("var", args, kwargs)
706713
window_func = window_aggregations.ewmcov
707714
wfunc = partial(
@@ -756,6 +763,7 @@ def cov(
756763
):
757764
from pandas import Series
758765

766+
maybe_warn_args_and_kwargs(type(self), "cov", None, kwargs)
759767
self._validate_numeric_only("cov", numeric_only)
760768

761769
def cov_func(x, y):
@@ -829,6 +837,7 @@ def corr(
829837
):
830838
from pandas import Series
831839

840+
maybe_warn_args_and_kwargs(type(self), "corr", None, kwargs)
832841
self._validate_numeric_only("corr", numeric_only)
833842

834843
def cov_func(x, y):

pandas/core/window/expanding.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
ExpandingIndexer,
2626
GroupbyIndexer,
2727
)
28+
from pandas.core.window.common import maybe_warn_args_and_kwargs
2829
from pandas.core.window.doc import (
2930
_shared_docs,
3031
args_compat,
@@ -252,6 +253,7 @@ def sum(
252253
engine_kwargs: dict[str, bool] | None = None,
253254
**kwargs,
254255
):
256+
maybe_warn_args_and_kwargs(type(self), "sum", args, kwargs)
255257
nv.validate_expanding_func("sum", args, kwargs)
256258
return super().sum(
257259
numeric_only=numeric_only,
@@ -285,6 +287,7 @@ def max(
285287
engine_kwargs: dict[str, bool] | None = None,
286288
**kwargs,
287289
):
290+
maybe_warn_args_and_kwargs(type(self), "max", args, kwargs)
288291
nv.validate_expanding_func("max", args, kwargs)
289292
return super().max(
290293
numeric_only=numeric_only,
@@ -318,6 +321,7 @@ def min(
318321
engine_kwargs: dict[str, bool] | None = None,
319322
**kwargs,
320323
):
324+
maybe_warn_args_and_kwargs(type(self), "min", args, kwargs)
321325
nv.validate_expanding_func("min", args, kwargs)
322326
return super().min(
323327
numeric_only=numeric_only,
@@ -351,6 +355,7 @@ def mean(
351355
engine_kwargs: dict[str, bool] | None = None,
352356
**kwargs,
353357
):
358+
maybe_warn_args_and_kwargs(type(self), "mean", args, kwargs)
354359
nv.validate_expanding_func("mean", args, kwargs)
355360
return super().mean(
356361
numeric_only=numeric_only,
@@ -382,6 +387,7 @@ def median(
382387
engine_kwargs: dict[str, bool] | None = None,
383388
**kwargs,
384389
):
390+
maybe_warn_args_and_kwargs(type(self), "median", None, kwargs)
385391
return super().median(
386392
numeric_only=numeric_only,
387393
engine=engine,
@@ -446,6 +452,7 @@ def std(
446452
engine_kwargs: dict[str, bool] | None = None,
447453
**kwargs,
448454
):
455+
maybe_warn_args_and_kwargs(type(self), "std", args, kwargs)
449456
nv.validate_expanding_func("std", args, kwargs)
450457
return super().std(
451458
ddof=ddof,
@@ -512,6 +519,7 @@ def var(
512519
engine_kwargs: dict[str, bool] | None = None,
513520
**kwargs,
514521
):
522+
maybe_warn_args_and_kwargs(type(self), "var", args, kwargs)
515523
nv.validate_expanding_func("var", args, kwargs)
516524
return super().var(
517525
ddof=ddof,
@@ -557,8 +565,9 @@ def var(
557565
aggregation_description="standard error of mean",
558566
agg_method="sem",
559567
)
560-
def sem(self, ddof: int = 1, *args, **kwargs):
561-
return super().sem(ddof=ddof, **kwargs)
568+
def sem(self, ddof: int = 1, numeric_only: bool = False, *args, **kwargs):
569+
maybe_warn_args_and_kwargs(type(self), "sem", args, kwargs)
570+
return super().sem(ddof=ddof, numeric_only=numeric_only, **kwargs)
562571

563572
@doc(
564573
template_header,
@@ -577,6 +586,7 @@ def sem(self, ddof: int = 1, *args, **kwargs):
577586
agg_method="skew",
578587
)
579588
def skew(self, numeric_only: bool = False, **kwargs):
589+
maybe_warn_args_and_kwargs(type(self), "skew", None, kwargs)
580590
return super().skew(numeric_only=numeric_only, **kwargs)
581591

582592
@doc(
@@ -618,6 +628,7 @@ def skew(self, numeric_only: bool = False, **kwargs):
618628
agg_method="kurt",
619629
)
620630
def kurt(self, numeric_only: bool = False, **kwargs):
631+
maybe_warn_args_and_kwargs(type(self), "kurt", None, kwargs)
621632
return super().kurt(numeric_only=numeric_only, **kwargs)
622633

623634
@doc(
@@ -656,6 +667,7 @@ def quantile(
656667
numeric_only: bool = False,
657668
**kwargs,
658669
):
670+
maybe_warn_args_and_kwargs(type(self), "quantile", None, kwargs)
659671
return super().quantile(
660672
quantile=quantile,
661673
interpolation=interpolation,
@@ -733,6 +745,7 @@ def rank(
733745
numeric_only: bool = False,
734746
**kwargs,
735747
):
748+
maybe_warn_args_and_kwargs(type(self), "rank", None, kwargs)
736749
return super().rank(
737750
method=method,
738751
ascending=ascending,
@@ -779,6 +792,7 @@ def cov(
779792
numeric_only: bool = False,
780793
**kwargs,
781794
):
795+
maybe_warn_args_and_kwargs(type(self), "cov", None, kwargs)
782796
return super().cov(
783797
other=other,
784798
pairwise=pairwise,
@@ -852,6 +866,7 @@ def corr(
852866
numeric_only: bool = False,
853867
**kwargs,
854868
):
869+
maybe_warn_args_and_kwargs(type(self), "corr", None, kwargs)
855870
return super().corr(
856871
other=other,
857872
pairwise=pairwise,

pandas/core/window/rolling.py

+15
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
)
8080
from pandas.core.window.common import (
8181
flex_binary_moment,
82+
maybe_warn_args_and_kwargs,
8283
zsqrt,
8384
)
8485
from pandas.core.window.doc import (
@@ -2080,6 +2081,7 @@ def sum(
20802081
engine_kwargs: dict[str, bool] | None = None,
20812082
**kwargs,
20822083
):
2084+
maybe_warn_args_and_kwargs(type(self), "sum", args, kwargs)
20832085
nv.validate_rolling_func("sum", args, kwargs)
20842086
return super().sum(
20852087
numeric_only=numeric_only,
@@ -2113,6 +2115,7 @@ def max(
21132115
engine_kwargs: dict[str, bool] | None = None,
21142116
**kwargs,
21152117
):
2118+
maybe_warn_args_and_kwargs(type(self), "max", args, kwargs)
21162119
nv.validate_rolling_func("max", args, kwargs)
21172120
return super().max(
21182121
numeric_only=numeric_only,
@@ -2161,6 +2164,7 @@ def min(
21612164
engine_kwargs: dict[str, bool] | None = None,
21622165
**kwargs,
21632166
):
2167+
maybe_warn_args_and_kwargs(type(self), "min", args, kwargs)
21642168
nv.validate_rolling_func("min", args, kwargs)
21652169
return super().min(
21662170
numeric_only=numeric_only,
@@ -2216,6 +2220,7 @@ def mean(
22162220
engine_kwargs: dict[str, bool] | None = None,
22172221
**kwargs,
22182222
):
2223+
maybe_warn_args_and_kwargs(type(self), "mean", args, kwargs)
22192224
nv.validate_rolling_func("mean", args, kwargs)
22202225
return super().mean(
22212226
numeric_only=numeric_only,
@@ -2262,6 +2267,7 @@ def median(
22622267
engine_kwargs: dict[str, bool] | None = None,
22632268
**kwargs,
22642269
):
2270+
maybe_warn_args_and_kwargs(type(self), "median", None, kwargs)
22652271
return super().median(
22662272
numeric_only=numeric_only,
22672273
engine=engine,
@@ -2325,6 +2331,7 @@ def std(
23252331
engine_kwargs: dict[str, bool] | None = None,
23262332
**kwargs,
23272333
):
2334+
maybe_warn_args_and_kwargs(type(self), "std", args, kwargs)
23282335
nv.validate_rolling_func("std", args, kwargs)
23292336
return super().std(
23302337
ddof=ddof,
@@ -2390,6 +2397,7 @@ def var(
23902397
engine_kwargs: dict[str, bool] | None = None,
23912398
**kwargs,
23922399
):
2400+
maybe_warn_args_and_kwargs(type(self), "var", args, kwargs)
23932401
nv.validate_rolling_func("var", args, kwargs)
23942402
return super().var(
23952403
ddof=ddof,
@@ -2416,6 +2424,7 @@ def var(
24162424
agg_method="skew",
24172425
)
24182426
def skew(self, numeric_only: bool = False, **kwargs):
2427+
maybe_warn_args_and_kwargs(type(self), "skew", None, kwargs)
24192428
return super().skew(numeric_only=numeric_only, **kwargs)
24202429

24212430
@doc(
@@ -2454,6 +2463,7 @@ def skew(self, numeric_only: bool = False, **kwargs):
24542463
agg_method="sem",
24552464
)
24562465
def sem(self, ddof: int = 1, numeric_only: bool = False, *args, **kwargs):
2466+
maybe_warn_args_and_kwargs(type(self), "sem", args, kwargs)
24572467
nv.validate_rolling_func("sem", args, kwargs)
24582468
# Raise here so error message says sem instead of std
24592469
self._validate_numeric_only("sem", numeric_only)
@@ -2500,6 +2510,7 @@ def sem(self, ddof: int = 1, numeric_only: bool = False, *args, **kwargs):
25002510
agg_method="kurt",
25012511
)
25022512
def kurt(self, numeric_only: bool = False, **kwargs):
2513+
maybe_warn_args_and_kwargs(type(self), "kurt", None, kwargs)
25032514
return super().kurt(numeric_only=numeric_only, **kwargs)
25042515

25052516
@doc(
@@ -2557,6 +2568,7 @@ def quantile(
25572568
numeric_only: bool = False,
25582569
**kwargs,
25592570
):
2571+
maybe_warn_args_and_kwargs(type(self), "quantile", None, kwargs)
25602572
return super().quantile(
25612573
quantile=quantile,
25622574
interpolation=interpolation,
@@ -2634,6 +2646,7 @@ def rank(
26342646
numeric_only: bool = False,
26352647
**kwargs,
26362648
):
2649+
maybe_warn_args_and_kwargs(type(self), "rank", None, kwargs)
26372650
return super().rank(
26382651
method=method,
26392652
ascending=ascending,
@@ -2680,6 +2693,7 @@ def cov(
26802693
numeric_only: bool = False,
26812694
**kwargs,
26822695
):
2696+
maybe_warn_args_and_kwargs(type(self), "cov", None, kwargs)
26832697
return super().cov(
26842698
other=other,
26852699
pairwise=pairwise,
@@ -2813,6 +2827,7 @@ def corr(
28132827
numeric_only: bool = False,
28142828
**kwargs,
28152829
):
2830+
maybe_warn_args_and_kwargs(type(self), "corr", None, kwargs)
28162831
return super().corr(
28172832
other=other,
28182833
pairwise=pairwise,

0 commit comments

Comments
 (0)