@@ -53,24 +53,24 @@ cdef class _BaseGrouper:
53
53
54
54
return values, index
55
55
56
+ cdef _init_dummy_series_and_index(self , Slider islider, Slider vslider):
57
+ """
58
+ Create Series and Index objects that we will alter in-place while iterating.
59
+ """
60
+ cached_index = self .ityp(islider.buf, dtype = self .idtype)
61
+ cached_series = self .typ(
62
+ vslider.buf, dtype = vslider.buf.dtype, index = cached_index, name = self .name
63
+ )
64
+ return cached_index, cached_series
65
+
56
66
cdef inline _update_cached_objs(self , object cached_typ, object cached_ityp,
57
67
Slider islider, Slider vslider):
58
- if cached_typ is None :
59
- cached_ityp = self .ityp(islider.buf, dtype = self .idtype)
60
- cached_typ = self .typ(
61
- vslider.buf, dtype = vslider.buf.dtype, index = cached_ityp, name = self .name
62
- )
63
- else :
64
- # See the comment in indexes/base.py about _index_data.
65
- # We need this for EA-backed indexes that have a reference
66
- # to a 1-d ndarray like datetime / timedelta / period.
67
- object .__setattr__ (cached_ityp, ' _index_data' , islider.buf)
68
- cached_ityp._engine.clear_mapping()
69
- cached_ityp._cache.clear() # e.g. inferred_freq must go
70
- cached_typ._mgr.set_values(vslider.buf)
71
- object .__setattr__ (cached_typ, ' _index' , cached_ityp)
72
- object .__setattr__ (cached_typ, ' name' , self .name)
73
- return cached_typ, cached_ityp
68
+ # See the comment in indexes/base.py about _index_data.
69
+ # We need this for EA-backed indexes that have a reference
70
+ # to a 1-d ndarray like datetime / timedelta / period.
71
+ cached_ityp._engine.clear_mapping()
72
+ cached_ityp._cache.clear() # e.g. inferred_freq must go
73
+ cached_typ._mgr.set_values(vslider.buf)
74
74
75
75
cdef inline object _apply_to_group(self ,
76
76
object cached_typ, object cached_ityp,
@@ -81,8 +81,8 @@ cdef class _BaseGrouper:
81
81
cdef:
82
82
object res
83
83
84
- cached_ityp._engine.clear_mapping()
85
- cached_ityp._cache.clear() # e.g. inferred_freq must go
84
+ # NB: we assume that _update_cached_objs has already cleared cleared
85
+ # the cache and engine mapping
86
86
res = self .f(cached_typ)
87
87
res = extract_result(res)
88
88
if not initialized:
@@ -160,6 +160,8 @@ cdef class SeriesBinGrouper(_BaseGrouper):
160
160
161
161
result = np.empty(self .ngroups, dtype = ' O' )
162
162
163
+ cached_ityp, cached_typ = self ._init_dummy_series_and_index(islider, vslider)
164
+
163
165
start = 0
164
166
try :
165
167
for i in range (self .ngroups):
@@ -169,7 +171,7 @@ cdef class SeriesBinGrouper(_BaseGrouper):
169
171
islider.move(start, end)
170
172
vslider.move(start, end)
171
173
172
- cached_typ, cached_ityp = self ._update_cached_objs(
174
+ self ._update_cached_objs(
173
175
cached_typ, cached_ityp, islider, vslider)
174
176
175
177
res, initialized = self ._apply_to_group(cached_typ, cached_ityp,
@@ -246,6 +248,8 @@ cdef class SeriesGrouper(_BaseGrouper):
246
248
247
249
result = np.empty(self .ngroups, dtype = ' O' )
248
250
251
+ cached_ityp, cached_typ = self ._init_dummy_series_and_index(islider, vslider)
252
+
249
253
start = 0
250
254
try :
251
255
for i in range (n):
@@ -263,7 +267,7 @@ cdef class SeriesGrouper(_BaseGrouper):
263
267
islider.move(start, end)
264
268
vslider.move(start, end)
265
269
266
- cached_typ, cached_ityp = self ._update_cached_objs(
270
+ self ._update_cached_objs(
267
271
cached_typ, cached_ityp, islider, vslider)
268
272
269
273
res, initialized = self ._apply_to_group(cached_typ, cached_ityp,
0 commit comments