Skip to content

Commit e7b7054

Browse files
Terji PetersenTerji Petersen
Terji Petersen
authored and
Terji Petersen
committed
CLN: clean IntervalArray._simple_new
1 parent e1dd15b commit e7b7054

File tree

1 file changed

+44
-23
lines changed

1 file changed

+44
-23
lines changed

pandas/core/arrays/interval.py

+44-23
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,10 @@ def __new__(
232232
data = extract_array(data, extract_numpy=True)
233233

234234
if isinstance(data, cls):
235-
left = data._left
236-
right = data._right
235+
left: ArrayLike = data._left
236+
right: ArrayLike = data._right
237237
closed = closed or data.closed
238+
dtype = IntervalDtype(left.dtype, closed=closed)
238239
else:
239240

240241
# don't allow scalars
@@ -255,11 +256,13 @@ def __new__(
255256
right = lib.maybe_convert_objects(right)
256257
closed = closed or infer_closed
257258

259+
left, right, dtype = cls._ensure_simple_new_inputs(
260+
left, right, closed=closed, copy=copy, dtype=dtype
261+
)
262+
258263
return cls._simple_new(
259264
left,
260265
right,
261-
closed,
262-
copy=copy,
263266
dtype=dtype,
264267
verify_integrity=verify_integrity,
265268
)
@@ -269,23 +272,39 @@ def _simple_new(
269272
cls: type[IntervalArrayT],
270273
left,
271274
right,
272-
closed: IntervalClosedType | None = None,
273-
copy: bool = False,
274-
dtype: Dtype | None = None,
275+
dtype: IntervalDtype,
275276
verify_integrity: bool = True,
276277
) -> IntervalArrayT:
277278
result = IntervalMixin.__new__(cls)
279+
result._left = left
280+
result._right = right
281+
result._dtype = dtype
278282

279-
if closed is None and isinstance(dtype, IntervalDtype):
280-
closed = dtype.closed
283+
if verify_integrity:
284+
result._validate()
281285

282-
closed = closed or "right"
286+
return result
283287

288+
@classmethod
289+
def _ensure_simple_new_inputs(
290+
cls,
291+
left,
292+
right,
293+
closed: IntervalClosedType | None = None,
294+
copy: bool = False,
295+
dtype: Dtype | None = None,
296+
) -> tuple[ArrayLike, ArrayLike, IntervalDtype]:
297+
"""Ensure correctness of input parameters for cls._simple_new."""
284298
from pandas.core.indexes.base import ensure_index
285299

286300
left = ensure_index(left, copy=copy)
287301
right = ensure_index(right, copy=copy)
288302

303+
if closed is None and isinstance(dtype, IntervalDtype):
304+
closed = dtype.closed
305+
306+
closed = closed or "right"
307+
289308
if dtype is not None:
290309
# GH 19262: dtype must be an IntervalDtype to override inferred
291310
dtype = pandas_dtype(dtype)
@@ -346,13 +365,8 @@ def _simple_new(
346365
right = right.copy()
347366

348367
dtype = IntervalDtype(left.dtype, closed=closed)
349-
result._dtype = dtype
350368

351-
result._left = left
352-
result._right = right
353-
if verify_integrity:
354-
result._validate()
355-
return result
369+
return left, right, dtype
356370

357371
@classmethod
358372
def _from_sequence(
@@ -512,10 +526,12 @@ def from_arrays(
512526
left = _maybe_convert_platform_interval(left)
513527
right = _maybe_convert_platform_interval(right)
514528

515-
return cls._simple_new(
516-
left, right, closed, copy=copy, dtype=dtype, verify_integrity=True
529+
left, right, dtype = cls._ensure_simple_new_inputs(
530+
left, right, closed=closed, copy=copy, dtype=dtype
517531
)
518532

533+
return cls._simple_new(left, right, dtype=dtype, verify_integrity=True)
534+
519535
_interval_shared_docs["from_tuples"] = textwrap.dedent(
520536
"""
521537
Construct an %(klass)s from an array-like of tuples.
@@ -639,7 +655,9 @@ def _shallow_copy(self: IntervalArrayT, left, right) -> IntervalArrayT:
639655
right : Index
640656
Values to be used for the right-side of the intervals.
641657
"""
642-
return self._simple_new(left, right, closed=self.closed, verify_integrity=False)
658+
dtype = IntervalDtype(left.dtype, closed=self.closed)
659+
left, right, dtype = self._ensure_simple_new_inputs(left, right, dtype=dtype)
660+
return self._simple_new(left, right, dtype=dtype, verify_integrity=False)
643661

644662
# ---------------------------------------------------------------------
645663
# Descriptive
@@ -986,7 +1004,10 @@ def _concat_same_type(
9861004

9871005
left = np.concatenate([interval.left for interval in to_concat])
9881006
right = np.concatenate([interval.right for interval in to_concat])
989-
return cls._simple_new(left, right, closed=closed, copy=False)
1007+
1008+
left, right, dtype = cls._ensure_simple_new_inputs(left, right, closed=closed)
1009+
1010+
return cls._simple_new(left, right, dtype=dtype)
9901011

9911012
def copy(self: IntervalArrayT) -> IntervalArrayT:
9921013
"""
@@ -1400,9 +1421,9 @@ def set_closed(self: IntervalArrayT, closed: IntervalClosedType) -> IntervalArra
14001421
msg = f"invalid option for 'closed': {closed}"
14011422
raise ValueError(msg)
14021423

1403-
return type(self)._simple_new(
1404-
left=self._left, right=self._right, closed=closed, verify_integrity=False
1405-
)
1424+
left, right = self._left, self._right
1425+
dtype = IntervalDtype(left.dtype, closed=closed)
1426+
return self._simple_new(left, right, dtype=dtype, verify_integrity=False)
14061427

14071428
_interval_shared_docs[
14081429
"is_non_overlapping_monotonic"

0 commit comments

Comments
 (0)