From 28f241b3f3f66f9af8f6e512d0dfdfcbf4c8eb7f Mon Sep 17 00:00:00 2001 From: Brock Date: Mon, 5 Apr 2021 09:43:41 -0700 Subject: [PATCH 1/2] REF: implement EABackedBlock --- pandas/core/internals/blocks.py | 57 +++++++++++++++------------------ 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 9a2b3be4b66e2..1813af903fc75 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -1358,6 +1358,31 @@ def delete(self, loc) -> None: # _cache not yet initialized pass + @cache_readonly + def array_values(self) -> ExtensionArray: + return self.values + + def get_values(self, dtype: Optional[DtypeObj] = None) -> np.ndarray: + """ + return object dtype as boxed values, such as Timestamps/Timedelta + """ + values = self.values + if dtype == _dtype_obj: + values = values.astype(object) + # TODO(EA2D): reshape not needed with 2D EAs + return np.asarray(values).reshape(self.shape) + + def interpolate( + self, method="pad", axis=0, inplace=False, limit=None, fill_value=None, **kwargs + ): + values = self.values + if values.ndim == 2 and axis == 0: + # NDArrayBackedExtensionArray.fillna assumes axis=1 + new_values = values.T.fillna(value=fill_value, method=method, limit=limit).T + else: + new_values = values.fillna(value=fill_value, method=method, limit=limit) + return self.make_block_same_class(new_values) + class ExtensionBlock(EABackedBlock): """ @@ -1482,15 +1507,6 @@ def setitem(self, indexer, value): self.values[indexer] = value return self - def get_values(self, dtype: Optional[DtypeObj] = None) -> np.ndarray: - # ExtensionArrays must be iterable, so this works. - # TODO(EA2D): reshape not needed with 2D EAs - return np.asarray(self.values).reshape(self.shape) - - @cache_readonly - def array_values(self) -> ExtensionArray: - return self.values - def take_nd( self, indexer, @@ -1562,12 +1578,6 @@ def fillna( values = self.values.fillna(value=value, limit=limit) return [self.make_block_same_class(values=values)] - def interpolate( - self, method="pad", axis=0, inplace=False, limit=None, fill_value=None, **kwargs - ): - new_values = self.values.fillna(value=fill_value, method=method, limit=limit) - return self.make_block_same_class(new_values) - def diff(self, n: int, axis: int = 1) -> List[Block]: if axis == 0 and n != 0: # n==0 case will be a no-op so let is fall through @@ -1675,27 +1685,12 @@ class NDArrayBackedExtensionBlock(EABackedBlock): values: NDArrayBackedExtensionArray - @property - def array_values(self) -> NDArrayBackedExtensionArray: - return self.values - @property def is_view(self) -> bool: """ return a boolean if I am possibly a view """ # check the ndarray values of the DatetimeIndex values return self.values._ndarray.base is not None - def get_values(self, dtype: Optional[DtypeObj] = None) -> np.ndarray: - """ - return object dtype as boxed values, such as Timestamps/Timedelta - """ - values = self.values - if dtype == _dtype_obj: - # DTA/TDA constructor and astype can handle 2D - values = values.astype(object) - # TODO(EA2D): reshape not needed with 2D EAs - return np.asarray(values).reshape(self.shape) - def iget(self, key): # GH#31649 we need to wrap scalars in Timestamp/Timedelta # TODO(EA2D): this can be removed if we ever have 2D EA @@ -1799,8 +1794,6 @@ class DatetimeTZBlock(ExtensionBlock, DatetimeLikeBlock): putmask = NDArrayBackedExtensionBlock.putmask fillna = NDArrayBackedExtensionBlock.fillna - get_values = NDArrayBackedExtensionBlock.get_values - # error: Incompatible types in assignment (expression has type # "Callable[[NDArrayBackedExtensionBlock], bool]", base class "ExtensionBlock" # defined the type as "bool") [assignment] From 845781825f4134cf0e8f15cf5fbc6284dcb57dc4 Mon Sep 17 00:00:00 2001 From: Brock Date: Mon, 5 Apr 2021 09:54:34 -0700 Subject: [PATCH 2/2] TST: test_delitem_series --- pandas/tests/extension/base/setitem.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pandas/tests/extension/base/setitem.py b/pandas/tests/extension/base/setitem.py index 34c9c097fbfd5..0392ea794237c 100644 --- a/pandas/tests/extension/base/setitem.py +++ b/pandas/tests/extension/base/setitem.py @@ -356,3 +356,14 @@ def test_setitem_series(self, data, full_indexer): data.astype(object), index=ser.index, name="data", dtype=object ) self.assert_series_equal(result, expected) + + def test_delitem_series(self, data): + # GH#40763 + ser = pd.Series(data, name="data") + + taker = np.arange(len(ser)) + taker = np.delete(taker, 1) + + expected = ser[taker] + del ser[1] + self.assert_series_equal(ser, expected)