diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index f38b49a15c120..6ca613624d07c 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -822,6 +822,7 @@ def take(self, indices, axis=0, allow_fill=True, fill_value=None, **kwargs): ) return self._shallow_copy(taken) + @final def _maybe_disallow_fill(self, allow_fill: bool, fill_value, indices) -> bool: """ We only use pandas-style take when allow_fill is True _and_ @@ -960,6 +961,7 @@ def __deepcopy__(self, memo=None): # -------------------------------------------------------------------- # Rendering Methods + @final def __repr__(self) -> str_t: """ Return a string representation for this object. @@ -1710,6 +1712,7 @@ def droplevel(self, level=0): return self._drop_level_numbers(levnums) + @final def _drop_level_numbers(self, levnums: List[int]): """ Drop MultiIndex levels by level _number_, not name. @@ -1827,6 +1830,7 @@ def is_monotonic_decreasing(self) -> bool: """ return self._engine.is_monotonic_decreasing + @final @property def _is_strictly_monotonic_increasing(self) -> bool: """ @@ -1844,6 +1848,7 @@ def _is_strictly_monotonic_increasing(self) -> bool: """ return self.is_unique and self.is_monotonic_increasing + @final @property def _is_strictly_monotonic_decreasing(self) -> bool: """ @@ -1868,6 +1873,7 @@ def is_unique(self) -> bool: """ return self._engine.is_unique + @final @property def has_duplicates(self) -> bool: """ @@ -2239,6 +2245,7 @@ def _is_all_dates(self) -> bool: return is_datetime_array(ensure_object(self._values)) @cache_readonly + @final def is_all_dates(self): """ Whether or not the index values only consist of dates. @@ -3287,6 +3294,7 @@ def get_loc(self, key, method=None, tolerance=None): """ @Appender(_index_shared_docs["get_indexer"] % _index_doc_kwargs) + @final def get_indexer( self, target, method=None, limit=None, tolerance=None ) -> np.ndarray: @@ -3346,6 +3354,7 @@ def _get_indexer( return ensure_platform_int(indexer) + @final def _check_indexing_method(self, method): """ Raise if we have a get_indexer `method` that is not supported or valid. @@ -4560,7 +4569,7 @@ def putmask(self, mask, value): np.putmask(values, mask, converted) return self._shallow_copy(values) - def equals(self, other: object) -> bool: + def equals(self, other: Any) -> bool: """ Determine if two Index object are equal. @@ -5122,6 +5131,7 @@ def get_indexer_for(self, target, **kwargs): indexer, _ = self.get_indexer_non_unique(target) return indexer + @final def _get_indexer_non_comparable(self, target: Index, method, unique: bool = True): """ Called from get_indexer or get_indexer_non_unique when the target @@ -5160,7 +5170,7 @@ def _get_indexer_non_comparable(self, target: Index, method, unique: bool = True return no_matches, missing @property - def _index_as_unique(self): + def _index_as_unique(self) -> bool: """ Whether we should treat this as unique for the sake of get_indexer vs get_indexer_non_unique. @@ -5196,6 +5206,7 @@ def _maybe_promote(self, other: Index): return self, other + @final def _should_compare(self, other: Index) -> bool: """ Check if `self == other` can ever have non-False entries. @@ -5804,10 +5815,6 @@ def _cmp_method(self, other, op): with np.errstate(all="ignore"): result = ops.comp_method_OBJECT_ARRAY(op, self._values, other) - elif is_interval_dtype(self.dtype): - with np.errstate(all="ignore"): - result = op(self._values, np.asarray(other)) - else: with np.errstate(all="ignore"): result = ops.comparison_op(self._values, other, op) @@ -5826,6 +5833,7 @@ def _arith_method(self, other, op): return (Index(result[0]), Index(result[1])) return Index(result) + @final def _unary_method(self, op): result = op(self._values) return Index(result, name=self.name) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 268474446d6f6..d1d6013f8e2ed 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -162,7 +162,7 @@ def __array_wrap__(self, result, context=None): # ------------------------------------------------------------------------ - def equals(self, other: object) -> bool: + def equals(self, other: Any) -> bool: """ Determines if two Index objects contain the same elements. """ @@ -508,7 +508,7 @@ def _partial_date_slice( __truediv__ = make_wrapped_arith_op("__truediv__") __rtruediv__ = make_wrapped_arith_op("__rtruediv__") - def shift(self, periods=1, freq=None): + def shift(self: _T, periods: int = 1, freq=None) -> _T: """ Shift index by desired number of time frequency increments. @@ -567,7 +567,7 @@ def _get_delete_freq(self, loc: int): freq = self.freq return freq - def _get_insert_freq(self, loc, item): + def _get_insert_freq(self, loc: int, item): """ Find the `freq` for self.insert(loc, item). """ @@ -593,7 +593,7 @@ def _get_insert_freq(self, loc, item): return freq @doc(NDArrayBackedExtensionIndex.delete) - def delete(self, loc): + def delete(self: _T, loc) -> _T: result = super().delete(loc) result._data._freq = self._get_delete_freq(loc) return result @@ -710,6 +710,7 @@ def _intersection(self, other: Index, sort=False) -> Index: return self._wrap_setop_result(other, result) def _can_fast_intersect(self: _T, other: _T) -> bool: + # Note: we only get here with len(self) > 0 and len(other) > 0 if self.freq is None: return False @@ -725,9 +726,6 @@ def _can_fast_intersect(self: _T, other: _T) -> bool: # so intersection will preserve freq return True - elif not len(self) or not len(other): - return False - elif isinstance(self.freq, Tick): # We "line up" if and only if the difference between two of our points # is a multiple of our freq @@ -741,9 +739,6 @@ def _can_fast_union(self: _T, other: _T) -> bool: # Assumes that type(self) == type(other), as per the annotation # The ability to fast_union also implies that `freq` should be # retained on union. - if not isinstance(other, type(self)): - return False - freq = self.freq if freq is None or freq != other.freq: @@ -769,7 +764,7 @@ def _can_fast_union(self: _T, other: _T) -> bool: # Only need to "adjoin", not overlap return (right_start == left_end + freq) or right_start in left - def _fast_union(self, other, sort=None): + def _fast_union(self: _T, other: _T, sort=None) -> _T: if len(other) == 0: return self.view(type(self)) diff --git a/pandas/core/indexes/interval.py b/pandas/core/indexes/interval.py index 1c267689b4d89..7ea43efbd91e1 100644 --- a/pandas/core/indexes/interval.py +++ b/pandas/core/indexes/interval.py @@ -729,7 +729,7 @@ def _get_indexer_pointwise(self, target: Index) -> Tuple[np.ndarray, np.ndarray] return ensure_platform_int(indexer), ensure_platform_int(missing) @property - def _index_as_unique(self): + def _index_as_unique(self) -> bool: return not self.is_overlapping _requires_unique_msg = ( diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index 40f1ce1fc7853..21b5841a87ef9 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -337,10 +337,6 @@ def is_monotonic_increasing(self) -> bool: def is_monotonic_decreasing(self) -> bool: return self._range.step < 0 or len(self) <= 1 - @property - def has_duplicates(self) -> bool: - return False - def __contains__(self, key: Any) -> bool: hash(key) try: