Skip to content

Commit 7c94949

Browse files
jbrockmendeljreback
authored andcommitted
TYP: Index get_indexer_foo methods (pandas-dev#31137)
1 parent 9843f43 commit 7c94949

File tree

3 files changed

+27
-23
lines changed

3 files changed

+27
-23
lines changed

pandas/_libs/index.pyx

+10-12
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ cdef class IndexEngine:
213213
return self.monotonic_dec == 1
214214

215215
cdef inline _do_monotonic_check(self):
216-
cdef object is_unique
216+
cdef:
217+
bint is_unique
217218
try:
218219
values = self._get_index_values()
219220
self.monotonic_inc, self.monotonic_dec, is_unique = \
@@ -236,10 +237,10 @@ cdef class IndexEngine:
236237
cdef _call_monotonic(self, values):
237238
return algos.is_monotonic(values, timelike=False)
238239

239-
def get_backfill_indexer(self, other, limit=None):
240+
def get_backfill_indexer(self, other: np.ndarray, limit=None) -> np.ndarray:
240241
return algos.backfill(self._get_index_values(), other, limit=limit)
241242

242-
def get_pad_indexer(self, other, limit=None):
243+
def get_pad_indexer(self, other: np.ndarray, limit=None) -> np.ndarray:
243244
return algos.pad(self._get_index_values(), other, limit=limit)
244245

245246
cdef _make_hash_table(self, Py_ssize_t n):
@@ -477,13 +478,13 @@ cdef class DatetimeEngine(Int64Engine):
477478
values = np.asarray(values).view('i8')
478479
return self.mapping.lookup(values)
479480

480-
def get_pad_indexer(self, other, limit=None):
481+
def get_pad_indexer(self, other: np.ndarray, limit=None) -> np.ndarray:
481482
if other.dtype != self._get_box_dtype():
482483
return np.repeat(-1, len(other)).astype('i4')
483484
other = np.asarray(other).view('i8')
484485
return algos.pad(self._get_index_values(), other, limit=limit)
485486

486-
def get_backfill_indexer(self, other, limit=None):
487+
def get_backfill_indexer(self, other: np.ndarray, limit=None) -> np.ndarray:
487488
if other.dtype != self._get_box_dtype():
488489
return np.repeat(-1, len(other)).astype('i4')
489490
other = np.asarray(other).view('i8')
@@ -506,16 +507,13 @@ cdef class PeriodEngine(Int64Engine):
506507
cdef _get_index_values(self):
507508
return super(PeriodEngine, self).vgetter().view("i8")
508509

509-
cdef void _call_map_locations(self, values):
510-
# super(...) pattern doesn't seem to work with `cdef`
511-
Int64Engine._call_map_locations(self, values.view('i8'))
512-
513510
cdef _call_monotonic(self, values):
514511
# super(...) pattern doesn't seem to work with `cdef`
515512
return Int64Engine._call_monotonic(self, values.view('i8'))
516513

517514
def get_indexer(self, values):
518-
cdef ndarray[int64_t, ndim=1] ordinals
515+
cdef:
516+
ndarray[int64_t, ndim=1] ordinals
519517

520518
super(PeriodEngine, self)._ensure_mapping_populated()
521519

@@ -524,14 +522,14 @@ cdef class PeriodEngine(Int64Engine):
524522

525523
return self.mapping.lookup(ordinals)
526524

527-
def get_pad_indexer(self, other, limit=None):
525+
def get_pad_indexer(self, other: np.ndarray, limit=None) -> np.ndarray:
528526
freq = super(PeriodEngine, self).vgetter().freq
529527
ordinal = periodlib.extract_ordinals(other, freq)
530528

531529
return algos.pad(self._get_index_values(),
532530
np.asarray(ordinal), limit=limit)
533531

534-
def get_backfill_indexer(self, other, limit=None):
532+
def get_backfill_indexer(self, other: np.ndarray, limit=None) -> np.ndarray:
535533
freq = super(PeriodEngine, self).vgetter().freq
536534
ordinal = periodlib.extract_ordinals(other, freq)
537535

pandas/_libs/index_class_helper.pxi.in

+1-4
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,7 @@ cdef class {{name}}Engine(IndexEngine):
5353
ndarray[{{ctype}}] values
5454
int count = 0
5555

56-
{{if name not in {'Float64', 'Float32'} }}
57-
if not util.is_integer_object(val):
58-
raise KeyError(val)
59-
{{endif}}
56+
self._check_type(val)
6057

6158
# A view is needed for some subclasses, such as PeriodEngine:
6259
values = self._get_index_values().view('{{dtype}}')

pandas/core/indexes/base.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
duplicated="np.ndarray",
9797
)
9898
_index_shared_docs = dict()
99+
str_t = str
99100

100101

101102
def _make_comparison_op(op, cls):
@@ -2959,7 +2960,9 @@ def get_loc(self, key, method=None, tolerance=None):
29592960
"""
29602961

29612962
@Appender(_index_shared_docs["get_indexer"] % _index_doc_kwargs)
2962-
def get_indexer(self, target, method=None, limit=None, tolerance=None):
2963+
def get_indexer(
2964+
self, target, method=None, limit=None, tolerance=None
2965+
) -> np.ndarray:
29632966
method = missing.clean_reindex_fill_method(method)
29642967
target = ensure_index(target)
29652968
if tolerance is not None:
@@ -3016,14 +3019,16 @@ def _convert_tolerance(self, tolerance, target):
30163019
raise ValueError("list-like tolerance size must match target index size")
30173020
return tolerance
30183021

3019-
def _get_fill_indexer(self, target, method, limit=None, tolerance=None):
3022+
def _get_fill_indexer(
3023+
self, target: "Index", method: str_t, limit=None, tolerance=None
3024+
) -> np.ndarray:
30203025
if self.is_monotonic_increasing and target.is_monotonic_increasing:
3021-
method = (
3026+
engine_method = (
30223027
self._engine.get_pad_indexer
30233028
if method == "pad"
30243029
else self._engine.get_backfill_indexer
30253030
)
3026-
indexer = method(target._ndarray_values, limit)
3031+
indexer = engine_method(target._ndarray_values, limit)
30273032
else:
30283033
indexer = self._get_fill_indexer_searchsorted(target, method, limit)
30293034
if tolerance is not None:
@@ -3032,7 +3037,9 @@ def _get_fill_indexer(self, target, method, limit=None, tolerance=None):
30323037
)
30333038
return indexer
30343039

3035-
def _get_fill_indexer_searchsorted(self, target, method, limit=None):
3040+
def _get_fill_indexer_searchsorted(
3041+
self, target: "Index", method: str_t, limit=None
3042+
) -> np.ndarray:
30363043
"""
30373044
Fallback pad/backfill get_indexer that works for monotonic decreasing
30383045
indexes and non-monotonic targets.
@@ -3063,7 +3070,7 @@ def _get_fill_indexer_searchsorted(self, target, method, limit=None):
30633070
indexer[indexer == len(self)] = -1
30643071
return indexer
30653072

3066-
def _get_nearest_indexer(self, target, limit, tolerance):
3073+
def _get_nearest_indexer(self, target: "Index", limit, tolerance) -> np.ndarray:
30673074
"""
30683075
Get the indexer for the nearest index labels; requires an index with
30693076
values that can be subtracted from each other (e.g., not strings or
@@ -3086,7 +3093,9 @@ def _get_nearest_indexer(self, target, limit, tolerance):
30863093
indexer = self._filter_indexer_tolerance(target, indexer, tolerance)
30873094
return indexer
30883095

3089-
def _filter_indexer_tolerance(self, target, indexer, tolerance):
3096+
def _filter_indexer_tolerance(
3097+
self, target: "Index", indexer: np.ndarray, tolerance
3098+
) -> np.ndarray:
30903099
distance = abs(self.values[indexer] - target)
30913100
indexer = np.where(distance <= tolerance, indexer, -1)
30923101
return indexer

0 commit comments

Comments
 (0)