Aller au contenu

Chapitre 10.2 : Les données en tables⚓︎

I. Les données⚓︎

A savoir

1. Introduction⚓︎

Aujourd'hui, le développement des technologies de l'informatique permet de recueillir énormément de données (big data). Le traitement et le stockage de ces données sont devenus des enjeux essentiels.

Les tables de données sont rapidement devenues le principal moyen de stocker des données afin qu'elles puissent être traitées par les programmes (recherche, tri, filtre, calcul, mise en forme, etc.) pour générer de nouveaux types d'informations.

Pour être traitées correctement, ces données doivent être structurées de façon précise afin que les programmes puissent lire et décoder facilement ces structures.

2. Comment structurer des données.⚓︎

Une table de données est une collection de données organisées sous forme d'un tableau (données tabulées) :

  • Chaque colonne correspond à un descripteur de donnée ou champ décrivant une catégorie d'information.
  • Chaque ligne est la liste des valeurs des informations décrivant un objet : c'est un enregistrement ou p-uplet.

Il existe plusieurs manières de stocker les données sous forme tabulée.

Exemple de table de données⚓︎

Civilité Nom Prénom Âge
Mr HOCHON Paul 45
Mme GATHOR Nathalie 64
Mr DECAJOU Benoit 32
Melle ADRENE Aline 21

3. Les formats de données en informatique⚓︎

Il existe différents formats permettant de mémoriser les informations d'une table dans un fichier.

On trouve couramment dans le mond einforamtique les formats CSV, JSON ou et XML.

Un des plus utilisés est le format CSV (pour "comma-separated values", soit "données séparées par des virgules") qui est un fichier texte dans lequel :

  • Chaque ligne correspond à une ligne de la table.
  • Chaque ligne est composée de champs (contenus des cellules du tableau) séparés par une virgule (,).
  • Toutes les lignes du fichier ont le même nombre de champs.

Voici la représentation CSV du tableau précédent :

Civilité,Nom,Prénom,Âge
Mr,HOCHON,Paul,45
Mme,GATHOR,Nathalie,64
Mr,DECAJOU,Benoit,32
Melle,ADRENE,Aline,21

La virgule est le séparateur standard pour les données anglosaxonnes, mais pas pour les données aux normes françaises. En effet, en français, la virgule est le séparateur des chiffres décimaux.

Il serait impossible de différencier les virgules des nombres décimaux et les virgules de séparation des informations. C'est pourquoi on utilise un autre séparateur : le point-virgule (;).

On peut parfois trouver un espace, une tabulation ou d'autres caractères en guise de séparateur : pour éviter les problèmes, il faut rester vigilants sur le type de séparateur utilisé.

Le format JSON (JavaScript Object Notation) est un format de données léger et facile à lire, couramment utilisé pour l'échange de données entre systèmes.

Il estbasé sur une syntaxe de paires clé-valeur et est souvent utilisé dans les API web pour transmettre des informations structurées.

JSON est indépendant du langage de programmation, ce qui le rend compatible avec de nombreuses technologies.

Sa structure hiérarchique permet de représenter des objets complexes et des listes de manière intuitive. En raison de sa simplicité et de son efficacité, JSON est devenu un standard pour le stockage et le transport de données dans les applications modernes.

Voici la représentation JSON du tableau précédent :

[
    {   "Civilité": "Mr", 
        "Nom": "HOCHON", 
        "Prénom": "Paul", 
        "Âge": 45   
        },

    {   "Civilité": "Mme", 
        "Nom": "GATHOR", 
        "Prénom": "Nathalie", 
        "Âge": 64   
        },

    {   "Civilité": "Mr", 
        "Nom": "DECAJOU", 
        "Prénom": "Benoit", 
        "Âge": 32
        },

    {   "Civilité": "Melle", 
        "Nom": "ADRENE", 
        "Prénom": "Aline", 
        "Âge": 21
        }
]

Le format XML (eXtensible Markup Language) est un langage de balisage utilisé pour représenter des données structurées de manière hiérarchique.

Il permet de décrire des données complexes grâce à des balises personnalisables, facilitant ainsi l'échange d'informations entre différents systèmes.

XML est largement utilisé dans le développement web, notamment pour les services web et la configuration de logiciels.

Sa flexibilité et sa capacité à représenter des structures de données arborescentes en font un choix populaire pour le stockage et le transport de données.

Voici la représentation XML du tableau précédent :

<Personnes>
    <Personne>
        <Civilité>Mr</Civilité>
        <Nom>HOCHON</Nom>
        <Prénom>Paul</Prénom>
        <Âge>45</Âge>
    </Personne>
    <Personne>
        <Civilité>Mme</Civilité>
        <Nom>GATHOR</Nom>
        <Prénom>Nathalie</Prénom>
        <Âge>64</Âge>
    </Personne>
    <Personne>
        <Civilité>Mr</Civilité>
        <Nom>DECAJOU</Nom>
        <Prénom>Benoit</Prénom>
        <Âge>32</Âge>
    </Personne>
    <Personne>
        <Civilité>Melle</Civilité>
        <Nom>ADRENE</Nom>
        <Prénom>Aline</Prénom>
        <Âge>21</Âge>
    </Personne>
</Personnes>

Chaque enregistrement du tableau est encapsulé dans une balise <Personne>, avec des sous-balises pour chaque champ.

Pour stocker et traiter les données en Python, on utiliser les types tableau (list) ou dictionnaire (dict)

## II. Le traitement des données en Python

A savoir

1. Indexation de tables⚓︎

Dans cette partie, on utilisera les données de la table ci-dessous formatée dans un fichier texte au format csv.

Nom note_math note_physique note_nsi
0 Marc 10 12 13
1 Zoé 15 10 11
2 Laure 4 6 12
3 Alain 8 14 7

Les lignes de la table sont indexées par leur numéro, les colonnes de la table sont indexées grâce aux descripteurs.

2. Importer des données depuis un fichier⚓︎

Pour importer des données depuis un fichier au format csv, on peut utiliser la bibliothèque Python csv

la fonction suivante permet d'importer les données contenues dans un fichier csv.

  • Elle renvoie une liste des dictionnaires
  • Chaque dictionnaire comporte des couples clés/valeurs correspondant à des couples descripteurs/valeurs.
import csv

def lire_fichier(nom_fichier, delim):
    """
    Ouvre le fichier csv contenant la table de données dont le nom est passé en
    paramètre et renvoie une liste contenant les données stockées dans ce fichier.

    PARAMÈTRES
        nom_fichier (str): le nom du fichier csv contenant les données
        delim (str): le délimiteur des données dans le fichier csv

    RETOURS
        (list): une liste de dictionnaires chacun contenant une ligne de la table
    """
    donnees = []
    with open(nom_fichier, 'r', encoding='utf-8') as csvfile:
        table = csv.DictReader(csvfile, delimiter=delim)
        for ligne in table:
            donnees.append(dict(ligne))
    return donnees

# Programme principal
tab_notes = lire_fichier("notes_eleves.csv", ",")
print(tab_notes)

Résultat obtenu :

[{'nom': 'Marc', 'note_math': '10', 'note_physique': '12', 'note_nsi': '13'},
{'nom': 'Zoé', 'note_math': '15', 'note_physique': '10', 'note_nsi': '11'},
{'nom': 'Laure', 'note_math': '4', 'note_physique': '6', 'note_nsi': '12'},
{'nom': 'Alain', 'note_math': '8', 'note_physique': '14', 'note_nsi': '7'}]

3. Recherche dans une table⚓︎

Pour effectuer une recherche dans un table qui correspond à un ou plusieurs critères on peut utiliser les listes en compréhensions.

a) Sélection de lignes entières⚓︎

Une sélection est la création d'une nouvelle table en extrayant les lignes de la table de départ qui satisfont à une ou plusieurs conditions données.

Exemple : Quels sont les élèves qui ont une note de math supérieure ou égale à 10 ?

selection_1 = [eleve for eleve in tab_notes if int(eleve["note_math"]) >= 10]
print(selection_1)

Résultat obtenu :

>>> [{'nom': 'Marc', 'note_math': '10', 'note_physique': '12', 'note_nsi': '13'},
{'nom': 'Zoé', 'note_math': '15', 'note_physique': '10', 'note_nsi': '11'}]

Remarque :

  • int(eleve["note_math"]) >= note_min : Comme la donnée note_math est importée sous forme de chaîne de caractère, il faut forcer le changement de type en mettant int devant la valeur pour pouvoir la comparer à la note de référence qui est un entier (int).
  • Il faut aussi vérifier que dans le résultat de la recherche qu'il n'y a pas de doublons (deux fois la même valeur).

b) Sélection de lignes avec colonnes spécifiques⚓︎

Une projection est la création d'une nouvelle table en extrayant les lignes de la table de départ qui correspondent à certaines colonnes précises.

Exemple : Quels sont les noms et prénoms des élèves qui ont une note de math et nsi inférieure à 10 ?

selection_2 = [{"Nom": eleve["nom"], {"Prenom": eleve["prenom"]} for eleve in tab_notes if int(eleve["note_nsi"]) < 10 and int(eleve["note_math"]) < 10]

print(selection_2)
Résultat obtenu :

>>> [{'nom': 'Alain', 'note_math': '8', 'note_physique': '14', 'note_nsi': '7'}]

4. Tri d'une table⚓︎

Le tri dans une table consiste à modifier l'ordre des données pour qu'elles soient présentées dans un ordre croissant ou décroissant selon le choix d'un ou plusieurs critères.

En Python, pour trier une collection d'objets (liste, dictionnaire, etc.), on peut utiliser une des méthodes de tri intégrées en spécifiant la clé sur laquelle on veut effectuer le tri.

Fonction Description
sorted Renvoie une nouvelle liste/dictionnaire triée
Ordre croissant resultat = sorted(liste, key="nom_clef")
Ordre décroissant resultat = sorted(liste, key="nom_clef", reverse=True)

Ici, comme on manipule une liste de dictionnaires, pour récupérer la clé, on utilisera la syntaxe suivante : il faut définir une fonction qui renvoie la clé choisie parmi tous les descripteurs.

Question : Trier la table selon la note de NSI croissante.

# Définition de la fonction retournant la clé de tri
def clef_de_tri(element):
    return int(element["note_nsi"])

# Programme principal
table_notes = lire_fichier_dico("notes_eleves.csv", ",")
table_triee = sorted(table_notes, key=clef_de_tri)
print(table_triee)

Résultat obtenu :

[{'nom': 'Alain', 'note_math': '8', 'note_physique': '14', 'note_nsi': '7'},
{'nom': 'Zoé', 'note_math': '15', 'note_physique': '10', 'note_nsi': '11'},
{'nom': 'Laure', 'note_math': '4', 'note_physique': '6', 'note_nsi': '12'},
{'nom': 'Marc', 'note_math': '10', 'note_physique': '12', 'note_nsi': '13'}]