From 0e8ac5fbf4f839744893af1e17112c967fc0b34c Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Wed, 17 Oct 2018 09:17:14 -0700 Subject: [PATCH 1/3] validate min/max axis closes #23081 --- pandas/compat/numpy/function.py | 19 +++++++++++++++++++ pandas/core/indexes/datetimelike.py | 4 ++++ pandas/tests/indexes/datetimelike.py | 12 ++++++++++++ 3 files changed, 35 insertions(+) diff --git a/pandas/compat/numpy/function.py b/pandas/compat/numpy/function.py index d42be56963569..b737a4ac4265d 100644 --- a/pandas/compat/numpy/function.py +++ b/pandas/compat/numpy/function.py @@ -360,3 +360,22 @@ def validate_resampler_func(method, args, kwargs): "{func}() instead".format(func=method))) else: raise TypeError("too many arguments passed in") + + +def validate_minmax_axis(axis): + """ + Ensure that the axis argument passed to min, max, argmin, or argmax is + zero or None, as otherwise it will be incorrectly ignored. + Parameters + ---------- + axis : int or None + Raises + ------ + ValueError + """ + ndim = 1 # hard-coded for Index + if axis is None: + return + if axis >= ndim or (axis < 0 and ndim + axis < 0): + raise ValueError("`axis` must be fewer than the number of " + "dimensions ({ndim})".format(ndim=ndim)) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 8e919ba3599fc..d9152c50309eb 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -431,6 +431,7 @@ def min(self, axis=None, *args, **kwargs): numpy.ndarray.min """ nv.validate_min(args, kwargs) + nv.validate_minmax_axis(axis) try: i8 = self.asi8 @@ -459,6 +460,7 @@ def argmin(self, axis=None, *args, **kwargs): numpy.ndarray.argmin """ nv.validate_argmin(args, kwargs) + nv.validate_minmax_axis(axis) i8 = self.asi8 if self.hasnans: @@ -479,6 +481,7 @@ def max(self, axis=None, *args, **kwargs): numpy.ndarray.max """ nv.validate_max(args, kwargs) + nv.validate_minmax_axis(axis) try: i8 = self.asi8 @@ -507,6 +510,7 @@ def argmax(self, axis=None, *args, **kwargs): numpy.ndarray.argmax """ nv.validate_argmax(args, kwargs) + nv.validate_minmax_axis(axis) i8 = self.asi8 if self.hasnans: diff --git a/pandas/tests/indexes/datetimelike.py b/pandas/tests/indexes/datetimelike.py index e32e18ea0ec4a..7af8b259fa137 100644 --- a/pandas/tests/indexes/datetimelike.py +++ b/pandas/tests/indexes/datetimelike.py @@ -8,6 +8,18 @@ class DatetimeLike(Base): + def test_argmax_axis_invalid(self): + # GH#23081 + rng = self.create_index() + with pytest.raises(ValueError): + rng.argmax(axis=1) + with pytest.raises(ValueError): + rng.argmin(axis=2) + with pytest.raises(ValueError): + rng.min(axis=-2) + with pytest.raises(ValueError): + rng.max(axis=-3) + def test_can_hold_identifiers(self): idx = self.create_index() key = idx[0] From 1ef07f01262e6cff8bf3a9409c118d2c61f924f6 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Wed, 17 Oct 2018 19:15:39 -0700 Subject: [PATCH 2/3] Fix copy/paste indentation mistake --- pandas/compat/numpy/function.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pandas/compat/numpy/function.py b/pandas/compat/numpy/function.py index b737a4ac4265d..bc3e253d44e67 100644 --- a/pandas/compat/numpy/function.py +++ b/pandas/compat/numpy/function.py @@ -366,7 +366,13 @@ def validate_minmax_axis(axis): """ Ensure that the axis argument passed to min, max, argmin, or argmax is zero or None, as otherwise it will be incorrectly ignored. - Parameters + Parameters + ---------- + axis : int or None + + Raises + ------ + ValueError ---------- axis : int or None Raises From b8302b3fbb647324387b717f8b1b4f0f52090c3d Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Wed, 17 Oct 2018 19:17:18 -0700 Subject: [PATCH 3/3] Fix merge mixup --- pandas/compat/numpy/function.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pandas/compat/numpy/function.py b/pandas/compat/numpy/function.py index bc3e253d44e67..a4232ca2ebf78 100644 --- a/pandas/compat/numpy/function.py +++ b/pandas/compat/numpy/function.py @@ -366,18 +366,14 @@ def validate_minmax_axis(axis): """ Ensure that the axis argument passed to min, max, argmin, or argmax is zero or None, as otherwise it will be incorrectly ignored. + Parameters ---------- axis : int or None - + Raises ------ ValueError - ---------- - axis : int or None - Raises - ------ - ValueError """ ndim = 1 # hard-coded for Index if axis is None: