Aller au contenu
Apprendre.
  • M1 · toutes les matières15 matières : Préparation de données, API & sécurité, CI/CD, Docker, Merise, Dataviz, KNIME, ML appliqué : projet LoL, SQL & UML, SQL avancé, Machine Learning, Git, IA frugale & responsable, Qualité des données, MathématiquesAnnée
  • M2 · toutes les matières4 matières : Deep Learning, AI Act, Comex & Fundraising, Gouvernance & DataMeshAnnée
  • Deep LearningM2 · 4 modules · Réseaux de neurones, CNN, texte, modèles génératifs.Matière
  • Préparation de donnéesM1 · 3 modules · Nettoyer, transformer et fusionner des données avec Python.Matière
  • API & sécuritéM1 · 2 modules · Consommer, concevoir et sécuriser des API.Matière
  • CI/CDM1 · 1 module · Intégration et livraison continues.Matière
  • DockerM1 · 3 modules · Conteneurs, images, volumes, réseaux, Compose.Matière
  • MeriseM1 · 2 modules · Modéliser une base : MCD, MLD, MPD.Matière
  • DatavizM1 · 2 modules · Visualiser pour comprendre et décider.Matière
  • KNIMEM1 · 1 module · Explorer et nettoyer des données en workflow.Matière
  • ML appliqué : projet LoLM1 · 2 modules · Du besoin métier au POC de vision par ordinateur.Matière
  • SQL & UMLM1 · 3 modules · Modèles UML et requêtes SQL.Matière
  • SQL avancéM1 · 3 modules · Jointures, fenêtres, CTE, optimisation.Matière
  • Machine LearningM1 · 3 modules · Régression, classification, segmentation, projet.Matière

↑↓ naviguer↵ ouvre le résultat en surbrillanceesc fermer

Partie 1 · Import

Importer des données : CSV, JSON, SQL et leurs pièges

Chaque format a sa fonction pandas, et son équivalent Python standard :

FormatpandasPython pur
Fichier plat (CSV, TSV)pd.read_csv() : sep, encoding, headermodule csv (csv.DictReader)
Excelpd.read_excel() : sheet_name (peut exiger openpyxl)hors bibliothèque standard
JSONpd.read_json() : attention aux structures imbriquées (orient)module json
Base SQLpd.read_sql() : connexion + requête ou nom de tablemodule sqlite3
AutresParquet, pickle (sérialisation Python)pickle

Paramètres du TP : index_col (colonne servant d'index), header=None (fichier sans en-tête), usecols (ne charger que certaines colonnes), skiprows (ignorer les premières lignes), dtype (forcer des types).

Vérifie que tu as compris

Un fichier CSV n'a pas de ligne d'en-tête. Quel paramètre de read_csv l'indique ?

Lire un CSV avec le module csv

import csv, io
texte = "id;nom;salaire\n1;Alice;42000\n2;Bob;38000"
lignes = list(csv.DictReader(io.StringIO(texte), delimiter=";"))
# [{'id': '1', 'nom': 'Alice', 'salaire': '42000'}, ...]

Remarque essentielle : tout est lu comme du texte. '42000' n'est pas un nombre : il faut convertir (int(), float()), c'est l'équivalent de dtype / .astype(). Le séparateur par défaut est la virgule : un fichier français en ; lu avec la virgule donne une seule colonne.

À toi de coder

Lire un CSV et convertir les types

Un fichier CSV est du texte. Si on ne convertit pas les nombres, '9' < '10' est faux (comparaison de chaînes) et une moyenne plante. Lis ce CSV au séparateur ;, puis convertis salaire en entier pour obtenir total, la somme des salaires.

Ctrl/⌘+Entrée

JSON imbriqué et SQL

Le JSON est courant sur le web et peut être imbriqué : il faut le normaliser (aplatir) pour obtenir un tableau. En SQL, on se connecte puis on exécute une requête dont le résultat devient un tableau :

import json, sqlite3
data = json.loads('{"nom": "Alice", "adresse": {"ville": "Paris"}}')
plat = {"nom": data["nom"], "ville": data["adresse"]["ville"]}

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t (id INTEGER, nom TEXT)")
con.execute("INSERT INTO t VALUES (1, 'Alice')")
con.row_factory = sqlite3.Row
lignes = [dict(r) for r in con.execute("SELECT * FROM t")]

À toi de coder

Aplatir un JSON imbriqué

Un JSON imbriqué ne rentre pas dans un tableau : une colonne ne peut pas contenir un dict. L'équivalent de pd.json_normalize consiste à remonter les champs imbriqués au premier niveau. Construis, pour chaque personne, un dict plat avec nom, ville et cp (code postal).

Ctrl/⌘+Entrée

Les problèmes classiques à l'import

  • Encodage : fichier non UTF-8 (souvent latin-1) donne des caractères illisibles (« é » au lieu de « é »). Solution : préciser encoding (Python : open(f, encoding="latin-1")).
  • Mauvaise détection des types : un entier lu comme texte (object). Correction avec dtype à l'import ou .astype() après.
  • Fichiers volumineux : lire par blocs avec chunksize pour ne pas saturer la mémoire (Python : itérer sur le fichier ligne à ligne).
  • Identifiants : le TP population force codgeo en string : le code 01001 deviendrait 1001 en entier (zéro initial perdu) (précision ajoutée).

Les dtypes

FamilleTypes
Numériqueint64, float64 (64 = taille en bits)
Texteobject (générique, chaînes ou types mixtes), string (plus moderne, plus efficace)
Temporeldatetime64[ns]
Booléenbool

Pour des chaînes très répétitives (faible cardinalité), le type category économise de la mémoire.

Vérifie que tu as compris

Un nombre est lu comme texte (object) à l'import. Quelle correction le cours propose-t-il ?

Vérifie que tu as compris

Pourquoi lire le code commune 01001 en string plutôt qu'en entier ?