Skip to content

Commit 72786cc

Browse files
gfyoungjreback
authored andcommitted
MAINT: Abstract index helpers in pxi.in file (pandas-dev#14989)
1 parent 7a79c1a commit 72786cc

File tree

3 files changed

+95
-125
lines changed

3 files changed

+95
-125
lines changed

pandas/index.pyx

+4-125
Original file line numberDiff line numberDiff line change
@@ -363,115 +363,6 @@ cdef class IndexEngine:
363363

364364
return result[0:count], missing[0:count_missing]
365365

366-
cdef class Int64Engine(IndexEngine):
367-
368-
cdef _get_index_values(self):
369-
return algos.ensure_int64(self.vgetter())
370-
371-
cdef _make_hash_table(self, n):
372-
return _hash.Int64HashTable(n)
373-
374-
def _call_monotonic(self, values):
375-
return algos.is_monotonic_int64(values, timelike=False)
376-
377-
def get_pad_indexer(self, other, limit=None):
378-
return algos.pad_int64(self._get_index_values(), other,
379-
limit=limit)
380-
381-
def get_backfill_indexer(self, other, limit=None):
382-
return algos.backfill_int64(self._get_index_values(), other,
383-
limit=limit)
384-
385-
cdef _check_type(self, object val):
386-
hash(val)
387-
if util.is_bool_object(val):
388-
raise KeyError(val)
389-
elif util.is_float_object(val):
390-
raise KeyError(val)
391-
392-
cdef _maybe_get_bool_indexer(self, object val):
393-
cdef:
394-
ndarray[uint8_t, cast=True] indexer
395-
ndarray[int64_t] values
396-
int count = 0
397-
Py_ssize_t i, n
398-
int64_t ival
399-
int last_true
400-
401-
if not util.is_integer_object(val):
402-
raise KeyError(val)
403-
404-
ival = val
405-
406-
values = self._get_index_values()
407-
n = len(values)
408-
409-
result = np.empty(n, dtype=bool)
410-
indexer = result.view(np.uint8)
411-
412-
for i in range(n):
413-
if values[i] == val:
414-
count += 1
415-
indexer[i] = 1
416-
last_true = i
417-
else:
418-
indexer[i] = 0
419-
420-
if count == 0:
421-
raise KeyError(val)
422-
if count == 1:
423-
return last_true
424-
425-
return result
426-
427-
cdef class Float64Engine(IndexEngine):
428-
429-
cdef _make_hash_table(self, n):
430-
return _hash.Float64HashTable(n)
431-
432-
cdef _get_index_values(self):
433-
return algos.ensure_float64(self.vgetter())
434-
435-
cdef _maybe_get_bool_indexer(self, object val):
436-
cdef:
437-
ndarray[uint8_t] indexer
438-
ndarray[float64_t] values
439-
int count = 0
440-
Py_ssize_t i, n
441-
int last_true
442-
443-
values = self._get_index_values()
444-
n = len(values)
445-
446-
result = np.empty(n, dtype=bool)
447-
indexer = result.view(np.uint8)
448-
449-
for i in range(n):
450-
if values[i] == val:
451-
count += 1
452-
indexer[i] = 1
453-
last_true = i
454-
else:
455-
indexer[i] = 0
456-
457-
if count == 0:
458-
raise KeyError(val)
459-
if count == 1:
460-
return last_true
461-
462-
return result
463-
464-
def _call_monotonic(self, values):
465-
return algos.is_monotonic_float64(values, timelike=False)
466-
467-
def get_pad_indexer(self, other, limit=None):
468-
return algos.pad_float64(self._get_index_values(), other,
469-
limit=limit)
470-
471-
def get_backfill_indexer(self, other, limit=None):
472-
return algos.backfill_float64(self._get_index_values(), other,
473-
limit=limit)
474-
475366

476367
cdef Py_ssize_t _bin_search(ndarray values, object val) except -1:
477368
cdef:
@@ -510,22 +401,6 @@ _backfill_functions = {
510401
'float64': algos.backfill_float64
511402
}
512403

513-
cdef class ObjectEngine(IndexEngine):
514-
515-
cdef _make_hash_table(self, n):
516-
return _hash.PyObjectHashTable(n)
517-
518-
def _call_monotonic(self, values):
519-
return algos.is_monotonic_object(values, timelike=False)
520-
521-
def get_pad_indexer(self, other, limit=None):
522-
return algos.pad_object(self._get_index_values(), other,
523-
limit=limit)
524-
525-
def get_backfill_indexer(self, other, limit=None):
526-
return algos.backfill_object(self._get_index_values(), other,
527-
limit=limit)
528-
529404

530405
cdef class DatetimeEngine(Int64Engine):
531406

@@ -668,3 +543,7 @@ cdef inline _to_i8(object val):
668543

669544
cdef inline bint _is_utc(object tz):
670545
return tz is UTC or isinstance(tz, _du_utc)
546+
547+
548+
# Generated from template.
549+
include "index_class_helper.pxi"

pandas/src/index_class_helper.pxi.in

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
"""
2+
Template for functions of IndexEngine subclasses.
3+
4+
WARNING: DO NOT edit .pxi FILE directly, .pxi is generated from .pxi.in
5+
"""
6+
7+
#----------------------------------------------------------------------
8+
# IndexEngine Subclass Methods
9+
#----------------------------------------------------------------------
10+
11+
{{py:
12+
13+
# name, dtype, ctype
14+
dtypes = [('Float64', 'float64', 'float64_t'),
15+
('Int64', 'int64', 'int64_t'),
16+
('Object', 'object', 'object')]
17+
}}
18+
19+
{{for name, dtype, ctype in dtypes}}
20+
21+
22+
cdef class {{name}}Engine(IndexEngine):
23+
24+
def _call_monotonic(self, values):
25+
return algos.is_monotonic_{{dtype}}(values, timelike=False)
26+
27+
def get_backfill_indexer(self, other, limit=None):
28+
return algos.backfill_{{dtype}}(self._get_index_values(),
29+
other, limit=limit)
30+
31+
def get_pad_indexer(self, other, limit=None):
32+
return algos.pad_{{dtype}}(self._get_index_values(),
33+
other, limit=limit)
34+
35+
cdef _make_hash_table(self, n):
36+
{{if name == 'Object'}}
37+
return _hash.PyObjectHashTable(n)
38+
{{else}}
39+
return _hash.{{name}}HashTable(n)
40+
{{endif}}
41+
42+
{{if name != 'Float64' and name != 'Object'}}
43+
cdef _check_type(self, object val):
44+
hash(val)
45+
if util.is_bool_object(val):
46+
raise KeyError(val)
47+
elif util.is_float_object(val):
48+
raise KeyError(val)
49+
{{endif}}
50+
51+
{{if name != 'Object'}}
52+
cdef _get_index_values(self):
53+
return algos.ensure_{{dtype}}(self.vgetter())
54+
55+
cdef _maybe_get_bool_indexer(self, object val):
56+
cdef:
57+
ndarray[uint8_t, cast=True] indexer
58+
ndarray[{{ctype}}] values
59+
int count = 0
60+
Py_ssize_t i, n
61+
int last_true
62+
63+
{{if name != 'Float64'}}
64+
if not util.is_integer_object(val):
65+
raise KeyError(val)
66+
{{endif}}
67+
68+
values = self._get_index_values()
69+
n = len(values)
70+
71+
result = np.empty(n, dtype=bool)
72+
indexer = result.view(np.uint8)
73+
74+
for i in range(n):
75+
if values[i] == val:
76+
count += 1
77+
indexer[i] = 1
78+
last_true = i
79+
else:
80+
indexer[i] = 0
81+
82+
if count == 0:
83+
raise KeyError(val)
84+
if count == 1:
85+
return last_true
86+
87+
return result
88+
{{endif}}
89+
90+
{{endfor}}

setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ def is_platform_mac():
116116
'_join': ['join_helper.pxi.in', 'joins_func_helper.pxi.in'],
117117
'hashtable': ['hashtable_class_helper.pxi.in',
118118
'hashtable_func_helper.pxi.in'],
119+
'index': ['index_class_helper.pxi.in'],
119120
'_sparse': ['sparse_op_helper.pxi.in']
120121
}
121122
_pxifiles = []

0 commit comments

Comments
 (0)