Skip to content

Instantly share code, notes, and snippets.

@BlueRayi
Created October 11, 2019 04:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BlueRayi/507960d7e6c7fa495408aac0b2298a2d to your computer and use it in GitHub Desktop.
Save BlueRayi/507960d7e6c7fa495408aac0b2298a2d to your computer and use it in GitHub Desktop.
Elo によるフィッティング
#!/usr/bin/env python
# coding: utf-8
# In[1]:
from pathlib import Path
# In[2]:
import pandas as pd
# In[3]:
class Player:
def __init__(self, rating=1500, rate_num=0):
self.rating = rating
self.rate_num = rate_num
def win_probability(self, rival):
return 1. / (10. ** ((rival.rating - self.rating) / 400.) + 1.)
def win(self, rival):
return random.random() < self.win_probability(rival)
@property
def K(self):
return 24 if self.rate_num >= 20 else 32
# In[4]:
def rate(winner, loser, drawn=False):
winner_result = 1. if not drawn else 0.5
loser_result = 0. if not drawn else 0.5
new_winner_rating = winner.rating + winner.K * (winner_result - winner.win_probability(loser))
new_loser_rating = loser.rating + loser.K * (loser_result - loser.win_probability(winner))
new_winner = Player(new_winner_rating, winner.rate_num + 1)
new_loser = Player(new_loser_rating, loser.rate_num + 1)
return new_winner,new_loser,
# In[5]:
players = {
'Emu': Player(),
'Parado': Player(),
'Niko': Player(),
'Taiga': Player(),
'Hiiro': Player(),
'Kiriya': Player(),
'Kuroto': Player(),
'Poppy': Player(),
}
# In[6]:
players_names = ['Emu', 'Parado', 'Niko', 'Taiga', 'Hiiro', 'Kiriya', 'Kuroto', 'Poppy']
# In[7]:
simulation_result_csv = Path('./simulation_result.csv')
result_df = pd.read_csv(simulation_result_csv)
result_df
# In[8]:
rating_rows = []
# In[9]:
rating_row = {}
for players_name in players_names:
rating_row[players_name] = players[players_name].rating
rating_rows.append(pd.Series(rating_row))
# In[10]:
for row_tuple in result_df.iterrows():
row = row_tuple[1]
for i in range(4):
winner_name = row[f'Match {i + 1} Winner']
loser_name = row[f'Match {i + 1} Loser']
winner = players[winner_name]
loser = players[loser_name]
new_winner,new_loser = rate(winner, loser)
players[winner_name] = new_winner
players[loser_name] = new_loser
rating_row = {}
for players_name in players_names:
rating_row[players_name] = players[players_name].rating
rating_rows.append(pd.Series(rating_row))
# In[11]:
rating_df = pd.DataFrame(rating_rows).reset_index()
rating_df
# In[12]:
elo_rating_csv = Path('./elo_rating.csv')
rating_df.to_csv(elo_rating_csv, index=False)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment