Created
June 22, 2021 09:11
-
-
Save lspinheiro/ee4639ef2b029d02ed3f29fdb8db0ff5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def calc_glicko2_rank(df: pd.DataFrame, tau:float, rd_0:float, sigma_0:float = 0.06, date_freq:str = '180D') -> pd.DataFrame: | |
glicko_scorer = Glicko2(tau=tau) | |
fighter_set = set(df['fighter_slog'].unique().tolist() + df['opponent_slog'].unique().tolist()) | |
for fighter in fighter_set: | |
glicko_scorer.add_player(fighter, rd=rd_0, sigma=sigma_0) | |
for group_idx, (date_idx, date_group) in tqdm(enumerate(df.groupby([pd.Grouper(key='date', freq=date_freq)]))): | |
# pre-rating map | |
rating_map = {fname: glicko_scorer[fname].rating for fname in fighter_set} | |
df.loc[date_group.index, 'pre_glicko_f1'] = date_group['fighter_slog'].map(rating_map) | |
df.loc[date_group.index, 'pre_glicko_f2'] = date_group['opponent_slog'].map(rating_map) | |
rd_map = {fname: glicko_scorer[fname].rd for fname in fighter_set} | |
df.loc[date_group.index, 'pre_glicko_rd_f1'] = date_group['fighter_slog'].map(rd_map) | |
df.loc[date_group.index, 'pre_glicko_rd_f2'] = date_group['opponent_slog'].map(rd_map) | |
# Add fights from each fighter | |
for fs_row in date_group.itertuples(): | |
fighter = fs_row.fighter_slog | |
opponent = fs_row.opponent_slog | |
score = fs_row.win_method_score if fs_row.result != 'loss' else 0. | |
glicko_scorer[fighter].add_fight(opponent, score) | |
# Get updates for each fighter | |
new_ratings = {} | |
for fname in fighter_set: | |
if len(glicko_scorer[fname].fights) > 0: | |
new_ratings[fname] = glicko_scorer.update_ratings(fname) | |
else: | |
new_ratings[fname] = glicko_scorer.update_ratings_no_fights(fname) | |
# Apply updates and reset fights | |
for fname in fighter_set: | |
glicko_scorer[fname].reset_fights() | |
glicko_scorer[fname].update_params(*new_ratings[fname]) | |
return df |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment