File size: 2,514 Bytes
3082357
7c1667d
e8b47d4
 
 
7c1667d
 
 
e8b47d4
 
 
 
dd89a50
d5f3e47
 
 
077b9b1
 
d5f3e47
077b9b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a7460e5
 
077b9b1
 
 
 
 
 
a7460e5
dd89a50
b74ba04
79132a6
dd89a50
a7460e5
 
dd89a50
e8b47d4
 
79132a6
e8b47d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import pandas as pd

def update_elo_ratings(ratings_dict, winner, loser):
    # Check if the ratings_dict is empty
    if not ratings_dict:
        # Create a blank DataFrame with the required columns
        ratings_df = pd.DataFrame(columns=['bot_name', 'elo_rating', 'games_played'])
    else:
        # Convert the dictionary to a pandas DataFrame
        ratings_df = pd.DataFrame.from_dict(ratings_dict, orient='index')
        ratings_df.reset_index(inplace=True)
        ratings_df.columns = ['bot_name', 'elo_rating', 'games_played']

    # Check and add new players if they don't exist in the dataset
    for player in [winner, loser]:
        if player not in ratings_df['bot_name'].values:
            new_player = {'bot_name': player, 'elo_rating': 1200, 'games_played': 0}
            ratings_df = pd.concat([ratings_df, pd.DataFrame([new_player])], ignore_index=True)

    # Function to determine the K-factor based on games played
    def determine_k_factor(games_played):
        # Define K-factor based on number of games played. Adjust these thresholds as needed.
        if games_played < 30:
            return 40
        elif games_played < 100:
            return 20
        else:
            return 10

    # Update games played
    ratings_df.loc[ratings_df['bot_name'] == winner, 'games_played'] += 1
    ratings_df.loc[ratings_df['bot_name'] == loser, 'games_played'] += 1

    # Extract old ratings and games played
    winner_old_rating = ratings_df.loc[ratings_df['bot_name'] == winner, 'elo_rating'].iloc[0]
    loser_old_rating = ratings_df.loc[ratings_df['bot_name'] == loser, 'elo_rating'].iloc[0]
    winner_games_played = ratings_df.loc[ratings_df['bot_name'] == winner, 'games_played'].iloc[0]
    loser_games_played = ratings_df.loc[ratings_df['bot_name'] == loser, 'games_played'].iloc[0]

    # Determine K-factors
    winner_k_factor = determine_k_factor(winner_games_played)
    loser_k_factor = determine_k_factor(loser_games_played)

    # Calculate new ratings
    winner_new_rating, loser_new_rating = elo(winner_old_rating, loser_old_rating, k_factor_winner=winner_k_factor, k_factor_loser=loser_k_factor)

    # Update the DataFrame
    ratings_df.loc[ratings_df['bot_name'] == winner, 'elo_rating'] = winner_new_rating
    ratings_df.loc[ratings_df['bot_name'] == loser, 'elo_rating'] = loser_new_rating

    # Convert the DataFrame to a dictionary
    updated_ratings_dict = ratings_df.set_index('bot_name').to_dict(orient='index')

    return updated_ratings_dict