Skip to content

Commit c355ed1

Browse files
authored
REF: simplify libreduction (#41262)
1 parent 881c37a commit c355ed1

File tree

1 file changed

+24
-20
lines changed

1 file changed

+24
-20
lines changed

pandas/_libs/reduction.pyx

+24-20
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,24 @@ cdef class _BaseGrouper:
5353

5454
return values, index
5555

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+
5666
cdef inline _update_cached_objs(self, object cached_typ, object cached_ityp,
5767
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)
7474

7575
cdef inline object _apply_to_group(self,
7676
object cached_typ, object cached_ityp,
@@ -81,8 +81,8 @@ cdef class _BaseGrouper:
8181
cdef:
8282
object res
8383

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
8686
res = self.f(cached_typ)
8787
res = extract_result(res)
8888
if not initialized:
@@ -160,6 +160,8 @@ cdef class SeriesBinGrouper(_BaseGrouper):
160160

161161
result = np.empty(self.ngroups, dtype='O')
162162

163+
cached_ityp, cached_typ = self._init_dummy_series_and_index(islider, vslider)
164+
163165
start = 0
164166
try:
165167
for i in range(self.ngroups):
@@ -169,7 +171,7 @@ cdef class SeriesBinGrouper(_BaseGrouper):
169171
islider.move(start, end)
170172
vslider.move(start, end)
171173

172-
cached_typ, cached_ityp = self._update_cached_objs(
174+
self._update_cached_objs(
173175
cached_typ, cached_ityp, islider, vslider)
174176

175177
res, initialized = self._apply_to_group(cached_typ, cached_ityp,
@@ -246,6 +248,8 @@ cdef class SeriesGrouper(_BaseGrouper):
246248

247249
result = np.empty(self.ngroups, dtype='O')
248250

251+
cached_ityp, cached_typ = self._init_dummy_series_and_index(islider, vslider)
252+
249253
start = 0
250254
try:
251255
for i in range(n):
@@ -263,7 +267,7 @@ cdef class SeriesGrouper(_BaseGrouper):
263267
islider.move(start, end)
264268
vslider.move(start, end)
265269

266-
cached_typ, cached_ityp = self._update_cached_objs(
270+
self._update_cached_objs(
267271
cached_typ, cached_ityp, islider, vslider)
268272

269273
res, initialized = self._apply_to_group(cached_typ, cached_ityp,

0 commit comments

Comments
 (0)