22from numpy cimport *
33import numpy as np
44
5- from pandas.core.array import SNDArray
65from distutils.version import LooseVersion
76
87is_numpy_prior_1_6_2 = LooseVersion(np.__version__) < ' 1.6.2'
@@ -114,8 +113,8 @@ cdef class Reducer:
114113
115114 # use the cached_typ if possible
116115 if cached_typ is not None :
117- cached_typ._data._block. values = chunk
118- cached_typ. name = name
116+ object . __setattr__ ( cached_typ._data._block, ' values' , chunk)
117+ object . __setattr__ (cached_typ, ' name' , name)
119118 res = self .f(cached_typ)
120119 else :
121120 res = self .f(chunk)
@@ -164,7 +163,7 @@ cdef class SeriesBinGrouper:
164163 bint passed_dummy
165164
166165 cdef public:
167- object arr, index, dummy_arr, dummy_index, values, f, bins, typ, ityp, name
166+ object arr, index, dummy_arr, dummy_index, values, f, bins, typ, name
168167
169168 def __init__ (self , object series , object f , object bins , object dummy ):
170169 n = len (series)
@@ -178,7 +177,6 @@ cdef class SeriesBinGrouper:
178177 self .arr = values
179178 self .index = series.index
180179 self .typ = type (series)
181- self .ityp = type (series.index)
182180 self .name = getattr (series,' name' ,None )
183181
184182 self .dummy_arr, self .dummy_index = self ._check_dummy(dummy)
@@ -210,9 +208,10 @@ cdef class SeriesBinGrouper:
210208 ndarray[int64_t] counts
211209 Py_ssize_t i, n, group_size
212210 object res
213- bint initialized = 0 , needs_typ = 1 , try_typ = 0
211+ bint initialized = 0
214212 Slider vslider, islider
215- object gin, typ, ityp, name
213+ object gin, typ, name
214+ object cached_typ = None
216215
217216 counts = np.zeros(self .ngroups, dtype = np.int64)
218217
@@ -226,45 +225,29 @@ cdef class SeriesBinGrouper:
226225
227226 group_size = 0
228227 n = len (self .arr)
229- typ = self .typ
230- ityp = self .ityp
231228 name = self .name
232229
233230 vslider = Slider(self .arr, self .dummy_arr)
234231 islider = Slider(self .index, self .dummy_index)
235232
236233 gin = self .dummy_index._engine
237234
238- # old numpy issue, need to always create and pass the Series
239- if is_numpy_prior_1_6_2:
240- try_typ = 1
241- needs_typ = 1
242-
243235 try :
244236 for i in range (self .ngroups):
245237 group_size = counts[i]
246238
247239 islider.set_length(group_size)
248240 vslider.set_length(group_size)
249241
250- # see if we need to create the object proper
251- if try_typ:
252- if needs_typ:
253- res = self .f(typ(vslider.buf, index = islider.buf,
254- name = name, fastpath = True ))
255- else :
256- res = self .f(SNDArray(vslider.buf,islider.buf,name = name))
242+ if cached_typ is None :
243+ cached_typ = self .typ(vslider.buf, index = islider.buf,
244+ name = name)
257245 else :
258- try :
259- res = self .f(SNDArray(vslider.buf,islider.buf,name = name))
260- needs_typ = 0
261- except :
262- res = self .f(typ(vslider.buf, index = islider.buf,
263- name = name, fastpath = True ))
264- needs_typ = 1
265-
266- try_typ = 1
246+ object .__setattr__ (cached_typ._data._block, ' values' , vslider.buf)
247+ object .__setattr__ (cached_typ, ' _index' , islider.buf)
248+ object .__setattr__ (cached_typ, ' name' , name)
267249
250+ res = self .f(cached_typ)
268251 res = _extract_result(res)
269252 if not initialized:
270253 result = self ._get_result_array(res)
@@ -309,7 +292,7 @@ cdef class SeriesGrouper:
309292 bint passed_dummy
310293
311294 cdef public:
312- object arr, index, dummy_arr, dummy_index, f, labels, values, typ, ityp, name
295+ object arr, index, dummy_arr, dummy_index, f, labels, values, typ, name
313296
314297 def __init__ (self , object series , object f , object labels ,
315298 Py_ssize_t ngroups , object dummy ):
@@ -324,7 +307,6 @@ cdef class SeriesGrouper:
324307 self .arr = values
325308 self .index = series.index
326309 self .typ = type (series)
327- self .ityp = type (series.index)
328310 self .name = getattr (series,' name' ,None )
329311
330312 self .dummy_arr, self .dummy_index = self ._check_dummy(dummy)
@@ -351,28 +333,22 @@ cdef class SeriesGrouper:
351333 ndarray[int64_t] labels, counts
352334 Py_ssize_t i, n, group_size, lab
353335 object res
354- bint initialized = 0 , needs_typ = 1 , try_typ = 0
336+ bint initialized = 0
355337 Slider vslider, islider
356- object gin, typ, ityp, name
338+ object gin, typ, name
339+ object cached_typ = None
357340
358341 labels = self .labels
359342 counts = np.zeros(self .ngroups, dtype = np.int64)
360343 group_size = 0
361344 n = len (self .arr)
362- typ = self .typ
363- ityp = self .ityp
364345 name = self .name
365346
366347 vslider = Slider(self .arr, self .dummy_arr)
367348 islider = Slider(self .index, self .dummy_index)
368349
369350 gin = self .dummy_index._engine
370351
371- # old numpy issue, need to always create and pass the Series
372- if is_numpy_prior_1_6_2:
373- try_typ = 1
374- needs_typ = 1
375-
376352 try :
377353 for i in range (n):
378354 group_size += 1
@@ -389,27 +365,15 @@ cdef class SeriesGrouper:
389365 islider.set_length(group_size)
390366 vslider.set_length(group_size)
391367
392- # see if we need to create the object proper
393- # try on the first go around
394- if try_typ:
395- if needs_typ:
396- res = self .f(typ(vslider.buf, index = islider.buf,
397- name = name, fastpath = True ))
398- else :
399- res = self .f(SNDArray(vslider.buf,islider.buf,name = name))
368+ if cached_typ is None :
369+ cached_typ = self .typ(vslider.buf, index = islider.buf,
370+ name = name)
400371 else :
372+ object .__setattr__ (cached_typ._data._block, ' values' , vslider.buf)
373+ object .__setattr__ (cached_typ, ' _index' , islider.buf)
374+ object .__setattr__ (cached_typ, ' name' , name)
401375
402- # try with a numpy array directly
403- try :
404- res = self .f(SNDArray(vslider.buf,islider.buf,name = name))
405- needs_typ = 0
406- except (Exception ), detail:
407- res = self .f(typ(vslider.buf, index = islider.buf,
408- name = name, fastpath = True ))
409- needs_typ = 1
410-
411- try_typ = 1
412-
376+ res = self .f(cached_typ)
413377 res = _extract_result(res)
414378 if not initialized:
415379 result = self ._get_result_array(res)
0 commit comments