Skip to content

Commit

Permalink
REF: implement _get_engine_target (#32611)
Browse files Browse the repository at this point in the history
  • Loading branch information
jbrockmendel authored Mar 12, 2020
1 parent 27ad779 commit fa48f5f
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 9 deletions.
25 changes: 16 additions & 9 deletions pandas/core/indexes/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -571,10 +571,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
Expand Down Expand Up @@ -2976,7 +2976,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)

Expand All @@ -2990,19 +2990,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(
Expand Down Expand Up @@ -3915,6 +3916,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)
Expand Down Expand Up @@ -4657,7 +4664,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
Expand Down
3 changes: 3 additions & 0 deletions pandas/core/indexes/extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"):
Expand Down

0 comments on commit fa48f5f

Please sign in to comment.