@@ -205,8 +205,7 @@ cdef class _BaseGrouper:
205
205
206
206
cdef inline object _apply_to_group(self ,
207
207
object cached_typ, object cached_ityp,
208
- Slider islider, Slider vslider,
209
- Py_ssize_t group_size, bint initialized):
208
+ bint initialized):
210
209
"""
211
210
Call self.f on our new group, then update to the next group.
212
211
"""
@@ -222,9 +221,6 @@ cdef class _BaseGrouper:
222
221
initialized = True
223
222
_check_result_array(res, len (self .dummy_arr))
224
223
225
- islider.advance(group_size)
226
- vslider.advance(group_size)
227
-
228
224
return res, initialized
229
225
230
226
@@ -269,7 +265,7 @@ cdef class SeriesBinGrouper(_BaseGrouper):
269
265
cdef:
270
266
ndarray arr, result
271
267
ndarray[int64_t] counts
272
- Py_ssize_t i, n, group_size
268
+ Py_ssize_t i, n, group_size, start, end
273
269
object res
274
270
bint initialized = 0
275
271
Slider vslider, islider
@@ -293,19 +289,21 @@ cdef class SeriesBinGrouper(_BaseGrouper):
293
289
294
290
result = np.empty(self .ngroups, dtype = ' O' )
295
291
292
+ start = 0
296
293
try :
297
294
for i in range (self .ngroups):
298
295
group_size = counts[i]
296
+ end = start + group_size
299
297
300
- islider.set_length(group_size )
301
- vslider.set_length(group_size )
298
+ islider.move(start, end )
299
+ vslider.move(start, end )
302
300
303
301
cached_typ, cached_ityp = self ._update_cached_objs(
304
302
cached_typ, cached_ityp, islider, vslider)
305
303
306
304
res, initialized = self ._apply_to_group(cached_typ, cached_ityp,
307
- islider, vslider,
308
- group_size, initialized)
305
+ initialized)
306
+ start += group_size
309
307
310
308
result[i] = res
311
309
@@ -361,7 +359,7 @@ cdef class SeriesGrouper(_BaseGrouper):
361
359
# Define result to avoid UnboundLocalError
362
360
ndarray arr, result = None
363
361
ndarray[int64_t] labels, counts
364
- Py_ssize_t i, n, group_size, lab
362
+ Py_ssize_t i, n, group_size, lab, start, end
365
363
object res
366
364
bint initialized = 0
367
365
Slider vslider, islider
@@ -377,6 +375,7 @@ cdef class SeriesGrouper(_BaseGrouper):
377
375
378
376
result = np.empty(self .ngroups, dtype = ' O' )
379
377
378
+ start = 0
380
379
try :
381
380
for i in range (n):
382
381
group_size += 1
@@ -385,20 +384,21 @@ cdef class SeriesGrouper(_BaseGrouper):
385
384
386
385
if i == n - 1 or lab != labels[i + 1 ]:
387
386
if lab == - 1 :
388
- islider.advance(group_size)
389
- vslider.advance(group_size)
387
+ start += group_size
390
388
group_size = 0
391
389
continue
392
390
393
- islider.set_length(group_size)
394
- vslider.set_length(group_size)
391
+ end = start + group_size
392
+ islider.move(start, end)
393
+ vslider.move(start, end)
395
394
396
395
cached_typ, cached_ityp = self ._update_cached_objs(
397
396
cached_typ, cached_ityp, islider, vslider)
398
397
399
398
res, initialized = self ._apply_to_group(cached_typ, cached_ityp,
400
- islider, vslider,
401
- group_size, initialized)
399
+ initialized)
400
+
401
+ start += group_size
402
402
403
403
result[lab] = res
404
404
counts[lab] = group_size
@@ -458,19 +458,13 @@ cdef class Slider:
458
458
self .buf.data = self .values.data
459
459
self .buf.strides[0 ] = self .stride
460
460
461
- cdef advance(self , Py_ssize_t k):
462
- self .buf.data = < char * > self .buf.data + self .stride * k
463
-
464
461
cdef move(self , int start, int end):
465
462
"""
466
463
For slicing
467
464
"""
468
465
self .buf.data = self .values.data + self .stride * start
469
466
self .buf.shape[0 ] = end - start
470
467
471
- cdef set_length(self , Py_ssize_t length):
472
- self .buf.shape[0 ] = length
473
-
474
468
cdef reset(self ):
475
469
476
470
self .buf.shape[0 ] = self .orig_len
0 commit comments