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)