C14 Fusion de tables
Activités
Remarque
Les exemples des activités sont volontairement courts et simples pour introduire les concepts, des exemples plus conséquents seront traités en exercice.
Activité 1 : Opérateur de concaténation
Pour un exposé, deux élèves de premières ont du faire des recherches sur la démographie de quelques pays européens, Antoine s'est chargé des trois pays suivants : France, Allemagne et Pologne, ses résultats sont dans le fichiers csv
suivant :
Démographie Fra-All-Pol
Justine a réuni les mêmes données pour les pays suivants : Italie, Espagne et Grèce :
Démographie Ita-Esp-Gre
-
Utiliser le module
csv
de Python pour lire les données de ces tables et les récupérer dans les listes de dictionnairespays_antoine
etpays_justine
Aide
On rappelle qu'on peut lire les données d'une table sous la forme d'une liste de dictionnaire à l'aide du module
csv
de Python :En cas de difficultés, se référer au chapitre sur la lecture et le traitement des données en tableimport csv # Remplacer <nom du fichier> par le nom du fichier (avec éventuellement le chemin d'accès) fichier=open(<nom du fichier>,"r",encoding="utf-8") contenu = list(csv.DictReader(fichier,delimiter=',')) fichier.close()
-
Recopier et compléter en utilisant le vocabulaire des données en table : descripteur, enregistrement, tables, champ
"Ces deux ..... partagent exactement les mêmes ....... mais contiennent des ......... différents. Chaque ...... est identifié de façon unique par le ......
nom
. Les données sont exprimées dans la même unité : kilomètre carré pour la surface et nombre d'habitants pour la population." -
Pour obtenir une table contenant les six pays, on peut simplement concaténer les deux listes grâce à l'opérateur
+
en python. Le programme s'écrit alors :Recopier et executer ce programme, quelles conditions permettent cette concaténation ?import csv # Données de la table d'Antoine fichier=open("pays_antoine.csv","r",encoding="utf-8") pays_antoine = list(csv.DictReader(fichier,delimiter=',')) fichier.close() # Données de la table de Justine fichier=open("pays_justine.csv","r",encoding="utf-8") pays_justine = list(csv.DictReader(fichier,delimiter=',')) fichier.close() # Concaténation des deux tables pays = pays_justine + pays_antoine
-
Que se passerait-il si Justine et Antoine avaient chacun dans leur fichier les données d'un même pays ?
Note
En classe de première, on ne traitera pas le problème de l'apparition de données dupliquées dans une table (les doublons). Cet aspect sera abordée avec les bases de données en terminale et la notion de clé.
Activité 2 : Combiner les données de deux tables
Jessica et Albert ont travaillé sur le même exposé, mais différemment. Jessica a crée un fichier csv
contenant la population des 6 pays (Allemagne, France, Pologne, Italie, Espagne, Grèce) tandis qu'Albert a crée un fichier contant la surface de ces 6 mêmes pays.
Population Ils souhaitent maintenant, fusionner leurs données de façon à créer une table contenant la population et la surface pour les six pays.
-
Ecrire un programme python permettant de lire ces deux tables et de les convertir en deux listes de dictionnaires
population
etsurface
.Aide
Voir l'activité précédente pour la lecture d'un fichier
csv
sous forme de liste de dictionnaire. Après lecture, la liste de dictionnairespopulation
devrait contenir :Et la liste de dictionnaires[{'Nom': 'Allemagne', 'Population': '83129285'}, {'Nom': 'France', 'Population': '67422241'}, {'Nom': 'Pologne', 'Population': '38386158'}, {'Nom': 'Italie', 'Population': '60494785'}, {'Nom': 'Espagne', 'Population': '47329981'}, {'Nom': 'Grèce', 'Population': '10709606'}]
surface
devrait contenir :[{'Nom': 'Allemagne', 'Surface (km²)': '357386'}, {'Nom': 'France', 'Surface (km²)': '551695'}, {'Nom': 'Pologne', 'Surface (km²)': '312679'}, {'Nom': 'Italie', 'Surface (km²)': '302072'}, {'Nom': 'Espagne', 'Surface (km²)': '505992'}, {'Nom': 'Grèce', 'Surface (km²)': '132049'}]
-
Obtient-on le résultat attendu en effectuant la concaténation des deux tables ? Pourquoi ?
-
Recopier et compléter avec les mots : tables, descripteur, enregistrement
Les deux ...... n'ont pas exactement la même structure, en effet elles partagent un ........ commun (
Nom
). Mais les autres descripteurs sont différents. Pour fusionner ces tables, on doit rapprocher les ........... des deux tables qui ont la même valeur sur le ............. commun. On dit qu'on fait une jointure des deux tables. -
Compléter la fonction
get_surface
ci-dessous qui prend en argument un nom de pays et renvoie sa surface (la variablesurface
est la liste de dictionnaire de la question 1.)def get_surface(nom_pays): for pays in surface: if pays[......]==.....: return ....['Surface (km²)']
-
Pour générer la jointure des deux tables sur le descripteur commun
Nom
on propose l'algorithme suivant :
Parcourir les pays du dictionnairepopulation
Récupérer la surface de chaque pays à partir du descripteur communNom
(fonctionget_surface
ci-dessus)
Stocker les informations dans une nouvelle liste de dictionnaire
Recopier, compléter et tester le programme correspondant :
fusion = []
for pays in population:
nom_pays = pays['Nom']
population_pays = ......
surface_pays = ........
fusion.append({'Nom':nom_pays,'Population':population_pays,'Surface':surface_pays})
Cours
Vous pouvez télécharger une copie au format pdf du diaporama de synthèse de cours présenté en classe :
Attention
Ce diaporama ne vous donne que quelques points de repères lors de vos révisions. Il devrait être complété par la relecture attentive de vos propres notes de cours et par une révision approfondie des exercices.
QCM
1. A quelle condition peut-on concaténer deux tables ?
- a) il suffit qu'elles aient un descripteur commun
- b) elles doivent avoir des descripteurs identiques
- c) elles doivent avoir au moins un enregistrement identique
- d) elles doivent avoir le même nombre de colonnes
- a)
il suffit qu'elles aient un descripteur commun - b) elles doivent avoir des descripteurs identiques
- c)
elles doivent avoir au moins un enregistrement identique - d)
elles doivent avoir le même nombre de colonnes
2. A quelle condition peut-on effectuer la jointure de deux tables ?
- a) il faut qu'elles aient un descripteur commun
- b) elles doivent avoir le même nombre de ligne
- c) elles doivent avoir au moins un enregistrement identique
- d) elles doivent avoir le même nombre de colonnes
- a) il faut qu'elles aient un descripteur commun
- b)
elles doivent avoir le même nombre de ligne - c)
elles doivent avoir au moins un enregistrement identique - d)
elles doivent avoir le même nombre de colonnes
3. Quelle instruction permettra de réaliser la concaténation des deux tables ci-dessous contenant des noms de communes et leur code postal (CP) :
t1 = [{"Nom":"Saint-Denis";"CP":97400},{"Nom":"Saint-Paul";"CP":97411}]
t1 = [{"Nom":"Le tampon";"CP":97418},{"Nom":"La possession";"CP":97419}]
- a)
t = t1.join(t2)
- b)
t = concat(t1, t2)
- c)
t == t1 + t2
- d)
t = t1 + t2
- a)
t = t1.join(t2)
- b)
t = concat(t1, t2)
- c)
t == t1 + t2
- d)
t = t1 + t2
Exercices
Exercice 1 : Concaténation de deux tables
- On donne ci-dessous les listes de contacts téléphoniques de deux amis : Amélie et Florent. Les deux listes sont au format
csv
et possèdent exactement les mêmes descripteurs :"Prénom"
et"Téléphone"
.
Listes des contacts de Florent
-
Ecrire un programme python permettant de lire ces deux listes de contacts sous la forme d'une liste de dictionnaires.
Aide
En cas de difficultés, revoir l'activité 1.
-
Justifier qu'on peut concaténer ces deux tables et créer la liste de dictionnaires regroupant les deux listes de contacts.
-
Une personne figurait à la fois dans les contacts d'Amélie et dans ceux de Florent. Laquelle ?
Note
La gestion des éventuels doublons lors d'une concaténation peut-être problématique et ne sera pas étudiée en détails. Par exemple ici, que faire si un même numéro de téléphone existe en double mais que le prénom correspondant n'est pas le même dans les deux listes ?
-
Modifier votre programme de façon supprimer les doublons lors (ou après) la concaténation.
Remarques
Cela ne figure pas au programme de l'enseignement de spécialité nsi en première, mais après avoir effectué la fusion des deux tables, on peut logiquement souhaiter sauvegarder le résultat au format
csv
. Pour cela, on pourra adapter le programme suivant en remplaçant les parties entre<
et>
par les variables correspondantes# On récupère les clés du dictionnaire avec la méthode "keys()" cles_dico = <nom de la liste de dictionnaires>[0].keys() # On ouvre un fichier en écriture with open('<nom fichier de sauvegarde>', 'w', newline='') as output_file: dict_writer = csv.DictWriter(output_file, cles_dico) # On y écrit les entêtes(les clés) puis les valeurs dict_writer.writeheader() dict_writer.writerows(<nom de la liste de dictionnaires>)
Exercice 1 : Jointure de deux tables
-
Télécharger ci-dessous le fichier des jours fériés : Date des jours fériés
Note
Ce fichier est issu de cette page du site data.gouv.fr.
-
Le fichier téléchargé ci-dessus, n'indique pas les jours de la semaine auxquels tombent les jours fériés. Cette information est disponible dans le tableau ci-dessous :
-
Ecrire un programme Python permettant de lire le contenu de ces deux fichiers sous la forme de deux listes de dictionnaires :
jours_feries
etjours_semaine
. -
Poursuivre votre programme en faisant la jointure de ces deux tables afin de regrouper les informations présentes pour chaque date : le nom du jour férié et le nom du jour de la semaine correspondant. Le premier enregistrement de cette table doit donc être :
2002-01-01,1er janvier,Mardi
-
Paul travaille dans une entreprise qui accorde un jour de repos au choix à tous les employés sur les six jours pendant lesquels elle travaille (du lundi au samedi). Ecrire un programme Python qui prend en paramètre une année et renvoie le jour de repos à choisir afin que celui-ci tombe le moins souvent possible un jour férié. Par exemple, pour l'année 2002 les jours fériés et les jours de la semaine correspondant étaient :
La fonction doit donc renvoyer2002-01-01,1er janvier,Mardi 2002-04-01,Lundi de Pâques,Lundi 2002-05-01,1er mai,Mercredi 2002-05-08,8 mai,Mercredi 2002-05-09,Ascension,Jeudi 2002-05-20,Lundi de Pentecôte,Lundi 2002-07-14,14 juillet,Dimanche 2002-08-15,Assomption,Jeudi 2002-11-01,Toussaint,Vendredi 2002-11-11,11 novembre,Lundi 2002-12-25,Jour de Noël,Mercredi
Samedi
car pour 2002, ce n'est jamais un jour férié.