所以我有一个数据框。我获取所有重要的数字列,并将它们存储在 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 类型。
请您参考如下方法:
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
