我怎样才能使这段代码更加地道pandas?
How can I make this code into more idiomatic pandas?
有点宽泛的问题,但我不确定还有什么方法可以得到有关如何改进此代码的指示。
我有一个包含赔率和比赛结果的数据框,我想计算投资某个球队的支出。
我现在使用的代码可以工作,但我觉得它略过了 Pandas 仅依靠 apply
方法并放入 Python 即可完成的大部分工作。
数据框如下所示:
这是我的代码:
def compute_payout(odds, amount=1):
if odds < 0:
return amount/(-1.0 * odds/100.0)
elif odds > 0:
return amount/(100.0/odds)
def game_payout(row, team_name):
if row['home_team'] == team_name:
if row['home_score'] > row['away_score']:
return compute_payout(row['home_odds'])
else:
return -1
elif row['away_team'] == team_name:
if row['away_score'] > row['home_score']:
return compute_payout(row['away_odds'])
else:
return -1
payout = df.apply(lambda row: game_payout(row, team_name), axis=1)
非常感谢任何建议!
将 numpy.select
与 &
链接的条件用于 bitwise AND
和 ~
用于反转布尔掩码:
m11 = df['home_team'] == team_name
m21 = df['away_team'] == team_name
m12 = df['home_score'] > df['away_score']
m22 = df['home_score'] < df['away_score']
vals = [df['home_odds'].apply(compute_payout), -1, df['away_odds'].apply(compute_payout), -1]
payout = np.select([m11 & m12, m11 & ~m12, m21 & m22, m21 & ~m22], vals, default=np.nan)
有点宽泛的问题,但我不确定还有什么方法可以得到有关如何改进此代码的指示。
我有一个包含赔率和比赛结果的数据框,我想计算投资某个球队的支出。
我现在使用的代码可以工作,但我觉得它略过了 Pandas 仅依靠 apply
方法并放入 Python 即可完成的大部分工作。
数据框如下所示:
这是我的代码:
def compute_payout(odds, amount=1):
if odds < 0:
return amount/(-1.0 * odds/100.0)
elif odds > 0:
return amount/(100.0/odds)
def game_payout(row, team_name):
if row['home_team'] == team_name:
if row['home_score'] > row['away_score']:
return compute_payout(row['home_odds'])
else:
return -1
elif row['away_team'] == team_name:
if row['away_score'] > row['home_score']:
return compute_payout(row['away_odds'])
else:
return -1
payout = df.apply(lambda row: game_payout(row, team_name), axis=1)
非常感谢任何建议!
将 numpy.select
与 &
链接的条件用于 bitwise AND
和 ~
用于反转布尔掩码:
m11 = df['home_team'] == team_name
m21 = df['away_team'] == team_name
m12 = df['home_score'] > df['away_score']
m22 = df['home_score'] < df['away_score']
vals = [df['home_odds'].apply(compute_payout), -1, df['away_odds'].apply(compute_payout), -1]
payout = np.select([m11 & m12, m11 & ~m12, m21 & m22, m21 & ~m22], vals, default=np.nan)