gpt4 book ai didi

python - 使用 pandas 高效计算时间特征

转载 作者:行者123 更新时间:2023-12-05 06:59:35 25 4
gpt4 key购买 nike

我有以下 .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_idxDatePlayer_1Player_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_1Player_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

我可以将该逻辑应用于每场比赛,但这将涉及为每场比赛运行这些函数,这是非常非常低效的。

我想做什么

如何仅使用给定比赛中每个球员的最后一场比赛来有效地计算我的特征?例如,可以使用以下逻辑更新每个玩家的胜率:

  1. 将每一列初始化为 0。
  2. 更新赢率如下:(M/M+1) + (W/N+1),M当前赢率,N当前数字比赛的比赛次数,如果玩家赢了,W = 1,否则为 0。

非常感谢组织此类流程的任何帮助或想法。

最佳答案

我尝试对系列进行操作,以便解决方案快速运行。我会在代码中通过注释来解释。

# to return head to head
strp1gw = ""
def get_head_to_head(s):
global strp1gw
strp1gw +=str(s)
return strp1gw

(
df = df
.assign(
# this is player 1 all wins before but to avoid creating extra columns I named it as Player_1_winrate to replace it with rate as you dont need cumulative sum of wins
Player_1_winrate = lambda x: x['Player_1_wins'].cumsum(),
# if player 1 played?
Player_1_matches = lambda x: np.where((x['Player_1'] =='p1') | (x['Player_2'] == 'p1'),1,0)
)
# this is number of matches played by player 1 before this one
.assign(Player_1_matches = lambda x: x['Player_1_matches'].cumsum())
# the player 1 winrate
.assign(Player_1_winrate = lambda x: x['Player_1_winrate']/x['Player_1_matches'])
# same for player 2 but you didnt mention how to compute Player_2_wins
.assign(
Player_2_winrate = lambda x: x['Player_2_wins'].cumsum(),
Player_2_matches = lambda x: np.where((x['Player_1'] =='p2') | (x['Player_2'] == 'p2'),1,0)
)
.assign(Player_2_matches = lambda x: x['Player_2_matches'].cumsum())
.assign(Player_2_winrate = lambda x: x['Player_2_winrate']/x['Player_2_matches'])
# to apply function to get head to head value
.assign(Head_to_head=lambda x: x['Player_1_wins'].apply(lambda s: get_head_to_head(s)))
)

关于python - 使用 pandas 高效计算时间特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64374062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com