From 9066e4323a85297325b11dd73065f74c8ada909b Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 31 Mar 2021 16:28:41 -0700 Subject: [PATCH 1/2] REF: RangeIndex dont subclass Int64Index --- pandas/core/indexes/range.py | 5 ++++- pandas/io/feather_format.py | 2 +- pandas/tests/indexes/common.py | 4 ++-- pandas/tests/indexes/test_numpy_compat.py | 5 +++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index f37faa4ab844b..01e9254ef626b 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -46,6 +46,7 @@ from pandas.core.indexes.numeric import ( Float64Index, Int64Index, + NumericIndex, ) from pandas.core.ops.common import unpack_zerodim_and_defer @@ -55,7 +56,7 @@ _empty_range = range(0) -class RangeIndex(Int64Index): +class RangeIndex(NumericIndex): """ Immutable Index implementing a monotonic integer range. @@ -97,6 +98,8 @@ class RangeIndex(Int64Index): _typ = "rangeindex" _engine_type = libindex.Int64Engine + _can_hold_na = False + inferred_type = "integer" _range: range # -------------------------------------------------------------------- diff --git a/pandas/io/feather_format.py b/pandas/io/feather_format.py index 3999f91a7b141..d032c54395c6d 100644 --- a/pandas/io/feather_format.py +++ b/pandas/io/feather_format.py @@ -56,7 +56,7 @@ def to_feather( # validate that we have only a default index # raise on anything else as we don't serialize the index - if not isinstance(df.index, Int64Index): + if not isinstance(df.index, (Int64Index, RangeIndex)): typ = type(df.index) raise ValueError( f"feather does not support serializing {typ} " diff --git a/pandas/tests/indexes/common.py b/pandas/tests/indexes/common.py index e5a24e9b938e2..ab2b2db7eec53 100644 --- a/pandas/tests/indexes/common.py +++ b/pandas/tests/indexes/common.py @@ -516,7 +516,7 @@ def test_hasnans_isnans(self, index_flat): return elif isinstance(index, DatetimeIndexOpsMixin): values[1] = iNaT - elif isinstance(index, (Int64Index, UInt64Index)): + elif isinstance(index, (Int64Index, UInt64Index, RangeIndex)): return else: values[1] = np.nan @@ -555,7 +555,7 @@ def test_fillna(self, index): if isinstance(index, DatetimeIndexOpsMixin): values[1] = iNaT - elif isinstance(index, (Int64Index, UInt64Index)): + elif isinstance(index, (Int64Index, UInt64Index, RangeIndex)): return else: values[1] = np.nan diff --git a/pandas/tests/indexes/test_numpy_compat.py b/pandas/tests/indexes/test_numpy_compat.py index 1ee7c5547ecf9..59c30c3abac03 100644 --- a/pandas/tests/indexes/test_numpy_compat.py +++ b/pandas/tests/indexes/test_numpy_compat.py @@ -12,6 +12,7 @@ Index, Int64Index, PeriodIndex, + RangeIndex, TimedeltaIndex, UInt64Index, ) @@ -55,7 +56,7 @@ def test_numpy_ufuncs_basic(index, func): with tm.external_error_raised((TypeError, AttributeError)): with np.errstate(all="ignore"): func(index) - elif isinstance(index, (Float64Index, Int64Index, UInt64Index)): + elif isinstance(index, (Float64Index, Int64Index, UInt64Index, RangeIndex)): # coerces to float (e.g. np.sin) with np.errstate(all="ignore"): result = func(index) @@ -104,7 +105,7 @@ def test_numpy_ufuncs_other(index, func, request): with tm.external_error_raised(TypeError): func(index) - elif isinstance(index, (Float64Index, Int64Index, UInt64Index)): + elif isinstance(index, (Float64Index, Int64Index, UInt64Index, RangeIndex)): # Results in bool array result = func(index) assert isinstance(result, np.ndarray) From 13f03cd3342ef6f37bd7d33691fb3c64ba3a3e9c Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 1 Apr 2021 14:01:33 -0700 Subject: [PATCH 2/2] mypy fixup --- pandas/core/indexes/range.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index 01e9254ef626b..b0911cc0ce556 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -99,7 +99,6 @@ class RangeIndex(NumericIndex): _typ = "rangeindex" _engine_type = libindex.Int64Engine _can_hold_na = False - inferred_type = "integer" _range: range # -------------------------------------------------------------------- @@ -384,6 +383,10 @@ def __contains__(self, key: Any) -> bool: return False return key in self._range + @property + def inferred_type(self) -> str: + return "integer" + # -------------------------------------------------------------------- # Indexing Methods