2
2
from numpy cimport *
3
3
import numpy as np
4
4
5
- from pandas.core.array import SNDArray
6
5
from distutils.version import LooseVersion
7
6
8
7
is_numpy_prior_1_6_2 = LooseVersion(np.__version__) < ' 1.6.2'
@@ -114,8 +113,8 @@ cdef class Reducer:
114
113
115
114
# use the cached_typ if possible
116
115
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)
119
118
res = self .f(cached_typ)
120
119
else :
121
120
res = self .f(chunk)
@@ -164,7 +163,7 @@ cdef class SeriesBinGrouper:
164
163
bint passed_dummy
165
164
166
165
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
168
167
169
168
def __init__ (self , object series , object f , object bins , object dummy ):
170
169
n = len (series)
@@ -178,7 +177,6 @@ cdef class SeriesBinGrouper:
178
177
self .arr = values
179
178
self .index = series.index
180
179
self .typ = type (series)
181
- self .ityp = type (series.index)
182
180
self .name = getattr (series,' name' ,None )
183
181
184
182
self .dummy_arr, self .dummy_index = self ._check_dummy(dummy)
@@ -210,9 +208,10 @@ cdef class SeriesBinGrouper:
210
208
ndarray[int64_t] counts
211
209
Py_ssize_t i, n, group_size
212
210
object res
213
- bint initialized = 0 , needs_typ = 1 , try_typ = 0
211
+ bint initialized = 0
214
212
Slider vslider, islider
215
- object gin, typ, ityp, name
213
+ object gin, typ, name
214
+ object cached_typ = None
216
215
217
216
counts = np.zeros(self .ngroups, dtype = np.int64)
218
217
@@ -226,45 +225,29 @@ cdef class SeriesBinGrouper:
226
225
227
226
group_size = 0
228
227
n = len (self .arr)
229
- typ = self .typ
230
- ityp = self .ityp
231
228
name = self .name
232
229
233
230
vslider = Slider(self .arr, self .dummy_arr)
234
231
islider = Slider(self .index, self .dummy_index)
235
232
236
233
gin = self .dummy_index._engine
237
234
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
-
243
235
try :
244
236
for i in range (self .ngroups):
245
237
group_size = counts[i]
246
238
247
239
islider.set_length(group_size)
248
240
vslider.set_length(group_size)
249
241
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)
257
245
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)
267
249
250
+ res = self .f(cached_typ)
268
251
res = _extract_result(res)
269
252
if not initialized:
270
253
result = self ._get_result_array(res)
@@ -309,7 +292,7 @@ cdef class SeriesGrouper:
309
292
bint passed_dummy
310
293
311
294
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
313
296
314
297
def __init__ (self , object series , object f , object labels ,
315
298
Py_ssize_t ngroups , object dummy ):
@@ -324,7 +307,6 @@ cdef class SeriesGrouper:
324
307
self .arr = values
325
308
self .index = series.index
326
309
self .typ = type (series)
327
- self .ityp = type (series.index)
328
310
self .name = getattr (series,' name' ,None )
329
311
330
312
self .dummy_arr, self .dummy_index = self ._check_dummy(dummy)
@@ -351,28 +333,22 @@ cdef class SeriesGrouper:
351
333
ndarray[int64_t] labels, counts
352
334
Py_ssize_t i, n, group_size, lab
353
335
object res
354
- bint initialized = 0 , needs_typ = 1 , try_typ = 0
336
+ bint initialized = 0
355
337
Slider vslider, islider
356
- object gin, typ, ityp, name
338
+ object gin, typ, name
339
+ object cached_typ = None
357
340
358
341
labels = self .labels
359
342
counts = np.zeros(self .ngroups, dtype = np.int64)
360
343
group_size = 0
361
344
n = len (self .arr)
362
- typ = self .typ
363
- ityp = self .ityp
364
345
name = self .name
365
346
366
347
vslider = Slider(self .arr, self .dummy_arr)
367
348
islider = Slider(self .index, self .dummy_index)
368
349
369
350
gin = self .dummy_index._engine
370
351
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
-
376
352
try :
377
353
for i in range (n):
378
354
group_size += 1
@@ -389,27 +365,15 @@ cdef class SeriesGrouper:
389
365
islider.set_length(group_size)
390
366
vslider.set_length(group_size)
391
367
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)
400
371
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)
401
375
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)
413
377
res = _extract_result(res)
414
378
if not initialized:
415
379
result = self ._get_result_array(res)
0 commit comments