Объект серии Python TypeError не может интерпретироваться как целое число при запуске функции в фрейме данных

Я пытаюсь запустить этот код:

def fact(x):
    if x in [0, 1]:
        return 1
    r = 1
    for a in range(1, (x+1)):  
        r = r*a
    return r
 
def ch(a, b):
    return fact(a)/(fact(b)*fact(a-b))

def matchProb(pW, W, L, best_of):
    #pW is the probability of winning a set
    #W is the winner's set score (they won 1,2, 3 set etc)
    #L is the loser's set score
    #best_of is the total numner  of sets
    
    towin = (best_of + 1) / 2 #best of three is whoever wins two
    Wleft = towin - W
    remain = best_of - W - L 
    
    Wleft.where(Wleft == 0, 1)
    
    Wleft.where(Wleft > remain, 1)
       
    win = 0
    for i in range(Wleft, (remain+1)):
        add = ch((i-1), (Wleft-1))*(pW**(Wleft-1))*((1-pW)**(i-Wleft))*pW
        win += add
    return win
 

Когда я запускаю его, я получаю следующую ошибку

df1[test] = matchProb(.5*Richtennis['W_Skill'], Richtennis['Wset1'], Richtennis['Lset1'], Richtennis['best_of'])

Почему это происходит и как это исправить? Этого не происходит, когда я использую прямые значения matchProb(0.5, 1, 0, 3) это выводит 0,665

Wleft — объект серии pandas. Это не удается, потому что вы пытаетесь запустить что-то вроде: for i in range(pd.Series(...), 10)
James 18.04.2024 13:37
Почему в 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
1
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы работали с серией pandas и пытались обработать ее как целое число. Кроме того, вам необходимо убедиться, что у вас правильный тип dptype. Вот предложение по улучшенному и исправленному методу:

import numpy as np
import pandas as pd

def fact(x):
    x = x.astype(int)
    result = np.ones_like(x, dtype=float)  
    max_val = np.max(x)  
    factorials = np.ones(max_val+1, dtype=float)
    for i in range(2, max_val+1):
        factorials[i] = factorials[i-1] * i
    result = factorials[x]  
    return result


def ch(a, b):
    return fact(a) / (fact(b) * fact(a - b))

def matchProb(pW, W, L, best_of):
    towin = ((best_of + 1) // 2).astype(int)  
    Wleft = np.maximum(1, towin - W).astype(int)
    remain = (best_of - W - L).astype(int)
    
    win = np.zeros_like(pW, dtype=float)  
    for i in range(1, int(np.max(remain))+1):  
        win_contribution = ch(i+Wleft-1, Wleft-1) * (pW**Wleft) * ((1-pW)**(i-1))
        win += win_contribution
    return win


np.random.seed(42)  
data = {
    'W_Skill': np.random.uniform(0.5, 1.5, size=10),
    'Wset1': np.random.randint(0, 4, size=10),
    'Lset1': np.random.randint(0, 3, size=10),
    'best_of': np.random.choice([3, 5], size=10)
}

Richtennis = pd.DataFrame(data)
print(Richtennis)

Richtennis['test'] = Richtennis.apply(lambda row: matchProb(0.5 * row['W_Skill'], row['Wset1'], row['Lset1'], row['best_of']), axis=1)

Здесь я создал небольшой образец фрейма данных:

    W_Skill  Wset1  Lset1  best_of
0  0.874540      1      0        5
1  1.450714      0      0        5
2  1.231994      1      1        5
3  1.098658      3      1        5
4  0.656019      3      0        5
5  0.655995      1      0        3
6  0.558084      1      0        5
7  1.366176      1      2        5
8  1.101115      3      2        3
9  1.208073      3      2        5

Применение функции возвращает:

    W_Skill  Wset1  Lset1  best_of                test
0  0.874540      1      0        5  1.1177533239777162
1  1.450714      0      0        5  2.2258720975881996
2  1.231994      1      1        5  1.4198505830249353
3  1.098658      3      1        5  0.5493292420985183
4  0.656019      3      0        5  0.5484285262904508
5  0.655995      1      0        3  0.5484123176584215
6  0.558084      1      0        5  0.6319234059189444
7  1.366176      1      2        5   1.376840802623449
8  1.101115      3      2        3                 0.0
9  1.208073      3      2        5                 0.0

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