From 30de4ac8efe62cc5aae377609f3607c95dc0c0ce Mon Sep 17 00:00:00 2001 From: Brock Date: Tue, 24 Nov 2020 19:18:38 -0800 Subject: [PATCH 1/4] CLN: remove ABCIndex --- pandas/core/algorithms.py | 5 +++-- pandas/core/common.py | 13 +++++-------- pandas/core/dtypes/generic.py | 1 - pandas/core/indexes/datetimelike.py | 16 +++++++++++++--- pandas/core/ops/array_ops.py | 8 +++----- pandas/tests/dtypes/test_generic.py | 1 - 6 files changed, 24 insertions(+), 20 deletions(-) diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index fcd47b37268cc..7850059656acc 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -49,7 +49,6 @@ ) from pandas.core.dtypes.generic import ( ABCExtensionArray, - ABCIndex, ABCIndexClass, ABCMultiIndex, ABCSeries, @@ -421,7 +420,9 @@ def isin(comps: AnyArrayLike, values: AnyArrayLike) -> np.ndarray: f"to isin(), you passed a [{type(values).__name__}]" ) - if not isinstance(values, (ABCIndex, ABCSeries, ABCExtensionArray, np.ndarray)): + if not isinstance( + values, (ABCIndexClass, ABCSeries, ABCExtensionArray, np.ndarray) + ): values = construct_1d_object_array_from_listlike(list(values)) # TODO: could use ensure_arraylike here diff --git a/pandas/core/common.py b/pandas/core/common.py index 24680fc855b0d..cdcbc43055052 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -24,12 +24,7 @@ is_extension_array_dtype, is_integer, ) -from pandas.core.dtypes.generic import ( - ABCExtensionArray, - ABCIndex, - ABCIndexClass, - ABCSeries, -) +from pandas.core.dtypes.generic import ABCExtensionArray, ABCIndexClass, ABCSeries from pandas.core.dtypes.inference import iterable_not_string from pandas.core.dtypes.missing import isna, isnull, notnull # noqa @@ -105,7 +100,7 @@ def is_bool_indexer(key: Any) -> bool: check_array_indexer : Check that `key` is a valid array to index, and convert to an ndarray. """ - if isinstance(key, (ABCSeries, np.ndarray, ABCIndex)) or ( + if isinstance(key, (ABCSeries, np.ndarray, ABCIndexClass)) or ( is_array_like(key) and is_extension_array_dtype(key.dtype) ): if key.dtype == np.object_: @@ -471,7 +466,9 @@ def convert_to_list_like( Convert list-like or scalar input to list-like. List, numpy and pandas array-like inputs are returned unmodified whereas others are converted to list. """ - if isinstance(values, (list, np.ndarray, ABCIndex, ABCSeries, ABCExtensionArray)): + if isinstance( + values, (list, np.ndarray, ABCIndexClass, ABCSeries, ABCExtensionArray) + ): # np.ndarray resolving as Any gives a false positive return values # type: ignore[return-value] elif isinstance(values, abc.Iterable) and not isinstance(values, str): diff --git a/pandas/core/dtypes/generic.py b/pandas/core/dtypes/generic.py index 34891180906bb..0e5867809fe52 100644 --- a/pandas/core/dtypes/generic.py +++ b/pandas/core/dtypes/generic.py @@ -23,7 +23,6 @@ def _check(cls, inst) -> bool: return meta(name, tuple(), dct) -ABCIndex = create_pandas_abc_type("ABCIndex", "_typ", ("index",)) ABCInt64Index = create_pandas_abc_type("ABCInt64Index", "_typ", ("int64index",)) ABCUInt64Index = create_pandas_abc_type("ABCUInt64Index", "_typ", ("uint64index",)) ABCRangeIndex = create_pandas_abc_type("ABCRangeIndex", "_typ", ("rangeindex",)) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 57f6a8ea0cca5..7f81567c35607 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -22,7 +22,7 @@ is_scalar, ) from pandas.core.dtypes.concat import concat_compat -from pandas.core.dtypes.generic import ABCIndex, ABCSeries +from pandas.core.dtypes.generic import ABCSeries from pandas.core.arrays import DatetimeArray, PeriodArray, TimedeltaArray from pandas.core.arrays.datetimelike import DatetimeLikeArrayMixin @@ -53,10 +53,20 @@ def _join_i8_wrapper(joinf, with_indexers: bool = True): # error: 'staticmethod' used with a non-method @staticmethod # type: ignore[misc] def wrapper(left, right): - if isinstance(left, (np.ndarray, ABCIndex, ABCSeries, DatetimeLikeArrayMixin)): + # Note: these only get called with left.dtype == right.dtype + if isinstance( + left, (np.ndarray, DatetimeIndexOpsMixin, ABCSeries, DatetimeLikeArrayMixin) + ): left = left.view("i8") - if isinstance(right, (np.ndarray, ABCIndex, ABCSeries, DatetimeLikeArrayMixin)): + else: + raise TypeError(type(left)) + if isinstance( + right, + (np.ndarray, DatetimeIndexOpsMixin, ABCSeries, DatetimeLikeArrayMixin), + ): right = right.view("i8") + else: + raise TypeError(type(right)) results = joinf(left, right) if with_indexers: diff --git a/pandas/core/ops/array_ops.py b/pandas/core/ops/array_ops.py index 8142fc3e695a3..c855687552e82 100644 --- a/pandas/core/ops/array_ops.py +++ b/pandas/core/ops/array_ops.py @@ -27,7 +27,7 @@ is_object_dtype, is_scalar, ) -from pandas.core.dtypes.generic import ABCExtensionArray, ABCIndex, ABCSeries +from pandas.core.dtypes.generic import ABCExtensionArray, ABCIndexClass, ABCSeries from pandas.core.dtypes.missing import isna, notna from pandas.core.ops import missing @@ -40,13 +40,11 @@ def comp_method_OBJECT_ARRAY(op, x, y): if isinstance(y, list): y = construct_1d_object_array_from_listlike(y) - if isinstance(y, (np.ndarray, ABCSeries, ABCIndex)): - # Note: these checks can be for ABCIndex and not ABCIndexClass - # because that is the only object-dtype class. + if isinstance(y, (np.ndarray, ABCSeries, ABCIndexClass)): if not is_object_dtype(y.dtype): y = y.astype(np.object_) - if isinstance(y, (ABCSeries, ABCIndex)): + if isinstance(y, (ABCSeries, ABCIndexClass)): y = y._values if x.shape != y.shape: diff --git a/pandas/tests/dtypes/test_generic.py b/pandas/tests/dtypes/test_generic.py index e51b0546b0cee..847daa1e6b263 100644 --- a/pandas/tests/dtypes/test_generic.py +++ b/pandas/tests/dtypes/test_generic.py @@ -22,7 +22,6 @@ class TestABCClasses: timedelta_array = pd.core.arrays.TimedeltaArray(timedelta_index) def test_abc_types(self): - assert isinstance(pd.Index(["a", "b", "c"]), gt.ABCIndex) assert isinstance(pd.Int64Index([1, 2, 3]), gt.ABCInt64Index) assert isinstance(pd.UInt64Index([1, 2, 3]), gt.ABCUInt64Index) assert isinstance(pd.Float64Index([1, 2, 3]), gt.ABCFloat64Index) From 5c36ab2e3304bba01369961d9a05e8d658be66c8 Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 25 Nov 2020 07:37:37 -0800 Subject: [PATCH 2/4] mypy fixup --- pandas/core/indexes/datetimelike.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 7f81567c35607..e422eb268cf32 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -72,7 +72,7 @@ def wrapper(left, right): if with_indexers: # dtype should be timedelta64[ns] for TimedeltaIndex # and datetime64[ns] for DatetimeIndex - dtype = left.dtype.base + dtype = cast(np.dtype, left.dtype).base join_index, left_indexer, right_indexer = results join_index = join_index.view(dtype) From 4b3eb5e4e21807a1675e8233bbf7c4d645e8a95c Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 25 Nov 2020 07:39:58 -0800 Subject: [PATCH 3/4] isin fix --- pandas/core/algorithms.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 7850059656acc..979a590470e58 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -425,6 +425,9 @@ def isin(comps: AnyArrayLike, values: AnyArrayLike) -> np.ndarray: ): values = construct_1d_object_array_from_listlike(list(values)) # TODO: could use ensure_arraylike here + elif isinstance(values, ABCMultiIndex): + # Avoid raising in extract_array + values = np.array(values) comps = _ensure_arraylike(comps) comps = extract_array(comps, extract_numpy=True) From a21f0dbf658aafe0d7bae906fd22ee41a8cee982 Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 25 Nov 2020 14:09:51 -0800 Subject: [PATCH 4/4] fixup --- pandas/core/indexes/datetimelike.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index e422eb268cf32..1b18f04ba603d 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -58,15 +58,11 @@ def wrapper(left, right): left, (np.ndarray, DatetimeIndexOpsMixin, ABCSeries, DatetimeLikeArrayMixin) ): left = left.view("i8") - else: - raise TypeError(type(left)) if isinstance( right, (np.ndarray, DatetimeIndexOpsMixin, ABCSeries, DatetimeLikeArrayMixin), ): right = right.view("i8") - else: - raise TypeError(type(right)) results = joinf(left, right) if with_indexers: