Skip to content

Commit 04d71b6

Browse files
committed
DEPR: Deprecate set_closed and add set_incluive
1 parent b4ec020 commit 04d71b6

File tree

7 files changed

+73
-28
lines changed

7 files changed

+73
-28
lines changed

doc/redirects.csv

+1
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,7 @@ generated/pandas.IntervalIndex.mid,../reference/api/pandas.IntervalIndex.mid
761761
generated/pandas.IntervalIndex.overlaps,../reference/api/pandas.IntervalIndex.overlaps
762762
generated/pandas.IntervalIndex.right,../reference/api/pandas.IntervalIndex.right
763763
generated/pandas.IntervalIndex.set_closed,../reference/api/pandas.IntervalIndex.set_closed
764+
generated/pandas.IntervalIndex.set_inclusive,../reference/api/pandas.IntervalIndex.set_inclusive
764765
generated/pandas.IntervalIndex.to_tuples,../reference/api/pandas.IntervalIndex.to_tuples
765766
generated/pandas.IntervalIndex.values,../reference/api/pandas.IntervalIndex.values
766767
generated/pandas.Interval.left,../reference/api/pandas.Interval.left

doc/source/reference/arrays.rst

+1
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ A collection of intervals may be stored in an :class:`arrays.IntervalArray`.
352352
arrays.IntervalArray.contains
353353
arrays.IntervalArray.overlaps
354354
arrays.IntervalArray.set_closed
355+
arrays.IntervalArray.set_inclusive
355356
arrays.IntervalArray.to_tuples
356357

357358

doc/source/reference/indexing.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ IntervalIndex components
250250
IntervalIndex.is_overlapping
251251
IntervalIndex.get_loc
252252
IntervalIndex.get_indexer
253-
IntervalIndex.set_closed
253+
IntervalIndex.set_inclusive
254254
IntervalIndex.contains
255255
IntervalIndex.overlaps
256256
IntervalIndex.to_tuples

pandas/core/arrays/interval.py

+56-4
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@
155155
from_breaks
156156
contains
157157
overlaps
158-
set_closed
158+
set_inclusive
159159
to_tuples
160160
%(extra_methods)s\
161161
@@ -1385,9 +1385,11 @@ def closed(self) -> IntervalClosedType:
13851385
Return an %(klass)s identical to the current one, but closed on the
13861386
specified side.
13871387
1388+
.. deprecated:: 1.5.0
1389+
13881390
Parameters
13891391
----------
1390-
inclusive : {'left', 'right', 'both', 'neither'}
1392+
closed : {'left', 'right', 'both', 'neither'}
13911393
Whether the intervals are closed on the left-side, right-side, both
13921394
or neither.
13931395
@@ -1420,8 +1422,58 @@ def closed(self) -> IntervalClosedType:
14201422
),
14211423
}
14221424
)
1423-
@deprecate_kwarg(old_arg_name="closed", new_arg_name="inclusive")
1424-
def set_closed(
1425+
def set_closed(self: IntervalArrayT, closed: IntervalClosedType) -> IntervalArrayT:
1426+
warnings.warn(
1427+
"set_closed is deprecated and will be removed in a future version. "
1428+
"Use set_inclusive instead.",
1429+
FutureWarning,
1430+
stacklevel=find_stack_level(),
1431+
)
1432+
return self.set_inclusive(closed)
1433+
1434+
_interval_shared_docs["set_inclusive"] = textwrap.dedent(
1435+
"""
1436+
Return an %(klass)s identical to the current one, but closed on the
1437+
specified side.
1438+
1439+
.. versionadded:: 1.5
1440+
1441+
Parameters
1442+
----------
1443+
inclusive : {'left', 'right', 'both', 'neither'}
1444+
Whether the intervals are closed on the left-side, right-side, both
1445+
or neither.
1446+
1447+
Returns
1448+
-------
1449+
new_index : %(klass)s
1450+
1451+
%(examples)s\
1452+
"""
1453+
)
1454+
1455+
@Appender(
1456+
_interval_shared_docs["set_inclusive"]
1457+
% {
1458+
"klass": "IntervalArray",
1459+
"examples": textwrap.dedent(
1460+
"""\
1461+
Examples
1462+
--------
1463+
>>> index = pd.arrays.IntervalArray.from_breaks(range(4), "right")
1464+
>>> index
1465+
<IntervalArray>
1466+
[(0, 1], (1, 2], (2, 3]]
1467+
Length: 3, dtype: interval[int64, right]
1468+
>>> index.set_inclusive('both')
1469+
<IntervalArray>
1470+
[[0, 1], [1, 2], [2, 3]]
1471+
Length: 3, dtype: interval[int64, both]
1472+
"""
1473+
),
1474+
}
1475+
)
1476+
def set_inclusive(
14251477
self: IntervalArrayT, inclusive: IntervalClosedType
14261478
) -> IntervalArrayT:
14271479
if inclusive not in VALID_CLOSED:

pandas/core/indexes/interval.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ def _new_IntervalIndex(cls, d):
179179
),
180180
}
181181
)
182-
@inherit_names(["set_closed", "to_tuples"], IntervalArray, wrap=True)
182+
@inherit_names(["set_closed", "set_inclusive", "to_tuples"], IntervalArray, wrap=True)
183183
@inherit_names(
184184
[
185185
"__array__",

pandas/tests/arrays/interval/test_interval.py

+7-16
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ def test_is_empty(self, constructor, left, right, closed):
6060

6161

6262
class TestMethods:
63-
@pytest.mark.parametrize("new_closed", ["left", "right", "both", "neither"])
64-
def test_set_closed(self, closed, new_closed):
63+
@pytest.mark.parametrize("new_inclusive", ["left", "right", "both", "neither"])
64+
def test_set_inclusive(self, closed, new_inclusive):
6565
# GH 21670
6666
array = IntervalArray.from_breaks(range(10), inclusive=closed)
67-
result = array.set_closed(new_closed)
68-
expected = IntervalArray.from_breaks(range(10), inclusive=new_closed)
67+
result = array.set_inclusive(new_inclusive)
68+
expected = IntervalArray.from_breaks(range(10), inclusive=new_inclusive)
6969
tm.assert_extension_array_equal(result, expected)
7070

7171
@pytest.mark.parametrize(
@@ -134,10 +134,10 @@ def test_set_na(self, left_right_dtypes):
134134

135135
tm.assert_extension_array_equal(result, expected)
136136

137-
def test_setitem_mismatched_closed(self):
137+
def test_setitem_mismatched_inclusive(self):
138138
arr = IntervalArray.from_breaks(range(4), "right")
139139
orig = arr.copy()
140-
other = arr.set_closed("both")
140+
other = arr.set_inclusive("both")
141141

142142
msg = "'value.inclusive' is 'both', expected 'right'"
143143
with pytest.raises(ValueError, match=msg):
@@ -488,17 +488,8 @@ def test_from_arrays_deprecation():
488488
IntervalArray.from_arrays([0, 1, 2], [1, 2, 3], closed="right")
489489

490490

491-
def test_set_closed_deprecated_closed():
491+
def test_set_closed_deprecated():
492492
# GH#40245
493493
array = IntervalArray.from_breaks(range(10))
494494
with tm.assert_produces_warning(FutureWarning):
495495
array.set_closed(closed="both")
496-
497-
498-
def test_set_closed_both_provided_deprecation():
499-
# GH#40245
500-
array = IntervalArray.from_breaks(range(10))
501-
msg = "Can only specify 'closed' or 'inclusive', not both."
502-
with pytest.raises(TypeError, match=msg):
503-
with tm.assert_produces_warning(FutureWarning):
504-
array.set_closed(inclusive="both", closed="both")

pandas/tests/indexes/interval/test_interval.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -871,21 +871,21 @@ def test_nbytes(self):
871871
expected = 64 # 4 * 8 * 2
872872
assert result == expected
873873

874-
@pytest.mark.parametrize("new_closed", ["left", "right", "both", "neither"])
875-
def test_set_closed(self, name, closed, new_closed):
874+
@pytest.mark.parametrize("new_inclusive", ["left", "right", "both", "neither"])
875+
def test_set_inclusive(self, name, closed, new_inclusive):
876876
# GH 21670
877877
index = interval_range(0, 5, inclusive=closed, name=name)
878-
result = index.set_closed(new_closed)
879-
expected = interval_range(0, 5, inclusive=new_closed, name=name)
878+
result = index.set_inclusive(new_inclusive)
879+
expected = interval_range(0, 5, inclusive=new_inclusive, name=name)
880880
tm.assert_index_equal(result, expected)
881881

882882
@pytest.mark.parametrize("bad_inclusive", ["foo", 10, "LEFT", True, False])
883-
def test_set_closed_errors(self, bad_inclusive):
883+
def test_set_inclusive_errors(self, bad_inclusive):
884884
# GH 21670
885885
index = interval_range(0, 5)
886886
msg = f"invalid option for 'inclusive': {bad_inclusive}"
887887
with pytest.raises(ValueError, match=msg):
888-
index.set_closed(bad_inclusive)
888+
index.set_inclusive(bad_inclusive)
889889

890890
def test_is_all_dates(self):
891891
# GH 23576

0 commit comments

Comments
 (0)