Skip to content

Instantly share code, notes, and snippets.

@lspinheiro
Created June 22, 2021 09:11
Show Gist options
  • Save lspinheiro/ee4639ef2b029d02ed3f29fdb8db0ff5 to your computer and use it in GitHub Desktop.
Save lspinheiro/ee4639ef2b029d02ed3f29fdb8db0ff5 to your computer and use it in GitHub Desktop.
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