Неожиданное переполнение 32-разрядного целого числа в pandas / numpy int64 (python 3.6)
позвольте мне начать с примера кода:
import numpy
from pandas import DataFrame
a = DataFrame({"nums": [2233, -23160, -43608]})
a.nums = numpy.int64(a.nums)
print(a.nums ** 2)
print((a.nums ** 2).sum())
на моей локальной машине и машинах других разработчиков это работает так, как ожидалось, и печатает:
0 4986289
1 536385600
2 1901657664
Name: nums, dtype: int64
2443029553
однако, на нашем производственном сервере, мы получаем:
0 4986289
1 536385600
2 1901657664
Name: nums, dtype: int64
-1851937743
который является 32-битным целочисленным переполнением, несмотря на то, что он является int64.
производственный сервер использует те же версии python, numpy, pandas и т. д. Это 64-bit Windows Server 2012
OS и все отчеты 64-бит (например,python --version
, sys.maxsize
, plastform.architecture
).
что может быть причиной этого?
1 ответов
Это ошибка в блоке bottleneck
библиотека, которую панды используют, если она установлена. В некоторых случаях,bottleneck.nansum
неправильно имеет 32-битное переполнение при вызове 64-битного ввода.
Я считаю, что это из-за bottleneck
используя PyInt_FromLong
, даже если long
32-битные. Я не уверен, почему это вообще компилируется. Есть отчет о проблеме на узкое место проблема tracker, еще не исправлено, а также отчет о проблеме на вопрос панды следопыт!--9-->, где они пытались компенсировать проблему узкого места (но я думаю, что они отключили узкое место, когда оно работает, а не когда оно не работает).