Skip to content

Commit 23c1425

Browse files
jbrockmendeljreback
authored andcommitted
REF: share comparison methods between ExtensionIndex subclasses (#30817)
1 parent 8029ba1 commit 23c1425

File tree

7 files changed

+24
-52
lines changed

7 files changed

+24
-52
lines changed

pandas/core/indexes/category.py

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import operator
21
from typing import Any, List
32
import warnings
43

@@ -9,7 +8,6 @@
98
from pandas._libs import index as libindex
109
from pandas._libs.hashtable import duplicated_int64
1110
from pandas._typing import AnyArrayLike
12-
import pandas.compat as compat
1311
from pandas.util._decorators import Appender, cache_readonly
1412

1513
from pandas.core.dtypes.common import (
@@ -29,7 +27,7 @@
2927
import pandas.core.common as com
3028
import pandas.core.indexes.base as ibase
3129
from pandas.core.indexes.base import Index, _index_shared_docs, maybe_extract_name
32-
from pandas.core.indexes.extension import ExtensionIndex, make_wrapped_comparison_op
30+
from pandas.core.indexes.extension import ExtensionIndex
3331
import pandas.core.missing as missing
3432
from pandas.core.ops import get_op_result_name
3533

@@ -858,24 +856,6 @@ def _concat_same_dtype(self, to_concat, name):
858856
result.name = name
859857
return result
860858

861-
@classmethod
862-
def _add_comparison_methods(cls):
863-
""" add in comparison methods """
864-
865-
def _make_compare(op):
866-
opname = f"__{op.__name__}__"
867-
868-
_evaluate_compare = make_wrapped_comparison_op(opname)
869-
870-
return compat.set_function_name(_evaluate_compare, opname, cls)
871-
872-
cls.__eq__ = _make_compare(operator.eq)
873-
cls.__ne__ = _make_compare(operator.ne)
874-
cls.__lt__ = _make_compare(operator.lt)
875-
cls.__gt__ = _make_compare(operator.gt)
876-
cls.__le__ = _make_compare(operator.le)
877-
cls.__ge__ = _make_compare(operator.ge)
878-
879859
def _delegate_property_get(self, name, *args, **kwargs):
880860
""" method delegation to the ._values """
881861
prop = getattr(self._values, name)
@@ -895,4 +875,3 @@ def _delegate_method(self, name, *args, **kwargs):
895875
CategoricalIndex._add_numeric_methods_add_sub_disabled()
896876
CategoricalIndex._add_numeric_methods_disabled()
897877
CategoricalIndex._add_logical_methods_disabled()
898-
CategoricalIndex._add_comparison_methods()

pandas/core/indexes/datetimelike.py

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,14 @@
3131

3232
from pandas.core import algorithms
3333
from pandas.core.accessor import PandasDelegate
34-
from pandas.core.arrays import (
35-
DatetimeArray,
36-
ExtensionArray,
37-
ExtensionOpsMixin,
38-
TimedeltaArray,
39-
)
34+
from pandas.core.arrays import DatetimeArray, ExtensionArray, TimedeltaArray
4035
from pandas.core.arrays.datetimelike import DatetimeLikeArrayMixin
4136
import pandas.core.indexes.base as ibase
4237
from pandas.core.indexes.base import Index, _index_shared_docs
4338
from pandas.core.indexes.extension import (
4439
ExtensionIndex,
4540
inherit_names,
4641
make_wrapped_arith_op,
47-
make_wrapped_comparison_op,
4842
)
4943
from pandas.core.indexes.numeric import Int64Index
5044
from pandas.core.ops import get_op_result_name
@@ -90,7 +84,7 @@ def wrapper(left, right):
9084
["__iter__", "mean", "freq", "freqstr", "_ndarray_values", "asi8", "_box_values"],
9185
DatetimeLikeArrayMixin,
9286
)
93-
class DatetimeIndexOpsMixin(ExtensionIndex, ExtensionOpsMixin):
87+
class DatetimeIndexOpsMixin(ExtensionIndex):
9488
"""
9589
Common ops mixin to support a unified interface datetimelike Index.
9690
"""
@@ -109,13 +103,6 @@ class DatetimeIndexOpsMixin(ExtensionIndex, ExtensionOpsMixin):
109103
def is_all_dates(self) -> bool:
110104
return True
111105

112-
@classmethod
113-
def _create_comparison_method(cls, op):
114-
"""
115-
Create a comparison method that dispatches to ``cls.values``.
116-
"""
117-
return make_wrapped_comparison_op(f"__{op.__name__}__")
118-
119106
# ------------------------------------------------------------------------
120107
# Abstract data attributes
121108

pandas/core/indexes/datetimes.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,6 @@ def indexer_between_time(
10211021
return mask.nonzero()[0]
10221022

10231023

1024-
DatetimeIndex._add_comparison_ops()
10251024
DatetimeIndex._add_numeric_methods_disabled()
10261025
DatetimeIndex._add_logical_methods_disabled()
10271026

pandas/core/indexes/extension.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def wrapper(cls):
8686
return wrapper
8787

8888

89-
def make_wrapped_comparison_op(opname):
89+
def _make_wrapped_comparison_op(opname):
9090
"""
9191
Create a comparison method that dispatches to ``._data``.
9292
"""
@@ -163,6 +163,13 @@ class ExtensionIndex(Index):
163163

164164
_data: ExtensionArray
165165

166+
__eq__ = _make_wrapped_comparison_op("__eq__")
167+
__ne__ = _make_wrapped_comparison_op("__ne__")
168+
__lt__ = _make_wrapped_comparison_op("__lt__")
169+
__gt__ = _make_wrapped_comparison_op("__gt__")
170+
__le__ = _make_wrapped_comparison_op("__le__")
171+
__ge__ = _make_wrapped_comparison_op("__ge__")
172+
166173
def repeat(self, repeats, axis=None):
167174
nv.validate_repeat(tuple(), dict(axis=axis))
168175
result = self._data.repeat(repeats, axis=axis)

pandas/core/indexes/interval.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,7 @@
5151
maybe_extract_name,
5252
)
5353
from pandas.core.indexes.datetimes import DatetimeIndex, date_range
54-
from pandas.core.indexes.extension import (
55-
ExtensionIndex,
56-
inherit_names,
57-
make_wrapped_comparison_op,
58-
)
54+
from pandas.core.indexes.extension import ExtensionIndex, inherit_names
5955
from pandas.core.indexes.multi import MultiIndex
6056
from pandas.core.indexes.timedeltas import TimedeltaIndex, timedelta_range
6157
from pandas.core.ops import get_op_result_name
@@ -1195,14 +1191,20 @@ def _delegate_method(self, name, *args, **kwargs):
11951191
return type(self)._simple_new(res, name=self.name)
11961192
return Index(res)
11971193

1198-
@classmethod
1199-
def _add_comparison_methods(cls):
1200-
""" add in comparison methods """
1201-
cls.__eq__ = make_wrapped_comparison_op("__eq__")
1202-
cls.__ne__ = make_wrapped_comparison_op("__ne__")
1194+
# GH#30817 until IntervalArray implements inequalities, get them from Index
1195+
def __lt__(self, other):
1196+
return Index.__lt__(self, other)
1197+
1198+
def __le__(self, other):
1199+
return Index.__le__(self, other)
1200+
1201+
def __gt__(self, other):
1202+
return Index.__gt__(self, other)
1203+
1204+
def __ge__(self, other):
1205+
return Index.__ge__(self, other)
12031206

12041207

1205-
IntervalIndex._add_comparison_methods()
12061208
IntervalIndex._add_logical_methods_disabled()
12071209

12081210

pandas/core/indexes/period.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,6 @@ def memory_usage(self, deep=False):
840840
return result
841841

842842

843-
PeriodIndex._add_comparison_ops()
844843
PeriodIndex._add_numeric_methods_disabled()
845844
PeriodIndex._add_logical_methods_disabled()
846845

pandas/core/indexes/timedeltas.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,6 @@ def insert(self, loc, item):
436436
raise TypeError("cannot insert TimedeltaIndex with incompatible label")
437437

438438

439-
TimedeltaIndex._add_comparison_ops()
440439
TimedeltaIndex._add_logical_methods_disabled()
441440

442441

0 commit comments

Comments
 (0)