Skip to content

Commit 3d95777

Browse files
author
awu42
committed
Merge remote-tracking branch 'upstream/master' into new-feature
2 parents 3757712 + 7c94949 commit 3d95777

File tree

4 files changed

+41
-56
lines changed

4 files changed

+41
-56
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

pandas/core/indexes/numeric.py

+14-33
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ class IntegerIndex(NumericIndex):
231231
This is an abstract class for Int64Index, UInt64Index.
232232
"""
233233

234+
_default_dtype: np.dtype
235+
234236
def __contains__(self, key) -> bool:
235237
"""
236238
Check if key is a float and has a decimal. If it has, return False.
@@ -243,26 +245,17 @@ def __contains__(self, key) -> bool:
243245
except (OverflowError, TypeError, ValueError):
244246
return False
245247

246-
247-
class Int64Index(IntegerIndex):
248-
__doc__ = _num_index_shared_docs["class_descr"] % _int64_descr_args
249-
250-
_typ = "int64index"
251-
_can_hold_na = False
252-
_engine_type = libindex.Int64Engine
253-
_default_dtype = np.int64
254-
255248
@property
256249
def inferred_type(self) -> str:
257250
"""
258-
Always 'integer' for ``Int64Index``
251+
Always 'integer' for ``Int64Index`` and ``UInt64Index``
259252
"""
260253
return "integer"
261254

262255
@property
263256
def asi8(self) -> np.ndarray:
264257
# do not cache or you'll create a memory leak
265-
return self.values.view("i8")
258+
return self.values.view(self._default_dtype)
266259

267260
@Appender(_index_shared_docs["_convert_scalar_indexer"])
268261
def _convert_scalar_indexer(self, key, kind=None):
@@ -273,6 +266,15 @@ def _convert_scalar_indexer(self, key, kind=None):
273266
key = self._maybe_cast_indexer(key)
274267
return super()._convert_scalar_indexer(key, kind=kind)
275268

269+
270+
class Int64Index(IntegerIndex):
271+
__doc__ = _num_index_shared_docs["class_descr"] % _int64_descr_args
272+
273+
_typ = "int64index"
274+
_can_hold_na = False
275+
_engine_type = libindex.Int64Engine
276+
_default_dtype = np.dtype(np.int64)
277+
276278
def _wrap_joined_index(self, joined, other):
277279
name = get_op_result_name(self, other)
278280
return Int64Index(joined, name=name)
@@ -307,28 +309,7 @@ class UInt64Index(IntegerIndex):
307309
_typ = "uint64index"
308310
_can_hold_na = False
309311
_engine_type = libindex.UInt64Engine
310-
_default_dtype = np.uint64
311-
312-
@property
313-
def inferred_type(self) -> str:
314-
"""
315-
Always 'integer' for ``UInt64Index``
316-
"""
317-
return "integer"
318-
319-
@property
320-
def asi8(self) -> np.ndarray:
321-
# do not cache or you'll create a memory leak
322-
return self.values.view("u8")
323-
324-
@Appender(_index_shared_docs["_convert_scalar_indexer"])
325-
def _convert_scalar_indexer(self, key, kind=None):
326-
assert kind in ["loc", "getitem", "iloc", None]
327-
328-
# don't coerce ilocs to integers
329-
if kind != "iloc":
330-
key = self._maybe_cast_indexer(key)
331-
return super()._convert_scalar_indexer(key, kind=kind)
312+
_default_dtype = np.dtype(np.uint64)
332313

333314
@Appender(_index_shared_docs["_convert_arr_indexer"])
334315
def _convert_arr_indexer(self, keyarr):

0 commit comments

Comments
 (0)