Skip to content

Commit 8384eaf

Browse files
authored
REF: make EA reductions, nanops funcs keyword-only (#37541)
* REF: make EA reductions, nanops funcs keyword-only * whatsnew
1 parent 64027e6 commit 8384eaf

File tree

9 files changed

+72
-41
lines changed

9 files changed

+72
-41
lines changed

doc/source/whatsnew/v1.2.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ ExtensionArray
545545
- Fixed bug where ``astype()`` with equal dtype and ``copy=False`` would return a new object (:issue:`284881`)
546546
- Fixed bug when applying a NumPy ufunc with multiple outputs to a :class:`pandas.arrays.IntegerArray` returning None (:issue:`36913`)
547547
- Fixed an inconsistency in :class:`PeriodArray`'s ``__init__`` signature to those of :class:`DatetimeArray` and :class:`TimedeltaArray` (:issue:`37289`)
548+
- Reductions for :class:`BooleanArray`, :class:`Categorical`, :class:`DatetimeArray`, :class:`FloatingArray`, :class:`IntegerArray`, :class:`PeriodArray`, :class:`TimedeltaArray`, and :class:`PandasArray` are now keyword-only methods (:issue:`37541`)
548549

549550
Other
550551
^^^^^

pandas/core/arrays/boolean.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ def _values_for_argsort(self) -> np.ndarray:
424424
data[self._mask] = -1
425425
return data
426426

427-
def any(self, skipna: bool = True, **kwargs):
427+
def any(self, *, skipna: bool = True, **kwargs):
428428
"""
429429
Return whether any element is True.
430430
@@ -492,7 +492,7 @@ def any(self, skipna: bool = True, **kwargs):
492492
else:
493493
return self.dtype.na_value
494494

495-
def all(self, skipna: bool = True, **kwargs):
495+
def all(self, *, skipna: bool = True, **kwargs):
496496
"""
497497
Return whether all elements are True.
498498

pandas/core/arrays/categorical.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1945,7 +1945,7 @@ def _reverse_indexer(self) -> Dict[Hashable, np.ndarray]:
19451945
# Reductions
19461946

19471947
@deprecate_kwarg(old_arg_name="numeric_only", new_arg_name="skipna")
1948-
def min(self, skipna=True, **kwargs):
1948+
def min(self, *, skipna=True, **kwargs):
19491949
"""
19501950
The minimum value of the object.
19511951
@@ -1981,7 +1981,7 @@ def min(self, skipna=True, **kwargs):
19811981
return self.categories[pointer]
19821982

19831983
@deprecate_kwarg(old_arg_name="numeric_only", new_arg_name="skipna")
1984-
def max(self, skipna=True, **kwargs):
1984+
def max(self, *, skipna=True, **kwargs):
19851985
"""
19861986
The maximum value of the object.
19871987

pandas/core/arrays/datetimelike.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -1245,7 +1245,7 @@ def __isub__(self, other):
12451245
# --------------------------------------------------------------
12461246
# Reductions
12471247

1248-
def min(self, axis=None, skipna=True, *args, **kwargs):
1248+
def min(self, *, axis=None, skipna=True, **kwargs):
12491249
"""
12501250
Return the minimum value of the Array or minimum along
12511251
an axis.
@@ -1256,7 +1256,7 @@ def min(self, axis=None, skipna=True, *args, **kwargs):
12561256
Index.min : Return the minimum value in an Index.
12571257
Series.min : Return the minimum value in a Series.
12581258
"""
1259-
nv.validate_min(args, kwargs)
1259+
nv.validate_min((), kwargs)
12601260
nv.validate_minmax_axis(axis, self.ndim)
12611261

12621262
if is_period_dtype(self.dtype):
@@ -1276,7 +1276,7 @@ def min(self, axis=None, skipna=True, *args, **kwargs):
12761276
return self._box_func(result)
12771277
return self._from_backing_data(result)
12781278

1279-
def max(self, axis=None, skipna=True, *args, **kwargs):
1279+
def max(self, *, axis=None, skipna=True, **kwargs):
12801280
"""
12811281
Return the maximum value of the Array or maximum along
12821282
an axis.
@@ -1289,7 +1289,7 @@ def max(self, axis=None, skipna=True, *args, **kwargs):
12891289
"""
12901290
# TODO: skipna is broken with max.
12911291
# See https://github.com/pandas-dev/pandas/issues/24265
1292-
nv.validate_max(args, kwargs)
1292+
nv.validate_max((), kwargs)
12931293
nv.validate_minmax_axis(axis, self.ndim)
12941294

12951295
if is_period_dtype(self.dtype):
@@ -1309,7 +1309,7 @@ def max(self, axis=None, skipna=True, *args, **kwargs):
13091309
return self._box_func(result)
13101310
return self._from_backing_data(result)
13111311

1312-
def mean(self, skipna=True, axis: Optional[int] = 0):
1312+
def mean(self, *, skipna=True, axis: Optional[int] = 0):
13131313
"""
13141314
Return the mean value of the Array.
13151315
@@ -1350,8 +1350,8 @@ def mean(self, skipna=True, axis: Optional[int] = 0):
13501350
return self._box_func(result)
13511351
return self._from_backing_data(result)
13521352

1353-
def median(self, axis: Optional[int] = None, skipna: bool = True, *args, **kwargs):
1354-
nv.validate_median(args, kwargs)
1353+
def median(self, *, axis: Optional[int] = None, skipna: bool = True, **kwargs):
1354+
nv.validate_median((), kwargs)
13551355

13561356
if axis is not None and abs(axis) >= self.ndim:
13571357
raise ValueError("abs(axis) must be less than ndim")

pandas/core/arrays/floating.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -439,19 +439,19 @@ def _cmp_method(self, other, op):
439439

440440
return BooleanArray(result, mask)
441441

442-
def sum(self, skipna=True, min_count=0, **kwargs):
442+
def sum(self, *, skipna=True, min_count=0, **kwargs):
443443
nv.validate_sum((), kwargs)
444444
return super()._reduce("sum", skipna=skipna, min_count=min_count)
445445

446-
def prod(self, skipna=True, min_count=0, **kwargs):
446+
def prod(self, *, skipna=True, min_count=0, **kwargs):
447447
nv.validate_prod((), kwargs)
448448
return super()._reduce("prod", skipna=skipna, min_count=min_count)
449449

450-
def min(self, skipna=True, **kwargs):
450+
def min(self, *, skipna=True, **kwargs):
451451
nv.validate_min((), kwargs)
452452
return super()._reduce("min", skipna=skipna)
453453

454-
def max(self, skipna=True, **kwargs):
454+
def max(self, *, skipna=True, **kwargs):
455455
nv.validate_max((), kwargs)
456456
return super()._reduce("max", skipna=skipna)
457457

pandas/core/arrays/integer.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -603,19 +603,19 @@ def _arith_method(self, other, op):
603603

604604
return self._maybe_mask_result(result, mask, other, op_name)
605605

606-
def sum(self, skipna=True, min_count=0, **kwargs):
606+
def sum(self, *, skipna=True, min_count=0, **kwargs):
607607
nv.validate_sum((), kwargs)
608608
return super()._reduce("sum", skipna=skipna, min_count=min_count)
609609

610-
def prod(self, skipna=True, min_count=0, **kwargs):
610+
def prod(self, *, skipna=True, min_count=0, **kwargs):
611611
nv.validate_prod((), kwargs)
612612
return super()._reduce("prod", skipna=skipna, min_count=min_count)
613613

614-
def min(self, skipna=True, **kwargs):
614+
def min(self, *, skipna=True, **kwargs):
615615
nv.validate_min((), kwargs)
616616
return super()._reduce("min", skipna=skipna)
617617

618-
def max(self, skipna=True, **kwargs):
618+
def max(self, *, skipna=True, **kwargs):
619619
nv.validate_max((), kwargs)
620620
return super()._reduce("max", skipna=skipna)
621621

pandas/core/arrays/numpy_.py

+19-13
Original file line numberDiff line numberDiff line change
@@ -271,77 +271,83 @@ def _values_for_factorize(self) -> Tuple[np.ndarray, int]:
271271
# ------------------------------------------------------------------------
272272
# Reductions
273273

274-
def any(self, axis=None, out=None, keepdims=False, skipna=True):
274+
def any(self, *, axis=None, out=None, keepdims=False, skipna=True):
275275
nv.validate_any((), dict(out=out, keepdims=keepdims))
276276
return nanops.nanany(self._ndarray, axis=axis, skipna=skipna)
277277

278-
def all(self, axis=None, out=None, keepdims=False, skipna=True):
278+
def all(self, *, axis=None, out=None, keepdims=False, skipna=True):
279279
nv.validate_all((), dict(out=out, keepdims=keepdims))
280280
return nanops.nanall(self._ndarray, axis=axis, skipna=skipna)
281281

282-
def min(self, skipna: bool = True, **kwargs) -> Scalar:
282+
def min(self, *, skipna: bool = True, **kwargs) -> Scalar:
283283
nv.validate_min((), kwargs)
284284
result = masked_reductions.min(
285285
values=self.to_numpy(), mask=self.isna(), skipna=skipna
286286
)
287287
return result
288288

289-
def max(self, skipna: bool = True, **kwargs) -> Scalar:
289+
def max(self, *, skipna: bool = True, **kwargs) -> Scalar:
290290
nv.validate_max((), kwargs)
291291
result = masked_reductions.max(
292292
values=self.to_numpy(), mask=self.isna(), skipna=skipna
293293
)
294294
return result
295295

296-
def sum(self, axis=None, skipna=True, min_count=0, **kwargs) -> Scalar:
296+
def sum(self, *, axis=None, skipna=True, min_count=0, **kwargs) -> Scalar:
297297
nv.validate_sum((), kwargs)
298298
return nanops.nansum(
299299
self._ndarray, axis=axis, skipna=skipna, min_count=min_count
300300
)
301301

302-
def prod(self, axis=None, skipna=True, min_count=0, **kwargs) -> Scalar:
302+
def prod(self, *, axis=None, skipna=True, min_count=0, **kwargs) -> Scalar:
303303
nv.validate_prod((), kwargs)
304304
return nanops.nanprod(
305305
self._ndarray, axis=axis, skipna=skipna, min_count=min_count
306306
)
307307

308-
def mean(self, axis=None, dtype=None, out=None, keepdims=False, skipna=True):
308+
def mean(self, *, axis=None, dtype=None, out=None, keepdims=False, skipna=True):
309309
nv.validate_mean((), dict(dtype=dtype, out=out, keepdims=keepdims))
310310
return nanops.nanmean(self._ndarray, axis=axis, skipna=skipna)
311311

312312
def median(
313-
self, axis=None, out=None, overwrite_input=False, keepdims=False, skipna=True
313+
self, *, axis=None, out=None, overwrite_input=False, keepdims=False, skipna=True
314314
):
315315
nv.validate_median(
316316
(), dict(out=out, overwrite_input=overwrite_input, keepdims=keepdims)
317317
)
318318
return nanops.nanmedian(self._ndarray, axis=axis, skipna=skipna)
319319

320-
def std(self, axis=None, dtype=None, out=None, ddof=1, keepdims=False, skipna=True):
320+
def std(
321+
self, *, axis=None, dtype=None, out=None, ddof=1, keepdims=False, skipna=True
322+
):
321323
nv.validate_stat_ddof_func(
322324
(), dict(dtype=dtype, out=out, keepdims=keepdims), fname="std"
323325
)
324326
return nanops.nanstd(self._ndarray, axis=axis, skipna=skipna, ddof=ddof)
325327

326-
def var(self, axis=None, dtype=None, out=None, ddof=1, keepdims=False, skipna=True):
328+
def var(
329+
self, *, axis=None, dtype=None, out=None, ddof=1, keepdims=False, skipna=True
330+
):
327331
nv.validate_stat_ddof_func(
328332
(), dict(dtype=dtype, out=out, keepdims=keepdims), fname="var"
329333
)
330334
return nanops.nanvar(self._ndarray, axis=axis, skipna=skipna, ddof=ddof)
331335

332-
def sem(self, axis=None, dtype=None, out=None, ddof=1, keepdims=False, skipna=True):
336+
def sem(
337+
self, *, axis=None, dtype=None, out=None, ddof=1, keepdims=False, skipna=True
338+
):
333339
nv.validate_stat_ddof_func(
334340
(), dict(dtype=dtype, out=out, keepdims=keepdims), fname="sem"
335341
)
336342
return nanops.nansem(self._ndarray, axis=axis, skipna=skipna, ddof=ddof)
337343

338-
def kurt(self, axis=None, dtype=None, out=None, keepdims=False, skipna=True):
344+
def kurt(self, *, axis=None, dtype=None, out=None, keepdims=False, skipna=True):
339345
nv.validate_stat_ddof_func(
340346
(), dict(dtype=dtype, out=out, keepdims=keepdims), fname="kurt"
341347
)
342348
return nanops.nankurt(self._ndarray, axis=axis, skipna=skipna)
343349

344-
def skew(self, axis=None, dtype=None, out=None, keepdims=False, skipna=True):
350+
def skew(self, *, axis=None, dtype=None, out=None, keepdims=False, skipna=True):
345351
nv.validate_stat_ddof_func(
346352
(), dict(dtype=dtype, out=out, keepdims=keepdims), fname="skew"
347353
)

pandas/core/arrays/timedeltas.py

+1
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ def __iter__(self):
370370

371371
def sum(
372372
self,
373+
*,
373374
axis=None,
374375
dtype=None,
375376
out=None,

0 commit comments

Comments
 (0)