Fusion de données en tables
Présentation d'un nouveau jeu de données
Vous avez sûrement remarqué que le fichier
countries.csv
qui a servi à nos recherche précédentes ne contient pas le nom des capitales de pays.
En effet les villes sont répertoriées selon un code représenté par un entier.
On retrouve plus de 49000 viles dans le fichier
cities.csv
dont voici un extrait de données :
id,nameCity,latitude,longitude,country,population
0,Sant Julià de Lòria,42.46372,1.49129,AD,8022
1,Ordino,42.55623,1.53319,AD,3066
2,les Escaldes,42.50729,1.53414,AD,15853
3,la Massana,42.54499,1.51483,AD,7211
4,Encamp,42.53474,1.58014,AD,11223
5,Canillo,42.5676,1.59756,AD,3292
6,Andorra la Vella,42.50779,1.52109,AD,20430
Clef commune aux deux jeux de données
Le champ
id
du fichier
cities.csv
correspond au champ
capital
du fichier
countries.csv
.
Nous dirons qu'il y a une
clef commune aux deux tables de données.
Dans le fichier cities.csv
le champ id
permet de différencier deux villes qui auraient le même nom. Chaque id
n’apparaît qu'une fois dans le fichier, on parle dans ce cas de clef primaire.
Dans le fichier countries.csv
, le champs capital
est nécessairement pris dans les id
du fichier cities.csv
.
On parle dans ce cas de clef étrangère.
Construction d'une nouvelle table
On comprend bien que l'on aimerait enrichir les données propres aux pays avec celles contenues dans le fichier des villes (ou inversement).
Une des règle de construction des bases de données est de séparer au maximum les données pour ne pas gérer des tables trop lourdes.
Donc si les données sont séparées dans plusieurs tables, il est nécessaire de pouvoir construire, souvent uniquement pour le temps d'une recherche, une table à partir de deux tables séparées.
C'est que que l'on appelle
fusionner les tables.
Pour fusionner deux tables il faut donc:
- Le nom des deux tables
- Le nom des deux clefs qui serviront de critère de fusion
Fusion "à la main"
Pour bien comprendre le mécanisme de la fusion nous allons tout d'abord en faire une "à la main".
Pour cela nous disposons de deux courts extraits de données en tables :
- une table
LesActeurs
.
- Une table
LesFilms
.
et comme on peut s'en douter :
- Chaque film a une distribution composée d'acteurs
- Chaque acteur a une filmographie composée de films
Compléter "à la main" la fusion de ces deux tables sur le critère d'égalité lié au champ
film_id
:
fusion de deux tables
SOLUTION
Fonction de fusion en python
La fonction ci-dessous permet de fusionner les tables
table1
et
table2
.
La fusion se fera sur les lignes dont :
la
valeur liée à la
cle1
dans
table1
et
la
valeur liée à la
cle2
dans
table2
sont égales.
contrairement à ce que l'on a pût faire dans l'exemple "à la main", les deux clefs deux deux données en tables n'ont pas nécessairement le même nom, d'où l'existence de deux variables cle1
et cle2
.
def fusion(table1, cle1, table2, cle2):
fusion=[]
for element1 in table1:
for element2 in table2:
if element1[cle1]==element2[cle2]:
element_fusion=element1
for clef in element2:
element_fusion[clef]=element2[clef]
fusion.append(element_fusion)
return fusion
- Fusionner les tables issues des fichiers
countries.csv
et cities.csv
en ajoutant à chaque pays toutes les caractéristiques de sa capitale
- Afficher le premier élément de cette table fusionnée.
- Quelle redondance apparaît dans cette table ?
- Ajouter une ligne dans la fonction
fusion()
pour éviter cette redondance.
- Une fois la modification réalisée, fusionner à nouveau les tables puis afficher le premier élément de cette table fusionnée pour vérifier que la redondance est bien absente.
# codez ces questions ici
SOLUTION
Recherche dans une table issue d'une fusion
Nous allons maintenant exploiter cette notion de fusion de table pour effectuer des recherches :
- Afficher toutes les capitales dans lesquelles on peut dépenser des Euros
- Afficher le nom des pays dont la capitale a moins de 100 000 habitants
- Afficher le nom des pays dont la capitale est située entre les deux tropiques (de latitudes -23.436° et +23.436°)
# codez ces questions ici
SOLUTION
Nous avons vu dans cette partie que la gestion des données en tables entraîne des problèmes :
- d'indexation
- de recherche
- de tri
- de fusion
- ... et il en existe encore bien d'autres...
On a également pu constater que l'accumulation de ces problèmes peut être résolu par des codes python assez lourds.
Il existe d'autres façons de résoudre ces problèmes :
- Utiliser une bibliothèque python adapté à ce genre de problème (par exemple
pandas
)
- parler ici SGBD ssytèles inétgrés et SQL