Skip to content

Commit bd4ff39

Browse files
authored
DEPR: Deprecate set_closed and add set_incluive (#47636)
* DEPR: Deprecate set_closed and add set_incluive * Remove set closed * Revert "Remove set closed" This reverts commit 15ec590. * Add set closed * Add set closed * Add whatsnew
1 parent cef9aad commit bd4ff39

File tree

8 files changed

+74
-27
lines changed

8 files changed

+74
-27
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
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ IntervalIndex components
251251
IntervalIndex.get_loc
252252
IntervalIndex.get_indexer
253253
IntervalIndex.set_closed
254+
IntervalIndex.set_inclusive
254255
IntervalIndex.contains
255256
IntervalIndex.overlaps
256257
IntervalIndex.to_tuples

doc/source/whatsnew/v1.5.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,7 @@ Other Deprecations
762762
- Deprecated the ``closed`` argument in :class:`IntervalIndex` in favor of ``inclusive`` argument; In a future version passing ``closed`` will raise (:issue:`40245`)
763763
- Deprecated the ``closed`` argument in :class:`IntervalDtype` in favor of ``inclusive`` argument; In a future version passing ``closed`` will raise (:issue:`40245`)
764764
- Deprecated the ``closed`` argument in :class:`.IntervalArray` in favor of ``inclusive`` argument; In a future version passing ``closed`` will raise (:issue:`40245`)
765-
- Deprecated the ``closed`` argument in :class:`IntervalTree` in favor of ``inclusive`` argument; In a future version passing ``closed`` will raise (:issue:`40245`)
765+
- Deprecated :meth:`.IntervalArray.set_closed` and :meth:`.IntervalIndex.set_closed` in favor of ``set_inclusive``; In a future version ``set_closed`` will get removed (:issue:`40245`)
766766
- Deprecated the ``closed`` argument in :class:`ArrowInterval` in favor of ``inclusive`` argument; In a future version passing ``closed`` will raise (:issue:`40245`)
767767
- Deprecated allowing ``unit="M"`` or ``unit="Y"`` in :class:`Timestamp` constructor with a non-round float value (:issue:`47267`)
768768
- Deprecated the ``display.column_space`` global configuration option (:issue:`7576`)

pandas/core/arrays/interval.py

+56-3
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@
159159
contains
160160
overlaps
161161
set_closed
162+
set_inclusive
162163
to_tuples
163164
%(extra_methods)s\
164165
@@ -1388,9 +1389,11 @@ def closed(self) -> IntervalClosedType:
13881389
Return an %(klass)s identical to the current one, but closed on the
13891390
specified side.
13901391
1392+
.. deprecated:: 1.5.0
1393+
13911394
Parameters
13921395
----------
1393-
inclusive : {'left', 'right', 'both', 'neither'}
1396+
closed : {'left', 'right', 'both', 'neither'}
13941397
Whether the intervals are closed on the left-side, right-side, both
13951398
or neither.
13961399
@@ -1423,8 +1426,58 @@ def closed(self) -> IntervalClosedType:
14231426
),
14241427
}
14251428
)
1426-
@deprecate_kwarg(old_arg_name="closed", new_arg_name="inclusive")
1427-
def set_closed(
1429+
def set_closed(self: IntervalArrayT, closed: IntervalClosedType) -> IntervalArrayT:
1430+
warnings.warn(
1431+
"set_closed is deprecated and will be removed in a future version. "
1432+
"Use set_inclusive instead.",
1433+
FutureWarning,
1434+
stacklevel=find_stack_level(),
1435+
)
1436+
return self.set_inclusive(closed)
1437+
1438+
_interval_shared_docs["set_inclusive"] = textwrap.dedent(
1439+
"""
1440+
Return an %(klass)s identical to the current one, but closed on the
1441+
specified side.
1442+
1443+
.. versionadded:: 1.5
1444+
1445+
Parameters
1446+
----------
1447+
inclusive : {'left', 'right', 'both', 'neither'}
1448+
Whether the intervals are closed on the left-side, right-side, both
1449+
or neither.
1450+
1451+
Returns
1452+
-------
1453+
new_index : %(klass)s
1454+
1455+
%(examples)s\
1456+
"""
1457+
)
1458+
1459+
@Appender(
1460+
_interval_shared_docs["set_inclusive"]
1461+
% {
1462+
"klass": "IntervalArray",
1463+
"examples": textwrap.dedent(
1464+
"""\
1465+
Examples
1466+
--------
1467+
>>> index = pd.arrays.IntervalArray.from_breaks(range(4), "right")
1468+
>>> index
1469+
<IntervalArray>
1470+
[(0, 1], (1, 2], (2, 3]]
1471+
Length: 3, dtype: interval[int64, right]
1472+
>>> index.set_inclusive('both')
1473+
<IntervalArray>
1474+
[[0, 1], [1, 2], [2, 3]]
1475+
Length: 3, dtype: interval[int64, both]
1476+
"""
1477+
),
1478+
}
1479+
)
1480+
def set_inclusive(
14281481
self: IntervalArrayT, inclusive: IntervalClosedType
14291482
) -> IntervalArrayT:
14301483
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)