1
1
from copy import copy
2
2
3
- from cython import Py_ssize_t
4
-
5
3
from libc.stdlib cimport free, malloc
6
4
7
5
import numpy as np
@@ -11,14 +9,14 @@ from numpy cimport int64_t, ndarray
11
9
12
10
cnp.import_array()
13
11
14
- from pandas._libs cimport util
12
+ from pandas._libs.util cimport is_array, set_array_not_contiguous
15
13
16
14
from pandas._libs.lib import is_scalar, maybe_convert_objects
17
15
18
16
19
17
cpdef check_result_array(object obj, Py_ssize_t cnt):
20
18
21
- if (util. is_array(obj) or
19
+ if (is_array(obj) or
22
20
(isinstance (obj, list ) and len (obj) == cnt) or
23
21
getattr (obj, ' shape' , None ) == (cnt,)):
24
22
raise ValueError (' Must produce aggregated value' )
@@ -33,7 +31,7 @@ cdef class _BaseGrouper:
33
31
if (dummy.dtype != self .arr.dtype
34
32
and values.dtype != self .arr.dtype):
35
33
raise ValueError (' Dummy array must be same dtype' )
36
- if util. is_array(values) and not values.flags.contiguous:
34
+ if is_array(values) and not values.flags.contiguous:
37
35
# e.g. Categorical has no `flags` attribute
38
36
values = values.copy()
39
37
index = dummy.index.values
@@ -106,7 +104,7 @@ cdef class SeriesBinGrouper(_BaseGrouper):
106
104
self .f = f
107
105
108
106
values = series.values
109
- if util. is_array(values) and not values.flags.c_contiguous:
107
+ if is_array(values) and not values.flags.c_contiguous:
110
108
# e.g. Categorical has no `flags` attribute
111
109
values = values.copy(' C' )
112
110
self .arr = values
@@ -204,7 +202,7 @@ cdef class SeriesGrouper(_BaseGrouper):
204
202
self .f = f
205
203
206
204
values = series.values
207
- if util. is_array(values) and not values.flags.c_contiguous:
205
+ if is_array(values) and not values.flags.c_contiguous:
208
206
# e.g. Categorical has no `flags` attribute
209
207
values = values.copy(' C' )
210
208
self .arr = values
@@ -288,9 +286,9 @@ cpdef inline extract_result(object res, bint squeeze=True):
288
286
res = res._values
289
287
if squeeze and res.ndim == 1 and len (res) == 1 :
290
288
res = res[0 ]
291
- if hasattr (res, ' values' ) and util. is_array(res.values):
289
+ if hasattr (res, ' values' ) and is_array(res.values):
292
290
res = res.values
293
- if util. is_array(res):
291
+ if is_array(res):
294
292
if res.ndim == 0 :
295
293
res = res.item()
296
294
elif squeeze and res.ndim == 1 and len (res) == 1 :
@@ -304,7 +302,7 @@ cdef class Slider:
304
302
"""
305
303
cdef:
306
304
ndarray values, buf
307
- Py_ssize_t stride, orig_len, orig_stride
305
+ Py_ssize_t stride
308
306
char * orig_data
309
307
310
308
def __init__ (self , ndarray values , ndarray buf ):
@@ -316,11 +314,9 @@ cdef class Slider:
316
314
317
315
self .values = values
318
316
self .buf = buf
319
- self .stride = values.strides[0 ]
320
317
318
+ self .stride = values.strides[0 ]
321
319
self .orig_data = self .buf.data
322
- self .orig_len = self .buf.shape[0 ]
323
- self .orig_stride = self .buf.strides[0 ]
324
320
325
321
self .buf.data = self .values.data
326
322
self .buf.strides[0 ] = self .stride
@@ -333,10 +329,8 @@ cdef class Slider:
333
329
self .buf.shape[0 ] = end - start
334
330
335
331
cdef reset(self ):
336
-
337
- self .buf.shape[0 ] = self .orig_len
338
332
self .buf.data = self .orig_data
339
- self .buf.strides [0 ] = self .orig_stride
333
+ self .buf.shape [0 ] = 0
340
334
341
335
342
336
class InvalidApply (Exception ):
@@ -408,39 +402,34 @@ cdef class BlockSlider:
408
402
"""
409
403
Only capable of sliding on axis=0
410
404
"""
411
-
412
- cdef public:
413
- object frame, dummy, index
414
- int nblocks
415
- Slider idx_slider
416
- list blocks
417
-
418
405
cdef:
406
+ object frame, dummy, index, block
407
+ list blk_values
408
+ ndarray values
409
+ Slider idx_slider
419
410
char ** base_ptrs
411
+ int nblocks
412
+ Py_ssize_t i
420
413
421
414
def __init__ (self , object frame ):
422
- cdef:
423
- Py_ssize_t i
424
- object b
425
-
426
415
self .frame = frame
427
416
self .dummy = frame[:0 ]
428
417
self .index = self .dummy.index
429
418
430
- self .blocks = [b .values for b in self .dummy._mgr.blocks]
419
+ self .blk_values = [block .values for block in self .dummy._mgr.blocks]
431
420
432
- for x in self .blocks :
433
- util. set_array_not_contiguous(x )
421
+ for values in self .blk_values :
422
+ set_array_not_contiguous(values )
434
423
435
- self .nblocks = len (self .blocks )
424
+ self .nblocks = len (self .blk_values )
436
425
# See the comment in indexes/base.py about _index_data.
437
426
# We need this for EA-backed indexes that have a reference to a 1-d
438
427
# ndarray like datetime / timedelta / period.
439
428
self .idx_slider = Slider(
440
429
self .frame.index._index_data, self .dummy.index._index_data)
441
430
442
- self .base_ptrs = < char ** > malloc(sizeof(char * ) * len ( self .blocks) )
443
- for i, block in enumerate (self .blocks ):
431
+ self .base_ptrs = < char ** > malloc(sizeof(char * ) * self .nblocks )
432
+ for i, block in enumerate (self .blk_values ):
444
433
self .base_ptrs[i] = (< ndarray> block).data
445
434
446
435
def __dealloc__ (self ):
@@ -450,10 +439,9 @@ cdef class BlockSlider:
450
439
cdef:
451
440
ndarray arr
452
441
Py_ssize_t i
453
-
454
442
# move blocks
455
443
for i in range (self .nblocks):
456
- arr = self .blocks [i]
444
+ arr = self .blk_values [i]
457
445
458
446
# axis=1 is the frame's axis=0
459
447
arr.data = self .base_ptrs[i] + arr.strides[1 ] * start
@@ -470,10 +458,8 @@ cdef class BlockSlider:
470
458
cdef:
471
459
ndarray arr
472
460
Py_ssize_t i
473
-
474
- # reset blocks
475
461
for i in range (self .nblocks):
476
- arr = self .blocks [i]
462
+ arr = self .blk_values [i]
477
463
478
464
# axis=1 is the frame's axis=0
479
465
arr.data = self .base_ptrs[i]
0 commit comments