【发布时间】:2020-10-15 14:40:36
【问题描述】:
我有以下 .csv 文件:
Match_idx,Date,Player_1,Player_2,Player_1_wins
0,2020-01-01,p1,p2,1
1,2020-01-02,p2,p3,0
2,2020-01-03,p3,p1,1
3,2020-01-04,p4,p1,1
我想计算更多列以获得以下输出 .csv 文件:
Match_idx,Date,Player_1,Player_2,Player_1_wins,Player_1_winrate,Player_2_winrate,Player_1_matches,Player_2_matches,Head_to_head
0,2020-01-01,p1,p2,1,0,0,0,0,0,''
1,2020-01-02,p2,p3,0,0,0,1,0,0,''
2,2020-01-03,p3,p1,1,1,1,1,1,0,''
3,2020-01-04,p4,p1,1,0,1/2,0,2,0,''
4,2020-01-05,p1,p3,0,1/2,2/2,3,2,'0'
5,2020-01-06,p3,p1,1,1/3,3/3,4,3,'11'
每一列的语义:
-
Match_idx,Date,Player_1,Player_2:直截了当 -
Player_1_wins:Player_1赢了比赛吗? 1 : 0
这些列将被保留,我想添加这些:
-
Player_1_winrate: number_of_wins_for_player_1_before_this_one / number_of_matches_played_by_player_1_before_this_one -
Player_2_winrate: 与上面的 player_2 相同 -
Player_1_matches: number_of_matches_played_by_player_1_before_this_one -
Player_2_matches: 与上面的 player_2 相同 -
Head_to_head:Player_1和Player_2之间先前匹配的结果。编码为 {'0' 和 '1'} 的字符串,如果Player_1赢得比赛,则为 '1',否则为 '0'。
我做了什么
我正在使用 pandas 库来操作这个文件。我一直在考虑的幼稚方法如下:选择每场比赛,输或赢,由球员参加,并按日期排序。之后,对于胜率功能,将以下两个函数应用于一场比赛。
def get_matches_won_before_by_player(df: pd.DataFrame, player: str, before: str):
mask_player_won = (
((df['Player_1_wins'] == 1) & (df['Player_1'] == player)) |
((df['Player_1_wins'] == 0) & (df['Player_2'] == player))
)
req = df[(df['Date'] < before) & mask_player_won]
req.sort_values(by='Date', inplace=True)
return req
def get_matches_played_before_by_player(df: pd.DataFrame, player: str, before: str):
mask_player_played = (
(df['Player_1'] == player) |
(df['Player_2'] == player)
)
req = df[(df['Date'] < before) & mask_player_played]
req.sort_values(by='Date', inplace=True)
return req
我可以将该逻辑应用于每场比赛,但这将涉及为每场比赛运行这些函数,这是非常非常无效的。
我想做的事
如何仅使用给定比赛中每位球员的最后一场比赛有效地计算我的特征?例如,更新每个玩家的胜率可以通过以下逻辑来完成:
- 将每列初始化为 0。
- 更新胜率如下:(M/M+1) + (W/N+1),
M当前胜率,N当前比赛场数,W= 1 if玩家获胜,否则为 0。
非常感谢组织此类过程的任何帮助或想法。
【问题讨论】:
标签: python pandas performance