Применить функцию к датафрейму - PullRequest
0 голосов
/ 09 октября 2018

Итак, у меня есть датафрейм.Я выбираю все числовые столбцы, которые имеют значение, и они хранятся в bookies (который представляет собой список).

Затем я хочу применить критерий Келли (определенный ниже) к каждой из этих книг в отношении модели:

def kelly_criterion(bookie_odds, model):
    kelly = (((bookie_odds-1) * model ) - (1-model)) / (bookie_odds-1)
    return kelly

Вот как я пытаюсь его применить:

for bookie in bookies:
    df[bookie + "_kelly"] = df[bookie].apply(kelly_criterion(df[bookie],df["win"]))

Это ошибка, которую я получаю:

TypeError: 'Series' object is not callable

Все столбцыЯ использую, имеют тип float64.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

pd.Series.apply работает только с одним столбцом и передает значения.

pd.DataFrame.apply работает с несколькими столбцами и передает pd.Series объекты.

Вы по-прежнему можете использовать pd.Series.apply, если выпереопределите вашу функцию:

def kelly_criterion(model, bookie_odds):
    kelly = (((bookie_odds-1) * model ) - (1-model)) / (bookie_odds-1)
    return kelly

for bookie in bookies:
    df[f'{bookie}_kelly'] = df['win'].apply(kelly_criterion, bookie_odds=bookie)

Однако вы должны использовать векторизованные методы для использования каркаса Pandas:

for bookie in bookies:
    num = (df[bookie] - 1) * df['win'] - 1 + df['win']
    denum = df[bookie] - 1
    df[f'{bookie}_kelly'] = num / denum

Для полной векторизации:

kellies = [f'{bookie}_kelly' for bookie in bookies]

bookies_sub_1 = df[bookies] - 1
df[kellies] = (bookies_sub_1 * df['win'] - 1 + df['win']) / bookies_sub_1
0 голосов
/ 09 октября 2018

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

for bookie in bookies:
    df[bookie + "_kelly"] = kelly_criterion(df[bookie],df["win"])
...