Неожиданным 32-битное целочисленное переполнение в панды/numpy строки типа int64 (питон 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
ОС и все отчеты 64-битные (напр.python --version
, sys.maxsize
, plastform.architecture
).
Что может быть причиной вот это?
1 ответ:
Это ошибка в библиотеке
bottleneck
, которую использует Pandas, если она установлена. В некоторых случаяхbottleneck.nansum
неправильно имеет 32-разрядное поведение переполнения при вызове на 64-разрядном входе.Я считаю, что это связано с
bottleneck
использованиеPyInt_FromLong
Даже еслиlong
является 32-разрядным. Я даже не знаю, почему это вообще компилируется. Есть отчет о проблеме на bottleneck issue tracker , еще не исправленный, а также отчет о проблеме на Pandas issue tracker , где они пытались компенсировать для Проблемы Bottleneck (но я думаю, что они отключили Bottleneck, когда он работает, а не когда он не работает).