Skip to content

Commit 4880813

Browse files
committed
CLN: removed need for SNDArray ; simplied SeriesGroupber / SeriesBinGrouper
1 parent 02cc76b commit 4880813

File tree

2 files changed

+24
-75
lines changed

2 files changed

+24
-75
lines changed

pandas/core/array.py

-15
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,3 @@
3535

3636
NA = np.nan
3737

38-
# a series-like ndarray ####
39-
40-
41-
class SNDArray(Array):
42-
43-
def __new__(cls, data, index=None, name=None):
44-
data = data.view(SNDArray)
45-
data.index = index
46-
data.name = name
47-
48-
return data
49-
50-
@property
51-
def values(self):
52-
return self.view(Array)

pandas/src/reduce.pyx

+24-60
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from numpy cimport *
33
import numpy as np
44

5-
from pandas.core.array import SNDArray
65
from distutils.version import LooseVersion
76

87
is_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

Comments
 (0)