<jupyter_start><jupyter_text>Récupération des données<jupyter_code>import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd
import time

df = pd.read_csv('/content/drive/MyDrive/horsesData.csv')

data = df[['raceId', 'horse_genyId','horse_name','results_position']]
data<jupyter_output>/usr/local/lib/python3.7/dist-packages/IPython/core/interactiveshell.py:2718: DtypeWarning: Columns (31,32,47,48,57,58) have mixed types.Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)<jupyter_text>Création tableau des classements elo<jupyter_code>classement = pd.DataFrame(columns = ['id', 'nom', 'elo']).set_index('id', drop=False)
classement<jupyter_output><empty_output><jupyter_text>Code classement elo<jupyter_code>########## FONCTION ########## Code modification elo #########

def new_elo(anciens_elo, resultats):
    """
    Calcule la liste des nouveaux elos
    Args :
      anciens_elo -- liste de float
      resultats -- liste de float, contenant des nan (et rien d'autre)
    """
    K = 24   #Paramètre pour le calcul
    nb_partants = len(anciens_elo)  
    nb_arrivees = np.count_nonzero(~np.isnan(resultats))
    
    #Un pti mot pour dire ce qu'est R ?
    R = 10**(anciens_elo/400)
    Rtot = np.sum(R)

    E = R/(R+(1/(nb_partants-1))*(Rtot-R))

    S = np.array([(nb_arrivees-position+1)/nb_arrivees if not np.isnan(position) else 0 for position in resultats])
    
    new_elo_tot = K*np.sum(S-E)
    nvx_elo = anciens_elo + K*(S-E) - new_elo_tot/nb_partants
    
    return nvx_elo
def maj(classement, ids, elos):
    for indice, id in enumerate(ids):
      classement.at[id, 'elo'] = elos[indice]
pd.set_option('display.max_columns', None)<jupyter_output><empty_output><jupyter_text>Dans un premier temps, nous initialisons l'elo de tous les chevaux qui ne sont pas dans la database classement.<jupyter_code>tmps1=time.clock()
ELO_INITIAL = 1500

#On travaille d'abord sur des numpy arrays (plus rapide et plus léger)
index_absents = ~data['horse_genyId'].isin(classement['id']).values  
absents = data[['horse_genyId','horse_name']][index_absents].values
liste_elo = np.broadcast_to(ELO_INITIAL, (len(absents), 1))  #on crée une liste de la bonne taille avec les élos initiaux
nvx_chevaux_data = np.concatenate((absents, liste_elo), axis=1)  #on crée la "base" du dataframe : colonnes = id, nom, elo


#Actualisation du dataframe de référence
df2 = pd.DataFrame(nvx_chevaux_data, columns = ['id', 'nom', 'elo'])
classement = classement.append(df2, ignore_index=True).set_index('id', drop=False)

classement.drop_duplicates(inplace=True, subset=['id'])  #On a ajouté les chevaux à chaque fois qu'ils apparaissaient dans le fichier course 
                                                          #et qu'ils n'étaient pas dans le classement. Mais ils peuvent courir plusieurs fois

#Parcours successif des courses pour calculer les nouveaux elos 
g = data.groupby('raceId')

for _, race_data in g:
    #On récupère dans un df toutes les données dont on a besoin avec une jointure à gauche (tous les chevaux de la course observée)
    infos_course = pd.merge(race_data, classement, how='inner', left_on='horse_genyId', right_index=True)

    nouveaux_elos = new_elo(infos_course['elo'].values, infos_course['results_position'].values)
    maj(classement, infos_course['horse_genyId'].values, nouveaux_elos)

print(classement)
tmps2=time.clock()
print(tmps2-tmps1)<jupyter_output>/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:1: DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
  """Entry point for launching an IPython kernel.
{'fraction_non_alphanumeric': 0.1187933796049119, 'fraction_numerical': 0.012813667912439935, 'mean_word_length': 4.809302325581395, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '454834', 'license': 'MIT', 'n_tokens_mistral': 1374, 'n_tokens_neox': 1340, 'n_words': 326, 'path': 'notebooks/elo/database_elo.ipynb', 'repo_name': 'benjamrio/horse-races-ML', 'size': '3746'}