C15 : Exercices

C15.E1

Dans cet exercice, on travaillera avec le fichier csv donnant la population des communes des Haut-de-France en 2016, téléchargeable ici.

1) Écrire une fonction csv_to_listeDicos(nom_fichier: str)->dict qui prend un nom de fichier en paramètre et renvoie les données du fichier sous la forme d'une liste de dictionnaires.

2) Écrire une fonction listeDicos_to_listeAttributs(listeDicos: list)->list qui prend une liste de dictionnaires (correspondant à un fichier csv) en paramètre et renvoie la liste des attributs des données.

3) Écrire une fonction listeDicos_to_listeNomsSup50000(listeDicos:list)-list qui prend une liste de dictionnaires (correspondant à un fichier csv) en paramètre et renvoie la liste des noms des communes de plus de 50000 habitants.

Afficher la correction
import csv

def csv_to_listeDicos(url):
    liste = []
    with open(url, 'r', encoding='utf-8') as objFichier:
        objDatasCsv = csv.DictReader(objFichier, delimiter=';')
        for ligne in objDatasCsv:
            liste.append(dict(ligne))
    return liste

def listeDicos_to_listeAttributs(listeDicos:list)->list:
    return list(listeDicos[0].keys())

def listeDicos_to_listeNomsSup50000(listeDicos:list)->list:
    listeNomsSup50000 = []
    for dico in listeDicos:
        if int(dico['Population totale']) > 50000:
            listeNomsSup50000.append(dico['Nom de la commune'])
    return listeNomsSup50000

# ===== Programme principal =====
# Question 1
listeCommunes = csv_to_listeDicos('population-francaise-communes-2014.csv')

# Question 2
listeAttributs = listeDicos_to_listeAttributs(listeCommunes)
print(listeAttributs)

# Question 3
listeNomsSup50000 = listeDicos_to_listeNomsSup50000(listeCommunes)
print(listeNomsSup50000)

C15.E2

Dans cet exercice, on travaillera avec le fichier csv "Population millésimée - Communes de la MEL" téléchargeable ici depuis le site des Données ouvertes de la Métropole Européenne de Lille (ou ici sur ostralo.net).

1) Écrire une fonction csv_to_dico(nom_fichier: str) -> dict qui prend un nom de fichier csv en paramètre et renvoie les données du fichier sous la forme d'une liste de dictionnaires.

2) Écrire une fonction attributs(liste_dicos: list) -> list qui prend une liste de dictionnaires (correspondant à un fichier csv) en paramètre et renvoie la liste des attributs des données.

Compléter le programme principal pour afficher cette liste pour le fichier étudié.

3) On souhaite isoler les données d'une année ciblée (les années disponibles dans le fichier sont 2012, 2013, 2014, 2015 et 2016).

3.1. Écrire une fonction donnees_annee(liste_dicos, annee) qui prend une liste de dictionnaires et une année en paramètres, et renvoie les données simplifiées (sous la forme d'une liste de dictionnaires) en ne gardant que les attributs "Nom de la commune" et "Population totale" pour l'année de recensement passée en paramètre.

3.2. Écrire une fonction qui renvoie la liste des communes de plus de 50 000 habitants pour une année donnée.

4) On souhaite isoler les données concernant la population d'une commune ciblée pour l'ensemble des années disponibles.

Écrire une fonction evoluation_population(liste_dicos, nom_commune) -> dict qui renvoie un dictionnaire ayant les années 2012, 2013, 2014, 2015 et 2016 comme clés et la population de la commune passée en paramètre comme valeurs pour chacune de ces années.

Ainsi, pour la commune "Haubourdin" la fonction doit renvoyer le dictionnaire suivant : {2012:14623, 2013:14684, 2014: 14777, 2015: 14935, 2016:15054}

Afficher la correction
import csv

# Question 1
def creerListeCsv(url):
    liste = []
    with open(url, 'r', encoding='utf-8') as objFichier:
        objDatasCsv = csv.DictReader(objFichier, delimiter=';')
        for ligne in objDatasCsv:
            liste.append(dict(ligne))
    return liste

# Question 2
def liste_attributs(liste_dicos):
    return list(liste_dicos[0].keys())

#Question 3.1
def donnees_annee(liste_dicos, annee):
    liste = []
    for dico in liste_dicos:
        if int(dico['Année recensement']) == annee:
            dico_simplifie = {}
            dico_simplifie['Nom de la commune'] = dico['Nom de la commune']
            dico_simplifie['Population totale'] = dico['Population totale']
            liste.append(dico_simplifie)
    return liste

# Question 3.2
def liste_communes_50000(liste_dicos, annee):
    liste = []
    for dico in liste_dicos:
        if int(dico['Année recensement']) == annee and int(dico['Population totale']) > 50000:
            liste.append(dico['Nom de la commune'])
    return liste

# Question 4
def evoluation_population(liste_dicos, nom_commune) -> dict:
    dico_evolution = {}
    for dico in liste_dicos:
        if dico['Nom de la commune'] == nom_commune:
            annee = int(dico['Année recensement'])
            population = int(dico['Population totale'])
            dico_evolution[annee] = population
    return dico_evolution

# Programme principal
liste_communes = creerListeCsv('population-millesimee-communes-francaises.csv')
attributs = liste_attributs(liste_communes)
print(attributs)

liste_communes_population_2014 = donnees_annee(liste_communes, 2014)
print(liste_communes_population_2014)

liste_nom_50000 = liste_communes_50000(liste_communes, 2014)
print(liste_nom_50000)

dico_evolution = evoluation_population(liste_communes, "Haubourdin")
print(dico_evolution)

C15.E3

Dans cet exercice, on s'intéresse aux Pokémons.

pokémon

On dispose d'une base de données au format csv (en anglais, donc le séparateur est la virgule) de l'ensemble des Pokémons et de leurs caractéristiques.

1) Écrire la fonction qui permet d'extraire les données du fichier sous la forme d'une liste de dictionnaires.

2) Écrire une fonction qui renvoie la liste des attributs du fichier de données. Compléter le programme principal pour afficher cette liste.

3) Écrire une fonction qui renvoie la liste des noms des Pokémons dont l'attribut Attack est supérieur à une valeur passée en paramètre. Compléter le programme principal pour utiliser cette fonction avec une valeur donnée par l'utilisateur et afficher les éléments de la liste.

4) Écrire une fonction pour calculer et afficher la moyenne des points de vie (attribut HP) des Pokémons d'une génération (attribut Generation) passée en paramètre. Compléter le programme principal en utilisant cette fonction afin d'afficher les moyennes des points de vie des Pokémons pour chaque génération.

Afficher la correction
import csv

def creerListeCsv(url):
    liste = []
    with open(url, 'r', encoding='utf-8') as objFichier:
        objDatasCsv = csv.DictReader(objFichier, delimiter=',')
        for ligne in objDatasCsv:
            liste.append(dict(ligne))
    return liste

def liste_attributs(liste_dicos):
    return list(liste_dicos[0].keys())

def liste_attack_sup(liste_dicos, attack_min):
    liste_noms = []
    for pok in liste_dicos:
        if int(pok['Attack']) > attack_min:
            liste_noms.append(pok['Name'])
    return liste_noms

def moyenne(liste):
    somme = 0
    for val in liste:
        somme = somme + val
    moyenne = somme / len(liste)
    return moyenne

def hp_moy_gen(liste_dicos, generation):
    # Création de la liste des HP
    liste_hp = []
    for pok in liste_dicos:
        if int(pok['Generation']) == generation:
            liste_hp.append(int(pok['HP']))
    # Calcul de la moyenne des HP
    moy = moyenne(liste_hp)
    return moy

def hp_moy_gen_v2(liste_dicos, generation):
    somme = 0
    nb_pok = 0
    for pok in liste_dicos:
        if int(pok['Generation']) == generation:
            somme = somme + int(pok['HP'])
            nb_pok = nb_pok + 1
    moyenne = somme / nb_pok
    return moyenne

# ===== Programme principal =====
l_pok = creerListeCsv('pokemon.csv')
print(liste_attributs(l_pok))
print(liste_attack_sup(l_pok, 150))

print(hp_moy_gen_v2(l_pok,1))
print(hp_moy_gen_v2(l_pok,2))
print(hp_moy_gen_v2(l_pok,3))