File size: 3,282 Bytes
3082357
7c1667d
b27fe1c
 
e8b47d4
 
 
7c1667d
 
 
e8b47d4
 
 
 
dd89a50
d5f3e47
 
 
077b9b1
 
d5f3e47
077b9b1
 
 
 
 
 
 
 
 
b27fe1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import pandas as pd

import math

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
    def elo(winner_rating, loser_rating, k_factor_winner=32, k_factor_loser=32):
        # Calculate the expected scores for each player
        winner_expected = 1 / (1 + 10 ** ((loser_rating - winner_rating) / 400))
        loser_expected = 1 / (1 + 10 ** ((winner_rating - loser_rating) / 400))

        # Calculate the new ratings for each player
        winner_new_rating = winner_rating + k_factor_winner * (1 - winner_expected)
        loser_new_rating = loser_rating + k_factor_loser * (0 - loser_expected)

        return winner_new_rating, loser_new_rating

    # ...

    # 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 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