Sur le site du CIO, on peut trouver le fichier au format CSV : athlete_events.csv. Ce fichier contient des informations sur tous les participants aux épreuves olympiques des « temps modernes », depuis 1896. La semaine de l'Olympisme est l'occasion de découvrir le format csv ; c'est la partie « Manipulation de données en tables » du programme.
Comma-separated values, connu sous le sigle CSV, est un format texte ouvert représentant des données tabulaires sous forme de valeurs séparées par des virgules ou des point-virgule. Un fichier CSV est un fichier texte), par opposition aux formats dits « binaires ». Chaque ligne du texte correspond à une ligne d'un tableau et les virgules correspondent aux séparations entre les colonnes. Les portions de texte séparées par une virgule correspondent ainsi aux contenus des cellules d'un tableau. Une ligne est une suite ordonnée de caractères terminée par un caractère de fin de ligne (line break – LF ou CRLF)).
"""
Données en table
Semaine de l'Olympisme : Liste des participants depuis la création des
jeux olympiques.
Champs et types du fichier csv (dans l'ordre):
ID : int, Name : str, Sex : str, Age : int, Height : int, Weight : int,
Team : str, NOC : str, Games : str, Year : int, Season : str, City : str,
Sport : str, Event : str, Medal : str
"""
recuperation_lignes_fichier
dont la spécification est :
def recuperation_lignes_fichier(nom_fichier):
""" str -> List[str]
Ouvre le fichier nom_fichier et récupère les informations.
Chaque ligne du fichier est une chaîne de caractères et constitue
un élément de la liste retournée.
"""
main
(ne pas oublier de télécharger le fichier
athlete_events.csv).
readlines
permet de récupérer toutes les lignes d'un fichier au sein d'une liste.
open
permet de créer un objet de type fichier.
def recuperation_lignes_fichier(nom_fichier):
""" str -> List[str]
Ouvre le fichier nom_fichier et récupère les informations.
Chaque ligne du fichier est une chaîne de caractères et constitue
un élément de la liste retournée.
"""
fichier = open(nom_fichier, 'r')
res = fichier.readlines()
fichier.close()
return res
def main():
""" Fonction principale """
nom_fichier = "athlete_events.csv"
lignes_fichier = recuperation_lignes_fichier(nom_fichier)
# print(lignes_fichier)
main()
traitement_lignes
dont la spécification est :
def traitement_lignes(lignes):
""" List[str] -> List[List[str]]
Suppression de la première ligne qui est uniquement constituée des
champ puis, pour chaque élément de la liste lignes, suppression du
caractère de fin de ligne. Pour finir, découpage de la chaîne de
caractères de façon à ce que chaque champ constitue l'élément d'une liste.
La liste retournée est donc constituée d'autant de sous listes qu'il y
a d'éléments dans la liste lignes.
"""
main
.
strip
d'une chaîne de caractères permet de supprimer les caractères de fin de ligne.split
d'une chaîne de caractères permet de la découper et de former une liste de chaînes
de caractères.
def traitement_lignes(lignes):
""" List[str] -> List[List[str]]
Suppression de la première ligne qui est uniquement constituée des
champ puis, pour chaque élément de la liste lignes, suppression du
caractère de fin de ligne. Pour finir, découpage de la chaîne de
caractères de façon à ce que chaque champ constitue l'élément d'une liste.
La liste retournée est donc constituée d'autant de sous listes qu'il y
a d'éléments dans la liste lignes.
"""
res = []
for ligne in lignes[1:]:
ligne = ligne.strip()
liste_ligne = ligne.split(";")
res.append(liste_ligne)
return res
def main():
""" Fonction principale """
nom_fichier = "athlete_events.csv"
lignes_fichier = recuperation_lignes_fichier(nom_fichier)
# print(lignes_fichier)
liste_elts_lignes = traitement_lignes(lignes_fichier)
#print(liste_elts_lignes)
main()
vers_nbre
dont la spécification est :
def vers_nbre(nbre_chaine):
""" str -> float
Reçoit une chaîne de caractères représentant un entier ou la chaîne de
caractères 'NA'.
Dans le premier cas retourne l'entier correspondant ('12' devient 12),
dans le second retourne -1.
"""
def vers_nbre(nbre_chaine):
""" str -> float
Reçoit une chaîne de caractères représentant un entier ou la chaîne de
caractères NA.
Dans le premier cas retourne l'entier correspondant ('12' devient 12),
dans le second retourne -1.
"""
if nbre_chaine != 'NA':
return float(nbre_chaine)
else:
return -1
dict_olympiades
dont la spécification est :
def dict_olympiades(liste_olympiades):
""" List[List[str]] -> List[Dict]
À partir de la liste de listes contenant les informations sur une Olympiade
construit une liste dont chaque élément est un dictionnaire.
Les clés de ce dictionnaire sont les noms des champs dans le fichier, les
valeurs sont recherchées dans chaque sous-liste.
REMARQUE : dict_olympiades doit appeler vers_nbre.
"""
Le code est fastidieux à écrire !
def dict_olympiades(liste_olympiades):
""" List[List[str]] -> List[Dict]
À partir de la liste de listes contenant les informations sur une Olympiade
construit une liste dont chaque élément est un dictionnaire.
Les clés de ce dictionnaires sont les noms des champs dans le fichier, les
valeurs sont recherchées dans chaque sous-liste.
Les valeurs du dictionnaire sont typées, un champ NA pour une valeur
numérique est transformée en -1.
"""
res = []
for olympiade in liste_olympiades:
dict_olympiade = {}
for i in range(len(olympiade)):
dict_olympiade['ID'] = vers_nbre(olympiade[0])
dict_olympiade['Name'] = olympiade[1]
dict_olympiade['Sex'] = olympiade[2]
dict_olympiade['Age'] = vers_nbre(olympiade[3])
dict_olympiade['Height'] = vers_nbre(olympiade[4])
dict_olympiade['Weight'] = vers_nbre(olympiade[5])
dict_olympiade['Team'] = olympiade[6]
dict_olympiade['NOC'] = olympiade[7]
dict_olympiade['Games'] = olympiade[8]
dict_olympiade['Year'] = vers_nbre(olympiade[9])
dict_olympiade['Season'] = olympiade[10]
dict_olympiade['City'] = olympiade[11]
dict_olympiade['Sport'] = olympiade[12]
dict_olympiade['Event'] = olympiade[13]
dict_olympiade['Medal'] = olympiade[14]
res.append(dict_olympiade)
return res
main
.
def main():
""" Fonction principale """
nom_fichier = "athlete_events.csv"
lignes_fichier = recuperation_lignes_fichier(nom_fichier)
# print(lignes_fichier)
liste_elts_lignes = traitement_lignes(lignes_fichier)
#print(liste_elts_lignes)
liste_dict_olympiades = dict_olympiades(liste_elts_lignes)
#print(liste_dict_olympiades)
main()
athletes_par_olympiade
dont la spécification est :
def athletes_par_olympiade(list_dict_olympiades):
""" List[Dict] -> Dict[int, int]
Détermine le nombre d'athlètes pour chaque olympiade d'été.
Retourne un dictionnaire dont les clés sont les années et les valeurs
le nombre d'athlètes.
"""
def athletes_par_olympiade(list_dict_olympiades):
""" List[Dict] -> Dict[int, int]
Détermine le nombre d'athlètes pour chaque olympiade en été.
Retourne un dictionnaire dont les clés sont les années et les valeurs
le nombre d'athlètes.
"""
res = {}
for olympiade in list_dict_olympiades:
if olympiade['Season'] == "Summer":
if olympiade['Year'] not in res.keys():
res[olympiade['Year']] = 1
else:
res[olympiade['Year']] = res[olympiade['Year']] + 1
return res
main
.
def main():
""" Fonction principale """
nom_fichier = "athlete_events.csv"
lignes_fichier = recuperation_lignes_fichier(nom_fichier)
# print(lignes_fichier)
liste_elts_lignes = traitement_lignes(lignes_fichier)
#print(liste_elts_lignes)
liste_dict_olympiades = dict_olympiades(liste_elts_lignes)
#print(liste_dict_olympiades)
nbre_athletes_par_olympiade = athletes_par_olympiade(liste_dict_olympiades)
#print(nbre_athletes_par_olympiade)
main()
construit_listes_xy
dont la spécification est :
def construit_listes_xy(dict_xy):
""" Dict[float, float] -> Tuple(List[float], List[float])
Détermine les listes de couples (x, y) pour le tracer final où
x et y sont des listes (le ième élément de x correspond au ième
élément de y).
"""
def construit_listes_xy(dict_xy):
""" Dict[float, float] -> Tuple(List[float], List[float])
Détermine les listes de couples (x, y) pour le tracer final où
x et y sont des listes (le ième élément de x correspond au ième
élément de y).
"""
x = []
y = []
for cle in dict_xy.keys():
x.append(cle)
y.append(dict_xy[cle])
return (x, y)
def affichage(x, y, titre):
""" List[float] x List[float] x str -> None
Trace y(x).
"""
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y)
ax.set_title(titre)
plt.show()
Ce code nécessite d'écrire au début du fichier les instructions suivantes :
import matplotlib.pyplot as plt
from matplotlib import style
style.use('seaborn')
affichage
depuis la fonction main
.
def main():
""" Fonction principale """
nom_fichier = "athlete_events.csv"
lignes_fichier = recuperation_lignes_fichier(nom_fichier)
# print(lignes_fichier)
liste_elts_lignes = traitement_lignes(lignes_fichier)
#print(liste_elts_lignes)
liste_dict_olympiades = dict_olympiades(liste_elts_lignes)
#print(liste_dict_olympiades)
nbre_athletes_par_olympiade = athletes_par_olympiade(liste_dict_olympiades)
#print(nbre_athletes_par_olympiade)
annees, athletes = construit_listes_xy(nbre_athletes_par_olympiade)
affichage(annees, athletes, "Nombre d'athlètes par olympiade d'été")
main()
feminines_par_olympiade
dont la spécification est :
def feminines_par_olympiade(list_dict_olympiades):
""" List[Dict] -> Dict[int, int]
Détermine le nombre de feminines pour chaque Olympiade d'été.
Retourne un dictionnaire dont les clés sont les années et les valeurs
le nombre d'athlètes féminines.
"""
def feminines_par_olympiade(list_dict_olympiades):
""" List[Dict] -> Dict[int, int]
Détermine le nombre de feminines pour chaque olympiade d'été.
Retourne un dictionnaire dont les clés sont les années et les valeurs
le nombre d'athlètes féminines.
"""
res = {}
for olympiade in list_dict_olympiades:
if olympiade['Season'] == "Summer" and olympiade['Sex'] == "F":
if olympiade['Year'] not in res.keys():
res[olympiade['Year']] = 1
else:
res[olympiade['Year']] = res[olympiade['Year']] + 1
return res
main
.