From 5781eadb202182747a0ec3f50b7cf89c8ce7a103 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Tue, 10 Mar 2020 20:00:12 -0700 Subject: [PATCH] REF: implement _get_engine_target --- pandas/core/indexes/base.py | 25 ++++++++++++++++--------- pandas/core/indexes/extension.py | 3 +++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index a5f133fb10d10..929fcafff36af 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -567,10 +567,10 @@ def _cleanup(self): def _engine(self): # property, for now, slow to look up - # to avoid a reference cycle, bind `_ndarray_values` to a local variable, so + # to avoid a reference cycle, bind `target_values` to a local variable, so # `self` is not passed into the lambda. - _ndarray_values = self._ndarray_values - return self._engine_type(lambda: _ndarray_values, len(self)) + target_values = self._get_engine_target() + return self._engine_type(lambda: target_values, len(self)) # -------------------------------------------------------------------- # Array-Like Methods @@ -2972,7 +2972,7 @@ def get_indexer( "backfill or nearest reindexing" ) - indexer = self._engine.get_indexer(target._ndarray_values) + indexer = self._engine.get_indexer(target._get_engine_target()) return ensure_platform_int(indexer) @@ -2986,19 +2986,20 @@ def _convert_tolerance(self, tolerance, target): def _get_fill_indexer( self, target: "Index", method: str_t, limit=None, tolerance=None ) -> np.ndarray: + + target_values = target._get_engine_target() + if self.is_monotonic_increasing and target.is_monotonic_increasing: engine_method = ( self._engine.get_pad_indexer if method == "pad" else self._engine.get_backfill_indexer ) - indexer = engine_method(target._ndarray_values, limit) + indexer = engine_method(target_values, limit) else: indexer = self._get_fill_indexer_searchsorted(target, method, limit) if tolerance is not None: - indexer = self._filter_indexer_tolerance( - target._ndarray_values, indexer, tolerance - ) + indexer = self._filter_indexer_tolerance(target_values, indexer, tolerance) return indexer def _get_fill_indexer_searchsorted( @@ -3911,6 +3912,12 @@ def _internal_get_values(self) -> np.ndarray: """ return self.values + def _get_engine_target(self) -> np.ndarray: + """ + Get the ndarray that we can pass to the IndexEngine constructor. + """ + return self._values + @Appender(IndexOpsMixin.memory_usage.__doc__) def memory_usage(self, deep: bool = False) -> int: result = super().memory_usage(deep=deep) @@ -4653,7 +4660,7 @@ def get_indexer_non_unique(self, target): elif self.is_all_dates and target.is_all_dates: # GH 30399 tgt_values = target.asi8 else: - tgt_values = target._ndarray_values + tgt_values = target._get_engine_target() indexer, missing = self._engine.get_indexer_non_unique(tgt_values) return ensure_platform_int(indexer), missing diff --git a/pandas/core/indexes/extension.py b/pandas/core/indexes/extension.py index 7b11df15f69fb..4984fc27516ff 100644 --- a/pandas/core/indexes/extension.py +++ b/pandas/core/indexes/extension.py @@ -231,6 +231,9 @@ def __array__(self, dtype=None) -> np.ndarray: def _ndarray_values(self) -> np.ndarray: return self._data._ndarray_values + def _get_engine_target(self) -> np.ndarray: + return self._data._values_for_argsort() + @Appender(Index.dropna.__doc__) def dropna(self, how="any"): if how not in ("any", "all"):