From 2ccf1f43d6fe8c68e60bb80a93ddbfce29c8a247 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Mon, 23 Jan 2023 13:56:01 +0000 Subject: [PATCH 1/3] DEPR: move NumericIndex._engine_type and NumericIndex.inferred_type to Index --- pandas/core/indexes/base.py | 41 ++++++++++++++++++++++++++++++++-- pandas/core/indexes/numeric.py | 31 ------------------------- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 2948bb81d0b6a..341a471a3373f 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -386,11 +386,26 @@ def _outer_indexer( _attributes: list[str] = ["name"] _can_hold_strings: bool = True + _engine_types: dict[np.dtype | ExtensionDtype, type[libindex.IndexEngine]] = { + np.dtype(np.int8): libindex.Int8Engine, + np.dtype(np.int16): libindex.Int16Engine, + np.dtype(np.int32): libindex.Int32Engine, + np.dtype(np.int64): libindex.Int64Engine, + np.dtype(np.uint8): libindex.UInt8Engine, + np.dtype(np.uint16): libindex.UInt16Engine, + np.dtype(np.uint32): libindex.UInt32Engine, + np.dtype(np.uint64): libindex.UInt64Engine, + np.dtype(np.float32): libindex.Float32Engine, + np.dtype(np.float64): libindex.Float64Engine, + np.dtype(np.complex64): libindex.Complex64Engine, + np.dtype(np.complex128): libindex.Complex128Engine, + } + @property def _engine_type( self, ) -> type[libindex.IndexEngine] | type[libindex.ExtensionEngine]: - return libindex.ObjectEngine + return self._engine_types.get(self.dtype, libindex.ObjectEngine) # whether we support partial string indexing. Overridden # in DatetimeIndex and PeriodIndex @@ -2540,12 +2555,34 @@ def holds_integer(self) -> bool: ) return self._holds_integer() + def _inferred_type(self) -> str_t: + """ + Return a string of the type inferred from the values. + """ + try: # fastpath numeric indexes + return { + "i": "integer", + "u": "integer", + "f": "floating", + "c": "complex", + }[self.dtype.kind] + except KeyError: + return lib.infer_dtype(self._values, skipna=False) + @cache_readonly def inferred_type(self) -> str_t: """ Return a string of the type inferred from the values. """ - return lib.infer_dtype(self._values, skipna=False) + try: + return { + "i": "integer", + "u": "integer", + "f": "floating", + "c": "complex", + }[self.dtype.kind] + except KeyError: + return lib.infer_dtype(self._values, skipna=False) @cache_readonly @final diff --git a/pandas/core/indexes/numeric.py b/pandas/core/indexes/numeric.py index 68bdd1893c77f..6834fdcdf1f99 100644 --- a/pandas/core/indexes/numeric.py +++ b/pandas/core/indexes/numeric.py @@ -4,7 +4,6 @@ import numpy as np -from pandas._libs import index as libindex from pandas._typing import Dtype from pandas.util._decorators import ( cache_readonly, @@ -74,36 +73,6 @@ class NumericIndex(Index): ) _can_hold_strings = False - _engine_types: dict[np.dtype, type[libindex.IndexEngine]] = { - np.dtype(np.int8): libindex.Int8Engine, - np.dtype(np.int16): libindex.Int16Engine, - np.dtype(np.int32): libindex.Int32Engine, - np.dtype(np.int64): libindex.Int64Engine, - np.dtype(np.uint8): libindex.UInt8Engine, - np.dtype(np.uint16): libindex.UInt16Engine, - np.dtype(np.uint32): libindex.UInt32Engine, - np.dtype(np.uint64): libindex.UInt64Engine, - np.dtype(np.float32): libindex.Float32Engine, - np.dtype(np.float64): libindex.Float64Engine, - np.dtype(np.complex64): libindex.Complex64Engine, - np.dtype(np.complex128): libindex.Complex128Engine, - } - - @property - def _engine_type(self) -> type[libindex.IndexEngine]: - # error: Invalid index type "Union[dtype[Any], ExtensionDtype]" for - # "Dict[dtype[Any], Type[IndexEngine]]"; expected type "dtype[Any]" - return self._engine_types[self.dtype] # type: ignore[index] - - @cache_readonly - def inferred_type(self) -> str: - return { - "i": "integer", - "u": "integer", - "f": "floating", - "c": "complex", - }[self.dtype.kind] - def __new__( cls, data=None, dtype: Dtype | None = None, copy: bool = False, name=None ) -> NumericIndex: From 507a0c42c991e877fa2cba48bb3ff9d05a876ae2 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Mon, 23 Jan 2023 23:53:48 +0000 Subject: [PATCH 2/3] fix --- pandas/core/indexes/base.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 341a471a3373f..ba918bf9b78ed 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2555,26 +2555,12 @@ def holds_integer(self) -> bool: ) return self._holds_integer() - def _inferred_type(self) -> str_t: - """ - Return a string of the type inferred from the values. - """ - try: # fastpath numeric indexes - return { - "i": "integer", - "u": "integer", - "f": "floating", - "c": "complex", - }[self.dtype.kind] - except KeyError: - return lib.infer_dtype(self._values, skipna=False) - @cache_readonly def inferred_type(self) -> str_t: """ Return a string of the type inferred from the values. """ - try: + try: # fastpath numeric indexes return { "i": "integer", "u": "integer", From c1c0c1861168e5dc8bcc58a6c400ce230d432608 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Tue, 24 Jan 2023 19:38:53 +0000 Subject: [PATCH 3/3] update fastpath --- pandas/core/indexes/base.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index ba918bf9b78ed..e9380f815e2c1 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2560,15 +2560,14 @@ def inferred_type(self) -> str_t: """ Return a string of the type inferred from the values. """ - try: # fastpath numeric indexes + if isinstance(self.dtype, np.dtype) and self.dtype.kind in "iufc": # fastpath return { "i": "integer", "u": "integer", "f": "floating", "c": "complex", }[self.dtype.kind] - except KeyError: - return lib.infer_dtype(self._values, skipna=False) + return lib.infer_dtype(self._values, skipna=False) @cache_readonly @final