Charger et stocker des données

Apprends à charger dans pandas des données provenant des formats que les analystes rencontrent au quotidien, puis à les enregistrer sans perdre d’informations. Lis des fichiers CSV et d’autres fichiers texte en choisissant les bons séparateurs de champs, formats numériques, marqueurs de valeurs manquantes, formats de date et encodages, y compris pour les rapports comportant des lignes de titre et des pieds de page. Charge des classeurs Excel, des fichiers JSON et des données d’API web, stocke les résultats aux formats CSV, Excel et Parquet, et lis et écris des données dans des bases SQL à l’aide de requêtes paramétrées sûres.

IntermédiaireUnité 3 sur 8 de la formation Formation : Python et pandas : NumPy, analyse et visualisation de données

Ce que tu vas apprendre

  1. Lis des fichiers CSV et d’autres fichiers texte délimités avec pd.read_csv, maîtrise la façon dont pandas sépare, nomme et détermine le type des colonnes, puis vérifie le résultat avant de l’analyser.
    • Lire un fichier CSV et examiner le résultat créé par pandas
      Charge un fichier à valeurs séparées par des virgules dans un DataFrame, choisis l’en-tête, les noms de colonnes, l’index et les colonnes à conserver, puis vérifie les types inférés par pandas.
    • Gérer les séparateurs de champs et les formats régionaux des nombres
      Repère le séparateur de champs, le séparateur décimal et le séparateur de milliers utilisés dans un fichier, puis règle sep, decimal et thousands pour que les nombres soient chargés comme tels.
    • Maîtriser les valeurs manquantes, les types des colonnes et les dates lors de la lecture
      Indique à pandas quels marqueurs signifient « manquant », conserve les identifiants comme texte, choisis les types numériques et convertis les dates avec un format explicite.
    • Lire des fichiers dont la structure est irrégulière
      Ignore les lignes de titre, les commentaires et les pieds de page, lis les en-têtes sur plusieurs lignes et les colonnes à largeur fixe, puis décide comment traiter les lignes mal formées.
  2. Comprends comment le texte est stocké sous forme d’octets, corrige les erreurs d’encodage et les caractères déformés, et lis les fichiers trop volumineux ou trop lents à charger en une seule fois.
    • Comprendre comment les caractères sont représentés par des octets
      Explique ce qu’est un encodage et reconnais ASCII, UTF-8, Latin-1, Windows-1252, UTF-16 et la marque d’ordre des octets.
    • Diagnostiquer et corriger les problèmes d’encodage
      Reconnais une erreur de décodage et du mojibake, trouve le bon encodage et écris des fichiers que d’autres programmes lisent correctement.
    • Lire efficacement des fichiers texte volumineux et compressés
      Réduis l’utilisation de la mémoire pendant la lecture, traite un fichier par blocs, combine correctement les résultats partiels et lis directement les fichiers compressés.
  3. Lis les données de feuilles de calcul contenant des titres, des cellules fusionnées et des formules, et écris un ou plusieurs DataFrame dans un classeur destiné à d’autres personnes.
    • Lire les feuilles de calcul de classeurs Excel
      Choisis la feuille, les lignes et les colonnes à lire, et comprends ce que pandas fait des dates, des formules, des cellules fusionnées et de la mise en forme.
    • Écrire des DataFrame dans des classeurs Excel
      Enregistre un ou plusieurs tableaux dans un classeur que tes collègues peuvent ouvrir, et évite d’écraser les données ou de leur attribuer des noms incorrects.
  4. Lis et écris du JSON, transforme des enregistrements imbriqués en tableaux et demande des données à des API web de façon fiable et sûre.
    • Lire et écrire des données JSON
      Connais la syntaxe de JSON et sa correspondance avec les objets Python, puis lis et écris du JSON et du JSON Lines avec Python et pandas.
    • Aplatir des données JSON imbriquées pour obtenir un tableau
      Transforme les objets et les listes imbriqués en colonnes et en lignes avec pd.json_normalize, et décide ce que représente une ligne.
    • Demander des données à une API web
      Appelle une API avec la bibliothèque requests, vérifie la réponse, gère les clés, les pages et les limites de fréquence, et lis les tableaux des pages web.
  5. Écris des résultats nettoyés au format CSV, compare les formats textuels et binaires, et utilise Parquet pour conserver des données compactes et correctement typées entre les étapes d’analyse.
    • Écrire des DataFrame dans des fichiers CSV et texte
      Maîtrise l’index, les valeurs manquantes, les formats des nombres et des dates ainsi que l’encodage des fichiers écrits, et protège les données brutes.
    • Comparer les formats de stockage textuels et binaires
      Explique les différences entre les formats textuels, les formats binaires orientés par lignes et les formats binaires en colonnes, puis choisis CSV, Excel, JSON, Parquet, Feather, pickle ou une base de données selon la tâche.
    • Lire et écrire des fichiers Parquet
      Enregistre des DataFrame au format Parquet avec leurs types, lis une sélection de colonnes et organise les données en jeu de données partitionné.
  6. Connecte pandas à une base de données, charge les résultats de requêtes avec des paramètres et les bons types, et écris correctement des DataFrame dans des tables.
    • Se connecter à une base de données et charger les résultats de requêtes
      Ouvre une connexion à SQLite ou à une autre base de données, exécute une requête SQL donnée depuis pandas et gère les identifiants et les connexions.
    • Passer des paramètres de requête de manière sûre et maîtriser les types des résultats
      Insère des valeurs dans les requêtes à l’aide de paramètres plutôt que par formatage de chaînes, et obtiens des dates, des entiers et des tailles de blocs corrects dans le résultat.
    • Écrire des DataFrame dans des tables de base de données
      Crée, complète et remplace des tables avec to_sql, choisis les types des colonnes, puis vérifie et répète les écritures correctement.

Charger et stocker des données : cours

6 chapitres

1

Charger des fichiers texte délimités dans pandas

Les fichiers texte peuvent ressembler à des tableaux tout en laissant certains choix importants implicites. Tu vas lire des enregistrements dans pandas, vérifier les lignes et les colonnes obtenues et choisir les options relatives aux en-têtes, aux champs entre guillemets, aux conventions numériques, aux marqueurs de valeurs manquantes et aux dates. Tu vas aussi repérer les observations réelles dans des rapports contenant des titres, des commentaires et des totaux, afin d’obtenir le tableau et les valeurs attendus à la fin de l’importation.

Tu utilises Excel en anglais ? Tape alors des virgules au lieu des points-virgules, et ces noms : SOMME devient SUM.

1.1 Des enregistrements CSV à un tableau vérifié

Un fichier CSV est un texte brut organisé en enregistrements et en champs. Des virgules séparent généralement les champs, et le premier enregistrement fournit souvent les noms des colonnes. Le fichier contient des caractères, pas de schéma pandas : le lire implique donc aussi de décider ce que représentent ces caractères.

Charger et examiner un petit fichier

Supposons qu’un fichier contienne :

order_id,date,region,units,price
1001,2026-03-02,North,3,4.50
1002,2026-03-02,South,1,12.00
1003,2026-03-03,North,2,7.25

Lis-le et examine le résultat :

import pandas as pd

df = pd.read_csv("sales.csv")
print(df.head())
print(df.shape)
print(df.dtypes)
df.info()

La forme est (3, 5) : trois lignes de données et cinq colonnes. pandas infère int64 pour order_id et units, et float64 pour price. La colonne date contient toujours du texte. Dans pandas 3, les colonnes de texte inférées affichent normalement str ; les versions antérieures de pandas affichent souvent object.

Chaque vérification répond à une question différente. head() montre si les champs correspondent à leurs étiquettes. shape révèle des lignes manquantes ou une colonne supplémentaire inattendue. dtypes vérifie l’interprétation, et info() ajoute les nombres de valeurs non manquantes. Si une colonne destinée à contenir des nombres est chargée comme texte, examine les valeurs brutes : une unité, un code de valeur manquante ou une convention décimale différente peut empêcher l’inférence d’un type numérique.

Faire correspondre les étiquettes aux enregistrements

Pour un fichier sans en-tête dont la première ligne est 1001,North,3, utilise :

df = pd.read_csv(
    "orders.txt",
    header=None,
    names=["id", "region", "units"]
)

Sans ce choix, pandas prend le premier enregistrement pour l’en-tête. Ses valeurs deviennent des noms de colonnes et l’enregistrement disparaît des données. Utilise index_col="order_id" lorsqu’une colonne existante doit servir d’index aux lignes. Utilise usecols=["region", "units"] pour ne lire que ces colonnes, ou nrows=1000 pour examiner les 1 000 premières lignes de données avant de charger un gros fichier.

Laisser le lecteur CSV gérer les guillemets

L’enregistrement "Smith, Jane",Boston,10 comporte trois champs. La virgule à l’intérieur du nom entre guillemets fait partie de ce nom. Deux guillemets doubles dans un champ entre guillemets représentent un guillemet double littéral : "O'Neil ""Red""" devient O'Neil "Red". Un champ entre guillemets peut même contenir un saut de ligne : les enregistrements et les lignes physiques ne correspondent donc pas toujours.

L’appel à line.split(",") coupe le nom et ne peut pas gérer ces règles. read_csv les gère pendant l’analyse. pd.read_table utilise la tabulation comme séparateur par défaut ; pd.read_fwf gère les champs définis par des positions de caractères.

Trouver le fichier que Python recherche

Un chemin relatif est résolu à partir du répertoire de travail courant du programme. Si "data/sales.csv" est introuvable, examine ce répertoire avec Path.cwd() après from pathlib import Path. Un chemin absolu, un objet Path, une URL ou un fichier texte en mémoire comme StringIO peut aussi être passé à read_csv. Vérifie l’emplacement avant de modifier les options d’analyse : un fichier manquant et un fichier mal analysé sont deux problèmes différents.

Points clés

  • Un CSV stocke des caractères ; pandas infère les types des colonnes à la lecture.
  • Vérifie les premières lignes, la forme, les types et les nombres de valeurs non manquantes après une importation.
  • Utilise header=None et names lorsque le fichier n’a pas d’en-tête.
  • Les séparateurs et sauts de ligne entre guillemets font partie des champs ; utilise un analyseur CSV.
  • Les chemins relatifs partent du répertoire de travail courant.

1.2 Séparateurs et chargement correct des nombres

Un séparateur de champs sépare les champs ; un séparateur décimal sépare les parties entière et décimale d’un nombre. Un séparateur de milliers groupe les chiffres. Ces trois rôles nécessitent des réglages distincts, même lorsque le même symbole remplit différents rôles selon les fichiers.

Examiner les caractères avant de choisir les options

Regarde quelques lignes brutes dans un éditeur. Une extension .csv ne garantit pas la présence de virgules et .txt n’indique pas la structure. Voici des réglages courants :

Structure du fichierOption de lecture
Champs séparés par des tabulationssep="\t"
Champs séparés par des barres verticales`sep="
Champs séparés par des suites d’espacessep=r"\s+"
Champs séparés par des points-virgulessep=";"

Tu peux examiner le début sans lire tout le fichier :

with open("products.csv", encoding="utf-8") as f:
    print(f.readline())
    print(f.readline())
Étudier une exportation régionale

Considère ce texte :

product;price;qty
Tea;3,50;1.200
Coffee;12,90;850

Les points-virgules séparent les champs, la virgule est le séparateur décimal et le point groupe les milliers. Indique explicitement ces trois conventions à la lecture :

df = pd.read_csv(
    "products.csv",
    sep=";",
    decimal=",",
    thousands="."
)

Les prix deviennent 3,5 et 12,9. Les quantités deviennent 1 200 et 850. Avec la virgule comme séparateur par défaut, cet en-tête ne décrit pas trois colonnes séparées par des virgules. Même après avoir choisi sep=";", le travail n’est pas terminé : les prix restent du texte et "1.200" peut devenir le nombre décimal 1,2. Ce dernier résultat est un nombre valide, mais son sens est erroné : une erreur grave peut donc survenir sans exception d’analyse.

Compare quelques valeurs chargées avec leur texte source et examine describe() pour repérer des plages invraisemblables. Une quantité attendue dans les milliers qui apparaît proche de un indique un possible problème de convention numérique. Modifier uniquement le séparateur ne le corrigera pas.

Distinguer les limites des champs du groupement des nombres

Dans un fichier dont les champs sont séparés par des virgules, un nombre groupé comme "1,234.50" doit être entre guillemets. La virgule à l’intérieur fait partie du nombre. Avec thousands=",", pandas peut lire le champ entre guillemets comme 1 234,5. Sans guillemets, la virgule crée aussi une limite de champ ; thousands ne peut pas rétablir la structure perdue de l’enregistrement.

Choisir un moteur d’analyse syntaxique compatible

Le moteur C par défaut traite rapidement les structures courantes. Le moteur Python prend en charge la détection du séparateur avec sep=None, les séparateurs sous forme d’expressions régulières et skipfooter. La détection examine un échantillon et peut mal choisir sur un rapport irrégulier : indique donc directement un séparateur connu.

Un séparateur de plus d’un caractère est généralement traité comme une expression régulière et nécessite le moteur Python ; r"\s+" est un cas particulier également pris en charge par le moteur C. Le moteur PyArrow peut lire avec des fils d’exécution parallèles, mais prend en charge un ensemble d’options différent. Par exemple, chunksize n’est pas pris en charge avec engine="pyarrow". Choisis le moteur selon les options nécessaires à ton fichier, puis vérifie la structure et les valeurs du résultat.

Points clés

  • Choisis sep, decimal et thousands selon leurs rôles distincts.
  • Un résultat qui ressemble à un nombre peut tout de même être erroné d’un facteur 1 000.
  • Place un champ entre guillemets lorsque son contenu comprend le séparateur.
  • Le moteur Python prend en charge la détection et skipfooter ; les options diffèrent selon le moteur.

1.3 Valeurs manquantes, identifiants et dates

L’inférence de type ne peut pas savoir si 999 est une mesure ou un code indiquant une valeur inconnue. Elle ne peut pas non plus savoir si les zéros initiaux ont un sens. Utilise les définitions des données pour régler les options de lecture avant que l’inférence ne modifie ces valeurs.

Déclarer les marqueurs de valeurs manquantes là où ils s’appliquent

pandas reconnaît les champs vides et les marqueurs intégrés comme "NA", "N/A", "n/a", "NULL", "NaN" et "None". Une source peut utiliser d’autres marqueurs. Supposons que score contienne 88, "n/a", "-" et 999, 999 étant défini comme inconnu :

df = pd.read_csv(
    "scores.csv",
    na_values={"score": ["-", "999"]}
)

La colonne des scores contient maintenant 88,0 et trois valeurs manquantes. Sans déclaration des marqueurs, "-" peut maintenir la colonne sous forme de texte ; une valeur sentinelle numérique non déclarée peut entrer dans les calculs. La moyenne de 88 et 999 est de 543,5, même si le seul score connu est 88.

Un dictionnaire limite un marqueur à sa colonne. Un na_values=["999"] appliqué à tout le fichier supprimerait aussi un code de produit réel 999. Si "NA" est une véritable étiquette, utilise keep_default_na=False pour désactiver la liste des marqueurs intégrés et indique explicitement les marqueurs qui signifient réellement une valeur manquante. Avec ce réglage, inclus "" si les champs vides doivent toujours compter comme manquants.

Préserver les valeurs selon leur rôle

Lis les identifiants comme du texte :

df = pd.read_csv(
    "visits.csv",
    dtype={"site_code": str, "visits": "Int64"}
)

Un code comme "00501" doit conserver ses cinq caractères. Le lire comme un entier donne 501 ; convertir cet entier en texte ensuite produit "501", pas le code d’origine. Utilise un type numérique pour les valeurs avec lesquelles tu fais des calculs.

Les colonnes ordinaires d’entiers NumPy ne peuvent pas contenir NaN : une colonne d’effectifs avec une valeur manquante devient donc souvent float64. Le type nullable "Int64" de pandas, avec un I majuscule, conserve les valeurs entières et représente une valeur manquante par <NA>. dtype_backend="numpy_nullable" demande des types nullables pour l’ensemble du résultat. Pour un petit ensemble d’étiquettes répétées, dtype={"region": "category"} stocke les étiquettes comme catégories et peut réduire l’utilisation de la mémoire.

Préciser l’écriture des dates

Un texte qui ressemble à une date reste du texte tant qu’il n’est pas converti. Pour les dates où le jour vient en premier, comme "03/04/2026" et "13/04/2026", utilise :

df = pd.read_csv(
    "events.csv",
    parse_dates=["day"],
    date_format="%d/%m/%Y"
)

Ces valeurs deviennent le 3 avril et le 13 avril. Sans format, une hypothèse donnant la priorité au mois peut soit inverser des jours et des mois valides, soit empêcher la conversion de la colonne. dayfirst=True exprime une préférence ; un format explicite indique la structure attendue. Les dates ISO comme "2026-04-03" évitent l’ambiguïté entre jour et mois.

Après la lecture, examine dtypes, isna().sum() et le nombre de lignes. Vérifie une date dont l’interprétation distingue les conventions. Si une colonne reste du texte, la conversion n’a pas produit les dates et heures attendues ; une augmentation inattendue du nombre de valeurs manquantes peut révéler qu’une véritable étiquette a été prise pour un marqueur.

Points clés

  • Déclare les marqueurs de valeurs manquantes propres à la source, de préférence par colonne.
  • Utilise keep_default_na=False lorsqu’un marqueur intégré est une donnée réelle.
  • Lis les identifiants composés uniquement de chiffres comme du texte pour préserver les zéros initiaux.
  • Utilise le type nullable Int64 pour les effectifs entiers avec des valeurs manquantes.
  • Donne un format explicite aux dates ambiguës et vérifie leur type de données.
  • Vérifie les nombres de valeurs manquantes par rapport à la source.

1.4 Tableaux dans les rapports et fichiers à largeur fixe

Un rapport peut mêler un tableau à des titres, des lignes vides, des commentaires, des totaux et des notes sur la source. Repère d’abord l’en-tête et les bornes des données. Sinon, un lecteur peut prendre un titre pour des noms de colonnes ou inclure un total comme observation ordinaire.

Lire uniquement le tableau

Un rapport contient ces neuf lignes physiques :

Monthly sales report
Exported 2026-04-01

region,jan,feb
North,120,135
# test row below
South,98,101
Total,218,236
Source: internal system

Les trois premières lignes précèdent l’en-tête. Les deux dernières ne sont pas des observations. Lis-le avec :

df = pd.read_csv(
    "report.csv",
    skiprows=3,
    comment="#",
    skipfooter=2,
    engine="python"
)

Le résultat comporte deux lignes. Le total de janvier est de 218 pour North et South. Conserver la ligne de totaux ajouterait 218 et donnerait 436. Avec les options par défaut, le titre à un champ peut devenir l’en-tête et provoquer une erreur d’analyse à l’arrivée des enregistrements à trois champs.

skiprows=3 compte les trois premières lignes physiques, y compris la ligne vide. Une liste comme skiprows=[0, 2] supprime des lignes à des positions précises, comptées à partir de zéro. Les lignes vides sont ignorées par défaut, et comment="#" supprime le texte des commentaires. skipfooter nécessite le moteur Python. Adapte ces réglages à la structure réelle : un nombre fixe de lignes à ignorer peut devenir incorrect si l’outil d’exportation ajoute une ligne de titre.

Examiner les enregistrements mal formés

Un enregistrement comportant trop de champs peut déclencher on_bad_lines="error", l’option par défaut. "warn" l’ignore avec un avertissement, tandis que "skip" le supprime sans avertissement. Avant de choisir l’une de ces options, examine l’enregistrement brut. Une virgule non placée entre guillemets dans un nom ou un mauvais séparateur peut créer des champs supplémentaires ; ignorer la ligne fait alors perdre une observation valide au lieu de corriger la cause.

Un nombre insuffisant de champs se traite différemment. Sous id,name,score, l’enregistrement 2,Ben est chargé avec un score manquant. Il ne déclenche pas forcément d’erreur. Vérifie les nombres de valeurs manquantes ainsi que le nombre de lignes, et compare les enregistrements conservés à la source lorsque tu exclus des lignes mal formées.

Lire des en-têtes superposés ou des positions de caractères

Deux lignes d’étiquettes de colonnes peuvent former un MultiIndex. Avec les étiquettes de groupes region,sales,sales au-dessus de ,2025,2026, header=[0, 1] produit des étiquettes comme ("sales", "2025"). Si des étiquettes sans hiérarchie conviennent mieux à l’analyse, ignore les deux lignes d’en-tête et fournis names=["region", "sales_2025", "sales_2026"].

Un texte à largeur fixe n’a pas de séparateur. Les bornes des colonnes sont des positions de caractères :

df = pd.read_fwf(
    "readings.txt",
    colspecs=[(0, 4), (4, 11), (11, 16)]
)

Ces intervalles semi-ouverts incluent chaque début et excluent sa fin. Le premier champ occupe les positions de 0 à 3, et le suivant commence à 4. widths=[4, 7, 5] décrit la même structure. L’inférence est pratique pour des échantillons réguliers ; des bornes explicites évitent qu’une valeur courte au début définisse une largeur incorrecte.

Points clés

  • Repère l’en-tête, les observations et le pied de page avant de choisir les options de lignes à ignorer.
  • Les lignes de totaux incluses comme observations peuvent doubler une somme.
  • Ignorer des lignes incorrectes fait perdre des enregistrements ; examine d’abord les champs supplémentaires.
  • Les enregistrements courts peuvent être chargés avec des valeurs manquantes à la fin.
  • Pour ces structures, utilise des en-têtes sur plusieurs lignes ou des bornes explicites de largeur fixe.
2

Lire du texte correctement et efficacement

La correction du texte dépend de la règle utilisée pour décoder ses octets, et l’efficacité de la lecture dépend de ce que le programme conserve en mémoire. Tu vas distinguer les erreurs d’encodage du texte déformé, t’appuyer sur des indices pour choisir un encodage et préserver les caractères pendant les échanges. Tu réduiras ensuite l’utilisation de la mémoire pour les gros fichiers grâce à la sélection des colonnes, à des types adaptés et au traitement par blocs, notamment en combinant correctement les résultats partiels.

2.1 Comment le texte est stocké sous forme d’octets

Un fichier stocke des octets, chacun ayant une valeur de 0 à 255. Un encodage définit comment les caractères sont représentés par ces octets. L’encodage convertit le texte Python en octets ; le décodage reconvertit les octets en texte. Les mêmes octets peuvent représenter des caractères différents selon la règle de décodage.

Compter séparément les caractères et les octets
text = "café"
raw = text.encode("utf-8")
print(len(text))  # 4 characters
print(len(raw))   # 5 bytes
print(raw.decode("utf-8"))  # café

Ici, l’accent ne constitue pas un deuxième caractère visible. La lettre "é" nécessite deux octets en UTF-8 : quatre caractères occupent donc cinq octets. Le nombre d’octets et le nombre de caractères répondent à des questions différentes.

ASCII définit 128 caractères, dont les lettres anglaises de base, les chiffres, la ponctuation et les codes de contrôle. Leurs valeurs d’octet sont identiques en ASCII, UTF-8, Latin-1 et Windows-1252. Ce début commun explique pourquoi un échantillon contenant uniquement du texte anglais peut sembler correct même lorsque le réglage de l’encodage est erroné.

Reconnaître les principales familles d’encodages
EncodageReprésentation du texteIndice utile
UTF-8Un à quatre octets par caractère UnicodeLes lettres ASCII utilisent un octet ; "é" en utilise deux
Latin-1Un octet par caractère de son répertoire limitéChaque valeur d’octet peut être décodée
Windows-1252Un octet par caractère pris en chargeComprend des symboles imprimables supplémentaires comme "€"
UTF-16Généralement deux octets par caractère, quatre pour les autresL’ordre des octets compte

UTF-8 représente tous les caractères Unicode et constitue le choix habituel pour échanger du texte. Latin-1 et Windows-1252 représentent un ensemble plus réduit de caractères. Ils concordent pour de nombreuses lettres accentuées, mais diffèrent sur une partie des valeurs d’octet : Windows-1252 utilise l’octet 0x80 pour "€", là où Latin-1 comporte un caractère de contrôle. Ce ne sont pas deux noms interchangeables pour un même encodage.

Lire correctement les marques d’ordre des octets

Une marque d’ordre des octets, ou BOM, est un marqueur placé au début de certains fichiers. UTF-16 peut commencer par FF FE pour l’ordre avec l’octet de poids faible en premier ou par FE FF pour l’ordre avec l’octet de poids fort en premier. encoding="utf-16" utilise la BOM pour choisir l’ordre. Sans BOM, précise "utf-16-le" ou "utf-16-be" selon la source.

Une BOM UTF-8 est EF BB BF. open(..., encoding="utf-8-sig") de Python la supprime pendant le décodage. Dans open(), le simple "utf-8" la conserve sous la forme \ufeff, qui peut se retrouver sans qu’on s’y attende dans le premier nom d’en-tête. Le lecteur CSV de pandas gère aussi une BOM UTF-8 initiale, mais choisir utf-8-sig rend explicite la convention attendue pour le fichier.

Indiquer explicitement l’encodage
with open("notes.txt", encoding="utf-8") as f:
    text = f.read()

La valeur par défaut de open() dépend de la version de Python et du mode UTF-8. Python 3.11 à 3.14 peuvent utiliser l’encodage des paramètres régionaux ; Python 3.15 active le mode UTF-8 par défaut, avec la possibilité de le désactiver. Un encodage explicite maintient la correspondance entre le script et le format réel du fichier sur tous les ordinateurs. Il empêche aussi qu’un réglage par défaut propre à une plateforme change silencieusement la lecture des mêmes octets.

Points clés

  • L’encodage transforme le texte en octets ; le décodage transforme les octets en texte.
  • Le nombre de caractères et le nombre d’octets peuvent différer.
  • Un échantillon composé uniquement de caractères ASCII peut masquer un mauvais choix d’encodage.
  • Latin-1 et Windows-1252 diffèrent malgré leurs nombreux caractères communs.
  • Utilise la BOM et les informations sur l’ordre des octets pour lire de l’UTF-16.
  • Passe explicitement l’encodage attendu à open().

2.2 Trouver la cause d’un texte déformé

Un mauvais encodage peut provoquer une erreur visible avec UnicodeDecodeError, ou produire silencieusement un texte déformé qui semble lisible, appelé mojibake. Dans les deux cas, le problème vient d’une interprétation des octets selon la mauvaise règle. Conserve le fichier d’origine pour pouvoir le décoder à nouveau.

Diagnostiquer une erreur à partir de la source

Un CSV enregistré en Windows-1252 contient des noms de villes dont "Zürich" et "Málaga". Sa lecture en UTF-8 peut échouer à l’octet 0xfc, utilisé pour "ü" en Windows-1252. Une fois que les paramètres d’exportation de la source confirment son encodage, lis-le avec :

df = pd.read_csv("cities.csv", encoding="cp1252")
print(df["city"].head())

Examine les noms contenant des accents ou des symboles. Un échantillon composé uniquement de caractères ASCII ne permet pas de distinguer ces encodages. Un octet invalide particulier en UTF-8 suggère un ancien encodage possible ; il ne permet pas de déterminer avec certitude lequel a produit le fichier.

Reconnaître une erreur qui n’a pas déclenché d’exception

Des octets UTF-8 décodés en Windows-1252 peuvent transformer "café" en "café" et "São Paulo" en "São Paulo". Le lecteur a produit des caractères sans erreur, mais ce ne sont pas les bons. Relis les octets d’origine en UTF-8 :

df = pd.read_csv("cities.csv", encoding="utf-8")

La recherche et le remplacement corrigent un symptôme visible à la fois et peuvent manquer d’autres lettres endommagées. Ils risquent aussi de modifier une occurrence correcte d’un caractère. Un décodage correct traite la cause pour tout le fichier.

Recueillir des indices sur l’encodage

Commence par la documentation du fournisseur ou ses paramètres d’exportation. Examine un petit échantillon d’octets si nécessaire :

with open("cities.csv", "rb") as f:
    sample = f.read(200)
print(sample)

Le mode binaire préserve les octets sans les décoder. Une BOM peut fournir un indice direct. Un détecteur comme charset-normalizer estime l’encodage probable, mais un échantillon court peut correspondre à plusieurs possibilités. Vérifie le résultat avec des noms accentués et des symboles connus.

Latin-1 attribue un caractère à chaque octet : il peut donc décoder toute suite d’octets sans erreur. Cette réussite ne dit rien à elle seule sur la correction des caractères. Windows-1252 utilise aussi des caractères sur un octet, mais laisse quelques valeurs d’octet non définies et peut déclencher une erreur de décodage.

Éviter de supprimer les indices

encoding_errors="replace" remplace par "�" les octets que le décodeur ne peut pas lire. encoding_errors="ignore" les supprime. Ces options peuvent aider à examiner des données d’entrée endommagées, mais elles font perdre des informations et ne doivent pas remplacer la recherche du bon encodage. Un nom transformé en "Zrich" peut empêcher une correspondance tout aussi sûrement qu’un texte visiblement déformé.

Pour la sortie, UTF-8 prend en charge la plus large gamme de caractères. Certains tableurs le reconnaissent plus sûrement en présence d’une BOM :

df.to_csv("cities_export.csv", index=False, encoding="utf-8-sig")

Rouvre le fichier exporté dans le programme destinataire et examine les mêmes valeurs accentuées. L’objectif est d’obtenir un texte correct aux deux extrémités de l’échange.

Points clés

  • Vérifie les erreurs de décodage et les caractères visiblement déformés.
  • Relis les octets d’origine avec le bon encodage pour corriger le mojibake.
  • Un décodage Latin-1 réussi ne prouve pas que le texte est correct.
  • Les modes de remplacement et d’ignorance font perdre des informations sur les caractères.
  • Utilise UTF-8 avec une BOM lorsque le tableur destinataire en a besoin.

2.3 Lire de gros fichiers sans conserver toutes les lignes

La taille d’un fichier sur disque ne correspond pas à la mémoire qu’il nécessite. pandas construit en mémoire des tableaux, des index et des valeurs textuelles dont les types influent sur l’espace nécessaire. Mesure-le avec df.memory_usage(deep=True) ou df.info(memory_usage="deep") avant de décider comment charger davantage de données.

Réduire les données chargées en mémoire

Lis une sélection de colonnes avec usecols, examine un échantillon initial avec nrows et choisis des types adaptés avec dtype. Une catégorie peut stocker les noms de régions répétés de manière compacte. float32 utilise moins d’espace que float64, mais offre environ sept chiffres significatifs : choisis-le uniquement si cette précision convient aux mesures. Un petit aperçu aide à déterminer les types ; il ne prouve pas que toutes les lignes suivantes ont la même structure.

Traiter les blocs et conserver un résultat réduit

chunksize transforme la valeur renvoyée : au lieu d’un DataFrame, on obtient un itérateur de DataFrame. Pour calculer un total et une moyenne :

total = 0.0
count = 0
with pd.read_csv(
    "measurements.csv",
    usecols=["amount"],
    chunksize=100_000
) as reader:
    for chunk in reader:
        total += chunk["amount"].sum()
        count += chunk["amount"].count()
mean = total / count if count else float("nan")

La boucle conserve une somme cumulée et un nombre cumulé de valeurs non manquantes. Chaque bloc peut être libéré après utilisation. Rassembler tous les blocs dans une liste puis les concaténer rétablit le besoin de mémoire initial ; le traitement par blocs n’économise de la mémoire que si le travail conserve un résultat réduit ou écrit les parties traitées.

Un fichier de dix lignes lu avec chunksize=4 donne des blocs de 4, 4 et 2 lignes. Pour des montants de 1 à 10 avec les régions N, S, E qui se répètent, additionne les totaux régionaux partiels pour obtenir 22 pour N, 15 pour S et 18 pour E. Leur total est de 55.

Combiner les bonnes quantités

Les sommes et les effectifs s’additionnent. Pour combiner les minimums, on prend le plus petit des minimums partiels ; pour les maximums, on prend le plus grand des maximums partiels. Les moyennes nécessitent une pondération, car les blocs peuvent contenir des nombres différents d’observations valides.

Pour les valeurs 1, 2 et 3 dans un bloc et 10 dans un autre, les moyennes des blocs sont de 2 et 10. La moyenne de ces deux moyennes est de 6 : elle attribue le même poids au bloc d’une valeur et à celui de trois valeurs. Additionne plutôt les sommes et les effectifs : un total de 16 pour quatre observations donne une moyenne de 4. Les médianes des blocs ne contiennent pas assez d’informations pour reconstituer une médiane globale.

Lire directement les fichiers compressés

read_csv infère normalement la compression à partir d’extensions reconnues comme .gz, .bz2, .zip, .xz et .zst. Il décompresse pendant la lecture :

with pd.read_csv("measurements.csv.gz", chunksize=100_000) as reader:
    for chunk in reader:
        print(len(chunk))

Une archive ZIP utilisée ainsi doit contenir exactement un fichier de données. df.to_csv("out.csv.gz", index=False) écrit un CSV compressé avec gzip. La compression réduit l’espace disque et la taille du transfert ; elle ne supprime pas la mémoire utilisée par le tableau décodé. Pour des analyses répétées, convertir un jeu de données vérifié en Parquet évite aussi de réanalyser le texte et restitue les types de colonnes stockés.

Points clés

  • Mesure l’occupation mémoire totale et ne lis que les colonnes nécessaires.
  • Les lecteurs par blocs produisent des DataFrame ; conserve des résultats réduits pour économiser la mémoire.
  • Combine les sommes et les nombres de valeurs non manquantes avant de calculer une moyenne globale.
  • Les médianes des blocs ne permettent pas de reconstituer la médiane globale.
  • Le texte compressé est décompressé à la lecture ; un ZIP doit contenir un seul fichier de données.
  • Parquet convient aux jeux de données chargés de manière répétée.
3

Travailler avec des classeurs Excel

Les classeurs mêlent les données à une présentation destinée aux personnes : plusieurs feuilles, des titres, des formules, des étiquettes fusionnées et des formats d’affichage. Tu vas repérer un tableau dans cette structure et distinguer les valeurs stockées de ce qu’une cellule affiche. Tu écriras ensuite des rapports à une ou plusieurs feuilles, maîtriseras les mises à jour d’un classeur existant et vérifieras que les feuilles enregistrées contiennent les lignes et les valeurs attendues.

3.1 Repérer et lire le tableau d’une feuille de calcul

Un classeur Excel peut contenir plusieurs feuilles, des titres et des totaux calculés. Les cellules possèdent des valeurs et des types stockés ainsi qu’une mise en forme d’affichage. Lire une feuille consiste à repérer le tableau de données et à comprendre quelles parties du classeur deviennent des valeurs du DataFrame.

Choisir la feuille et ses bornes
df = pd.read_excel(
    "quarterly.xlsx",
    sheet_name="Q1",
    skiprows=2,
    usecols="A:C",
    nrows=2
)

Supposons que la ligne 1 soit un titre fusionné, que la ligne 2 soit vide, que la ligne 3 contienne region, date et sales, et que les lignes 4 à 5 contiennent les observations. skiprows=2 fait de la ligne 3 l’en-tête ; nrows=2 s’arrête avant le total de la ligne 6. Pour North 1 200 et South 950, la somme des deux observations est de 2 150. Inclure un total mis en cache de 2 150 comme troisième observation doublerait ce montant.

Excel affiche les numéros de ligne à partir de 1 ; les positions des lignes dans pandas commencent à 0. header=2 sélectionne aussi la ligne 3 d’Excel comme en-tête. usecols="A,C,E:F" sélectionne des colonnes distinctes et une plage. L’option par défaut sheet_name=0 lit la première feuille ; un nom sélectionne une feuille précise, et sheet_name=1 sélectionne la deuxième.

sheet_name=None renvoie un dictionnaire qui associe les noms des feuilles à des DataFrame. Sélectionne une clé ou parcours les éléments avec .items() ; le dictionnaire lui-même n’est pas un DataFrame unique. Pour effectuer plusieurs lectures dans un même classeur :

with pd.ExcelFile("quarterly.xlsx") as xf:
    print(xf.sheet_names)
    q1 = pd.read_excel(xf, sheet_name="Q1")
Savoir ce que la cellule stocke réellement

Un pourcentage affiché sous la forme "15%" stocke 0,15. Un nombre affiché sur cinq chiffres peut contenir 2 139, même si l’écran montre "02139". Aucune option de lecture ne peut retrouver un zéro qui n’existe que dans la mise en forme. Stocke les identifiants comme texte dans le classeur et passe aussi dtype={"zip": str} à la lecture ; sinon, pandas peut inférer des entiers même à partir de cellules textuelles composées uniquement de chiffres.

La précision numérique d’Excel est limitée à 15 chiffres significatifs. Un identifiant de 16 chiffres saisi comme nombre peut déjà être endommagé avant sa lecture par Python. Stocke ces valeurs comme texte. Une feuille de calcul comporte au maximum 1 048 576 lignes et 16 384 colonnes : un très grand jeu de données nécessite donc un autre format.

Traiter les formules et les cellules fusionnées avec soin

pandas ne calcule pas les formules. Il lit les résultats mis en cache dans le classeur. Un tableur peut enregistrer des résultats à jour ; un fichier généré par un script peut contenir des résultats en cache manquants, provisoires ou périmés. openpyxl ne calcule pas de résultat, et XlsxWriter écrit normalement un zéro provisoire si aucune valeur ne lui est fournie. Recalcule les valeurs importantes dans pandas ou ouvre et enregistre le classeur dans un tableur avant de te fier à ses totaux mis en cache.

Seule la cellule supérieure gauche d’une plage de cellules fusionnées stocke son étiquette. Une étiquette de pays fusionnée peut donc laisser des cellules vides dans les lignes suivantes. Lorsque la structure confirme que l’étiquette s’applique à ces lignes, df["country"] = df["country"].ffill() la propage vers le bas. Examine les bornes du tableau avant de remplir les cellules.

La lecture nécessite une bibliothèque servant de moteur. openpyxl gère .xlsx et .xlsm ; xlrd gère .xls, pyxlsb gère .xlsb, odf gère .ods et calamine prend en charge plusieurs formats de tableur. Un moteur manquant déclenche une ImportError qui indique la dépendance. Les couleurs, commentaires et autres éléments de mise en forme ne sont pas chargés comme données du DataFrame.

Points clés

  • Sélectionne explicitement la feuille, l’en-tête, les colonnes et les lignes d’observations.
  • sheet_name=None renvoie un dictionnaire de DataFrame.
  • Les valeurs stockées peuvent différer des pourcentages affichés ou des identifiants affichés avec des zéros initiaux.
  • pandas ne calcule pas les formules ; leurs résultats mis en cache peuvent être périmés ou manquants.
  • Les étiquettes fusionnées se trouvent dans la cellule supérieure gauche.
  • Stocke les identifiants longs comme texte avant qu’Excel puisse les arrondir.
  • Installe un moteur de lecture compatible avec le format du classeur.

3.2 Écrire un classeur contenant plusieurs feuilles

Excel est utile lorsque des personnes doivent ouvrir et examiner un rapport dans un tableur. Un DataFrame peut devenir une feuille de calcul, ou plusieurs DataFrame peuvent partager un classeur. Choisis le chemin de destination et les noms des feuilles avant l’écriture pour que chaque tableau soit placé au bon endroit.

Écrire un ou plusieurs tableaux
weather.to_excel(
    "weather.xlsx",
    sheet_name="Weather",
    index=False
)

index=False exclut les numéros de ligne par défaut de la feuille. Sans cette option, ils apparaissent comme une première colonne supplémentaire et peuvent revenir sous la forme "Unnamed: 0" lors d’une lecture ultérieure. Ne conserve un index que s’il contient des étiquettes qui ont un sens et doivent figurer dans le rapport.

Un appel à to_excel avec un chemin écrit un classeur à cet emplacement et remplace un fichier existant. L’appeler une fois pour Weather puis une seconde fois pour Counts au même chemin peut ne laisser que le second tableau. Utilise un seul objet d’écriture pour les deux :

with pd.ExcelWriter("report.xlsx") as writer:
    weather.to_excel(writer, sheet_name="Weather", index=False)
    counts.to_excel(writer, sheet_name="Counts", index=False)

Le gestionnaire de contexte termine l’écriture et ferme le classeur à la fin du bloc. Sa lecture avec pd.read_excel("report.xlsx", sheet_name=None) renvoie un dictionnaire contenant les deux noms de feuilles. L’écriture de fichiers .xlsx nécessite openpyxl ou XlsxWriter.

Mettre à jour une feuille d’un classeur existant

Pour préserver les autres feuilles tout en en remplaçant une, utilise un objet d’écriture en mode ajout :

with pd.ExcelWriter(
    "report.xlsx",
    mode="a",
    engine="openpyxl",
    if_sheet_exists="replace"
) as writer:
    counts.to_excel(writer, sheet_name="Counts", index=False)

if_sheet_exists contrôle ce qui se passe en cas de conflit de noms. "error" arrête l’opération, "new" crée une autre feuille, "replace" remplace la feuille et "overlay" écrit dans ses cellules existantes. L’écriture en superposition n’efface pas les anciennes cellules situées hors du nouveau tableau : une mise à jour plus courte peut donc laisser d’anciennes lignes. Décide si le rapport nécessite un remplacement complet de la feuille ou une écriture en superposition soigneusement positionnée.

Faciliter la réouverture du fichier

Les noms de feuilles sont limités à 31 caractères et ne peuvent pas contenir :, \, /, ?, *, [ ou ]. Un nom court comme "Q1 Summary" convient ; "Q1/Q2" contient une barre oblique interdite. Certains moteurs émettent un avertissement au lieu de s’arrêter pour un nom trop long : choisis donc toi-même des noms compatibles.

startrow et startcol positionnent un tableau à l’aide de décalages comptés à partir de zéro. na_rep donne un marqueur visible aux valeurs manquantes. float_format="%.2f" arrondit les nombres écrits, et autofilter=True ajoute des boutons de filtre à l’en-tête dans pandas 3. Les colonnes de dates et heures sont écrites comme des dates Excel.

L’arrondi en sortie modifie les nombres stockés, pas seulement leur affichage. Conserve séparément un fichier d’analyse avec toutes les décimales lorsqu’un rapport arrondi est nécessaire. Rouvre le classeur et vérifie la liste des feuilles, les dimensions des tableaux et des valeurs représentatives. La lecture Excel est relativement lente et un aller-retour peut modifier les types de données pandas : utilise donc Parquet pour les tableaux d’analyse intermédiaires lorsque la conservation des types compte.

Points clés

  • Utilise un seul ExcelWriter pour placer plusieurs tableaux dans un nouveau classeur.
  • Une écriture avec un chemin remplace un classeur existant.
  • Le mode ajout et if_sheet_exists contrôlent les mises à jour des feuilles existantes.
  • Choisis des noms de feuilles valides et vérifie le classeur après l’avoir rouvert.
4

Obtenir des données à partir de fichiers JSON et d’API web

JSON et les API web fournissent des enregistrements dont la structure ne correspond pas toujours à un tableau. Tu vas analyser et écrire du JSON, choisir une structure de tableau adaptée et aplatir des objets ou des listes imbriqués en gardant à l’esprit ce que représente chaque ligne. Tu vérifieras aussi les réponses HTTP, parcourras les pages et géreras les identifiants et les limites de fréquence, afin que le jeu de données obtenu contienne les enregistrements que tu voulais collecter.

4.1 Objets JSON, tableaux et enregistrements ligne par ligne

JSON stocke les données imbriquées sous forme de texte. Les objets contiennent des paires nom-valeur, les tableaux contiennent des valeurs ordonnées et les chaînes utilisent des guillemets doubles. Les autres valeurs sont les nombres, true, false et null. Le module json de Python convertit cette syntaxe en objets Python avant la construction d’un tableau.

Analyser et écrire du JSON valide
import json

text = '{"station":"Oslo","active":true,"temp_c":[3.5,null,4.0]}'
data = json.loads(text)
print(data["active"])   # True
print(data["temp_c"])   # [3.5, None, 4.0]

Les objets deviennent des dictionnaires, les tableaux deviennent des listes et null devient None. json.loads analyse une chaîne ; json.load lit un fichier ouvert. Les fonctions d’écriture effectuent l’opération inverse : json.dumps renvoie du texte et json.dump écrit dans un fichier.

with open("station.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

ensure_ascii=False laisse lisibles des caractères comme "ü". La valeur par défaut peut écrire le même caractère sous la forme \u00fc ; les deux formes représentent la même chaîne. Un dictionnaire Python affiché n’est pas du JSON : les guillemets simples, True, None et les virgules finales ne sont pas valides dans la syntaxe JSON. Le JSON standard ne comporte pas non plus de NaN. L’encodeur Python l’autorise par défaut, mais allow_nan=False le refuse ; pandas écrit les valeurs manquantes sous la forme null.

Adapter la structure du tableau

Un tableau JSON nécessite une orientation, c’est-à-dire une disposition des lignes, des étiquettes et des valeurs. orient="records" donne un objet par ligne :

[{"city":"Lyon","temp_c":21.5},{"city":"Osaka","temp_c":null}]

L’orientation par défaut d’un DataFrame, "columns", groupe les valeurs sous les noms de colonnes, puis sous les étiquettes de lignes. "split" stocke séparément les colonnes, l’index et les données. Précise une orientation adaptée au programme destinataire au lieu de supposer que tous les tableaux JSON ont la même forme.

from io import StringIO
import pandas as pd

df = pd.read_json(
    StringIO('[{"code":"0042","amount":9.5}]'),
    orient="records",
    dtype={"code": str}
)

Dans pandas 3, une chaîne simple passée à read_json est un chemin : place donc le texte JSON lui-même dans StringIO. Même les chaînes JSON composées uniquement de chiffres peuvent être interprétées comme des nombres ; le type de données explicite préserve "0042".

Utiliser JSON Lines pour des enregistrements séquentiels

JSON Lines contient un objet JSON complet par ligne, sans tableau englobant ni virgule entre les enregistrements :

{"id":1,"amount":9.5}
{"id":2,"amount":12.0}

Lis-le avec pd.read_json(path, lines=True) et écris-le avec df.to_json(path, orient="records", lines=True). Les options chunksize et nrows du lecteur nécessitent lines=True, qui rend les enregistrements accessibles séquentiellement.

Lors de l’exportation des dates, définis date_format="iso" pour obtenir des horodatages ISO lisibles. pandas 3.1 utilise encore par défaut les millisecondes depuis l’origine pour la sortie JSON ordinaire d’un DataFrame, mais cette valeur par défaut va changer. Une sortie explicite des dates évite de dépendre d’un lecteur qui devrait deviner ce que représente un grand entier.

Points clés

  • La syntaxe JSON diffère de celle d’un dictionnaire Python affiché.
  • load et dump utilisent des fichiers ; loads et dumps utilisent des chaînes.
  • Choisis une orientation adaptée à la structure du tableau.
  • Place le texte JSON dans StringIO pour read_json et préserve les types des identifiants.
  • JSON Lines utilise un objet par ligne et permet la lecture par blocs.
  • Utilise une sortie de dates ISO pour échanger des horodatages lisibles.

4.2 Choisir ce que représente une ligne de données imbriquées

Du JSON imbriqué peut décrire une commande, son client et plusieurs articles dans un même objet. Avant de l’aplatir, décide de la granularité : ce que représente une ligne. La granularité détermine quels montants peuvent être additionnés.

Aplatir d’abord les objets imbriqués

Considérons deux commandes. La commande 501 appartient à Ana et contient les articles A1 (quantité 2, prix 3,5) et B7 (quantité 1, prix 10,0). La commande 502 appartient à Ben et contient A1 (quantité 4, prix 3,5). Les informations sur les clients sont des objets imbriqués et les articles sont des listes.

orders = [
    {"order_id": 501,
     "customer": {"name": "Ana", "country": "PT"},
     "items": [{"sku": "A1", "qty": 2, "price": 3.5},
               {"sku": "B7", "qty": 1, "price": 10.0}]},
    {"order_id": 502,
     "customer": {"name": "Ben", "country": "CA"},
     "items": [{"sku": "A1", "qty": 4, "price": 3.5}]}
]
order_rows = pd.json_normalize(orders)

On obtient deux lignes et quatre colonnes : order_id, items, customer.name et customer.country. Les champs imbriqués du client deviennent des colonnes dont les noms sont séparés par des points. Les listes d’articles restent dans des cellules ; la normalisation ne transforme pas automatiquement chaque liste en lignes.

Développer une liste avec les informations de l’objet parent
items = pd.json_normalize(
    orders,
    record_path="items",
    meta=["order_id", ["customer", "name"]]
)

record_path choisit la liste dont les éléments deviennent des lignes. meta copie les valeurs de l’objet parent sur chaque ligne, avec une liste de clés pour un chemin imbriqué. Le résultat comporte trois lignes d’articles : deux pour la commande d’Ana et une pour celle de Ben. Le chiffre d’affaires est égal à la quantité multipliée par le prix : 7,0, 10,0 et 14,0, soit un total de 31,0.

Si les frais de livraison d’une commande sont de 4,00, ils sont répétés sur les deux lignes d’articles de la commande 501. Additionner ces frais répétés donne 8,00 pour une commande. Conserve les montants propres aux commandes dans un tableau des commandes distinct si tu as aussi besoin d’un tableau des articles ; garde order_id pour les relier.

Contrôler les noms et les champs manquants

sep="_" crée des noms comme customer_name. record_prefix="item_" distingue les champs des articles des champs parents de même nom. max_level=0 laisse les dictionnaires imbriqués intacts.

Un champ imbriqué ordinaire absent d’un enregistrement devient une valeur manquante dans sa colonne de sortie. Un champ manquant demandé par meta déclenche une KeyError par défaut ; errors="ignore" autorise les métadonnées manquantes et les remplace par NaN. Une liste manquante nommée par record_path doit toujours être corrigée.

Extraire le contenu des réponses d’API avant de l’aplatir

Une API peut renvoyer une enveloppe contenant count, next et results. Passe data["results"] à pd.json_normalize pour aplatir les enregistrements. Passer l’enveloppe elle-même normalise un objet englobant et laisse sa liste de résultats dans une cellule. Garde les métadonnées de pagination à disposition pour récupérer les pages suivantes, mais construis le tableau d’analyse à partir de la liste réelle des enregistrements.

Points clés

  • Décide si chaque ligne représente un objet parent ou un élément de liste.
  • json_normalize développe les objets imbriqués ; record_path développe une liste choisie.
  • meta répète les champs parents sur chaque ligne enfant.
  • Les montants propres à l’objet parent peuvent être comptés deux fois après le développement d’une liste.
  • Aplatis les enregistrements contenus dans l’enveloppe d’une API plutôt que l’enveloppe elle-même.

4.3 Demander un résultat d’API complet et vérifié

Une API web accepte une requête HTTP à un point de terminaison et renvoie un code de statut, des en-têtes et un corps. De nombreuses API utilisent des corps JSON, mais la réception d’une réponse ne signifie pas qu’elle contient les données ou tous les enregistrements dont tu as besoin.

Envoyer des paramètres et vérifier la réponse
import requests

resp = requests.get(
    url,
    params={"city": "Lima", "units": "metric"},
    timeout=10
)
resp.raise_for_status()
data = resp.json()
df = pd.json_normalize(data["results"])

Ici, url est le point de terminaison documenté de l’API. params encode la chaîne de requête, ce qui permet de traiter correctement les espaces et les caractères spéciaux dans les valeurs. Requests n’a pas de délai d’expiration par défaut. Une seule valeur de délai contrôle l’attente de la connexion et celle de la lecture ; ce n’est pas une durée limite pour le téléchargement complet de la réponse.

Appelle raise_for_status() avant d’utiliser le corps. Cette méthode déclenche une erreur HTTP pour les réponses 4xx et 5xx. Un message d’erreur JSON peut être analysé correctement tout en décrivant une requête échouée ; inversement, une réponse 200 peut contenir du texte non JSON et faire échouer resp.json(). Examine resp.text lorsque le format de la réponse est inattendu.

StatutSignification à examiner
200La requête a réussi
400Les éléments de la requête sont invalides
401Les identifiants sont absents ou invalides
403L’accès est interdit
404La ressource demandée est introuvable
429La fréquence des requêtes est trop élevée
5xxUne erreur s’est produite côté serveur
Garder les identifiants séparément

Utilise la méthode d’authentification documentée par l’API. Pour un jeton d’accès au porteur, lis une clé depuis une variable d’environnement et envoie-la dans un en-tête :

import os

key = os.environ["WEATHER_API_KEY"]
headers = {"Authorization": "Bearer " + key}

Ne place pas les clés dans le code et les notebooks enregistrés. Si une clé a été partagée ou enregistrée dans un dépôt, révoque-la et remplace-la. Une clé donne accès ; masquer ultérieurement une valeur affichée n’annule pas son exposition.

Continuer jusqu’à la lecture de toutes les pages

Suis le mécanisme de page suivante documenté par l’API, qu’il utilise des numéros de page, des décalages ou une URL de page suivante. Collecte les enregistrements de chaque page et arrête-toi à la condition de fin indiquée. Un total de 230 enregistrements à raison de 100 par page nécessite des pages de 100, 100 et 30 enregistrements. La première page peut être parfaitement valide alors que le jeu de données est incomplet.

Compare le nombre collecté au total indiqué lorsqu’il est disponible. Respecte les limites de fréquence : 429 impose d’attendre avant une nouvelle requête, et Retry-After peut préciser le délai. Cet en-tête peut contenir un nombre de secondes ou une date HTTP. Enregistre les réponses brutes pour rendre l’analyse reproductible et éviter de télécharger les mêmes données à chaque réexécution.

Reconnaître d’autres formats de tableaux web

pd.read_html(url) renvoie une liste de DataFrame, un pour chaque tableau HTML correspondant. match="Population" limite les tableaux selon leur texte. La fonction nécessite une dépendance d’analyse HTML comme lxml ou BeautifulSoup avec html5lib. pd.read_xml lit les éléments XML répétés comme des lignes, avec lxml ou parser="etree". Consulte les conditions d’un site avant d’en extraire les données et privilégie un téléchargement officiel ou une API lorsqu’ils sont disponibles.

Points clés

  • Envoie les valeurs de requête avec params et fixe un délai d’expiration explicite.
  • Vérifie le statut HTTP avant d’analyser le corps attendu de la réponse.
  • Conserve les clés dans des variables d’environnement et remplace les clés exposées.
  • Suis la pagination jusqu’à la fin et vérifie le nombre d’enregistrements collectés.
  • Respecte les limites de fréquence et enregistre les réponses brutes pour assurer la reproductibilité.
  • read_html renvoie une liste de tableaux ; XML possède un lecteur distinct.
5

Stocker les données dans le format de fichier approprié

Enregistrer un tableau implique de choisir en fonction de son utilisation suivante. Un collègue peut avoir besoin d’un CSV ou d’un classeur lisible, tandis que ta prochaine analyse nécessite des types exacts et toutes les décimales. Tu vas maîtriser la sortie CSV, comparer les formats d’échange et les formats binaires courants, et utiliser Parquet pour les tableaux typés. Tu sélectionneras aussi des colonnes et des partitions à la lecture et maintiendras la cohérence des fichiers du jeu de données lorsque de nouvelles données seront ajoutées.

5.1 Écrire un CSV sans données supplémentaires involontaires

Une exportation CSV doit préserver les valeurs nécessaires au destinataire et rendre ses conventions explicites. Choisis si l’index des lignes constitue une donnée, comment les valeurs manquantes apparaissent et si la sortie est destinée à une analyse précise ou à un affichage arrondi.

Choisir ce qui devient une colonne
df.to_csv("weather_processed.csv", index=False)

Par défaut, l’index est écrit. Pour un tableau avec un index numéroté ordinaire, cela ajoute un premier champ sans nom ; une lecture ultérieure avec read_csv peut l’afficher sous la forme "Unnamed: 0". index=False exclut ces numéros de ligne. Lorsque l’index contient des étiquettes qui ont un sens, conserve-le et relis-le avec index_col=0.

Les valeurs manquantes deviennent normalement des champs vides. na_rep="NA" les rend visibles, mais le lecteur destinataire doit interpréter correctement ce marqueur. Dans un tableau de villes avec Lyon à 21,5 °C et Osaka à 18,25 °C, une valeur de précipitations manquante pour Osaka doit rester distincte de précipitations nulles.

Adapter la convention textuelle au destinataire
df.to_csv(
    "weather_export.csv",
    index=False,
    sep=";",
    decimal=",",
    na_rep="NA",
    date_format="%Y-%m-%d",
    encoding="utf-8"
)

Les options de séparateur et de décimale produisent des valeurs comme Lyon;21,5;0,0. La sortie de dates ISO évite toute ambiguïté entre le jour et le mois. Utilise encoding="utf-8-sig" lorsque le tableur destinataire a besoin d’une BOM pour reconnaître UTF-8.

float_format="%.1f" écrit une décimale. La valeur 18,25 devient "18.2" avec ce formatage, et les décimales supprimées ne peuvent pas être récupérées depuis le CSV. Garde toutes les décimales dans les données d’analyse ; crée un rapport arrondi distinct si nécessaire.

Vérifier ce qui est conservé après un aller-retour

Le CSV stocke des caractères sans métadonnées sur les types de données pandas. Considérons quatre colonnes : un identifiant "02139", une date et heure, une catégorie ordonnée A < B < C et des entiers nullables avec une valeur manquante. Une lecture CSV par défaut peut renvoyer l’entier 2 139, la date sous forme de texte, de simples étiquettes de catégorie sans leur ordre et des nombres à virgule flottante pour les effectifs.

Une lecture qui se termine sans erreur n’a donc pas forcément restauré le DataFrame d’origine. Conserve les options nécessaires pour reconstituer les données, notamment les identifiants textuels, la conversion des dates et les marqueurs de valeurs manquantes. L’ordre des catégories doit aussi être défini à nouveau. Pour des analyses répétées où ces types comptent, Parquet peut les préserver directement.

Ajouter des enregistrements et protéger les données brutes
df.to_csv(
    "daily_results.csv",
    mode="a",
    header=False,
    index=False
)

Cela ajoute des lignes à un fichier existant. Garde un ordre des colonnes et des conventions cohérents avec ce fichier. Avec header=True, un ajout écrit un autre en-tête au milieu, et la lecture suivante peut le traiter comme un enregistrement. Pour un nouveau fichier, écris l’en-tête une fois avant les ajouts ultérieurs.

Conserve les fichiers reçus ou téléchargés inchangés dans un emplacement réservé aux données brutes. Écris séparément les résultats calculés sous des noms descriptifs. Après avoir rouvert un fichier traité exporté, vérifie son nombre de lignes, ses colonnes, ses valeurs manquantes et des valeurs représentatives, notamment les zéros initiaux et les dates.

Points clés

  • Exclus un index de lignes par défaut avec index=False.
  • Choisis les marqueurs de valeurs manquantes, l’encodage et les conventions numériques selon le destinataire.
  • L’arrondi en sortie supprime définitivement des décimales.
  • Les allers-retours CSV nécessitent des options de lecture explicites pour restaurer les types.
  • Ajoute les données sans répéter les en-têtes et garde les fichiers bruts inchangés.

5.2 Choisir un format selon l’utilisation suivante

Le meilleur format de stockage dépend de la personne ou du programme qui lira ensuite les données et de ce qui doit être conservé pendant l’échange. Un tableau envoyé à un collègue, une réponse d’API imbriquée et un jeu de données d’analyse typé ont des besoins différents.

Comparer le stockage textuel et binaire

Les formats textuels encodent des caractères visibles. CSV est facile à examiner et largement pris en charge ; JSON représente naturellement les objets et tableaux imbriqués. CSV ne possède pas de schéma des types de colonnes, et les types de valeurs JSON ordinaires ne préservent pas tous les types de données pandas. Leur relecture nécessite une analyse et peut demander des choix explicites de types.

Les formats binaires encodent les données pour une lecture directe par des logiciels. Des formats comme Parquet et Feather stockent un schéma décrivant les colonnes et leurs types, ce qui réduit le besoin d’inférer à nouveau les types. La prise en charge des types dépend toutefois du format et du lecteur : des objets Python arbitraires ne deviennent pas portables simplement parce que le fichier est binaire.

Une organisation orientée par lignes conserve ensemble les champs d’un enregistrement. Une organisation en colonnes conserve ensemble les valeurs d’une même colonne. Une analyse a souvent besoin de quelques colonnes sur de nombreuses lignes : les lecteurs de formats en colonnes peuvent donc ignorer les colonnes inutiles. Les valeurs similaires adjacentes se compressent aussi bien. La taille des fichiers et la vitesse dépendent des données ; le résultat de compression d’un tableau n’est pas un rapport fixe valable pour tous les tableaux.

Associer chaque format à une tâche
FormatUtilisation adaptéePoint principal à considérer
CSVÉchange de tableaux simplesReconstituer les types à la lecture
ExcelRapports utilisés dans des tableursLa structure et les limites du tableur comptent
JSONEnregistrements imbriqués et services webChoisir la structure des objets et des tableaux
ParquetJeux de données d’analyse stockésTypé, en colonnes, compressé et largement pris en charge
FeatherÉchange rapide de DataFrameStockage fondé sur Arrow pour les outils compatibles
pickleObjets Python personnels et temporairesLa confiance et la compatibilité des versions comptent
HDF5Plusieurs grands jeux de données scientifiquesOrganisation hiérarchique ; PyTables pour pandas
Base de donnéesRequêtes et mises à jour partagéesConnexions, autorisations et transactions

Parquet est un format ouvert utilisé par pandas, R, Spark et DuckDB. Feather utilise Arrow IPC et convient aux échanges rapides entre Python et R ou entre des étapes locales. to_feather et read_feather permettent cet échange. HDF5 regroupe plusieurs jeux de données dans un fichier ; to_hdf de pandas nécessite PyTables.

Comprendre la limite de confiance de pickle

pickle peut enregistrer des objets Python au-delà des tableaux ordinaires, mais son chargement peut exécuter du code. Ne charge jamais un fichier pickle provenant d’une source non fiable. Utilise-le pour tes propres objets de courte durée et prévois des limites de compatibilité lorsque Python et les bibliothèques évoluent. Par exemple, pandas 3 ne prend plus en charge la lecture de fichiers pickle créés avec des versions de pandas antérieures à 1.0.

Décider selon le résultat attendu

Si un destinataire doit examiner un petit tableau sans outils particuliers, CSV est pratique. S’il a besoin de feuilles de classeur nommées, utilise Excel. Si tu dois préserver les identifiants, les catégories et les types nullables entre les sessions d’analyse, choisis Parquet. Si plusieurs programmes doivent interroger et mettre à jour des enregistrements partagés, une base de données convient mieux que l’échange de copies d’un fichier. Le choix du format dépend de l’utilisation suivante, pas de l’extension du fichier d’entrée d’origine.

Points clés

  • Choisis un format selon le destinataire, la structure des données et la fidélité requise des types.
  • Les formats en colonnes permettent de lire certaines colonnes et offrent une compression utile.
  • Parquet convient aux tableaux d’analyse stockés ; Excel convient aux rapports utilisés dans un tableur.
  • Feather permet des échanges rapides ; HDF5 regroupe des jeux de données scientifiques.
  • Les fichiers pickle non fiables peuvent exécuter du code à leur chargement.
  • Les bases de données permettent des requêtes et des mises à jour partagées.

5.3 Conserver des tableaux typés au format Parquet

Parquet stocke un tableau avec les types de ses colonnes dans un format ouvert en colonnes. Il est utile lorsqu’un DataFrame vérifié doit être chargé plusieurs fois ou transmis à d’autres outils d’analyse. pandas utilise PyArrow pour les exemples ci-dessous.

Écrire et vérifier un aller-retour avec conservation des types
df.to_parquet("sales.parquet", engine="pyarrow")
restored = pd.read_parquet("sales.parquet", engine="pyarrow")
print(restored.dtypes)

Un identifiant textuel "02139", une colonne de dates et heures, une catégorie ordonnée et des entiers nullables peuvent tous conserver leurs types lors de cet aller-retour de pandas à PyArrow puis à pandas. Contrairement à une lecture CSV, il n’est pas nécessaire de deviner le rôle de l’identifiant ni de recréer l’ordre des catégories. Examine les types et des valeurs représentatives lorsque tu utilises un nouveau programme d’écriture ou de lecture.

L’option par défaut index=None stocke un RangeIndex de manière compacte sous forme de métadonnées. Un autre index est écrit comme colonnes et restauré à la lecture. Utilise index=False lorsque l’index n’est pas nécessaire. Ce choix concerne les étiquettes de lignes indépendamment des colonnes ordinaires du tableau.

Lire moins de données et choisir la compression
small = pd.read_parquet(
    "sales.parquet",
    columns=["zip", "amount"]
)

Le lecteur peut récupérer uniquement ces colonnes depuis le stockage. Cela diffère du chargement du tableau entier suivi d’une sélection, car toute la lecture a alors déjà eu lieu. La sélection de colonnes est particulièrement utile pour les tableaux larges.

Snappy est le codec de compression par défaut. compression="zstd" ou "gzip" demande souvent plus de travail à l’écriture en échange d’un stockage plus compact, tandis que compression=None écrit des données non compressées. Mesure ce compromis avec des données représentatives : les étiquettes répétées et les mesures aléatoires ne se compressent pas de la même façon. Installe PyArrow ; le moteur alternatif fastparquet est obsolète dans pandas 3.1.

Organiser un jeu de données en partitions
df.to_parquet(
    "sales_dataset",
    engine="pyarrow",
    partition_cols=["year"],
    index=False
)
recent = pd.read_parquet(
    "sales_dataset",
    filters=[("year", "==", 2026)]
)

La destination est un répertoire contenant des sous-répertoires comme year=2025 et year=2026. La lecture du répertoire charge le jeu de données ; un filtre peut éviter les partitions sans rapport avec la sélection. Avec cette organisation, PyArrow déduit les valeurs de year des noms de répertoires et pandas reçoit généralement une colonne de partition catégorielle.

Choisis une colonne de partition comportant un petit ensemble de valeurs utiles sur lesquelles tu filtres souvent. Un identifiant unique d’enregistrement crée des milliers de minuscules partitions, ce qui augmente le travail sur les fichiers et les répertoires. L’année ou un petit ensemble de régions offre souvent une répartition plus pratique.

Ajouter des données sans corrompre le jeu de données

Un fichier Parquet unique ne permet pas l’ajout de lignes à la manière d’un CSV avec pandas. Écris de nouveaux fichiers ou de nouvelles partitions dans le répertoire du jeu de données, ou lis, combine et réécris un fichier unique. Les fichiers d’un même jeu de données doivent avoir des schémas compatibles. Si l’un stocke un code comme texte et un autre comme entier, le chargement peut échouer ou convertir les valeurs. Définis des types de données cohérents avant d’écrire chaque partie et vérifie qu’une partition ajoutée ne crée pas de copies des mêmes enregistrements déjà présents.

Points clés

  • Parquet préserve les types de colonnes pris en charge avec des lecteurs compatibles.
  • columns ne lit que les colonnes nécessaires ; filters limite les données aux éléments correspondants.
  • Le stockage de l’index est contrôlé séparément de celui des colonnes ordinaires.
  • Partitionne selon quelques valeurs souvent filtrées, en évitant les minuscules fichiers.
  • Ajoute des fichiers au jeu de données avec des schémas compatibles ; n’ajoute pas d’octets à un fichier unique.
6

Lire et écrire des données dans des bases SQL

Le travail avec une base de données associe deux décisions : quel résultat demander et quelle modification enregistrer. Tu vas ouvrir et fermer des connexions, lire dans pandas les résultats de requêtes SQL fournies et lier des valeurs variables sans modifier la structure des requêtes. Tu maîtriseras ensuite les types des résultats et le traitement par blocs, choisiras un mode d’écriture dans une table et vérifieras son effet, notamment la différence entre un chargement complet et un ajout répété.

6.1 Ouvrir une connexion à une base de données et lire un résultat

Une base de données relationnelle stocke des enregistrements dans des tables aux colonnes nommées. Un programme envoie une requête SQL par une connexion et reçoit un résultat que pandas peut transformer en DataFrame. La base peut sélectionner uniquement les données nécessaires avant leur transfert vers Python.

Commencer avec un fichier SQLite
import sqlite3
import pandas as pd

con = sqlite3.connect("shop.db")
try:
    df = pd.read_sql_query(
        "SELECT region, amount FROM sales", con
    )
finally:
    con.close()

SQLite fonctionne sans serveur distinct et stocke une base de données dans un fichier. La connexion crée le fichier s’il n’existe pas : une erreur dans le chemin peut donc ouvrir une nouvelle base vide au lieu de celle attendue. ":memory:" crée une base temporaire en mémoire. La requête ci-dessus renvoie les colonnes region et amount d’une table sales existante ; les noms des colonnes du résultat deviennent les étiquettes du DataFrame.

Le bloc with d’une connexion SQLite gère une transaction, mais ne ferme pas la connexion. Appelle explicitement close() une fois le travail terminé. Un bloc try/finally ferme la connexion même si la lecture déclenche une erreur.

Utiliser un moteur pour une base de données serveur

SQLAlchemy fournit des moteurs pour des systèmes comme PostgreSQL, MySQL et SQL Server, avec un pilote adapté installé. Une URL de connexion indique le dialecte, le pilote, le serveur et la base de données. Conserve-la dans une variable d’environnement :

import os
from sqlalchemy import create_engine

engine = create_engine(os.environ["ANALYSIS_DB_URL"])
try:
    with engine.connect() as conn:
        df = pd.read_sql_query(
            "SELECT region, amount FROM sales", conn
        )
finally:
    engine.dispose()

Le contexte de connexion rend la connexion au pool du moteur. dispose() libère les ressources du pool lorsque le moteur n’est plus nécessaire. Utilise un compte en lecture seule pour l’analyse et conserve les identifiants hors des notebooks et du suivi de versions. Une URL de moteur pour un fichier SQLite local peut être "sqlite:///shop.db".

Choisir le lecteur adapté à l’entrée
LecteurEntrée
read_sql_queryUne requête SQL et une connexion
read_sql_tableUn nom de table et une connexion ou un moteur SQLAlchemy
read_sqlUne requête ou, avec une connexion prise en charge, un nom de table

Avec une connexion sqlite3 simple, passe une requête complète. pd.read_sql("sales", con) envoie sales comme du SQL et échoue ; utilise plutôt pd.read_sql_query("SELECT * FROM sales", con). pandas prend en charge les connexions SQLAlchemy, ADBC et SQLite ; une connexion directe par un pilote quelconque ne constitue pas un substitut pris en charge simplement parce que le pilote peut exécuter du SQL.

Transférer le résultat nécessaire

Une requête qui renvoie une sélection de lignes et de colonnes transfère moins de données que la lecture d’une table entière suivie de la suppression de la majeure partie dans pandas. La requête fournie SELECT SUM(amount) AS total FROM sales renvoie une valeur agrégée, nommée total. La lecture d’un résultat de requête ne modifie pas la table stockée. Après le chargement, vérifie le nombre de lignes et les types comme tu le ferais pour un fichier ; les types déclarés dans la base et les types renvoyés par pandas sont liés, mais ne sont pas identiques.

Points clés

  • SQLite est une base de données locale sur fichier ; les bases serveur nécessitent une connexion et un pilote.
  • Utilise des requêtes complètes avec une connexion SQLite simple.
  • Laisse une requête réduire le nombre de lignes et de colonnes transférées à pandas.
  • Conserve les identifiants séparément et utilise un accès en lecture seule pour l’analyse.
  • Ferme les connexions SQLite et libère les ressources SQLAlchemy.

6.2 Garder les valeurs de requête séparées du SQL

Les valeurs variables doivent être placées dans des paramètres de requête. L’instruction SQL définit l’opération ; les paramètres liés fournissent la région, le seuil ou toute autre valeur utilisée pour cette exécution. Cela préserve la structure de la requête même lorsqu’une valeur contient un guillemet.

Lier les valeurs avec la syntaxe de la connexion

Pour SQLite :

query = "SELECT region, amount, sold_on FROM sales WHERE amount > ? ORDER BY amount DESC"
df = pd.read_sql_query(query, con, params=(70,))

Pour les montants des ventes 120,0 ; 75,5 ; 60,0 et 210,0, cela renvoie 210,0 ; 120,0 et 75,5 par ordre décroissant. Le tuple (70,) contient un élément ; (70) est simplement le nombre 70. SQLite accepte aussi les marqueurs de paramètres nommés, par exemple WHERE region = :r avec params={"r": "North"}.

Les règles des marqueurs de paramètres dépendent de l’interface. psycopg utilise %s ou %(name)s. Avec SQLAlchemy, place une instruction dans text et utilise des paramètres nommés :

from sqlalchemy import text

query = text("SELECT region, amount FROM sales WHERE amount >= :m")
with engine.connect() as conn:
    df = pd.read_sql_query(query, conn, params={"m": 100})

Passe les valeurs par params ; n’utilise pas le formatage Python pour les insérer dans l’instruction.

Comprendre ce que protège le paramétrage

Supposons qu’un code construise une condition avec une chaîne f et une entrée "x' OR '1'='1". La coller entre guillemets transforme la condition en region = 'x' OR '1'='1', ce qui correspond à toutes les lignes. C’est une injection SQL : une valeur est devenue une partie exécutable de la structure de la requête.

Un paramètre lié est comparé comme une seule valeur : cette même chaîne ne correspond donc qu’à une région portant littéralement ce texte. La liaison gère aussi les noms ordinaires contenant des apostrophes sans avoir à construire soi-même leur échappement. La règle s’applique aux entrées provenant de fichiers comme aux formulaires utilisateur.

Les paramètres représentent des valeurs, pas des noms de tables ou de colonnes. Un paramètre à la place d’un nom de table ne sélectionne pas cette table. Lorsqu’un programme a besoin d’un identifiant variable, choisis-le dans une liste fixe contrôlée par le code.

Maîtriser les types du résultat

SQLite stocke souvent les dates comme texte. Demande à pandas de les convertir :

df = pd.read_sql_query(
    "SELECT sold_on, visits FROM observations", con,
    parse_dates=["sold_on"],
    dtype={"visits": "Int64"}
)

La colonne de dates devient une colonne de dates et heures, et une colonne d’effectifs contenant des NULL SQL utilise des entiers nullables au lieu de devenir une colonne à virgule flottante uniquement pour représenter les valeurs manquantes. Examine le résultat pour vérifier la conversion.

Distinguer les blocs de la mise en mémoire tampon du pilote

chunksize=1000 renvoie un itérateur de DataFrame contenant chacun au plus 1 000 lignes. Un résultat de quatre lignes avec chunksize=3 donne des blocs de trois et une ligne. Garde la connexion ouverte pendant leur traitement. Certains pilotes de base de données mettent quand même tout le résultat en mémoire tampon avant que pandas ne produise les blocs ; un curseur côté serveur ou une configuration de lecture en flux peut aussi être nécessaire pour limiter la mémoire utilisée sur l’ensemble du parcours de connexion.

Points clés

  • Lie les valeurs variables avec params en utilisant la forme de marqueur de paramètre propre à l’interface.
  • Un tuple positionnel à une valeur nécessite une virgule finale.
  • Les paramètres empêchent une valeur de modifier la structure de la requête.
  • Choisis les noms variables de tables et de colonnes dans une liste fixe approuvée.
  • Convertis les dates et demande explicitement des types entiers nullables pour les résultats.
  • La taille des blocs pandas ne détermine pas la façon dont le pilote met les données en mémoire tampon.

6.3 Écrire des tables et vérifier la modification voulue

to_sql crée une table de base de données à partir d’un DataFrame ou écrit des lignes dans une table existante. Ses options déterminent si les données existantes sont conservées, si l’index devient une colonne et comment un ensemble d’écritures est validé.

Choisir le comportement pour une table existante
df.to_sql("sales", con, index=False)

L’option par défaut if_exists="fail" arrête l’opération lorsque sales existe déjà. Ne choisis un autre mode que si son effet correspond au chargement voulu :

ModeComportement pour une table existante
failArrêter sans charger dans cette table
appendAjouter des lignes au contenu existant
replaceSupprimer la table et la recréer
delete_rowsSupprimer toutes les lignes, conserver la table, puis insérer

delete_rows est disponible dans pandas 3. Remplacer une table supprime son ancienne définition, notamment les clés, index et contraintes ; les autorisations propres à la base de données peuvent aussi être affectées. Supprimer les lignes conserve la définition, mais efface quand même tous les enregistrements existants. Utilise ce mode pour un rechargement complet voulu, pas lorsque le DataFrame ne contient qu’un nouveau lot.

Définir les colonnes et écrire dans une transaction

Par défaut, l’index du DataFrame est écrit comme colonne. Un index sans nom devient index ; un index nommé conserve son nom. index_label lui donne un nom explicite et index=False l’exclut. Si un identifiant est déjà une colonne ordinaire, écrire les numéros de ligne par défaut n’ajoute généralement aucune information utile.

Avec SQLAlchemy, dtype peut choisir les types de la base de données :

from sqlalchemy import types

with engine.begin() as conn:
    df.to_sql(
        "sales", conn,
        if_exists="append",
        index=False,
        dtype={"sold_on": types.Date()},
        chunksize=1000
    )

engine.begin() valide la transaction si le bloc se termine correctement et l’annule en cas d’exception. Pour une table existante, le schéma stocké continue de déterminer quelles valeurs peuvent être insérées ; dtype n’est pas une commande de modification de ses colonnes. Les garanties de transaction dépendent aussi de la prise en charge des opérations utilisées par la base de données. L’ajout dans une transaction SQLAlchemy regroupe les insertions de l’exemple.

chunksize regroupe les lignes en lots. method="multi" place plusieurs lignes dans une instruction INSERT lorsque cette option est prise en charge. Elle peut améliorer ou réduire les performances selon la base de données et la taille des lots : mesure-les donc avec des données représentatives.

Vérifier l’augmentation, pas seulement la fin de l’opération
check = pd.read_sql_query("SELECT COUNT(*) AS n FROM sales", con)
print(check["n"].iloc[0])

Pour une table nouvelle ou entièrement rechargée, compare le nombre à len(df). Pour un ajout, compare l’augmentation : une table de quatre lignes qui reçoit deux lignes doit en contenir six. Le nombre de lignes renvoyé par to_sql provient du pilote ; vérifie directement les données stockées.

Exécuter deux fois un ajout répète les enregistrements, sauf si la base refuse les doublons ou si le programme ne sélectionne que les nouveaux enregistrements. Décide si l’opération est un rechargement complet ou un ajout de nouveaux enregistrements avant de la relancer. Une transaction empêche un chargement partiel en cas d’échec ; elle ne rend pas uniques les ajouts répétés qui réussissent.

Points clés

  • append ajoute des lignes ; replace supprime la table ; delete_rows conserve sa définition.
  • Utilise index=False sauf si l’index fait partie des données à stocker.
  • Utilise une transaction SQLAlchemy pour valider ou annuler un chargement dans son ensemble.
  • Vérifie un ajout en contrôlant l’augmentation attendue du nombre de lignes stockées.
  • Répéter un ajout réussi peut dupliquer des enregistrements.
  • Les performances selon la taille des lots et l’utilisation d’un INSERT à plusieurs lignes dépendent de la base de données.

Charger et stocker des données : exemples

6 Leçons Interactives

1

Construire un tableau fiable à partir de texte

17 étapes
Pars des enregistrements bruts pour obtenir un DataFrame vérifié, en choisissant les en-têtes, les formats numériques, les types et les bornes du rapport.
  1. 1
    IntroductionLire la structure avant les valeurs

    Une exportation textuelle laisse des choix importants à son lecteur. Une virgule peut séparer des champs ou figurer dans un nom entre guillemets ; un nombre peut être une mesure ou un identifiant.

    Tu vas d’abord établir les enregistrements et les colonnes, puis interpréter leurs valeurs et enfin supprimer les éléments du rapport situés hors du tableau. Examine le résultat après chaque décision afin qu’une lecture réussie ne masque pas des données modifiées.

  2. 2
    ExempleCharger trois enregistrements de ventes

    Le fichier des ventes comporte un en-tête et trois observations :

    order_id,date,region,units,price
    1001,2026-03-02,North,3,4.50
    1002,2026-03-02,South,1,12.00
    1003,2026-03-03,North,2,7.25
    

    df = pd.read_csv("sales.csv") produit la forme (3, 5). units est une colonne d’entiers et price une colonne à virgule flottante. Les chaînes qui ressemblent à des dates doivent encore être converties.

  3. 3
    ExplicationDonner un objectif à chaque vérification

    Utilise head() pour vérifier que les champs se trouvent sous les noms attendus, shape pour comparer les dimensions et dtypes pour examiner leur interprétation. info() ajoute les nombres de valeurs non manquantes.

    Si une colonne numérique est du texte, examine les valeurs brutes à la recherche de marqueurs ou de conventions numériques. Si un fichier est introuvable, vérifie le répertoire de travail courant : modifier les options des colonnes ne peut pas corriger un chemin relatif qui pointe au mauvais endroit.

  4. 4
    DéfiConserver la première observation

    Un fichier sans en-tête commence par V12,South,6 et contient 40 observations. Une lecture par défaut donne 39 lignes avec ces trois valeurs comme étiquettes. Quelle modification de la lecture conserve toutes les observations et fournit des noms utiles ?

    ---reveal---

    Utilise header=None, names=["site", "region", "units"]. Le premier enregistrement reste une donnée : la forme attendue est donc (40, 3). Fournir des noms de remplacement avec header=0 consommerait quand même ce premier enregistrement.

  5. 5
    Point cléLes guillemets définissent la limite du champ

    L’enregistrement "Smith, Jane",Boston,10 comporte trois champs. La virgule à l’intérieur des guillemets fait partie du nom. Un guillemet doublé dans un champ entre guillemets représente un guillemet littéral.

    Les champs entre guillemets peuvent aussi contenir un saut de ligne. Laisse read_csv interpréter les enregistrements : découper chaque ligne physique sur les virgules peut créer de fausses colonnes et de faux enregistrements.

  6. 6
    ExempleRepérer trois symboles différents

    L’exportation des produits contient Tea;3,50;1.200. Un point-virgule sépare les champs, une virgule marque la partie décimale du prix et un point groupe les chiffres de la quantité.

    df = pd.read_csv(
        "products.csv", sep=";",
        decimal=",", thousands="."
    )
    

    Les valeurs obtenues sont un prix de 3,5 et une quantité de 1 200. L’option de séparateur seule ne définit pas la convention numérique.

  7. 7
    DéfiRepérer une erreur d’échelle silencieuse

    Une exportation séparée par des points-virgules indique que les quantités sont des unités entières. La quantité brute est "6.400", mais une lecture utilisant seulement sep=";" donne 6,4. Quelle option numérique et quelle valeur attendue corrigent l’interprétation ?

    ---reveal---

    Utilise thousands="." pour interpréter le point comme un séparateur de milliers et obtenir 6 400. La valeur 6,4 est numériquement valide si le point est interprété comme séparateur décimal : cette erreur peut donc survenir sans exception. Compare les valeurs chargées à la source.

  8. 8
    ConseilAdapter le moteur aux options nécessaires

    Le moteur C habituel traite rapidement les fichiers courants. Le moteur Python prend en charge la détection du séparateur, les séparateurs généraux sous forme d’expressions régulières et l’exclusion des pieds de page. sep=None peut détecter un séparateur, mais peut se tromper sur des rapports irréguliers.

    Indique un séparateur que tu connais déjà. Sélectionne engine="python" lorsque tu utilises skipfooter ; le moteur PyArrow a ses propres limites d’options, notamment l’absence de prise en charge de chunksize.

  9. 9
    ExempleDéfinir les marqueurs de valeurs manquantes par colonne

    Les valeurs des scores sont 88, "n/a", "-" et 999. Les deux dernières sont documentées comme marqueurs de valeurs manquantes.

    df = pd.read_csv(
        "scores.csv",
        na_values={"score": ["-", "999"]}
    )
    

    La colonne des scores contient alors 88,0 suivi de trois valeurs manquantes. Limite la règle à score afin qu’un 999 légitime dans une autre colonne reste une donnée. Une valeur sentinelle non déclarée peut fausser les totaux et les moyennes.

  10. 10
    ExplicationPréserver les codes et interpréter les dates

    Un identifiant comme "00501" doit être stocké comme texte, tandis que les effectifs comportant des valeurs manquantes peuvent utiliser le type nullable "Int64". Les dates nécessitent elles aussi une interprétation.

    df = pd.read_csv(
        "visits.csv",
        dtype={"code": str, "visits": "Int64"},
        parse_dates=["day"], date_format="%d/%m/%Y"
    )
    

    Le format explicite fait de "03/04/2026" le 3 avril. Examine ensuite les types de données pour confirmer que la conversion demandée a bien eu lieu.

  11. 11
    DéfiPréserver une étiquette réelle et une valeur manquante

    Dans un CSV, la zone "NA" est une étiquette réelle. Un champ visits vide signifie que la valeur est manquante et les effectifs connus sont des entiers. Quels choix de valeurs manquantes et de type préservent ces sens ?

    ---reveal---

    Utilise keep_default_na=False, na_values={"visits": [""]}, dtype={"visits": "Int64"}. L’étiquette de zone est conservée, tandis que les champs de visites vides deviennent des valeurs manquantes dans une colonne d’entiers. Laisser les marqueurs par défaut activés supprimerait aussi l’étiquette réelle "NA".

  12. 12
    ExempleRepérer le tableau du rapport

    Un rapport comporte trois lignes avant son en-tête, un commentaire # dans son corps, puis des observations suivies d’un total et d’une note sur la source.

    df = pd.read_csv(
        "report.csv", skiprows=3, comment="#",
        skipfooter=2, engine="python"
    )
    

    Les lignes de titre, le commentaire et le pied de page sont exclus. Si la somme des observations de janvier est de 218, conserver une ligne de total de 218 donnerait à tort une somme de colonne de 436.

  13. 13
    Point cléTout enregistrement incorrect ne déclenche pas une erreur

    Des champs supplémentaires peuvent déclencher une erreur de ligne mal formée. Un nombre insuffisant de champs peut au contraire produire des valeurs manquantes à la fin : sous id,name,score, l’enregistrement 2,Ben est chargé sans score.

    Ignorer les enregistrements mal formés supprime aussi leurs observations. Vérifie séparément le nombre de lignes et les nombres de valeurs manquantes, et recherche un séparateur incorrect ou un champ non placé entre guillemets avant de décider de supprimer des enregistrements.

  14. 14
    DéfiBien repérer les positions

    Une exportation à largeur fixe attribue les positions 0 à 2 à un code, 3 à 9 à un nom et 10 à 14 à une valeur. Quels colspecs correspondent à ces champs ?

    ---reveal---

    Utilise [(0, 3), (3, 10), (10, 15)]. Chaque intervalle inclut son début et exclut sa fin, ce qui donne des largeurs de 3, 7 et 5. Utiliser les bornes finales 2, 9 et 14 supprimerait le dernier caractère de chaque champ, car ces bornes sont exclues.

  15. 15
    ExplicationChoisir des étiquettes hiérarchiques ou simples

    Lorsque deux lignes d’en-tête décrivent des groupes et des années, header=[0, 1] crée des étiquettes de colonnes à deux niveaux. Une colonne de ventes peut alors être désignée par ("sales", "2026").

    Si l’analyse nécessite des noms ordinaires sans hiérarchie, ignore les deux lignes d’en-tête et fournis des noms comme "region", "sales_2025" et "sales_2026". Vérifie qu’aucun des deux en-têtes n’a été conservé parmi les observations.

  16. 16
    DéfiCombiner les choix de structure et d’interprétation des valeurs

    Une exportation comporte une ligne de titre, puis l’en-tête code;amount;day. Un enregistrement est 00018;2.100,50;11/12/2026. Les montants utilisent le point pour grouper les milliers et la virgule décimale ; les dates indiquent le jour en premier. Donne les options de lecture essentielles.

    ---reveal---

    Utilise skiprows=1, sep=";", thousands=".", decimal=",", dtype={"code": str}, parse_dates=["day"], date_format="%d/%m/%Y". L’enregistrement conserve le code "00018", le montant 2 100,5 et la date du 11 décembre.

  17. 17
    RécapitulatifVérifier le sens des données importées

    Détermine d’abord les limites des enregistrements, les en-têtes et les bornes du tableau. Définis ensuite les conventions numériques, les marqueurs de valeurs manquantes, les types des identifiants et les dates.

    Examine les dimensions et les types, compare certaines valeurs brutes et vérifie les valeurs manquantes et les totaux. Un analyseur peut terminer sans erreur tout en perdant un zéro initial, en inversant une date ou en comptant un total de rapport comme une observation. Ces vérifications indiquent si le tableau importé a le même sens que le fichier.

2

Décoder le texte et le traiter par blocs

13 étapes
Diagnostique les caractères endommagés, puis traite les données d’entrée volumineuses ou compressées sans conserver tout le jeu de données.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDeux problèmes de lecture distincts
  2. 2
    ExempleSuivre la transformation d’un caractère en octets
  3. 3
    ExplicationUtiliser les marqueurs et la documentation
  4. 4
    DéfiInterpréter la signature
  5. 5
    ExempleCorriger l’interprétation d’origine
  6. 6
    ConseilNe pas effacer les caractères illisibles
  7. 7
    DéfiPrivilégier les indices à l’absence d’erreur
  8. 8
    ExplicationMesurer le tableau chargé
  9. 9
    ExempleConserver une somme et un effectif cumulés
  10. 10
    DéfiDonner le même poids aux observations
  11. 11
    Point cléLa compression et le traitement par blocs répondent à des coûts différents
  12. 12
    DéfiConserver le gain de mémoire
  13. 13
    RécapitulatifGarder des octets et des résultats partiels fiables
3

Lire un classeur et construire un rapport clair

11 étapes
Repère les observations des feuilles de calcul, comprends les valeurs stockées dans les cellules et enregistre plusieurs tableaux sans perdre de feuilles.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionSéparer le tableau de sa présentation
  2. 2
    ExempleSélectionner les observations dans Q1
  3. 3
    ExplicationLire la valeur stockée
  4. 4
    Point cléUne formule n’est pas une demande de calcul
  5. 5
    DéfiExpliquer deux cellules suspectes
  6. 6
    ConseilVérifier l’ensemble des feuilles
  7. 7
    ExempleÉcrire deux feuilles avec un seul objet d’écriture
  8. 8
    ExplicationChoisir comment modifier une feuille existante
  9. 9
    DéfiÉviter de laisser d’anciennes lignes
  10. 10
    DéfiConstruire un rapport à partir de plusieurs feuilles sources
  11. 11
    RécapitulatifVérifier le classeur à la lecture et à l’écriture
4

Transformer des enregistrements d’API en tableau de granularité adaptée

16 étapes
Analyse du JSON, développe les enregistrements imbriqués et collecte les résultats complets d’une API en vérifiant chaque étape.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDu texte de la réponse aux observations
  2. 2
    ExempleConvertir les valeurs JSON en Python
  3. 3
    ExplicationChoisir explicitement une structure de tableau
  4. 4
    DéfiPréserver un identifiant JSON
  5. 5
    ConseilRendre le JSON échangé lisible et valide
  6. 6
    ExempleCommencer avec une ligne par commande
  7. 7
    ExempleDévelopper la liste choisie
  8. 8
    Point cléAdapter les totaux à la granularité des lignes
  9. 9
    DéfiGarder visible un objet parent sans élément
  10. 10
    ExempleVérifier le statut avant de construire un tableau
  11. 11
    ConseilProtéger l’accès et respecter les délais d’attente
  12. 12
    DéfiTenir compte de toutes les pages
  13. 13
    ExplicationExtraire les enregistrements et examiner les valeurs manquantes
  14. 14
    LienReconnaître un autre format web
  15. 15
    DéfiSéparer la collecte de la normalisation
  16. 16
    RécapitulatifVérifier chaque étape dans l’ordre
5

Choisir ce que ton fichier enregistré préserve

13 étapes
Maîtrise les exportations CSV, compare les choix de stockage et lis les parties utiles d’un jeu de données Parquet typé.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionEnregistrer pour le prochain lecteur
  2. 2
    ExempleÉcrire les champs CSV voulus
  3. 3
    Point cléUne exportation peut faire perdre de la précision et des types
  4. 4
    DéfiAjouter uniquement des enregistrements
  5. 5
    ExplicationLire des colonnes sans lire tous les champs
  6. 6
    LienAssocier les formats aux activités
  7. 7
    DéfiChoisir la portabilité et la confiance
  8. 8
    ExempleÉcrire et lire un tableau typé
  9. 9
    ExempleUtiliser une répartition utile en répertoires
  10. 10
    DéfiÉviter des milliers de petites partitions
  11. 11
    ConseilAjouter des fichiers avec des types compatibles
  12. 12
    DéfiConserver un rapport et un jeu de données d’analyse
  13. 13
    RécapitulatifVérifier les propriétés nécessaires pour la suite
6

Lire les résultats de requêtes et vérifier les écritures dans les tables

14 étapes
Gère les connexions, lie les valeurs, maîtrise les types des résultats et stocke un lot en vérifiant son effet dans la base de données.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionUne lecture renvoie des données ; une écriture les modifie
  2. 2
    ExempleLire une base de données SQLite locale
  3. 3
    ExplicationGérer la durée de vie du moteur et des connexions
  4. 4
    DéfiEnvoyer une requête au lieu d’un nom de table
  5. 5
    ExempleLier un seuil variable
  6. 6
    Point cléUne valeur ne peut pas devenir une syntaxe de requête
  7. 7
    DéfiPréserver les types et la séparation des paramètres
  8. 8
    ConseilTraiter les blocs pendant que la connexion est ouverte
  9. 9
    ExplicationDécider du sort des enregistrements existants
  10. 10
    ExempleAjouter des lignes dans une transaction
  11. 11
    DéfiVérifier la modification et la réexécution
  12. 12
    ConseilVérifier directement les résultats stockés
  13. 13
    DéfiConserver la définition et remplacer un instantané
  14. 14
    RécapitulatifAdapter l’appel à son effet sur la base de données

Charger et stocker des données : QCM

50 Questions Pratiques en 5 séries

Série 1 : Lire les données et vérifier leur sens10 Questions Pratiques

Question 1 sur 10

Un fichier sans en-tête commence par S14,East,8. Comment faut-il le lire pour que cet enregistrement reste une donnée ?
  1. header=0, names=["site", "zone", "count"]
  2. header=None, names=["site", "zone", "count"]
  3. header=1, names=["site", "zone", "count"]
  4. skiprows=1, names=["site", "zone", "count"]
Afficher la réponseMasquer la réponse
Réponse : B
header=None indique qu’il n’y a pas de ligne d’étiquettes, tandis que names fournit les étiquettes séparément. Utiliser header=0 consommerait le premier enregistrement comme en-tête, même si des noms de remplacement sont fournis. La ligne commençant par S14 doit rester parmi les observations.

Question 2 sur 10

Un fichier séparé par des points-virgules contient sensor;distance_m suivi de R8;2.450,75. Comment obtenir la distance 2 450,75 ?
  1. sep=";", decimal=".", thousands=","
  2. sep=",", decimal=",", thousands="."
  3. sep=";", decimal=",", thousands=" "
  4. sep=";", decimal=",", thousands="."
Afficher la réponseMasquer la réponse
Réponse : D
Le point-virgule sépare les champs, la virgule marque la partie décimale et le point groupe les milliers. Ces réglages convertissent la distance en 2 450,75. Inverser les réglages de décimale et de groupement ne correspond pas au nombre source, même si le séparateur de champs est correct.

Question 3 sur 10

En UTF-8, chaque lettre ASCII utilise un octet et "é" en utilise deux. Combien d’octets encodent "été" ?
  1. 5 octets
  2. 3 octets
  3. 4 octets
  4. 6 octets
Afficher la réponseMasquer la réponse
Réponse : A
Les deux lettres accentuées utilisent chacune deux octets et la lettre ASCII "t" en utilise un, soit cinq octets. Compter trois mesure les caractères, pas leur taille une fois encodés. Cette distinction compte pour examiner des octets stockés ou diagnostiquer un problème d’encodage.

Question 4 sur 10

Une feuille de calcul comporte un titre à la ligne 1, une ligne 2 vide, des étiquettes à la ligne 3, trois observations aux lignes 4 à 6 et un total à la ligne 7. Quelles options de lecture isolent les observations ?
  1. skiprows=3, nrows=3
  2. skiprows=2, nrows=4
  3. skiprows=2, nrows=3
  4. skiprows=1, nrows=3
Afficher la réponseMasquer la réponse
Réponse : C
Ignorer deux lignes place la troisième ligne de la feuille comme en-tête, puis nrows=3 lit les trois observations. En ignorer trois consommerait la première observation comme étiquettes avec le comportement par défaut de l’en-tête. Lire quatre lignes de données inclurait aussi le total comme observation.

Question 5 sur 10

Un journal contient un objet JSON complet sur chaque ligne, sans tableau englobant. Quelle option de lecture pandas correspond à cette structure ?
  1. orient="split"
  2. lines=False
  3. lines=True
  4. orient="index"
Afficher la réponseMasquer la réponse
Réponse : C
lines=True indique à pandas d’analyser des enregistrements JSON distincts ligne par ligne. Modifier l’orientation seule ne transforme pas des objets successifs en un document JSON ordinaire. Le format par lignes permet aussi une lecture par blocs lorsqu’un journal volumineux doit être traité par parties.

Question 6 sur 10

Une réponse possède les clés count, next et results ; chaque élément de results est un enregistrement imbriqué de matériel. Que faut-il passer à json_normalize pour obtenir un tableau du matériel ?
  1. data["results"]
  2. data
  3. data["count"]
  4. data["next"]
Afficher la réponseMasquer la réponse
Réponse : A
La valeur results contient les enregistrements d’observations : normaliser cette liste produit donc des lignes de matériel et développe les champs des objets imbriqués. Normaliser toute l’enveloppe produit au contraire une ligne pour l’objet englobant et laisse la liste des enregistrements dans une cellule. Conserve les autres champs pour vérifier la collecte et gérer la pagination.

Question 7 sur 10

Un CSV réimporté contient une nouvelle colonne "Unnamed: 0" qui ne comporte que les anciens numéros de ligne par défaut. Quelle modification de l’exportation évite cela ?
  1. Utiliser header=False.
  2. Utiliser na_rep="0".
  3. Utiliser mode="a".
  4. Utiliser index=False.
Afficher la réponseMasquer la réponse
Réponse : D
Par défaut, l’outil d’écriture CSV inclut l’index du DataFrame : ses numéros de ligne sans nom reviennent donc comme colonne supplémentaire. index=False exclut ces étiquettes. Désactiver l’en-tête supprime les véritables noms de colonnes et ne résout pas le problème du champ d’index indésirable.

Question 8 sur 10

Une équipe a besoin d’un fichier largement pris en charge pour des analyses répétées, qui préserve une catégorie ordonnée et des effectifs nullables. Quel format convient le mieux ?
  1. Texte CSV
  2. Parquet
  3. Enregistrements JSON
  4. Classeur Excel
Afficher la réponseMasquer la réponse
Réponse : B
Parquet stocke les types de colonnes et les métadonnées pris en charge, ce qui permet à ces types pandas de survivre à un aller-retour compatible. CSV préserve les valeurs visibles, mais perd l’ordre des catégories et les métadonnées des entiers nullables. Excel est utile pour les rapports dans un tableur, mais peut aussi modifier les types pandas à la relecture.

Question 9 sur 10

Une base de données comporte une table readings existante et con est une connexion SQLite simple. Quel appel la récupère sous forme de DataFrame ?
  1. pd.read_sql("readings", con)
  2. pd.read_sql_table("readings", con)
  3. pd.read_sql_query("readings", con)
  4. pd.read_sql_query("SELECT * FROM readings", con)
Afficher la réponseMasquer la réponse
Réponse : D
Une requête SQL complète est exécutable par la connexion SQLite et son résultat devient un DataFrame. Un nom de table seul n’est pas une requête avec ce type de connexion. read_sql_table nécessite une connexion SQLAlchemy plutôt qu’une connexion sqlite3 simple.

Question 10 sur 10

Une requête SQLite contient WHERE site = ?. Comment faut-il passer la seule valeur "West" ?
  1. params=("West",)
  2. params=("West")
  3. params={"site": "West"}
  4. params="West"
Afficher la réponseMasquer la réponse
Réponse : A
Un marqueur de paramètre positionnel SQLite nécessite une séquence de valeurs ; la virgule finale en fait un tuple à un élément. Sans cette virgule, les parenthèses laissent une chaîne ordinaire. Un dictionnaire nommé s’utilise avec un marqueur nommé correspondant, comme :site, plutôt qu’avec le point d’interrogation utilisé ici.
Série 2 : Préserver les valeurs entre fichiers et connexions10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Dans un CSV, "NA" est une étiquette de zone valide et un effectif vide signifie que la valeur est manquante. Quelle configuration préserve ces deux sens ?
  1. keep_default_na=True, na_values={"count": [""]}
  2. keep_default_na=False, na_values={"zone": ["NA"]}
  3. keep_default_na=False, na_values={"count": [""]}
  4. keep_default_na=True, na_values={"zone": ["NA"]}
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un en-tête CSV comporte quatre champs. Un enregistrement ultérieur n’en fournit que trois et se charge sans erreur. Que faut-il vérifier ?
  1. Le nombre de valeurs manquantes de la dernière colonne et cet enregistrement brut.
  2. Le nombre de valeurs manquantes seulement, sans examiner la structure source.
  3. Les seuls avertissements de lignes rejetées pour cet enregistrement court.
  4. Le nombre total de lignes, pour vérifier si les données sont complètes.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un nom source en UTF-8 apparaît sous la forme "André" après une lecture en Windows-1252. Quelle correction convient ?
  1. Relire le tableau modifié en Latin-1.
  2. Remplacer chaque caractère non ASCII par un espace.
  3. Enregistrer le tableau déformé avec une BOM UTF-8.
  4. Relire le fichier d’origine en UTF-8.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un bloc contient les valeurs non manquantes 2, 6 et 10 ; un second contient 18. Quelle est la moyenne globale ?
  1. 12
  2. 9
  3. 6
  4. 18
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Deux tableaux doivent être enregistrés dans des feuilles distinctes d’un même nouveau classeur. Quelle méthode d’écriture conserve les deux ?
  1. Appeler to_excel deux fois avec le même chemin de fichier.
  2. Écrire les deux dans un même contexte ExcelWriter.
  3. Écrire le second tableau avec header=False à ce chemin.
  4. Ouvrir un nouvel objet d’écriture en mode écriture pour chaque tableau.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une API indique 275 enregistrements correspondants et renvoie des pages d’au plus 80 enregistrements. Combien de requêtes sont nécessaires pour collecter le résultat complet ?
  1. 4 requêtes
  2. 3 requêtes
  3. 5 requêtes
  4. 275 requêtes
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un jeu de données Parquet est partitionné en répertoires par année. Une analyse nécessite uniquement les enregistrements de 2024 et deux colonnes. Quelle lecture utilise ces deux possibilités ?
  1. pd.read_parquet(path, columns=["year"], filters=[("site", "==", 2024)])
  2. pd.read_parquet(path, columns=["site", "value", "year"])
  3. pd.read_parquet(path, filters=[("year", "!=", 2024)])
  4. pd.read_parquet(path, columns=["site", "value"], filters=[("year", "==", 2024)])
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une connexion SQLite est utilisée dans with con:. Que faut-il encore faire après le travail sur la base de données ?
  1. Recréer la connexion pour valider la transaction.
  2. Libérer le pool de connexions.
  3. Fermer explicitement la connexion.
  4. Rouvrir la connexion pour libérer la transaction.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un résultat SQLite contient des dates ISO sous forme de texte dans day et des effectifs entiers avec NULL dans n. Un script doit sélectionner un site fourni à l’exécution sans modifier la structure de la requête. Quelle combinaison convient ?
  1. Insérer le site par formatage dans le SQL, convertir day et définir n comme Int64.
  2. Lier le site avec params, garder day comme texte et imposer int64 à n.
  3. Lier le site avec params, convertir day et définir n comme Int64.
  4. Lier un nom de table avec params, convertir day et définir n comme Int64.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une table contient 32 lignes. Un lot de cinq lignes est ajouté, puis ajouté à nouveau après une première exécution réussie. Aucune contrainte d’unicité ne le rejette. Quels nombre et conclusion conviennent ?
  1. 42 lignes ; des réexécutions réussies peuvent dupliquer le lot.
  2. 37 lignes ; le second ajout remplace le premier lot.
  3. 42 lignes ; une transaction détecte toujours les doublons.
  4. 32 lignes ; l’ajout nécessite de supprimer d’abord la table.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 3 : Diagnostiquer les importations avant de se fier au tableau10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un enregistrement CSV est "Field ""A,B""",7. Quelles valeurs un analyseur CSV standard doit-il produire ?
  1. Field "A et B" et 7
  2. Field A et B et 7
  3. Field ""A,B"" et 7
  4. Field "A,B" et 7
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un fichier séparé par des points-virgules contient code;score;day et 00064;999;07/08/2026. Le code est un identifiant, 999 signifie une valeur manquante uniquement pour le score et les dates indiquent le jour en premier. Quelle importation préserve ces trois sens ?
  1. sep=";", dtype={"code": int}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  2. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  3. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%m/%d/%Y"
  4. sep=";", dtype={"code": str}, na_values={"code": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

open() de Python laisse une BOM UTF-8 initiale dans le premier nom d’en-tête lors d’un décodage UTF-8 simple. Quel réglage d’encodage supprime ce marqueur ?
  1. encoding="utf-8-sig"
  2. encoding="utf-16-le"
  3. encoding="cp1252"
  4. encoding="ascii"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un très gros CSV possède une colonne numérique amount avec quelques valeurs manquantes. Le programme doit calculer sa moyenne globale avec une mémoire limitée. Quelle méthode reste correcte lorsque les blocs contiennent des nombres différents de valeurs valides ?
  1. Cumuler les moyennes des blocs et diviser par le nombre de blocs.
  2. Cumuler les sommes et diviser par la taille de bloc demandée.
  3. Cumuler la somme et le nombre de valeurs non manquantes de chaque bloc, puis diviser une fois.
  4. Conserver tous les blocs et les concaténer avant de calculer la moyenne.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Un classeur stocke un code sous forme du nombre 537 avec le format d’affichage 00000. Une cellule de formule n’a pas de résultat mis en cache. Que faut-il attendre d’une lecture pandas qui demande un type textuel pour le code ?
  1. Le code perd les zéros affichés et pandas ne calcule pas la formule.
  2. Le code obtient les zéros affichés et pandas calcule la formule.
  3. Le code perd les zéros affichés et pandas calcule la formule.
  4. Le code obtient les zéros affichés et la formule est lue à partir de son texte.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une chaîne JSON contient [{"device":"00091","active":true}]. Comment pandas doit-il la lire sans traiter la chaîne comme un chemin ni supprimer les zéros de l’identifiant ?
  1. Utiliser text directement et dtype={"device": str}.
  2. Utiliser StringIO(text) et dtype={"device": int}.
  3. Utiliser json.dumps(text) et dtype={"device": str}.
  4. Utiliser StringIO(text) et dtype={"device": str}.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Une API renvoie HTTP 200 avec du JSON valide et une URL next non vide. Le nombre de lignes collectées est inférieur à count. Un collègue présente le tableau actuel comme complet. Quel est le problème ?
  1. Le total doit être remplacé par le nombre de la première page.
  2. L’URL suivante doit pointer vers les enregistrements collectés.
  3. Le succès HTTP a été pris pour la collecte de toutes les pages.
  4. Le champ de total du serveur montre que les enregistrements sont complets.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une valeur d’analyse précise est 6,347. Elle est exportée avec float_format="%.2f", puis relue comme un nombre. Quelle valeur ce CSV peut-il restituer ?
  1. 6,347
  2. 6,35
  3. 6,34
  4. 6,3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un jeu de données partitionné par année stocke code comme texte en 2025 et comme entier dans un fichier prévu pour 2026. Les nouvelles données ne contiennent aussi qu’une ligne par code presque unique. Quelle préparation favorise le mieux une lecture fiable ?
  1. Garder des types de codes différents et remplacer les années par des partitions de codes.
  2. Harmoniser les types de codes et créer une partition pour chaque code.
  3. Garder des types de codes différents et compter sur la projection de colonnes pour les corriger.
  4. Harmoniser les types de codes et conserver le partitionnement utile par année.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une table existante comporte des contraintes importantes et contient un ancien instantané complet. Un nouveau DataFrame est l’instantané complet destiné à le remplacer. Quel mode conserve la définition de la table tout en chargeant le nouveau contenu ?
  1. if_exists="append"
  2. if_exists="delete_rows"
  3. if_exists="replace"
  4. if_exists="fail"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 4 : Relier les choix d’analyse aux résultats stockés10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un tableau séparé par des barres verticales stocke un champ numérique entre guillemets "7,680.25". Le séparateur est lu correctement, mais le montant reste du texte. Quelle option de lecture supplémentaire correspond au nombre ?
  1. thousands=","
  2. decimal=","
  3. thousands="."
  4. quotechar="|"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un rapport commence par deux lignes de titre, puis site,jan,feb. Son corps contient une ligne # note et se termine par un total suivi d’une note sur la source. Quelle configuration ne lit que les observations sans traiter les notes comme des enregistrements ?
  1. skiprows=3, comment="#", skipfooter=2, engine="python"
  2. skiprows=2, comment="#", skipfooter=1, engine="python"
  3. skiprows=2, comment="#", skipfooter=2, engine="python"
  4. skiprows=2, comment="#", skipfooter=2, engine="c"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un CSV documenté comme UTF-8 a été lu en Windows-1252, ce qui a déformé les noms. Ce tableau a ensuite été correctement enregistré en UTF-8. Le fichier téléchargé d’origine existe toujours. Quelle récupération restaure les noms attendus ?
  1. Relire le fichier exporté dérivé en UTF-8, puis l’enregistrer sans le modifier.
  2. Relire le fichier d’origine en Windows-1252, puis ajouter une BOM UTF-8.
  3. Relire le fichier exporté dérivé en Latin-1, puis remplacer les octets invalides.
  4. Relire le fichier d’origine en UTF-8, puis reconstruire le fichier exporté dérivé.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un classeur contient History et Current. Seule la feuille Current doit être remplacée et History doit être conservée. Quelle configuration d’écriture convient ?
  1. Mode écriture, moteur openpyxl et nom de feuille Current.
  2. Mode ajout, moteur openpyxl et if_sheet_exists="replace".
  3. Mode ajout, moteur openpyxl et if_sheet_exists="overlay".
  4. Mode écriture, moteur XlsxWriter et index=False pour Current.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Un tableau normalisé de pièces contient les lignes (visit_id, visit_fee, part_cost) : (51, 12, 3), (51, 12, 5) et (52, 7, 4). Quel est le total des frais de visite et des pièces pour ces deux visites ?
  1. 43
  2. 31
  3. 27
  4. 35
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Un script de collecte a enregistré la page 1 d’un résultat d’API. Sa requête pour la page 2 reçoit HTTP 429 avec Retry-After: 45. Quelle suite préserve la collecte et respecte la réponse ?
  1. Attendre 45 secondes, redemander la page 2, puis suivre les pages restantes.
  2. Attendre 45 secondes, recommencer à la page 1 et ajouter toutes les pages aux enregistrements sauvegardés.
  3. Demander immédiatement la page 3 et traiter la page 2 comme un résultat vide.
  4. Enregistrer le corps de la réponse 429 comme page 2, puis demander sa page suivante.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Pourquoi charger un fichier pickle non vérifié provenant d’un collègue implique-t-il une décision de confiance différente de la lecture d’un CSV ordinaire ?
  1. Le chargement du pickle prouve que le fichier vient de l’expéditeur indiqué.
  2. Un type de données préservé rend le pickle non vérifié sûr à charger.
  3. Le chargement du pickle peut exécuter du code lors du chargement de l’objet.
  4. La compatibilité des versions de bibliothèques empêche l’exécution de code dans un pickle.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un tableau contient 2 millions de lignes, 60 colonnes et quatre années. Une analyse récurrente nécessite deux colonnes pour une année. Quelle organisation du stockage et de la lecture évite les colonnes et groupes d’années inutiles ?
  1. Parquet partitionné par identifiant d’enregistrement, puis lecture complète du jeu de données.
  2. Un CSV par année, puis lecture de toutes les colonnes de tous les fichiers.
  3. Un fichier Parquet par année, puis chargement de tous les fichiers avant filtrage.
  4. Parquet partitionné par année, avec une liste de colonnes et un filtre sur l’année.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un programme permet aux utilisateurs de choisir une table et un seuil. Sa requête utilise un marqueur de paramètre pour le nom de table et insère le seuil par formatage dans le SQL. Quelle modification permet ces choix de manière sûre ?
  1. Choisir la table dans une liste fixe et lier la valeur du seuil.
  2. Lier le nom de table et le seuil comme des valeurs ordinaires.
  3. Insérer les deux entrées par formatage après avoir supprimé leurs espaces.
  4. Lier le nom de table mais insérer par formatage un seuil qui ressemble à un nombre.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un lot quotidien doit être ajouté à une table existante avec des contraintes. Un échec ne doit laisser aucune insertion partielle et un lot chargé avec succès doit augmenter le nombre de lignes stockées de sa longueur. Quelle méthode convient ?
  1. Remplacer dans une transaction SQLAlchemy, puis comparer le nombre à la taille du lot.
  2. Ajouter sans transaction, puis comparer le total à la taille du lot.
  3. Supprimer toutes les lignes dans une transaction, puis vérifier l’augmentation depuis l’ancien total.
  4. Ajouter dans une transaction SQLAlchemy, puis vérifier l’augmentation du nombre de lignes.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 5 : Résoudre plusieurs risques de chargement et de stockage10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Un CSV contient les codes "0072" et "0073", des effectifs entiers nullables et les dates "12/01/2026", "26/01/2026". La source définit des dates avec le jour en premier. Quelle combinaison préserve ces sens ?
  1. Code comme texte, effectif comme int32, dates converties avec %d/%m/%Y.
  2. Code comme entier, effectif comme Int64, dates converties avec %d/%m/%Y.
  3. Code comme texte, effectif comme Int64, dates converties avec %d/%m/%Y.
  4. Code comme texte, effectif comme Int64, dates converties avec %m/%d/%Y.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un outil de chargement utilise on_bad_lines="skip". Sur 1 000 observations sources, 995 sont chargées ; deux d’entre elles ont des champs manquants à la fin. Que peut-on conclure ?
  1. Sept observations ont été perdues ; chaque champ manquant indique un enregistrement ignoré.
  2. Cinq observations ont été perdues ; les enregistrements courts chargés doivent encore être examinés.
  3. Cinq observations ont été perdues ; les enregistrements chargés sont forcément tous complets.
  4. Deux observations ont été perdues ; la différence de nombre reflète seulement les champs vides.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un fichier court se décode sans erreur en Latin-1, mais l’encodage source est inconnu. Quels indices renforceraient ce choix ?
  1. L’absence d’exception de décodage lors de la lecture en Latin-1.
  2. L’ouverture du fichier par un éditeur de texte sans affichage de son encodage.
  3. Un en-tête composé uniquement d’ASCII qui semble correct avec ce décodeur.
  4. La documentation d’exportation et des valeurs accentuées correctement décodées.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Un CSV gzip est traité par blocs. Un collègue additionne les montants, mais divise par le nombre de lignes, y compris celles dont le montant manque, et conserve tous les blocs dans une liste. Quelle paire de corrections convient pour calculer uniquement une moyenne avec une mémoire limitée ?
  1. Compter les montants non manquants et ne conserver que les sommes et les effectifs.
  2. Compter toutes les lignes et ne conserver que la moyenne des moyennes de blocs.
  3. Compter les montants non manquants et concaténer tous les blocs conservés.
  4. Compter les blocs et conserver leurs sommes sans les nombres d’observations.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Le total d’une formule dans une feuille de calcul affiche 90, mais le dernier résultat mis en cache enregistré est 74. Un identifiant d’appareil à 16 chiffres a été saisi comme nombre. Quelles sont les deux limites à traiter avant de se fier à l’importation ?
  1. Les résultats de formules en cache doivent être actualisés ; une lecture comme texte suffit à restaurer l’identifiant complet.
  2. La formule affichée est à jour ; l’identifiant complet d’origine doit être stocké comme texte.
  3. Les résultats de formules en cache doivent être actualisés ; l’identifiant complet d’origine doit être stocké comme texte.
  4. La formule affichée est à jour ; une lecture comme texte suffit à restaurer l’identifiant complet.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une enveloppe contient trois commandes avec respectivement 2, 1 et 0 articles. Le tableau des articles répète les frais de livraison de chaque commande. L’analyste a besoin du nombre de commandes et du total des frais de livraison. Quelle structure évite de perdre ou de répéter des commandes ?
  1. Compter les lignes d’articles et additionner tous les frais répétés dans le tableau des articles.
  2. Ne garder que les commandes présentes dans le tableau des articles et prendre les frais les plus élevés.
  3. Utiliser le nombre de lignes d’articles comme nombre de commandes et diviser les frais par trois.
  4. Garder un tableau des commandes pour les nombres et les frais, relié à un tableau distinct des articles.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un CSV traité comporte un en-tête répété parmi les enregistrements, des mesures arrondies et des identifiants à zéros initiaux altérés après relecture. Quel ensemble de modifications traite les trois causes ?
  1. Ajouter avec les en-têtes, exporter toutes les décimales et lire les identifiants comme texte.
  2. Ajouter sans les en-têtes, exporter toutes les décimales et lire les identifiants comme texte.
  3. Ajouter sans les en-têtes, utiliser un type flottant plus large à la lecture et lire les identifiants comme entiers.
  4. Ajouter sans les en-têtes, exporter les valeurs arrondies et convertir ensuite les identifiants en texte.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un collègue a besoin d’un rapport pour tableur avec des feuilles nommées pour les mesures et les effectifs. Quel format de sortie répond directement à ce besoin ?
  1. Classeur Excel
  2. Fichier JSON Lines
  3. Fichier Feather
  4. Jeu de données Parquet
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une table stockée contient 140 lignes. Un lot de sept lignes ne contient que de nouveaux enregistrements et doit préserver les lignes et contraintes existantes. Après le chargement, quels mode et vérification du nombre conviennent ?
  1. Utiliser replace et vérifier que le nombre stocké est de sept.
  2. Utiliser append et vérifier que le nombre stocké est de 147.
  3. Utiliser append et vérifier que le nombre stocké est de sept.
  4. Utiliser delete_rows et vérifier que le nombre stocké est de 147.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une table avec des contraintes contient 80 lignes. Un ajout de 12 lignes dans une transaction prise en charge échoue après l’insertion de cinq lignes, et l’exception sort du bloc de transaction. Combien de lignes doivent rester et quel serait le résultat d’une nouvelle tentative réussie ?
  1. 80 après annulation ; 92 après une nouvelle tentative réussie.
  2. 85 après l’échec ; 97 après une nouvelle tentative réussie.
  3. 80 après annulation ; 80 après une nouvelle tentative réussie.
  4. 92 après l’échec ; 104 après une nouvelle tentative réussie.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Tu bloques sur ton propre exercice ? Aide aux Devoirs

Mots-Clés

91 Mots-Clés, chacun avec sa définition

A

Agrégat partiel
Un agrégat partiel est un résultat réduit pour une partie des données, qui peut être combiné selon une règle adaptée avec les résultats d’autres parties.
Les sommes des blocs s’additionnent directement, mais une moyenne globale nécessite la somme combinée et le nombre de valeurs non manquantes.
Ajout
Un ajout insère de nouvelles lignes dans une table existante sans effacer ses enregistrements précédents ; répéter un lot peut donc ajouter des doublons.
Une table de 11 lignes en contient 15 après quatre insertions réussies et peut en contenir 19 après répétition de cet ajout.
Aller-retour au format CSV
Un aller-retour au format CSV écrit un tableau sous forme de texte puis le relit, ce qui nécessite de reconstituer les types que CSV ne stocke pas comme métadonnées.
Une catégorie ordonnée peut revenir sous forme de texte ordinaire même lorsque toutes les étiquettes visibles restent inchangées.
Annulation de transaction
Une annulation de transaction annule les modifications non validées d’une transaction lorsque celle-ci ne peut pas se terminer correctement, et rétablit l’état validé précédent.
Si un chargement par insertion pris en charge échoue dans une transaction du moteur, ses insertions précédentes peuvent être annulées.
ASCII
ASCII définit 128 caractères de base dont les valeurs d’octet sont partagées par UTF-8 et plusieurs encodages occidentaux courants à un octet.
Un en-tête composé uniquement de texte anglais peut paraître correct même lorsque l’encodage utilisé pour les noms accentués qui suivent est incorrect.

B

Base de données relationnelle
Une base de données relationnelle stocke des enregistrements dans des tables à colonnes nommées et permet aux programmes de récupérer ou de modifier des données par des opérations SQL.
Une requête peut ne renvoyer que les lignes et les colonnes nécessaires avant que pandas ne construise un tableau d’analyse.
Bloc
Un bloc est un groupe d’enregistrements de taille limitée produit par un lecteur itératif, qui permet à un programme de traiter une partie d’un fichier à la fois.
Une entrée de 13 lignes lue par blocs de cinq donne des DataFrame de cinq, cinq et trois lignes.

C

Caractère de remplacement
Le caractère de remplacement, "�", indique un contenu que le décodeur n’a pas pu interpréter lorsqu’il a reçu l’instruction de remplacer les octets invalides.
Un nom chargé sous la forme "Ren�" a perdu des informations sur ses caractères ; conserve les octets d’origine pour une lecture corrigée.
Chemin des enregistrements
Un chemin des enregistrements sélectionne la liste imbriquée dont les éléments deviennent des lignes de sortie lorsque pandas normalise une collection d’objets JSON.
Définir record_path="items" crée une ligne d’article pour chaque élément de la liste d’articles d’une commande.
Classeur
Un classeur est un fichier de tableur contenant une ou plusieurs feuilles de calcul ainsi que les valeurs, types, formules et éléments de présentation des cellules.
Un même classeur .xlsx peut contenir des feuilles distinctes pour les observations, les totaux et une synthèse du rapport.
Clé d’API
Une clé d’API est un identifiant d’accès envoyé par un client selon la méthode d’authentification documentée de l’API afin d’obtenir un accès autorisé.
Lis une clé privée depuis une variable d’environnement au lieu de l’enregistrer dans une cellule de notebook.
Code de statut HTTP
Un code de statut HTTP est un nombre renvoyé dans une réponse qui indique le résultat de la requête ; les codes 4xx et 5xx indiquent des catégories d’erreurs.
Vérifie si le statut indique un échec avant de convertir un message d’erreur JSON en ce qui ressemble à un tableau de données.
Codec de compression
Un codec de compression est un algorithme utilisé pour compresser et décompresser des données stockées, en établissant un compromis entre la taille du fichier et les coûts de traitement.
Snappy est le codec Parquet par défaut de pandas ; un autre codec peut produire des fichiers plus petits avec un coût d’écriture différent.
Colonne catégorielle
Une colonne catégorielle stocke les valeurs à l’aide d’un ensemble défini d’étiquettes, ce qui économise souvent de la mémoire lorsque de nombreuses lignes répètent quelques étiquettes.
Quatre étiquettes régionales répétées sur des milliers d’enregistrements se prêtent bien à un stockage catégoriel.
Colonnes à index hiérarchique
Les colonnes à index hiérarchique possèdent des étiquettes à plusieurs niveaux, que pandas peut construire à partir de plusieurs lignes d’en-tête.
Un tableau de ventes peut désigner une colonne à la fois par sa mesure et par son année, comme ("sales", "2026").
Compression
La compression encode les données dans un nombre plus réduit d’octets stockés, ce qui réduit la taille du fichier mais nécessite une décompression avant l’utilisation des valeurs.
pandas peut décompresser un fichier .csv.gz pendant la lecture sans créer d’abord une copie non compressée.
Connexion
Une connexion est une interface active par laquelle un programme envoie des opérations à une base de données et reçoit leurs résultats.
Garde la connexion ouverte jusqu’à ce que le résultat d’une requête par blocs ait été entièrement parcouru, puis ferme-la.
CSV
Un fichier CSV est un fichier texte composé d’enregistrements dont les champs sont séparés par un séparateur ; des guillemets protègent les séparateurs présents dans les champs.
Une adresse contenant une virgule reste dans un seul champ lorsqu’elle est correctement placée entre guillemets dans le CSV.
Curseur côté serveur
Un curseur côté serveur permet à une interface de base de données de récupérer progressivement un résultat au lieu de le mettre entièrement en mémoire tampon en une seule fois.
Le traitement par blocs de pandas peut tout de même nécessiter la lecture en flux pour éviter que le pilote de base de données ne mette tout le résultat en mémoire tampon.

D

Décodage
Le décodage convertit des octets stockés en texte selon un encodage précis, ce qui détermine les caractères qui apparaissent dans le résultat.
Ouvrir un fichier UTF-8 avec un décodeur ancien peut déformer les accents sans déclencher d’erreur.
Délai d’expiration de la requête
Un délai d’expiration de la requête limite l’attente de la connexion ou de la lecture pendant une requête HTTP, sans imposer de durée limite à l’ensemble du téléchargement.
Définis un délai d’expiration afin qu’une connexion qui ne répond pas ne laisse pas indéfiniment en attente un script de collecte auprès d’une API.
Données brutes
Les données brutes sont les données d’entrée reçues ou téléchargées pour une analyse et conservées inchangées, séparément des fichiers de sortie dérivés et nettoyés.
Garde le fichier de mesures reçu afin qu’une correction ultérieure du décodage ou de l’analyse puisse repartir de ses octets d’origine.

E

En-tête
Un en-tête est une ligne d’étiquettes de champs qu’un lecteur utilise comme noms de colonnes au lieu de traiter ces étiquettes comme une observation.
Pour un fichier sans en-tête, fournis des noms de colonnes afin que la première mesure reste dans le tableau.
Encodage
Un encodage est une règle qui permet de représenter des caractères par des octets et d’interpréter ces octets comme des caractères à la lecture.
Un même nom peut occuper des suites d’octets différentes selon qu’il est enregistré en UTF-8 ou en Windows-1252.
Enregistrement
Un enregistrement est une entrée complète d’un fichier délimité, composée de champs ; un contenu entre guillemets peut l’étendre sur plusieurs lignes physiques.
Un commentaire contenant un saut de ligne peut occuper deux lignes physiques tout en appartenant à un seul enregistrement.
Entier nullable
Un entier nullable est un type entier de pandas qui peut contenir des valeurs manquantes en plus des nombres entiers, comme le type de données Int64.
Une colonne d’effectifs de visites peut conserver 3 et 8 comme entiers tout en représentant toute observation vide par <NA>.
Enveloppe de réponse d’API
Une enveloppe de réponse d’API est un objet englobant qui contient les données des enregistrements ainsi que des informations comme le nombre de résultats et l’emplacement de la page suivante.
Aplatis la liste de résultats de l’enveloppe tout en conservant sa valeur de page suivante pour une autre requête.
ExcelWriter
Un ExcelWriter gère une session d’écriture de classeur afin que plusieurs DataFrame puissent être placés sur des feuilles différentes avant la fermeture du fichier.
Écrire deux tableaux avec un seul objet d’écriture conserve les deux feuilles dans le même classeur de rapport final.
Exportation de l’index
L’exportation de l’index écrit les étiquettes de lignes d’un DataFrame dans une colonne de sortie, ce qui n’est utile que lorsque ces étiquettes font partie des données échangées.
Exclus un index numéroté ordinaire pour éviter une nouvelle colonne "Unnamed: 0" après la relecture du CSV.

É

Écriture en superposition dans une feuille
L’écriture en superposition dans une feuille inscrit des valeurs dans une feuille de calcul existante sans effacer toutes les anciennes cellules situées hors de la nouvelle zone écrite.
Écrire un tableau plus court en superposition peut laisser d’anciennes lignes en dessous ; examine donc le contenu restant de la feuille.

F

Feather
Feather est un format binaire fondé sur Arrow IPC pour l’échange rapide de DataFrame typés entre outils d’analyse compatibles.
Une étape Python locale peut enregistrer un tableau Feather pour une étape ultérieure ou un traitement R compatible.
Feuille de calcul
Une feuille de calcul est une grille nommée de cellules dans un classeur, sélectionnée dans pandas par son nom ou par sa position comptée à partir de zéro.
Utiliser sheet_name=1 lit la deuxième feuille de calcul, qui peut différer de celle ouverte à l’écran.
Fichier à largeur fixe
Un fichier à largeur fixe stocke les champs à des positions de caractères précises au lieu de les séparer par un caractère séparateur.
Utilise des largeurs explicites lorsqu’une exportation d’équipements réserve quatre caractères à un code et sept à un nom.
Format d’affichage
Un format d’affichage modifie l’apparence d’une valeur stockée dans une cellule, par exemple sous forme de pourcentage ou de code avec des zéros initiaux, sans modifier la valeur sous-jacente.
Une cellule affichée sous la forme "15%" stocke 0,15 : la valeur chargée est donc une proportion plutôt que le nombre 15.
Format de date
Un format de date est un modèle qui indique à un analyseur comment sont disposées les composantes d’une date, comme le jour, le mois et l’année à quatre chiffres.
Le modèle %d/%m/%Y fait de "09/10/2026" le 9 octobre plutôt que le 10 septembre.

G

Granularité des lignes
La granularité des lignes indique ce que représente une ligne d’un tableau, ce qui détermine comment interpréter les étiquettes et les montants répétés.
Une ligne par article commandé utilise une unité de comptage différente d’une ligne par commande complète.

H

HDF5
HDF5 est un format binaire hiérarchique qui peut organiser plusieurs jeux de données dans un fichier, souvent utilisé pour des données scientifiques volumineuses.
pandas nécessite PyTables pour écrire plusieurs jeux de données d’analyse avec son interface HDF5.

I

Identifiant
Un identifiant est une étiquette désignant un enregistrement ou une entité, dont les chiffres peuvent avoir un sens sans représenter une quantité destinée aux calculs.
Lire un code d’équipement comme "00028" en tant que texte conserve les zéros nécessaires pour le faire correspondre au même code dans une liste source.
Inférence de type
L’inférence de type est le choix par le lecteur du type d’une colonne à partir de ses valeurs d’entrée lorsque le programme n’a pas précisé ce type.
Un code d’équipement composé uniquement de chiffres peut devenir un entier si l’on ne demande pas au lecteur de le conserver comme texte.
Injection SQL
Une injection SQL se produit lorsqu’un texte inséré modifie la structure d’une opération SQL au lieu de rester une valeur de donnée ordinaire.
Une entrée contenant des guillemets et une condition vraie peut élargir une requête construite par formatage de chaîne.
Intervalle semi-ouvert
Un intervalle semi-ouvert inclut sa position de départ et exclut sa position de fin, comme pour les bornes de colonnes à largeur fixe.
L’intervalle (2, 7) sélectionne cinq positions de caractères et se termine juste avant la position 7.

J

Jeu de données partitionné
Un jeu de données partitionné répartit les fichiers de tableau entre des répertoires selon les valeurs de certains champs, ce qui permet aux lecteurs d’ignorer les groupes sans rapport avec la sélection.
Des répertoires nommés year=2025 et year=2026 permettent à un filtre sur l’année de cibler la partie nécessaire.
JSON
JSON est un format texte pour les objets, tableaux, chaînes entre guillemets doubles, nombres, booléens et null, souvent utilisé pour échanger des enregistrements imbriqués.
Une API JSON peut renvoyer une liste d’objets représentant des stations, chacun contenant un nom et une série de températures.
JSON Lines
JSON Lines est une structure textuelle comportant un objet JSON complet sur chaque ligne, sans tableau extérieur englobant tous les enregistrements.
Les exportations volumineuses de journaux peuvent être lues par blocs lorsque pandas est informé que l’entrée utilise JSON Lines.

L

Latin-1
Latin-1 est un encodage à un octet qui associe chaque valeur d’octet à un caractère, notamment à des caractères de contrôle pour une partie de ces valeurs.
Une lecture en Latin-1 peut se terminer sans erreur tout en transformant un symbole attendu en un caractère incorrect.
Ligne mal formée
Une ligne mal formée est un enregistrement que l’analyseur ne peut pas faire correspondre à la structure attendue, par exemple parce qu’il contient plus de champs que son en-tête n’en décrit.
Un séparateur non placé entre guillemets dans un nom peut faire paraître une observation valide comme si elle contenait un champ supplémentaire.
Limite de fréquence des requêtes
Une limite de fréquence des requêtes restreint le nombre de requêtes qu’un client peut envoyer pendant une période, en signalant souvent les requêtes excessives par HTTP 429.
Attends selon les indications de Retry-After avant de réessayer une requête rejetée parce que la fréquence autorisée a été dépassée.

M

Marque d’ordre des octets (BOM)
Une marque d’ordre des octets, ou BOM, est un marqueur initial utilisé par certains fichiers texte pour indiquer une information sur l’encodage, comme l’ordre des octets en UTF-16.
Utiliser utf-8-sig lors de la lecture de texte avec Python supprime une BOM UTF-8 initiale du premier en-tête.
Marqueur de paramètre
Un marqueur de paramètre indique la position d’une valeur liée dans le SQL, avec la syntaxe requise par le pilote ou l’interface de requête.
SQLite accepte ? pour les valeurs positionnelles et :name pour les valeurs fournies dans un dictionnaire.
Marqueur de valeur manquante
Un marqueur de valeur manquante est une valeur source qui représente une observation absente et qui est convertie en valeur manquante à la lecture.
Si "-" signifie qu’un score manque, le déclarer comme valeur manquante évite qu’il maintienne la colonne des scores sous forme de texte.
Métadonnées de l’objet parent
Les métadonnées de l’objet parent sont les champs copiés d’un objet JSON englobant vers chaque ligne créée à partir de sa liste d’enregistrements imbriquée.
Un identifiant de commande copié sur chaque ligne d’article permet de relier les articles à leur commande d’origine.
Mise entre guillemets
La mise entre guillemets entoure un champ textuel afin que les séparateurs ou sauts de ligne qu’il contient soient traités comme du contenu plutôt que comme une structure d’enregistrement.
Le champ "Harbor, West" conserve sa virgule dans un seul nom de lieu lors d’une importation CSV.
Mode ajout
Le mode ajout ouvre un classeur existant pour le mettre à jour, ce qui permet d’ajouter des feuilles ou de les traiter selon une règle en cas de conflit de noms.
Un objet d’écriture openpyxl en mode ajout peut remplacer une feuille existante d’un classeur tout en conservant les autres feuilles.
Mojibake
Le mojibake est du texte déformé parce que des octets encodés ont été interprétés selon la mauvaise règle, même lorsque le décodeur ne signale aucune erreur.
Un nom contenant "Ã" à la place d’un accent invite à vérifier si des octets UTF-8 ont été lus comme Windows-1252.
Moteur d’analyse syntaxique
Un moteur d’analyse syntaxique est le programme qui lit une structure textuelle pour en extraire des valeurs, avec sa propre vitesse et son propre ensemble d’options prises en charge.
Un rapport nécessitant skipfooter utilise le moteur Python, car le moteur C ne prend pas en charge cette option.
Moteur de lecture et d’écriture Excel
Un moteur de lecture et d’écriture Excel est une bibliothèque que pandas utilise pour lire ou écrire un format de tableur, selon les types de fichiers qu’elle prend en charge.
L’absence d’openpyxl peut empêcher la lecture d’un fichier .xlsx même lorsque pandas est installé.
Moteur SQLAlchemy
Un moteur SQLAlchemy configure l’accès à une base de données par un pilote et gère un pool de connexions obtenues lors de l’exécution des opérations.
Un contexte de connexion rend sa connexion au pool ; libérer le moteur libère les ressources du pool.
Moyenne pondérée
Une moyenne pondérée donne à chaque moyenne partielle un poids proportionnel à son nombre d’observations valides lors de la combinaison de groupes de données inégaux.
Un bloc d’un enregistrement ne doit pas compter autant qu’un bloc de cent enregistrements lors du calcul de la moyenne globale.

N

Normalisation
La normalisation de JSON imbriqué développe les champs d’objets et les enregistrements de listes sélectionnés dans un tableau dont la granularité des lignes est choisie explicitement.
Normaliser des objets clients qui contiennent des commandes peut créer des colonnes dont les noms comportent des points sans développer la liste d’articles de chaque commande.

O

Objet JSON
Un objet JSON est une collection de valeurs nommées par des chaînes, entourée d’accolades, que l’analyseur JSON de Python convertit en dictionnaire.
Un objet peut associer "active" à true et "name" au nom textuel d’une station.
Occupation mémoire totale
L’occupation mémoire totale comptabilise la mémoire des valeurs stockées, y compris le contenu des objets textuels, au-delà de la taille superficielle de leurs tableaux.
Utilise un rapport d’occupation mémoire totale pour comparer des noms de régions répétés stockés comme texte et comme catégories.
Octet
Un octet est une unité de données stockées qui possède 256 valeurs possibles, de 0 à 255, et qui sert notamment à représenter du texte.
Quatre caractères visibles dans un nom peuvent nécessiter cinq octets lorsque l’un d’eux utilise deux octets UTF-8.
Orientation JSON
Une orientation JSON précise comment les lignes, colonnes, étiquettes et valeurs d’un tableau sont disposées dans une représentation JSON.
L’orientation records écrit chaque observation comme un objet, tandis que split conserve séparément les étiquettes et les données.

P

Pagination
La pagination divise un résultat d’API en pages demandées séparément, avec un mécanisme documenté pour atteindre les enregistrements restants.
Une collection de 260 enregistrements renvoyée par pages de 100 nécessite trois requêtes pour récupérer tous les enregistrements.
Paramètre lié
Un paramètre lié fournit une valeur de donnée séparément de la syntaxe SQL, ce qui empêche les caractères de cette valeur de redéfinir la requête.
Un nom de région contenant une apostrophe reste une seule valeur de comparaison lorsqu’il est passé en paramètre.
Parquet
Parquet est un format de fichier ouvert et typé, organisé en colonnes et compressé, largement pris en charge pour la lecture et le stockage de tableaux d’analyse.
Un identifiant et un effectif nullable peuvent conserver leurs types lors d’un aller-retour Parquet compatible avec pandas.
Pickle
Un pickle est une représentation sérialisée d’un objet Python qui peut exécuter du code au chargement et dépend de bibliothèques compatibles.
Utilise un pickle personnel de confiance pour un objet temporaire et choisis un format de tableau portable pour les échanges.
Pied de page
Un pied de page est un ensemble d’éléments placés à la fin d’un rapport, hors du tableau d’observations, comme des totaux, des notes sur la source ou des explications sur l’exportation.
Ignore les deux dernières lignes du rapport lorsqu’elles contiennent un total et une note sur la source plutôt que des observations.
Pilote de base de données
Un pilote de base de données est la bibliothèque qui assure la communication entre l’interface de base de données de Python et un système de base de données particulier.
Une URL SQLAlchemy pour PostgreSQL peut sélectionner psycopg, qui doit aussi être installé pour la connexion.
Plage de cellules fusionnées
Une plage de cellules fusionnées combine visuellement plusieurs cellules d’un tableur tout en conservant la valeur stockée dans sa cellule supérieure gauche.
Une étiquette régionale fusionnée peut laisser des entrées vides dans les lignes suivantes lorsque le tableau est lu dans pandas.
Point de terminaison (endpoint)
Un point de terminaison est une URL documentée à laquelle une API accepte une requête HTTP pour une ressource ou une opération donnée.
Un point de terminaison peut accepter un paramètre de ville et renvoyer les enregistrements de mesures correspondants dans une réponse JSON.
Précision de sortie
La précision de sortie est le nombre de chiffres conservés dans les valeurs écrites, qui peut être réduit définitivement par le formatage numérique à l’exportation.
Un rapport arrondi à l’écriture nécessite un fichier d’analyse distinct conservant toutes les décimales si les chiffres supprimés comptent.
Projection
La projection sélectionne les colonnes à lire dans un tableau stocké, ce qui permet à un lecteur de format en colonnes de laisser sur disque les colonnes sans rapport avec la sélection.
Passe une liste de colonnes à read_parquet lorsqu’une analyse n’a besoin que de la région et du montant.

R

Remplacement de table
Un remplacement de table supprime une table de base de données existante et la recrée, ce qui supprime son ancienne définition ainsi que ses enregistrements.
Remplacer une table partagée peut supprimer les clés et les index qui faisaient partie de sa structure d’origine.
Représentation des valeurs manquantes
Une représentation des valeurs manquantes est le texte écrit pour une valeur absente, comme un champ vide ou un marqueur d’exportation choisi.
Écrire des précipitations manquantes sous la forme "NA" les distingue d’un zéro enregistré lorsque le destinataire les lit correctement.
Résultat de formule mis en cache
Un résultat de formule mis en cache est la valeur stockée avec une formule de tableur afin qu’un lecteur puisse l’utiliser sans la recalculer.
Un classeur généré par script peut afficher des données de formule manquantes parce qu’aucun résultat à jour n’a été enregistré.

S

Schéma
Un schéma décrit la structure d’un jeu de données, notamment les noms et les types des colonnes que les lecteurs compatibles utilisent pour interpréter les valeurs stockées.
Un jeu de données partagé nécessite des types compatibles pour la colonne de codes dans tous ses fichiers afin d’éviter les échecs ou les modifications de valeurs à la lecture.
Séparateur de champs
Un séparateur de champs est un caractère ou un motif qui marque la limite entre des champs, comme une virgule, une tabulation, une barre verticale ou un point-virgule.
Un fichier séparé par des points-virgules nécessite sep=";", même si son extension est .csv.
Séparateur de milliers
Un séparateur de milliers groupe les chiffres dans un champ numérique et doit être distingué du séparateur décimal et du séparateur de champs.
Une valeur groupée écrite "4.200,50" utilise un point pour les milliers et une virgule pour sa partie décimale.
Séparateur décimal
Un séparateur décimal sépare les parties entière et décimale d’un nombre ; pandas peut interpréter un séparateur choisi lors de l’analyse du texte.
Avec une virgule décimale, "8,75" représente la même valeur que 8.75 dans une sortie Python.
Sérialisation
La sérialisation convertit des objets en mémoire en une représentation stockée ou échangée, par exemple en écrivant des valeurs Python sous forme de texte JSON.
Utilise json.dump pour sérialiser des enregistrements dans un fichier UTF-8 ouvert plutôt que d’écrire la représentation repr d’un dictionnaire Python.
SQLite
SQLite est un moteur de base de données qui fonctionne sans serveur distinct et stocke généralement une base entière dans un seul fichier local.
Une connexion à un chemin de base de données mal saisi peut créer un nouveau fichier dans lequel les tables attendues sont absentes.
Stockage en colonnes
Le stockage en colonnes conserve ensemble les valeurs d’une colonne, ce qui permet de lire certaines colonnes et de compresser des valeurs adjacentes similaires.
Une analyse nécessitant deux champs peut éviter de lire les autres colonnes d’un jeu de données Parquet large.

T

Tableau JSON
Un tableau JSON est une suite ordonnée de valeurs entre crochets, convertie en liste Python lors de l’analyse.
Un tableau de températures peut associer des observations numériques à null pour une mesure manquante.
Transaction
Une transaction regroupe des modifications de base de données pour les valider en cas de succès ou les annuler en cas d’échec, dans la limite des opérations prises en charge par la base.
Une transaction SQLAlchemy peut empêcher qu’un ajout ne laisse seulement une partie des enregistrements prévus dans la base.

U

UnicodeDecodeError
Une UnicodeDecodeError se produit lorsqu’un décodeur rencontre une suite d’octets qu’il ne peut pas interpréter avec l’encodage de texte choisi.
Un caractère accentué en Windows-1252 peut déclencher cette erreur lorsque le fichier est ouvert en UTF-8.
UTF-8
UTF-8 représente les caractères Unicode sur un à quatre octets, conserve les caractères ASCII sur un octet et prend en charge tous les caractères Unicode.
La lettre "é" utilise deux octets en UTF-8 : le nombre de caractères ne correspond donc pas nécessairement au nombre d’octets du fichier.
UTF-16
UTF-16 encode Unicode à l’aide d’unités de deux octets, dont l’ordre doit être connu ou indiqué par une marque d’ordre des octets initiale.
Lis une exportation sans BOM dont l’octet de poids faible vient en premier avec encoding="utf-16-le" lorsque sa structure est ainsi documentée.

V

Valeur sentinelle
Une valeur sentinelle est un code auquel un sens particulier est attribué, comme « inconnu », et qui pourrait autrement ressembler à une mesure ordinaire.
Un score de 999 documenté comme « inconnu » doit être déclaré manquant avant de calculer une moyenne qui a un sens.
Vérification de l’écriture
La vérification de l’écriture compare les résultats stockés dans la base de données à la modification prévue, par exemple à l’augmentation attendue du nombre de lignes après un ajout.
Après avoir ajouté six lignes à une table de 20, interroge le nombre de lignes et vérifie que le total attendu est de 26.

W

Windows-1252
Windows-1252 est un ancien encodage à un octet comportant des lettres occidentales et des symboles supplémentaires, qui diffère de Latin-1 pour une partie des valeurs d’octet.
L’octet du symbole euro en Windows-1252 devient un caractère de contrôle lorsqu’il est interprété en Latin-1.

À propos de cette unité

Par StudeliSignaler une erreur

Crée ton propre Matériel d'Étude

Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.

Commencer