2015-10-26 3 views
2

У меня есть функция, которая отлично работает с отдельными значениями, но когда я использую ее с pandas series.apply(), она дает OverflowError.Ошибка OverFlow с Pandas series.apply

from __future__ import division 
import pandas as pd 
import numpy as np 

birthdays = pd.DataFrame(np.empty([365,2]), columns = ['k','probability'], index = range(1,366)) 
birthdays['k'] = birthdays.index 

Я делаю функцию:

def probability_of_shared_bday(k): 
    end_point = 366 - k 
    numerator = 1 
    for i in range(end_point, 366): 
     numerator = numerator*i 
    denominator = 365**k 
    probability_of_no_match = (1 - numerator/denominator) 
    return probability_of_no_match 

, когда я пытаюсь это с отдельными целыми числами, то он работает отлично:

probability_of_shared_bday(1) 

0,0

probability_of_shared_bday(100) 

0,9999996927510721

Но когда я пытаюсь использовать эту функцию применить:

birthdays['probability'] = birthdays['k'].apply(probability_of_shared_bday, convert_dtype=False) 

OverflowError: целое результат деления слишком велики для поплавка

Это происходит независимо от того, если convert_dtype является истинным или ложным.

Проверка birthdays['k'].dtypes я dtype('int64')

+0

Что такое 'дни рождения ['k']. Max()'? –

+0

дни рождения ['k']. Max() is 365 –

+0

Это интригующая проблема, но, честно говоря, вы должны просто переписать свою функцию, чтобы разделить ее на 365, когда вы идете внутри цикла. – IanS

ответ

1

Я не знаю, почему у вас есть эта проблема с apply, но вы не должны написать функцию, как вы сделали в первую очередь. Вот предложение, которое позволяет избежать деления двух огромных чисел друг на друга:

def probability_of_shared_bday(k): 
    end_point = 366 - k 
    ratio = 1 
    for i in range(end_point, 366): 
     ratio *= i/365 
    probability_of_no_match = (1 - ratio) 
    return probability_of_no_match 

И проблема уходит!

+0

Это лучший способ написать функцию, спасибо. Было бы неплохо узнать, почему панды это делают;) –