From 9e57d6d212a4edf9227c137cf56ca92239dfb4f5 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 21 Dec 2021 13:39:55 -0500 Subject: [PATCH 1/6] fix column_arrays for array manager --- pandas/core/internals/array_manager.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 09f16a2ddab67..06849bffff5ca 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -794,7 +794,14 @@ def column_arrays(self) -> list[ArrayLike]: """ Used in the JSON C code to access column arrays. """ - return self.arrays + + def convert_array(arr: ArrayLike) -> ArrayLike: + if isinstance(arr, ExtensionArray): + return arr.to_numpy() + else: + return arr + + return [convert_array(arr) for arr in self.arrays] def iset( self, loc: int | slice | np.ndarray, value: ArrayLike, inplace: bool = False From 84b119faea9b3409c5f1a1afe388b77bfff29e45 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Wed, 23 Feb 2022 07:24:01 -0500 Subject: [PATCH 2/6] remove dead code in arrays/interval.py --- pandas/core/arrays/interval.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index d23910c37b52b..d809ad90ad1b5 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -1664,12 +1664,8 @@ def _from_combined(self, combined: np.ndarray) -> IntervalArray: nc = combined.view("i8").reshape(-1, 2) dtype = self._left.dtype - if needs_i8_conversion(dtype): - new_left = type(self._left)._from_sequence(nc[:, 0], dtype=dtype) - new_right = type(self._right)._from_sequence(nc[:, 1], dtype=dtype) - else: - new_left = nc[:, 0].view(dtype) - new_right = nc[:, 1].view(dtype) + new_left = nc[:, 0].view(dtype) + new_right = nc[:, 1].view(dtype) return self._shallow_copy(left=new_left, right=new_right) def unique(self) -> IntervalArray: From 64fedddc8d03f8b6ebfad6ce5827c9d778f0a1b7 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Fri, 25 Feb 2022 14:51:00 -0500 Subject: [PATCH 3/6] Undo Revert "remove dead code in arrays/interval.py" This reverts commit 84b119faea9b3409c5f1a1afe388b77bfff29e45. --- pandas/core/arrays/interval.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index d809ad90ad1b5..d23910c37b52b 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -1664,8 +1664,12 @@ def _from_combined(self, combined: np.ndarray) -> IntervalArray: nc = combined.view("i8").reshape(-1, 2) dtype = self._left.dtype - new_left = nc[:, 0].view(dtype) - new_right = nc[:, 1].view(dtype) + if needs_i8_conversion(dtype): + new_left = type(self._left)._from_sequence(nc[:, 0], dtype=dtype) + new_right = type(self._right)._from_sequence(nc[:, 1], dtype=dtype) + else: + new_left = nc[:, 0].view(dtype) + new_right = nc[:, 1].view(dtype) return self._shallow_copy(left=new_left, right=new_right) def unique(self) -> IntervalArray: From d1efe5ae4bb6414a9df229c039c31dcf44fbbff1 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 22 Mar 2022 09:16:49 -0400 Subject: [PATCH 4/6] TYP: interval mid, length and array fix --- pandas/_libs/interval.pyi | 4 ++-- pandas/core/arrays/interval.py | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pandas/_libs/interval.pyi b/pandas/_libs/interval.pyi index 67cb604083c6b..ade7a2c97cc34 100644 --- a/pandas/_libs/interval.pyi +++ b/pandas/_libs/interval.pyi @@ -54,8 +54,6 @@ class IntervalMixin: def open_left(self) -> bool: ... @property def open_right(self) -> bool: ... - mid: _MidDescriptor - length: _LengthDescriptor @property def is_empty(self) -> bool: ... def _check_closed_matches(self, other: IntervalMixin, name: str = ...) -> None: ... @@ -67,6 +65,8 @@ class Interval(IntervalMixin, Generic[_OrderableT]): def right(self: Interval[_OrderableT]) -> _OrderableT: ... @property def closed(self) -> IntervalClosedType: ... + mid: _MidDescriptor + length: _LengthDescriptor def __init__( self, left: _OrderableT, diff --git a/pandas/core/arrays/interval.py b/pandas/core/arrays/interval.py index 63f8fc0262199..e14eec419377c 100644 --- a/pandas/core/arrays/interval.py +++ b/pandas/core/arrays/interval.py @@ -7,6 +7,7 @@ ) import textwrap from typing import ( + TYPE_CHECKING, Sequence, TypeVar, Union, @@ -93,6 +94,10 @@ unpack_zerodim_and_defer, ) +if TYPE_CHECKING: + from pandas import Index + + IntervalArrayT = TypeVar("IntervalArrayT", bound="IntervalArray") IntervalOrNA = Union[Interval, float] @@ -1230,7 +1235,7 @@ def right(self): return Index(self._right, copy=False) @property - def length(self): + def length(self) -> Index: """ Return an Index with entries denoting the length of each Interval in the IntervalArray. @@ -1238,7 +1243,7 @@ def length(self): return self.right - self.left @property - def mid(self): + def mid(self) -> Index: """ Return the midpoint of each Interval in the IntervalArray as an Index. """ From 3784ae155cf2592e36273b80ce2d6521cd4c1ced Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 22 Mar 2022 16:01:40 -0400 Subject: [PATCH 5/6] put mid and length back in IntervalTree --- pandas/_libs/interval.pyi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandas/_libs/interval.pyi b/pandas/_libs/interval.pyi index ade7a2c97cc34..df49f2208cf3a 100644 --- a/pandas/_libs/interval.pyi +++ b/pandas/_libs/interval.pyi @@ -162,6 +162,8 @@ class IntervalTree(IntervalMixin): closed: IntervalClosedType = ..., leaf_size: int = ..., ): ... + mid: _MidDescriptor + length: _LengthDescriptor def get_indexer(self, target) -> npt.NDArray[np.intp]: ... def get_indexer_non_unique( self, target From a1edd49a15a2379e1649831345203f1e33386668 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 22 Mar 2022 16:05:58 -0400 Subject: [PATCH 6/6] change IntervalTree to return properties --- pandas/_libs/interval.pyi | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pandas/_libs/interval.pyi b/pandas/_libs/interval.pyi index df49f2208cf3a..bad6013aa58b6 100644 --- a/pandas/_libs/interval.pyi +++ b/pandas/_libs/interval.pyi @@ -32,8 +32,6 @@ class _LengthDescriptor: def __get__( self, instance: Interval[_OrderableTimesT], owner: Any ) -> Timedelta: ... - @overload - def __get__(self, instance: IntervalTree, owner: Any) -> np.ndarray: ... class _MidDescriptor: @overload @@ -42,8 +40,6 @@ class _MidDescriptor: def __get__( self, instance: Interval[_OrderableTimesT], owner: Any ) -> _OrderableTimesT: ... - @overload - def __get__(self, instance: IntervalTree, owner: Any) -> np.ndarray: ... class IntervalMixin: @property @@ -162,8 +158,10 @@ class IntervalTree(IntervalMixin): closed: IntervalClosedType = ..., leaf_size: int = ..., ): ... - mid: _MidDescriptor - length: _LengthDescriptor + @property + def mid(self) -> np.ndarray: ... + @property + def length(self) -> np.ndarray: ... def get_indexer(self, target) -> npt.NDArray[np.intp]: ... def get_indexer_non_unique( self, target