@@ -205,8 +205,7 @@ cdef class _BaseGrouper:
205205
206206 cdef inline object _apply_to_group(self ,
207207 object cached_typ, object cached_ityp,
208- Slider islider, Slider vslider,
209- Py_ssize_t group_size, bint initialized):
208+ bint initialized):
210209 """
211210 Call self.f on our new group, then update to the next group.
212211 """
@@ -222,9 +221,6 @@ cdef class _BaseGrouper:
222221 initialized = True
223222 _check_result_array(res, len (self .dummy_arr))
224223
225- islider.advance(group_size)
226- vslider.advance(group_size)
227-
228224 return res, initialized
229225
230226
@@ -269,7 +265,7 @@ cdef class SeriesBinGrouper(_BaseGrouper):
269265 cdef:
270266 ndarray arr, result
271267 ndarray[int64_t] counts
272- Py_ssize_t i, n, group_size
268+ Py_ssize_t i, n, group_size, start, end
273269 object res
274270 bint initialized = 0
275271 Slider vslider, islider
@@ -293,19 +289,21 @@ cdef class SeriesBinGrouper(_BaseGrouper):
293289
294290 result = np.empty(self .ngroups, dtype = ' O' )
295291
292+ start = 0
296293 try :
297294 for i in range (self .ngroups):
298295 group_size = counts[i]
296+ end = start + group_size
299297
300- islider.set_length(group_size )
301- vslider.set_length(group_size )
298+ islider.move(start, end )
299+ vslider.move(start, end )
302300
303301 cached_typ, cached_ityp = self ._update_cached_objs(
304302 cached_typ, cached_ityp, islider, vslider)
305303
306304 res, initialized = self ._apply_to_group(cached_typ, cached_ityp,
307- islider, vslider,
308- group_size, initialized)
305+ initialized)
306+ start += group_size
309307
310308 result[i] = res
311309
@@ -361,7 +359,7 @@ cdef class SeriesGrouper(_BaseGrouper):
361359 # Define result to avoid UnboundLocalError
362360 ndarray arr, result = None
363361 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
365363 object res
366364 bint initialized = 0
367365 Slider vslider, islider
@@ -377,6 +375,7 @@ cdef class SeriesGrouper(_BaseGrouper):
377375
378376 result = np.empty(self .ngroups, dtype = ' O' )
379377
378+ start = 0
380379 try :
381380 for i in range (n):
382381 group_size += 1
@@ -385,20 +384,21 @@ cdef class SeriesGrouper(_BaseGrouper):
385384
386385 if i == n - 1 or lab != labels[i + 1 ]:
387386 if lab == - 1 :
388- islider.advance(group_size)
389- vslider.advance(group_size)
387+ start += group_size
390388 group_size = 0
391389 continue
392390
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)
395394
396395 cached_typ, cached_ityp = self ._update_cached_objs(
397396 cached_typ, cached_ityp, islider, vslider)
398397
399398 res, initialized = self ._apply_to_group(cached_typ, cached_ityp,
400- islider, vslider,
401- group_size, initialized)
399+ initialized)
400+
401+ start += group_size
402402
403403 result[lab] = res
404404 counts[lab] = group_size
@@ -458,19 +458,13 @@ cdef class Slider:
458458 self .buf.data = self .values.data
459459 self .buf.strides[0 ] = self .stride
460460
461- cdef advance(self , Py_ssize_t k):
462- self .buf.data = < char * > self .buf.data + self .stride * k
463-
464461 cdef move(self , int start, int end):
465462 """
466463 For slicing
467464 """
468465 self .buf.data = self .values.data + self .stride * start
469466 self .buf.shape[0 ] = end - start
470467
471- cdef set_length(self , Py_ssize_t length):
472- self .buf.shape[0 ] = length
473-
474468 cdef reset(self ):
475469
476470 self .buf.shape[0 ] = self .orig_len
0 commit comments