From 729bee41b529117ff0d58f2aed4d0a89aa9609b5 Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 19 Mar 2021 20:50:21 -0700 Subject: [PATCH 1/2] REF: share external_values ArrayManager/BlockManager --- pandas/core/internals/array_manager.py | 10 ++---- pandas/core/internals/blocks.py | 42 +++++++++++++++----------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 34b3d83c066c2..acadfcbbdf302 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -61,9 +61,7 @@ from pandas.core.arrays import ( DatetimeArray, ExtensionArray, - IntervalArray, PandasArray, - PeriodArray, TimedeltaArray, ) from pandas.core.arrays.sparse import SparseDtype @@ -87,6 +85,7 @@ ) from pandas.core.internals.blocks import ( ensure_block_shape, + external_values, new_block, to_native_types, ) @@ -1203,12 +1202,7 @@ def dtype(self): def external_values(self): """The array that Series.values returns""" - if isinstance(self.array, (PeriodArray, IntervalArray)): - return self.array.astype(object) - elif isinstance(self.array, (DatetimeArray, TimedeltaArray)): - return self.array._data - else: - return self.array + return external_values(self.array) def internal_values(self): """The array that Series._values returns""" diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 99e54bace8915..1b5a345808192 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -96,7 +96,9 @@ ExtensionArray, FloatingArray, IntegerArray, + IntervalArray, PandasArray, + PeriodArray, TimedeltaArray, ) from pandas.core.base import PandasObject @@ -217,16 +219,9 @@ def is_view(self) -> bool: def is_categorical(self) -> bool: return self._holder is Categorical + @final def external_values(self): - """ - The array that Series.values returns (public attribute). - - This has some historical constraints, and is overridden in block - subclasses to return the correct array (e.g. period returns - object ndarray and datetimetz a datetime64[ns] ndarray instead of - proper extension array). - """ - return self.values + return external_values(self.values) def internal_values(self): """ @@ -1755,8 +1750,7 @@ class ObjectValuesExtensionBlock(HybridMixin, ExtensionBlock): Series[T].values is an ndarray of objects. """ - def external_values(self): - return self.values.astype(object) + pass class NumericBlock(Block): @@ -1941,12 +1935,6 @@ def is_view(self) -> bool: # check the ndarray values of the DatetimeIndex values return self.values._data.base is not None - def external_values(self): - # NB: this is different from np.asarray(self.values), since that - # return an object-dtype ndarray of Timestamps. - # Avoid FutureWarning in .astype in casting from dt64tz to dt64 - return self.values._data - class TimeDeltaBlock(DatetimeLikeBlockMixin): __slots__ = () @@ -2316,3 +2304,23 @@ def to_native_types( values[mask] = na_rep values = values.astype(object, copy=False) return values + + +def external_values(values: ArrayLike) -> ArrayLike: + """ + The array that Series.values returns (public attribute). + + This has some historical constraints, and is overridden in block + subclasses to return the correct array (e.g. period returns + object ndarray and datetimetz a datetime64[ns] ndarray instead of + proper extension array). + """ + if isinstance(values, (PeriodArray, IntervalArray)): + return values.astype(object) + elif isinstance(values, (DatetimeArray, TimedeltaArray)): + # NB: for datetime64tz this is different from np.asarray(values), since + # that returns an object-dtype ndarray of Timestamps. + # Avoid FutureWarning in .astype in casting from dt64tz to dt64 + return values._data + else: + return values From 647a3939c89f236033c06afe120c8e879bf1f853 Mon Sep 17 00:00:00 2001 From: Brock Date: Sat, 20 Mar 2021 10:26:16 -0700 Subject: [PATCH 2/2] DOC: suppress warnings from CategoricalBlock deprecation --- doc/source/user_guide/io.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst index cf153ddd2cbbd..3b7a6037a9715 100644 --- a/doc/source/user_guide/io.rst +++ b/doc/source/user_guide/io.rst @@ -5240,6 +5240,7 @@ Write to a feather file. Read from a feather file. .. ipython:: python + :okwarning: result = pd.read_feather("example.feather") result @@ -5323,6 +5324,7 @@ Write to a parquet file. Read from a parquet file. .. ipython:: python + :okwarning: result = pd.read_parquet("example_fp.parquet", engine="fastparquet") result = pd.read_parquet("example_pa.parquet", engine="pyarrow")