Возможная ошибка панд?

Просто смотрю на какое-то странное поведение в Python/Pandas.

Я знаю, что установка запутанная, я выполнял некоторые... задачи.

def lucas_n(n):
    '''Return the fist n lucas numbers modulo 1_000_007'''
    my_list = [1,3]
    while len(my_list) < n:
        my_list.append((my_list[-1]+my_list[-2])%1_000_007)
    return my_list

def f(seq):
    '''Look up https://projecteuler.net/problem=739'''
    
    df = pd.Series(seq)
    
    for i in range(len(seq)-1):
        df = df.iloc[1:].cumsum()
        
    return df.iloc[0]

x = lucas_n(1e4)

f(x)

>>> -8402283173942682253

Короче говоря, x — это последовательность положительных целых чисел, а f применяет последовательные .iloc[1:].cumsum() операции.

И результат отрицательный...

Это ошибка? Проблема с типом данных?

Похоже на целочисленное переполнение или что-то в этом роде, потому что с 1e3 в качестве параметра все работает как задумано.

NotAName 24.12.2020 01:21
mortada.net/can-integer-operations-overflow-in-python.html. В самом Python целые числа не могут переполняться, но поскольку pandas/numpy используют C в качестве серверной части, переполнение для этих пакетов реально.
NotAName 24.12.2020 01:22

ЭТО похоже, что он может перетекать между x = lucas_n(1e4)[0:4442] и x = lucas_n(1e4)[0:4443]

David Erickson 24.12.2020 01:24

Спасибо - в сочетании я рад признать, что в базовом бэкэнде C было переполнение. Если вы сформулируете это как ответ, я приму это.

Myccha 24.12.2020 01:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, у вас целочисленное переполнение. В самом Python целые числа могут иметь произвольную точность, но поскольку pandas/numpy по умолчанию используют типы данных C, может произойти переполнение:

введите здесь описание ссылки

Чтобы решить эту проблему, вы можете вручную преобразовать данные в целые числа Python:

def f(seq):
    '''Look up https://projecteuler.net/problem=739'''
    
    df = pd.Series(seq).astype('int') # Casting to Python integer type
    
    for i in range(len(seq)-1):
        df = df.iloc[1:].cumsum()
        
    return df.iloc[0]

Это решает проблему переполнения в моем тестировании.

Другие вопросы по теме