19. Premier script Python : charger une série FRED et la tracer en dix lignes

En 2010, deux économistes de Harvard, Carmen Reinhart et Kenneth Rogoff, publient une étude qui va peser sur la politique de la planète entière. Sa thèse : au-delà d'un endettement public de 90 % du PIB, la croissance s'effondrerait — leurs chiffres montraient même une contraction moyenne de −0,1 %. En pleine crise de la dette européenne, ce seuil de 90 % devient l'argument massue des partisans de l'austérité, cité par des ministres et des commissaires.

Trois ans plus tard, un doctorant de l'université du Massachusetts, Thomas Herndon, âgé de vingt-huit ans, tente de répliquer ce résultat pour un devoir d'économétrie. Il n'y arrive pas. Il demande alors aux auteurs leur feuille de calcul de travail et met au jour trois problèmes distincts : une formule Excel bornée aux lignes 30 à 44 au lieu de 30 à 49, qui exclut cinq pays ; l'exclusion sélective d'années pourtant disponibles ; et une pondération inhabituelle donnant le même poids à chaque pays, quel que soit le nombre d'observations. Une fois l'ensemble corrigé, la croissance moyenne des épisodes où la dette dépasse 90 % du PIB passe de −0,1 % à +2,2 %. L'erreur de tableur, si spectaculaire soit-elle, n'explique donc pas à elle seule l'écart ; et corriger les chiffres ne dit toujours pas qui, de la dette ou de la croissance, commande à l'autre.

Ce que la réplication a réellement corrigé

  1. Erreur de code : cinq pays exclus par une plage Excel mal bornée.
  2. Données exclues : certaines années disponibles n'avaient pas été intégrées.
  3. Pondération : chaque pays recevait le même poids, quel que soit le nombre d'années observées.

Effet combiné : −0,1 % publié → +2,2 % après correction.

L'erreur de tableur n'était pas, à elle seule, la plus lourde du lot — une pondération contestable pesait davantage. Mais elle est devenue le symbole d'un mal plus profond : un tableur opaque, non versionné, impossible à rejouer, avait propagé une bourde jusque dans la politique économique mondiale. C'est précisément ce que quelques lignes de code lisibles, partageables et ré-exécutables auraient rendu presque impossible. Voilà pourquoi ce dernier atelier vous fait passer de la souris au clavier : non pour faire le malin, mais pour rendre votre travail reproductible. À la fin, vous saurez charger une série FRED et la tracer en dix lignes de Python. Et vous ne referez jamais un Reinhart-Rogoff.

RepèresAtelier pratique · Niveau : Intermédiaire · Prérequis : chapitre 18

À la fin de cet atelier, vous saurez :

  • charger une série FRED et la tracer en dix lignes de Python, sans rien installer ;
  • fabriquer des grandeurs que FRED ne publie pas — déflateur, vitesse, moyenne mobile ;
  • reconnaître les trois erreurs qui arrêtent tous les débutants, et les corriger en une ligne.

Aucune connaissance de Python n'est supposée. La section « faire parler un graphique » est nettement plus avancée que le reste : elle peut attendre une seconde lecture.

Pourquoi le code, après la souris ?

Au chapitre précédent, vous avez appris à tout faire dans FRED à la souris. Alors pourquoi coder ? Pour trois raisons que le clavier seul offre. La reproductibilité, d'abord : un script dit exactement ce qu'il fait, se relit, se corrige, se partage — là où un clic ne laisse aucune trace. L'échelle, ensuite : tracer un graphique à la souris est facile, mais en tracer cent, recalculer une inflation chaque matin, croiser dix séries, exige l'automatisation. Et la puissance, enfin : une fois la donnée en mémoire, tout le calcul du monde s'ouvre.

Pourquoi coder après la souris : trois pouvoirs — reproductibilité, échelle, puissance.

Ce que la souris ne sait pas faire : rejouer, répéter à l'infini, calculer. C'est tout ce que gagne celui qui passe au clavier.

Générer/Modifier l'image dans Google Colab

L'outil que vous allez utiliser, la bibliothèque pandas, n'est pas né par hasard dans ce contexte. Wes McKinney l'a créée en 2008 alors qu'il travaillait dans un fonds d'investissement, précisément parce qu'il lui fallait un outil fiable pour analyser des données financières sans se tromper. Rendue publique fin 2009, elle est devenue le couteau suisse de quiconque manipule des données. Son nom même dit sa filiation : pandas, pour panel data — les données de panel de l'économétrie — et Python data analysis.

Commencer sans rien casser

Bonne nouvelle : vous n'avez rien à installer. Le chemin le plus simple pour un débutant s'appelle Google Colab (colab.research.google.com) : un carnet de code qui tourne dans votre navigateur, gratuitement, avec Python, pandas et matplotlib déjà prêts. Un compte Google suffit ; vous ouvrez un nouveau carnet, vous collez le script, vous cliquez sur « exécuter ». Rien à télécharger, rien à configurer. (Si vous préférez travailler sur votre machine, les outils modernes comme uv installent Python et ses bibliothèques en quelques secondes ; mais gardez cela pour plus tard.)

Dix lignes, un graphique

Voici le script complet. Ne vous laissez pas intimider : dix lignes en tout, dont huit de code, et nous les décortiquons juste après.

import pandas as pd
import matplotlib.pyplot as plt

url = "https://fred.stlouisfed.org/graph/fredgraph.csv?id=GDPC1"
df = pd.read_csv(url, parse_dates=["observation_date"], index_col="observation_date")

df.plot(title="PIB reel des Etats-Unis (GDPC1)", legend=False)
plt.ylabel("Milliards de dollars de 2017")
plt.tight_layout()
plt.savefig("gdpc1.png", dpi=150)

Exécutez-le, et voici ce qui apparaît :

Le PIB réel des États-Unis, chargé depuis FRED et tracé par le script.

Huit lignes, et toute l'histoire de la production américaine depuis 1947 s'affiche — jusqu'aux 24 180 milliards du premier trimestre 2026, creux COVID compris.

Générer/Modifier l'image dans Google Colab

Reprenons ligne à ligne. Les deux premières importent les outils : pandas pour les données (qu'on rebaptise pd par convention) et matplotlib pour le dessin (plt). La troisième construit l'adresse de la série : remarquez qu'on colle simplement l'identifiant GDPC1 — celui-là même que vous avez appris à repérer au chapitre 18 — à la fin de l'URL d'export CSV de FRED. La quatrième ligne est le cœur : pd.read_csv télécharge et lit le fichier en une seule instruction, sans que vous ayez à l'enregistrer à la main. Les deux dernières tracent le graphique, l'habillent et l'enregistrent en image. C'est tout. Vous venez de faire, en un script relançable à volonté, ce qui demandait un enregistrement manuel et un tableur.

Les quatre gestes du script Python : importer, construire l'URL, lire le CSV, tracer

Chaque geste tient en une ligne — et c'est la troisième, celle qui désigne la colonne par sa position, qui rendra votre script increvable.

Générer/Modifier l'image dans Google Colab

Le piège qui casse tous les vieux tutoriels

Un détail de cette quatrième ligne mérite un arrêt, car il fait trébucher tout le monde. Nous avons écrit parse_dates=["observation_date"]. Or, si vous consultez un tutoriel écrit avant fin 2024, vous y lirez parse_dates=["DATE"] — et votre script plantera aussitôt, avec un message sévère :

ValueError: Missing column provided to 'parse_dates': 'DATE'

La raison ? FRED a renommé la colonne de dates de ses fichiers CSV : elle s'appelait DATE, elle s'appelle désormais observation_date. Le changement est intervenu en décembre 2024, et il a cassé, du jour au lendemain, des milliers de scripts et de tutoriels. La leçon dépasse le cas particulier : les formats de données changent sous vos pieds, sans prévenir. Pour vous en prémunir, préférez une écriture qui ne code pas le nom en dur — désignez la première colonne par sa position :

df = pd.read_csv(url, index_col=0, parse_dates=[0])

Ainsi, quel que soit le nom de la colonne de dates, votre script survivra au prochain changement. C'est le réflexe même de la reproductibilité.

Il existe d'ailleurs une voie encore plus courte, qui esquive complètement ce piège : la bibliothèque pandas-datareader, qui parle directement à FRED sans passer par une URL. Deux lignes suffisent :

from pandas_datareader import data as web
df = web.DataReader("GDPC1", "fred", start="1947-01-01")

Elle est commode, et normalise le nom de la colonne pour vous. Nous avons tout de même détaillé la méthode par URL, car elle est la plus robuste — elle ne dépend d'aucune couche logicielle supplémentaire, et vous montre, à nu, ce qui se passe vraiment : un fichier qu'on télécharge et qu'on lit. Comprendre la version longue, c'est ne jamais être prisonnier de la version courte.

Transformer, en une ligne

Une fois la série en mémoire, toute la puissance de pandas s'ouvre. Vous vous souvenez du menu déroulant « Variation sur un an » de FRED ? En code, c'est une seule instruction. Comme le PIB est trimestriel, on compare chaque trimestre à celui d'un an plus tôt — quatre trimestres en arrière :

croissance = df.pct_change(4) * 100
croissance.plot(title="Croissance du PIB reel, sur un an (%)", legend=False)

Le PIB réel en glissement annuel : le krach COVID et son rebond.

Une instruction, pct_change(4), et le niveau devient un taux de croissance. Le krach COVID (−7,5 %) et son rebond spectaculaire (+12,4 %) sautent aux yeux — invisibles sur la courbe des niveaux.

Générer/Modifier l'image dans Google Colab

Le niveau, illisible à l'œil, est devenu le taux de croissance, la variable qui compte. C'est là, précisément, que le code dépasse la souris : la même transformation, vous pouvez l'appliquer à cent séries d'un coup, ou la recalculer chaque matin sur la dernière donnée.

Trois indicateurs du parcours, en une ligne chacun

Le vrai gain n'est pas de tracer plus vite : c'est de fabriquer des grandeurs que FRED ne publie pas. Trois d'entre elles, croisées dans ce parcours, tiennent chacune en une ligne une fois les séries chargées.

Le déflateur du PIB du chapitre 10 n'est que le rapport du nominal au réel. Chargez GDP et GDPC1 — tous deux trimestriels, donc directement comparables :

deflateur = pib["GDP"] / pib["GDPC1"] * 100

La vitesse de circulation de la monnaie, celle qui décidera plus loin si une hausse de la monnaie finit dans les prix, est le PIB nominal rapporté à la masse monétaire. Attention au piège, ici : le PIB est trimestriel, M2SL est mensuel, et diviser deux séries de fréquences différentes ne produit que des trous. Il faut d'abord ramener la seconde au trimestre :

vitesse = pib["GDP"] / m2["M2SL"].resample("QS").mean()

Enfin, le réflexe anti-bruit des chapitres 6 et 7 — un mois est du bruit, trois mois un début de signal — se code en une méthode :

tendance = inflation.rolling(3).mean()

Aucune de ces trois grandeurs n'existe comme série prête à l'emploi sous cette forme ; chacune vous appartient dès que vous l'écrivez, et se recalcule sur la donnée du jour à chaque exécution. C'est exactement la frontière entre consulter des chiffres et en faire l'analyse.

Faire parler un graphique

Poussons d'un cran, pour retrouver les bandes de récession du chapitre précédent — cette fois par le code. Trois gestes suffisent : chargez aussi la série USREC (l'indicateur de récession du NBER, qui vaut 1 pendant une récession, 0 sinon), repérez les intervalles de 1, ombrez chacun avec axvspan.

rec = pd.read_csv(
    "https://fred.stlouisfed.org/graph/fredgraph.csv?id=USREC",
    index_col=0, parse_dates=[0])
ax = df.plot(legend=False)
en_recession = rec["USREC"] == 1
debuts = rec.index[en_recession & ~en_recession.shift(1, fill_value=False)]
fins = rec.index[en_recession & ~en_recession.shift(-1, fill_value=False)]
for debut, fin in zip(debuts, fins):
    ax.axvspan(debut, fin, color="grey", alpha=0.3)

Le PIB réel avec les récessions du NBER, ajoutées par une boucle.

Cinq lignes de plus, une petite boucle, et votre graphique parle comme celui d'un professionnel : chaque récession y creuse une marche visible.

Générer/Modifier l'image dans Google Colab

Ne vous inquiétez pas de tout comprendre du premier coup : l'essentiel est de voir qu'en une poignée de lignes, on reproduit — et on automatise — ce que FRED fait d'un clic. La différence, c'est que votre version est à vous : relançable, modifiable, partageable.

Quand ça casse (et ça cassera)

Un dernier conseil, le plus utile de tous : débuter, c'est se tromper, et les messages d'erreur de Python, intimidants au début, sont vos amis. Voici les trois plus fréquents et leur remède. Le premier, vous le connaissez déjà : ValueError: Missing column… — vous avez cité un nom de colonne qui n'existe pas (le fameux DATE devenu observation_date). Le deuxième surgit avec de vieux fichiers où les valeurs manquantes sont notées par un point : le calcul refuse alors de démarrer, car la colonne est vue comme du texte, et le remède tient en un argument, na_values=".", qui dit à pandas de traiter ces points comme des trous. Le troisième, ModuleNotFoundError: No module named 'pandas', signifie simplement que la bibliothèque n'est pas installée — sur Colab, elle l'est déjà ; sur votre machine, une commande pip install pandas suffit. Aucune de ces erreurs n'est grave ; toutes se règlent en une ligne. Le vrai débutant n'est pas celui qui ne se trompe jamais, c'est celui qui abandonne à la première erreur rouge.

Trois erreurs classiques de Python et leur remède en une ligne

Trois messages rouges, trois remèdes d'une ligne : gardez cette table à portée, elle couvre l'essentiel de ce qui vous arrêtera.

Générer/Modifier l'image dans Google Colab

À retenir

  • Pourquoi coder — Contre le « Reinhart-Rogoff » : un tableur opaque a propagé une erreur jusque dans la politique mondiale. Un script est reproductible, versionnable, ré-exécutable — et il passe à l'échelle (cent graphiques au lieu d'un).
  • Commencer sans rien installerGoogle Colab : Python, pandas et matplotlib prêts dans le navigateur, gratuitement. Un compte Google suffit.
  • Le script minimalimport pandas as pd ; construire l'URL avec l'identifiant FRED (ex. GDPC1) ; pd.read_csv(url, …) télécharge et lit en une ligne ; .plot() dessine. Huit lignes, un graphique.
  • LE piège — La colonne de dates de FRED s'appelle observation_date (et non plus DATE) depuis décembre 2024. Les vieux tutoriels plantent. Robuste : index_col=0, parse_dates=[0] (par position, pas par nom).
  • Transformerdf.pct_change(4)*100 transforme un PIB trimestriel en croissance annuelle, en une instruction. Le code applique la même opération à cent séries d'un coup.
  • Les erreurs sont vos amiesValueError (mauvais nom de colonne), valeurs « . » (ajouter na_values="."), ModuleNotFoundError (pip install). Toutes se règlent en une ligne.

La suite du voyage

Vous voici équipé : vous savez lire la richesse d'un pays, la décomposer, aller chercher les chiffres à la source et les faire parler par le code. Il ne manque qu'une chose — la plus importante pour placer votre argent. Car tout ce savoir, aussi solide soit-il, ne suffit pas à battre le marché : le marché a lu les mêmes données que vous. Le dernier chapitre du module, sa synthèse, tire cette leçon paradoxale et libératrice : « La croissance déjà anticipée : pourquoi elle est souvent dans les cours ». D'ici là, un exercice : reprenez le script minimal, remplacez GDPC1 par CPIAUCSL, ajoutez .pct_change(12)*100, et vous tracerez l'inflation américaine vous-même. Vous venez d'écrire, en dix lignes, l'outil que des économistes payés très cher ouvrent chaque matin.

Sources et références

  • Carmen M. Reinhart & Kenneth S. Rogoff, « Growth in a Time of Debt », American Economic Review 100(2), Papers & Proceedings, mai 2010 — le seuil des 90 % de dette/PIB et la contraction de −0,1 %.
  • Thomas Herndon, Michael Ash & Robert Pollin, « Does high public debt consistently stifle economic growth? A critique of Reinhart and Rogoff », PERI Working Paper 322 (15 avril 2013), publié dans le Cambridge Journal of Economics 38(2), 2014 — trois problèmes distincts : erreur de tableur (lignes 30-44 au lieu de 30-49, excluant l'Australie, l'Autriche, la Belgique, le Canada et le Danemark), exclusion sélective d'années disponibles et pondération inhabituelle. Leur correction combinée fait passer la moyenne de −0,1 % à +2,2 % ; l'erreur Excel ne produit pas seule cet écart.
  • Wes McKinney — création de la bibliothèque pandas en 2008 chez AQR Capital Management, publiée en open source fin 2009 (pandas 0.1 sur PyPI, 25 décembre 2009) ; pandas = panel data + Python data analysis. Ouvrage : Python for Data Analysis (O'Reilly, 1re éd. 2012).
  • Endpoint CSV de FRED : https://fred.stlouisfed.org/graph/fredgraph.csv?id=XXXX. L'en-tête de la colonne de dates est observation_date depuis décembre 2024 (auparavant DATE) — d'où l'intérêt de index_col=0, parse_dates=[0].
  • Outils : pandas et matplotlib (bibliothèques Python) ; pandas-datareader (accès direct à FRED) ; Google Colab (colab.research.google.com, Python/pandas/matplotlib préinstallés) ; uv (installation locale rapide). Script minimal testé sous Python 3.11 / pandas 3.0.
  • Données des figures : BEA et NBER via FRED — PIB réel (GDPC1), indicateur de récession (USREC) ; glissement annuel et bandes de récession calculés par le script ; correction Reinhart-Rogoff d'après Herndon, Ash & Pollin (2013) — millésime du 16 juillet 2026. Chaque figure est accompagnée d'un notebook Google Colab (dépôt nmlab-figures) qui la régénère (données du jour pour les graphiques, schéma éditable pour les autres).