Skip to content

Commit 03adc0d

Browse files
jbrockmendelfeefladder
authored andcommitted
DEPR: unused kind arg in Index methods (pandas-dev#42857)
1 parent e01ce2d commit 03adc0d

File tree

8 files changed

+43
-14
lines changed

8 files changed

+43
-14
lines changed

doc/source/whatsnew/v1.4.0.rst

+2
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ Deprecations
160160
- Deprecated treating ``numpy.datetime64`` objects as UTC times when passed to the :class:`Timestamp` constructor along with a timezone. In a future version, these will be treated as wall-times. To retain the old behavior, use ``Timestamp(dt64).tz_localize("UTC").tz_convert(tz)`` (:issue:`24559`)
161161
- Deprecated ignoring missing labels when indexing with a sequence of labels on a level of a MultiIndex (:issue:`42351`)
162162
- Creating an empty Series without a dtype will now raise a more visible ``FutureWarning`` instead of a ``DeprecationWarning`` (:issue:`30017`)
163+
- Deprecated the 'kind' argument in :meth:`Index.get_slice_bound`, :meth:`Index.slice_indexer`, :meth:`Index.slice_locs`; in a future version passing 'kind' will raise (:issue:`42857`)
164+
-
163165

164166
.. ---------------------------------------------------------------------------
165167

pandas/core/indexes/base.py

+16-4
Original file line numberDiff line numberDiff line change
@@ -5839,7 +5839,7 @@ def slice_indexer(
58395839
start: Hashable | None = None,
58405840
end: Hashable | None = None,
58415841
step: int | None = None,
5842-
kind: str_t | None = None,
5842+
kind=no_default,
58435843
) -> slice:
58445844
"""
58455845
Compute the slice indexer for input labels and step.
@@ -5855,6 +5855,8 @@ def slice_indexer(
58555855
step : int, default None
58565856
kind : str, default None
58575857
5858+
.. deprecated:: 1.4.0
5859+
58585860
Returns
58595861
-------
58605862
indexer : slice
@@ -5880,6 +5882,8 @@ def slice_indexer(
58805882
>>> idx.slice_indexer(start='b', end=('c', 'g'))
58815883
slice(1, 3, None)
58825884
"""
5885+
self._deprecated_arg(kind, "kind", "slice_indexer")
5886+
58835887
start_slice, end_slice = self.slice_locs(start, end, step=step)
58845888

58855889
# return a slice
@@ -5928,6 +5932,8 @@ def _maybe_cast_slice_bound(self, label, side: str_t, kind=no_default):
59285932
side : {'left', 'right'}
59295933
kind : {'loc', 'getitem'} or None
59305934
5935+
.. deprecated:: 1.3.0
5936+
59315937
Returns
59325938
-------
59335939
label : object
@@ -5962,7 +5968,7 @@ def _searchsorted_monotonic(self, label, side: str_t = "left"):
59625968

59635969
raise ValueError("index must be monotonic increasing or decreasing")
59645970

5965-
def get_slice_bound(self, label, side: str_t, kind=None) -> int:
5971+
def get_slice_bound(self, label, side: str_t, kind=no_default) -> int:
59665972
"""
59675973
Calculate slice bound that corresponds to given label.
59685974
@@ -5975,12 +5981,15 @@ def get_slice_bound(self, label, side: str_t, kind=None) -> int:
59755981
side : {'left', 'right'}
59765982
kind : {'loc', 'getitem'} or None
59775983
5984+
.. deprecated:: 1.4.0
5985+
59785986
Returns
59795987
-------
59805988
int
59815989
Index of label.
59825990
"""
5983-
assert kind in ["loc", "getitem", None]
5991+
assert kind in ["loc", "getitem", None, no_default]
5992+
self._deprecated_arg(kind, "kind", "get_slice_bound")
59845993

59855994
if side not in ("left", "right"):
59865995
raise ValueError(
@@ -6030,7 +6039,7 @@ def get_slice_bound(self, label, side: str_t, kind=None) -> int:
60306039
else:
60316040
return slc
60326041

6033-
def slice_locs(self, start=None, end=None, step=None, kind=None):
6042+
def slice_locs(self, start=None, end=None, step=None, kind=no_default):
60346043
"""
60356044
Compute slice locations for input labels.
60366045
@@ -6044,6 +6053,8 @@ def slice_locs(self, start=None, end=None, step=None, kind=None):
60446053
If None, defaults to 1.
60456054
kind : {'loc', 'getitem'} or None
60466055
6056+
.. deprecated:: 1.4.0
6057+
60476058
Returns
60486059
-------
60496060
start, end : int
@@ -6062,6 +6073,7 @@ def slice_locs(self, start=None, end=None, step=None, kind=None):
60626073
>>> idx.slice_locs(start='b', end='c')
60636074
(1, 3)
60646075
"""
6076+
self._deprecated_arg(kind, "kind", "slice_locs")
60656077
inc = step is None or step >= 0
60666078

60676079
if not inc:

pandas/core/indexes/datetimes.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ def _maybe_cast_slice_bound(self, label, side: str, kind=lib.no_default):
729729

730730
return self._maybe_cast_for_get_loc(label)
731731

732-
def slice_indexer(self, start=None, end=None, step=None, kind=None):
732+
def slice_indexer(self, start=None, end=None, step=None, kind=lib.no_default):
733733
"""
734734
Return indexer for specified label slice.
735735
Index.slice_indexer, customized to handle time slicing.
@@ -743,6 +743,8 @@ def slice_indexer(self, start=None, end=None, step=None, kind=None):
743743
value-based selection in non-monotonic cases.
744744
745745
"""
746+
self._deprecated_arg(kind, "kind", "slice_indexer")
747+
746748
# For historical reasons DatetimeIndex supports slices between two
747749
# instances of datetime.time as if it were applying a slice mask to
748750
# an array of (self.hour, self.minute, self.seconds, self.microsecond).

pandas/core/indexes/multi.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -2586,7 +2586,7 @@ def _get_indexer_level_0(self, target) -> np.ndarray:
25862586
return ci.get_indexer_for(target)
25872587

25882588
def get_slice_bound(
2589-
self, label: Hashable | Sequence[Hashable], side: str, kind: str | None = None
2589+
self, label: Hashable | Sequence[Hashable], side: str, kind=lib.no_default
25902590
) -> int:
25912591
"""
25922592
For an ordered MultiIndex, compute slice bound
@@ -2601,6 +2601,8 @@ def get_slice_bound(
26012601
side : {'left', 'right'}
26022602
kind : {'loc', 'getitem', None}
26032603
2604+
.. deprecated:: 1.4.0
2605+
26042606
Returns
26052607
-------
26062608
int
@@ -2632,11 +2634,13 @@ def get_slice_bound(
26322634
MultiIndex.get_locs : Get location for a label/slice/list/mask or a
26332635
sequence of such.
26342636
"""
2637+
self._deprecated_arg(kind, "kind", "get_slice_bound")
2638+
26352639
if not isinstance(label, tuple):
26362640
label = (label,)
26372641
return self._partial_tup_index(label, side=side)
26382642

2639-
def slice_locs(self, start=None, end=None, step=None, kind=None):
2643+
def slice_locs(self, start=None, end=None, step=None, kind=lib.no_default):
26402644
"""
26412645
For an ordered MultiIndex, compute the slice locations for input
26422646
labels.
@@ -2655,6 +2659,8 @@ def slice_locs(self, start=None, end=None, step=None, kind=None):
26552659
Slice step
26562660
kind : string, optional, defaults None
26572661
2662+
.. deprecated:: 1.4.0
2663+
26582664
Returns
26592665
-------
26602666
(start, end) : (int, int)
@@ -2688,6 +2694,7 @@ def slice_locs(self, start=None, end=None, step=None, kind=None):
26882694
MultiIndex.get_locs : Get location for a label/slice/list/mask or a
26892695
sequence of such.
26902696
"""
2697+
self._deprecated_arg(kind, "kind", "slice_locs")
26912698
# This function adds nothing to its parent implementation (the magic
26922699
# happens in get_slice_bound method), but it adds meaningful doc.
26932700
return super().slice_locs(start, end, step)

pandas/core/indexes/numeric.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ def _convert_slice_indexer(self, key: slice, kind: str):
244244

245245
# We always treat __getitem__ slicing as label-based
246246
# translate to locations
247-
return self.slice_indexer(key.start, key.stop, key.step, kind=kind)
247+
return self.slice_indexer(key.start, key.stop, key.step)
248248

249249
return super()._convert_slice_indexer(key, kind=kind)
250250

pandas/tests/indexes/base_class/test_indexing.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ class TestGetSliceBounds:
1010
@pytest.mark.parametrize("side, expected", [("left", 4), ("right", 5)])
1111
def test_get_slice_bounds_within(self, kind, side, expected):
1212
index = Index(list("abcdef"))
13-
result = index.get_slice_bound("e", kind=kind, side=side)
13+
with tm.assert_produces_warning(FutureWarning, match="'kind' argument"):
14+
result = index.get_slice_bound("e", kind=kind, side=side)
1415
assert result == expected
1516

1617
@pytest.mark.parametrize("kind", ["getitem", "loc", None])
@@ -20,12 +21,13 @@ def test_get_slice_bounds_within(self, kind, side, expected):
2021
)
2122
def test_get_slice_bounds_outside(self, kind, side, expected, data, bound):
2223
index = Index(data)
23-
result = index.get_slice_bound(bound, kind=kind, side=side)
24+
with tm.assert_produces_warning(FutureWarning, match="'kind' argument"):
25+
result = index.get_slice_bound(bound, kind=kind, side=side)
2426
assert result == expected
2527

2628
def test_get_slice_bounds_invalid_side(self):
2729
with pytest.raises(ValueError, match="Invalid value for side kwarg"):
28-
Index([]).get_slice_bound("a", kind=None, side="middle")
30+
Index([]).get_slice_bound("a", side="middle")
2931

3032

3133
class TestGetIndexerNonUnique:

pandas/tests/indexes/multi/test_indexing.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,8 @@ def test_timestamp_multiindex_indexer():
820820
def test_get_slice_bound_with_missing_value(index_arr, expected, target, algo):
821821
# issue 19132
822822
idx = MultiIndex.from_arrays(index_arr)
823-
result = idx.get_slice_bound(target, side=algo, kind="loc")
823+
with tm.assert_produces_warning(FutureWarning, match="'kind' argument"):
824+
result = idx.get_slice_bound(target, side=algo, kind="loc")
824825
assert result == expected
825826

826827

pandas/tests/indexes/numeric/test_indexing.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -545,13 +545,16 @@ class TestGetSliceBounds:
545545
@pytest.mark.parametrize("side, expected", [("left", 4), ("right", 5)])
546546
def test_get_slice_bounds_within(self, kind, side, expected):
547547
index = Index(range(6))
548-
result = index.get_slice_bound(4, kind=kind, side=side)
548+
with tm.assert_produces_warning(FutureWarning, match="'kind' argument"):
549+
550+
result = index.get_slice_bound(4, kind=kind, side=side)
549551
assert result == expected
550552

551553
@pytest.mark.parametrize("kind", ["getitem", "loc", None])
552554
@pytest.mark.parametrize("side", ["left", "right"])
553555
@pytest.mark.parametrize("bound, expected", [(-1, 0), (10, 6)])
554556
def test_get_slice_bounds_outside(self, kind, side, expected, bound):
555557
index = Index(range(6))
556-
result = index.get_slice_bound(bound, kind=kind, side=side)
558+
with tm.assert_produces_warning(FutureWarning, match="'kind' argument"):
559+
result = index.get_slice_bound(bound, kind=kind, side=side)
557560
assert result == expected

0 commit comments

Comments
 (0)