Aller au contenu

Données en tables : principe

En cours d'écriture

Ce chapitre est en cours d'écriture. Il est déconseillé de s'y attaquer seul.

La puissance de calcul des ordinateurs facilite le traitement de grande quantités de données. Toutefois, la manière dont les données sont présentées est importantes. Il est beaucoup plus simple de traiter des données qui sont structurées, c'est à dire qui correspondent à un schéma établi avant le traitement des données : on n'a pas besoin de lire les données pour savoir ce qu'elles décrivent ni comment elles sont organisées. Dans l'idéal, cette structure est relativement simple pour autoriser des traitements avec des algorithmes basiques, mais aussi suffisamment souple pour pouvoir représenter des données relativement complexes.

Il existe de nombreuses manières de structurer les données. L'une des plus courante est la strucuration en table. Elle convient particulièrement aux données uniformes, c'est à dire où chaque objet est décrit avec les mêmes informations. On peut voir une table comme un tableau en deux dimensions, une grille. Chaque ligne représente un objet. Chaque colonne une donnée sur les objets décrits.

Dans cette partie du cours nous allons travailler sur les communes de France, avec deux tables1 :

La table localisation1, qui donne pour chaque commune son code postal, son code insee, sa latitude et sa longitude :

code insee nom code postal latitude longitude
01001 L' Abergement-Clémenciat 01400 46.153721024 4.925850148
01002 L' Abergement-de-Varey 01640 46.009605679 5.428087796
... ... ... ... ...

La table population1, qui donne pour chaque commune son code insee et sa population municipale.

code insee nom population
01001 L' Abergement-Clémenciat 776
01002 L' Abergement-de-Varey 248
... ... ...

CSV

Au total, nos deux tables décrivent 34978 communes, soit la quasi totalité des communes françaises. Il serait bien trop long de rentrer ces données à la main. Heureusement, une des grandes forces de la structuration en table est sa simplicité. On peut stocker une table dans un fichier texte avec une structure très simple. Un exemple de structure est le format CSV, pour Comma Separated Values.

  • Une ligne d'une table est représentée par une ligne dans le fichier.
  • Les valeurs des différentes colonnes sont séparées par un caractère, en général une virgule ou un point virgule.
  • Parfois, la première ligne est l'en-tête de la table, qui permet de savoir à quoi correspondent les colonnes. Cette lignes est aussi parfois appelé le descripteur ou schéma de la table.

Dans notre cas, pour la table localisation, celà donne :

code_insee,nom,code_postal,latitude,longitude
01001,L' Abergement-Clémenciat,01400,46.153721024,4.925850148
01002,L' Abergement-de-Varey,01640,46.009605679,5.428087796
...

Et pour la table population :

code_insee,nom,code_postal,population
01001,L' Abergement-Clémenciat,01400,776
01002,L' Abergement-de-Varey,01640,248
...

Vous pouvez cliquer sur les liens suivants pour télécharger les fichiers population.csv et localisation.csv qui contiennent les tables complètes.

Opérations sur les tables

On peut faire de nombreuses opérations sur des tables :

  • Ne garder que certaines colonnes (projection)
  • Ne garder que certaines lignes (sélection/recherche)
  • Transformer chaque ligne
  • Lier deux tables qui ont des données en commun (fusion/jointure)
  • Faire une opération sur toutes les valeurs d'une colonne. (comptage/addition/moyenne)
  • ...

Remarquez qu'on a seulement parlé de colonnes et de lignes, et non de code postal ou de population. C'est parce que les opérations de manipulation de tables que nous allons voir sont génériques : on peut les appliquer à n'importe quelles tables.

Pour des raisons de simplicité, nous travaillerons directement sur nos deux tables la plupart du temps. Certaines opérations génériques seront présentées en option.

Folium

Avec les données à notre disposition, on va produire, entre autres, plusieurs cartes de France. On va utiliser Folium, qui est une bibliothèque Python qui permet de créer des cartes.

Il est probable que Folium ne soit pas installé par défaut sur votre ordinateur. Vous pouvez installer Folium par le biais de Thonny.

Ouvrez Thonny. Par le menu en haut, accédez à outils > gérer les paquets.

gerer paquets

Entrez folium dans la barre de recherche, puis cliquez sur rechercher.

recherche folium

Cliquez sur folium dans la liste des modules.

cliquer folium

Cliquez ensuite sur installer.

installer folium

Une popup avec une progression devrait apparaître. Laissez faire, tout est automatique. Ensuite, la fenêtre changera pour afficher que Folium est installé.

folium installé

En cas de problème, demandez au professeur.

Chargement d'une table

Pour charger une table en mémoire depuis un fichier, on peut utiliser le module csv, présent par défaut dans Python.

Pour ça, on appelle la fonction DictReader du module csv, en lui spécifiant le fichier et le séparateur utilisé. Elle renvoie une valeur similaire à une list, que l'on peut donc parcourir et transformer en list :

import csv

population = []

with open('population.csv', 'r') as csvfile: # ouverture du fichier
    lecteur = csv.DictReader(csvfile, delimiter=',') #création du lecteur
    for ligne in lecteur: #On ajoute les éléments lus à la liste.
        population.append(ligne)

print(population[0])

Le code ci-dessus ouvre un fichier population.csv qui se trouve dans le même répertoire que le fichier python du code. Il lit ensuite le fichier, et charge la table qu'il contient dans la list population, puis affiche la première ligne.

Créez un fichier Python tables.py. Copiez-collez y le code ci dessus, et placez population.csv dans le même répertoire.

Executez-le. Vous devriez voir la sortie suivante :

{'code_insee': '01001', 'nom': "L' Abergement-Clémenciat", 'code_postal': '01400', 'population': '776'}

Comme vous pouvez le voir, la première ligne du fichier a été chargée sous forme d'un dictionnaire. Les clés sont les éléments du schéma, et les valeurs sont les élements correspondant dans la ligne.

Population est donc une list de dict :

[
    {'code_insee': '01001', 'nom': "L' Abergement-Clémenciat", 'code_postal': '01400', 'population': '776'}, 
    {'code_insee': '01002', 'nom': "L' Abergement-de-Varey", 'code_postal': '01640', 'population': '248'}, 
    {'code_insee': '01004', 'nom': 'Ambérieu-en-Bugey', 'code_postal': '01500', 'population': '14035'}, 
    {'code_insee': '01005', 'nom': 'Ambérieux-en-Dombes', 'code_postal': '01330', 'population': '1689'},
    ...
]

De cette manière, ce sera plus simple de travailler sur chaque commune. Charger les données et les organiser de manière à en faciliter le traitement s'appelle l'indexation. Il y a de nombreuses indexations possibles pour une table :

  • une seule list qui contient toutes les lignes mises bout à bout
  • une list qui contient des lignes sous forme de dict
  • une list qui contient des lignes sous forme de list
  • un dict qui contient des lignes sous forme de dict
  • un dict qui contient des lignes sous forme de list
  • un dict qui contient des colonnes sous forme de list
  • ...

La méthode d'indexation a un impact sur les performances de certaines opérations, et sur la place occupée en mémoire par la table. Nous en explorerons quelques unes au cours de ce chapitre, mais pour le moment, nous allons travailler avec celle présentée plus haut : une list qui contient des lignes sous forme de dict.

Code TP

En cliquant sur ce lien, vous pouvez télécharger le jeu de données et le support des exercices à faire au long de cette partie.

Les fichiers exerciceXX.py sont à compléter. Une tout petit module additionnel vous fournis les fonctions suivantes :

  • charger_csv qui charge un fichier CSV dont le nom est passé en paramètres sous forme d'une list de dict. Exemple charger_csv("localisation.csv")
  • exporter_carte qui prends en paramètre une table comportant les colonnes nom, latitude et longitude, et l'utilise pour créer une carte où chaque commune dans la table est localisée, puis l'enregistre dans un fichier HTML dont le nom est passé en paramètre. Exemple `exporter_carte(une_table_creee_plus_haut, "carte.html")
  • afficher_table, qui prends en paramètre une table quelconque et l'affiche d'une manière propre. Exemple afficher_table(une_table_creee_plus_haut)

Vous trouverez aussi des fichiers HTML de la forme exerciceX_resultat.html qui donnent pour les exercices produisant une carte la carte attendue.


  1. Les données de ces deux tables ont étés construites à partir de deux jeux de données : https://www.data.gouv.fr/fr/datasets/villes-de-france/ et https://www.insee.fr/fr/statistiques/4265429?sommaire=4265511#consulter