Données pour reproduire l'estimation de MRW (QJE, 1992)



Je montre ici comment construire une base de données pour reproduire les estimations dans l'article de Mankiw, Romer et Weil (QJE, 1992) en extrayant les données reproduites dans le pdf de l'article.




Dans l'article « A contribution to the Empirics of Economic Growth », Mankiw Romer et Weil (1992) proposent plusieurs estimations du modèle de Solow et d'une version augmentée avec du capital humain. Dans cette note, je montre comment récupérer les données utilisées par ces trois auteurs et reproduites dans un tableau à la fin de l'article (pages 434 à 436) à l'aide d'un petit code en Python.

Nous utilisons deux librairies, qu'il faut éventuellement installer avec la commande pip, tabula-py qui permet d'extraire des tables de documents PDF et Pandas.

import tabula
import pandas as pd

Pour télécharger la version PDF de l'article nous utilisons le module requests :

import requests

response = requests.get('https://eml.berkeley.edu/~dromer/papers/MRW_QJE1992.pdf')

with open('./mrw-1992.pdf', 'wb') as f:
  f.write(response.content)

Sans même lire la documentation de la librairie tabula-py on récupère facilement le tableau sur les deux premières pages. Le seul problème est qu'il faut renommer les colonnes (de l'objet DataFrame retourné par la fonction tabula.read_pdf()).

t1 = tabula.read_pdf('./mrw-1992.pdf', pages=28, silent=True)
t1 = t1[0]
t1.rename(columns={'0':'O', '1960':'GDP_1960', '1985':'GDP_1985', 'GDP':'g(GDP)', 'age pop':'g(POP)', 'Unnamed: 0':'I/Y', 'Unnamed: 1':'SCHOOL'}, inplace=True)

t2 = tabula.read_pdf('./mrw-1992.pdf', pages=29, silent=True)
t2 = t2[0]
t2.rename(columns={'0':'O', '1960':'GDP_1960', '1985':'GDP_1985', 'GDP':'g(GDP)', 'age pop':'g(POP)', 'Unnamed: 0':'I/Y', 'Unnamed: 1':'SCHOOL'}, inplace=True)

Pour la dernière page, c'est un peu plus compliqué. La fonction tabula.read_pdf() a besoin d'aide pour identifier les colonnes (elle ne parvient pas à séparer les colonnes O et 1960). On peut lui donner les coordonnées des séparateurs de colonnes (identifiées en éditant le fichier PDF sous Gimp et en configurant les règles, en haut à gauche, avec des points comme unité de mesure). Même avec cette information supplémentaire, la fonction retourne des données incohérentes sur les premières et dernières lignes (à cause du format particulier de l'entête du tableau et des notes au bas du tableau). On élimine donc ces lignes.

t3 = tabula.read_pdf('./mrw-1992.pdf',pages=30,silent=True, columns=[68, 150, 160, 170, 178, 205, 233, 251, 285, 306], guess=False)
t3 = t3[0][6:43]
t3.rename(columns={'436':'Number', 'QUARTERL':'Country', 'Y':'N', 'JO':'I', 'U':'O', 'RNAL':'GDP_1960', 'OF ECO':'GDP_1985', 'NOM':'g(GDP)', 'ICS':'g(POP)','Unnamed: 0':'I/Y', 'Unnamed: 1':'SCHOOL'}, inplace=True)  

Enfin, il ne reste plus qu'à concaténer les trois objets DataFrame t1, t2 et t3 à l'aide de la fonction concat de Pandas :

mrwdata = pd.concat([t1,t2,t3], ignore_index=True)