Skip to content

Commit 2d028a4

Browse files
committed
BUG: don't let np.prod overflow int64
1 parent 825bb0c commit 2d028a4

File tree

3 files changed

+10
-11
lines changed

3 files changed

+10
-11
lines changed

pandas/core/common.py

+6
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,13 @@ def banner(message):
845845
bar = '=' * 80
846846
return '%s\n%s\n%s' % (bar, message, bar)
847847

848+
def _long_prod(vals):
849+
result = 1L
850+
for x in vals:
851+
result *= x
852+
return result
848853

854+
849855
class groupby(dict):
850856
"""
851857
A simple groupby different from the one in itertools.

pandas/core/groupby.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2242,7 +2242,7 @@ def _indexer_from_factorized(labels, shape, compress=True):
22422242
max_group = len(obs_ids)
22432243
else:
22442244
comp_ids = group_index
2245-
max_group = np.prod(shape)
2245+
max_group = com._long_prod(shape)
22462246

22472247
if max_group > 1e6:
22482248
# Use mergesort to avoid memory errors in counting sort

pandas/core/reshape.py

+3-10
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ def _unstack_frame(obj, level):
402402

403403
def get_compressed_ids(labels, sizes):
404404
# no overflow
405-
if _long_prod(sizes) < 2 ** 63:
405+
if com._long_prod(sizes) < 2 ** 63:
406406
group_index = get_group_index(labels, sizes)
407407
comp_index, obs_ids = _compress_group_index(group_index)
408408
else:
@@ -411,9 +411,9 @@ def get_compressed_ids(labels, sizes):
411411
for v in labels:
412412
mask |= v < 0
413413

414-
while _long_prod(sizes) >= 2 ** 63:
414+
while com._long_prod(sizes) >= 2 ** 63:
415415
i = len(sizes)
416-
while _long_prod(sizes[:i]) >= 2 ** 63:
416+
while com._long_prod(sizes[:i]) >= 2 ** 63:
417417
i -= 1
418418

419419
rem_index, rem_ids = get_compressed_ids(labels[:i],
@@ -426,13 +426,6 @@ def get_compressed_ids(labels, sizes):
426426
return comp_index, obs_ids
427427

428428

429-
def _long_prod(vals):
430-
result = 1L
431-
for x in vals:
432-
result *= x
433-
return result
434-
435-
436429
def stack(frame, level=-1, dropna=True):
437430
"""
438431
Convert DataFrame to Series with multi-level Index. Columns become the

0 commit comments

Comments
 (0)