Partie D3 · exercices 23 à 32

Traiter une table avec Python

Lire un fichier CSV, compter, filtrer, croiser deux tables : le tableur ne fait pas tout

Un tableur est pratique pour explorer. Mais pour répéter un traitement, traiter un très gros fichier ou croiser des tables, un programme est plus sûr et plus rapide. Dans cette partie, tu vas refaire en Python une partie de D2, puis aller plus loin.

Avant de commencer

Mets dans un même dossier ton programme .py et les fichiers 2023_Pyramide.csv, Securite_routiere2.csv (dans Donnees.zip) et Eleves2022.csv (donné en classe). Chaque exercice est un fichier NOM_Prenom_ex05.py. Tu auras besoin des boucles, des conditions et des fonctions du cours Python.

CoursLire un fichier dans un programme

Un fichier CSV est du texte : Python le lit ligne par ligne. Chaque ligne est un texte, qu'on découpe avec .split(";") pour obtenir ses colonnes. On range tout dans une liste de listes : la table.

lire_table.py
def lire_table(nom):
    """Lit un fichier CSV et renvoie la table : une liste de lignes,
    chaque ligne étant une liste de textes (un texte par colonne)."""
    table = []
    with open(nom, encoding="cp1252") as fichier:
        for ligne in fichier:
            table.append(ligne.strip().split(";"))
    return table
essai.py
table = lire_table("2023_Pyramide.csv")
print(len(table))
print(table[1])
print(table[2])
console
108
['Année de naissance', 'Âge révolu', "Nombre d'hommes", 'Nombre de femmes']
['2022', '0', '345538', '330929']

Attention

Dans la liste, tout est du texte : '345538' n'est pas le nombre 345538. Pour calculer, il faut convertir avec int(...) (nombre entier). Et les indices commencent à 0 : la colonne « Nombre d'hommes » est ligne[2].

CoursBoîte à outils

BesoinEn PythonExemple
Convertir un texte en nombreint(texte)int(ligne[2])
Une partie de la liste (une tranche)liste[debut:fin] (la fin est exclue)table[2:103] : lignes d'indices 2 à 102
Tester l'appartenancevaleur in liste"MATHEMATIQUES" in ligne[6:11]
Compter : un compteurn = 0 puis n = n + 1 dans la boucleif ligne[1] == "F": n = n + 1
Compter par catégorie : un dictionnairedico[cle] (voir ci-dessous)effectifs[age] = effectifs[age] + 1
dictionnaire.py
effectifs = {}
for age in [20, 18, 20, 21, 20]:
    if age in effectifs:
        effectifs[age] = effectifs[age] + 1
    else:
        effectifs[age] = 1
print(effectifs)
console
{20: 3, 18: 1, 21: 1}

Un dictionnaire associe une clé (ici l'âge) à une valeur (ici l'effectif) : c'est un compteur par catégorie, sans avoir à connaître les catégories à l'avance.

ExercicesLa population en Python

EX 23Je découvre 🌶️prise en main

Exercice 23 — Lire la pyramide des âges

Dans un fichier, recopie la fonction lire_table du cours, puis ajoute :

ex01.py
table = lire_table("2023_Pyramide.csv")
print(len(table))
print(table[1])
print(table[2])
  1. Exécute le programme. Que représente le premier nombre affiché ?
  2. Quel est le type de table[2][2] ? Vérifie avec print(type(table[2][2])).
  3. Que faut-il faire pour utiliser table[2][2] dans un calcul ? Affiche int(table[2][2]) * 2.
Indice

Les lignes de la table sont les lignes du fichier : titre, descripteurs, 101 lignes de population, « Total », une ligne vide, trois lignes de notes.

💾 NOM_Prenom_ex23.py

EX 24Je m'entraîne 🌶️🌶️application

Exercice 24 — Les totaux de la population

Avec une boucle sur table[2:103] (les 101 lignes de population), calcule :

  1. le nombre total d'hommes et le nombre total de femmes ;
  2. la proportion de femmes dans la population, en pourcentage arrondi à 0,1.
Indice

Utilise deux compteurs (hommes et femmes) qui valent 0 au départ. Dans la boucle : hommes = hommes + int(ligne[2]).

💾 NOM_Prenom_ex24.py

EX 25Je m'entraîne 🌶️🌶️🌶️plusieurs étapes

Exercice 25 — L'âge moyen des Français

L'âge moyen d'une population se calcule ainsi : pour chaque âge, on multiplie l'âge par le nombre de personnes de cet âge ; on additionne tous ces produits ; on divise par la population totale.

  1. Écris un programme qui calcule l'âge moyen. (Attention à la ligne « 100 ou plus » : on prendra 100 ans.)
  2. Écris la fonction age_moyen(table) qui renvoie ce nombre, puis affiche round(age_moyen(table), 1).
Indice 1

Pour la ligne « 100 ou plus » : ligne[1].split()[0] donne '100' (le premier mot). Pour les autres, c'est le seul mot : '15'.

Indice 2

Deux compteurs : total_personnes et somme_ages.

💾 NOM_Prenom_ex25.py

ExercicesLe lycée en Python

EX 26Je m'entraîne 🌶️prise en main

Exercice 26 — Retrouver 916 et 39

Lis Eleves2022.csv avec lire_table. La première ligne contient les descripteurs : on la saute avec table[1:].

  1. Combien de lignes contient la table ? Combien d'élèves sont encore présents (colonne Sortie vide, soit ligne[2] == "") ?
  2. Combien d'élèves de terminale (classe qui commence par T : ligne[0][0] == "T") ont l'italien en LVB (ligne[5] == "ITALIEN") ? Compare avec ton résultat du tableur.
Indice

eleves = lire_table("Eleves2022.csv")[1:] donne la table sans la ligne des descripteurs.

💾 NOM_Prenom_ex26.py

EX 27Je m'entraîne 🌶️🌶️application

Exercice 27 — Une fonction qui compte

  1. Écris une fonction compter(table, colonne, valeur) qui renvoie le nombre d'élèves présents dont la colonne colonne vaut valeur.
  2. Utilise-la pour compter les élèves présents par LVB (colonne 5) : "ESPAGNOL", "ALLEMAND", "ITALIEN". Vérifie que la somme est 916.
Indice

Le test d'un élève présent est ligne[2] == "".

💾 NOM_Prenom_ex27.py

EX 28Je m'entraîne 🌶️🌶️🌶️plusieurs étapes

Exercice 28 — Les filles et les maths : un tableur peine, Python non

Dans une table d'élèves, les options sont dans cinq colonnes (ligne[6:11]). Un tableur a du mal à compter « les élèves qui ont MATHEMATIQUES dans l'une des cinq colonnes ». Python, lui, sait : "MATHEMATIQUES" in ligne[6:11].

  1. Écris une fonction part_filles(eleves, option) qui, pour les élèves présents de première et de terminale (classe qui commence par 1 ou T) suivant cette option, renvoie le nombre d'élèves et le pourcentage de filles (ligne[1] == "F").
  2. Compare le pourcentage de filles parmi les élèves de première et de terminale, avec celui dans la spécialité MATHEMATIQUES, puis dans MATHS EXPERTES.
  3. Teste aussi NUMERIQUE SC.INFORM., HUMAN.LITTER.PHILO. et PHYSIQUE-CHIMIE. Qu'observes-tu ? Que peut-on en conclure ?
Indice 1

Pour avoir la référence « toutes spécialités confondues », écris une version de la fonction sans le test d'option, ou teste option == "" pour tout accepter (au choix).

Indice 2

ligne[0][0] in "1T" est vrai si la classe commence par 1 ou par T.

💾 NOM_Prenom_ex28.py

ExercicesLes accidents : un gros fichier

EX 29Je m'entraîne 🌶️🌶️application

Exercice 29 — Garçons, filles, âges

Securite_routiere2.csv contient 73 985 victimes de 2021 : une ligne = un sexe et un âge. Le fichier a deux lignes de titre : on les saute avec table[2:].

  1. Combien de victimes de sexe G et de sexe F ? Compare avec ton résultat du tableur.
  2. Quel est l'âge moyen des victimes garçons, puis filles ?
  3. Quel est l'âge de la plus âgée victime du fichier ?
Indice 1

Pour l'âge moyen : une somme des âges et un compteur, séparés pour chaque sexe.

Indice 2

Pour le maximum : une variable maxi = 0 qui est remplacée quand on trouve un âge plus grand.

💾 NOM_Prenom_ex29.py

EX 30Je m'entraîne 🌶️🌶️🌶️plusieurs étapes

Exercice 30 — Un histogramme en texte

Avec un dictionnaire effectifs, compte les victimes de chaque âge. Puis affiche, par tranche de 10 ans (0 à 9 ans, 10 à 19 ans…), le nombre de victimes et une barre de # : un # par tranche de 500 victimes.

  1. Quel âge compte le plus de victimes ?
  2. Quelle tranche d'âge compte le plus de victimes ? Que penses-tu de la forme obtenue ?
Indice 1

age // 10 donne la tranche : 20 à 29 ans donnent 2.

Indice 2

Pour l'âge qui compte le plus de victimes : max(effectifs, key=effectifs.get) donne la clé de plus grande valeur.

Indice 3

"#" * 4 donne ####.

💾 NOM_Prenom_ex30.py

CoursCroiser deux tables

Deux tables peuvent se croiser quand elles ont un descripteur commun. Ici : l'âge. La pyramide des âges dit combien de personnes ont chaque âge ; le fichier des accidents dit combien de victimes ont chaque âge. En divisant, on obtient un taux : le nombre de victimes pour 100 000 personnes de cet âge. Un taux permet de comparer des groupes de tailles différentes.

Attention

Les victimes sont celles de 2021 ; la population est celle du 1er janvier 2023. Ce n'est pas la même année : les taux sont des ordres de grandeur, pas des mesures exactes.

EX 31Je m'entraîne 🌶️🌶️🌶️🌶️défi

Exercice 31 — Le taux de victimes par âge

Construis, à partir de la pyramide, un dictionnaire population : la clé est l'âge, la valeur est le nombre de personnes (hommes + femmes). Avec effectifs (exercice 30), calcule pour chaque âge de 0 à 99 ans :

taux = 100000 * effectifs[age] / population[age]

  1. À quel âge le taux est-il le plus élevé ? Quelle est sa valeur (arrondie à l'unité) ?
  2. Affiche le taux à 10, 18, 30, 50, 70 et 90 ans. Que constates-tu ?
  3. Compare le nombre de victimes à 70 ans et à 90 ans, puis le taux à ces âges. Pourquoi le taux est-il plus juste pour comparer ?
  4. Calcule le taux global des garçons (victimes garçons ÷ population masculine × 100 000) et celui des filles. Quel est le rapport entre les deux ? Peut-on parler de « surmortalité masculine » ?
Indice 1

Pour la population : population[age] = int(ligne[2]) + int(ligne[3]). Pour « 100 ou plus », la clé 100 peut s'obtenir avec int(ligne[1].split()[0]).

Indice 2

Pour le taux par sexe, tu as besoin du nombre total de victimes garçons (exercice 29) et du total d'hommes (exercice 24).

💾 NOM_Prenom_ex31.py

ExercicesBilan

EX 32Je m'entraîne 🌶️🌶️application

Exercice 32 — Tableur ou Python ?

Pour chaque situation, indique l'outil que tu choisirais (tableur ou Python) et pourquoi :

  1. Regarder rapidement un petit fichier et en faire un graphique.
  2. Refaire chaque année le même calcul sur un nouveau fichier de 500 000 lignes.
  3. Compter les élèves qui ont une option dans l'une de cinq colonnes.
  4. Montrer à un camarade, sans programmation, comment tu es arrivé à un résultat.
Indice

Pense à la rapidité de mise en œuvre, à la répétition du traitement, à la taille du fichier, à la lisibilité.

📝 réponses dans ton compte rendu, exercice 32