I show here how to build a database for replicating the estimations of Mankiw, Romer and Weil (QJE, 1992), by extracting the data reproduced in the PDF of the article.
In the article "A Contribution to the Empirics of Economic Growth", Mankiw, Romer and Weil (1992) propose several estimations of the Solow model and of a version augmented with human capital. In this note, I show how to retrieve the data used by these three authors, reproduced in a table at the end of the article (pages 434 to 436), with a small Python script.
We use two libraries, which may have to be installed with the pip command:
tabula-py, which extracts tables from PDF documents, and Pandas. Note that
tabula-py is only a wrapper around a Java library: a Java runtime
environment (version 8 or later) must therefore also be available on the
PATH, otherwise the pip installation will succeed but the call to
tabula.read_pdf() will fail.
import tabula
import pandas as pd
To download the PDF version of the article we use the requests module:
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)
Without even reading the documentation of the tabula-py library, the table
on the first two pages is easily retrieved. The only problem is that the
columns (of the DataFrame object returned by tabula.read_pdf()) have to be
renamed.
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)
The last page is a bit more complicated. The tabula.read_pdf() function
needs some help to identify the columns (it fails to separate the O and
1960 columns). One can give it the coordinates of the column separators
(identified by opening the PDF file in Gimp and setting the rulers, at the top
left, to points as the unit of measurement). Even with this extra
information, the function returns inconsistent data on the first and last
rows (because of the peculiar layout of the table header and of the notes at
the bottom of the table). These rows are therefore dropped.
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)
Finally, it only remains to concatenate the three DataFrame objects t1,
t2 and t3 with the concat function of Pandas, and to save the result in
a csv file:
mrwdata = pd.concat([t1,t2,t3], ignore_index=True)
mrwdata.to_csv('./mrw-1992.csv', index=False)
| Number | Country | N | I | O | GDP_1960 | GDP_1985 | g(GDP) | g(POP) | I/Y | SCHOOL | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | Algeria | 1 | 1 | 0 | 2485 | 4371 | 4.8 | 2.6 | 24.1 | 4.5 |
| 1 | 2 | Angola | 1 | 0 | 0 | 1588 | 1171 | 0.8 | 2.1 | 5.8 | 1.8 |
| 2 | 3 | Benin | 1 | 0 | 0 | 1116 | 1071 | 2.2 | 2.4 | 10.8 | 1.8 |
| 3 | 4 | Botswana | 1 | 1 | 0 | 959 | 3671 | 8.6 | 3.2 | 28.3 | 2.9 |
| 4 | 5 | Burkina Faso | 1 | 0 | 0 | 529 | 857 | 2.9 | 0.9 | 12.7 | 0.4 |
| 5 | 6 | Burundi | 1 | 0 | 0 | 755 | 663 | 1.2 | 1.7 | 5.1 | 0.4 |
| 6 | 7 | Cameroon | 1 | 1 | 0 | 889 | 2190 | 5.7 | 2.1 | 12.8 | 3.4 |
| 7 | 8 | CentralAfr. Rep. | 1 | 0 | 0 | 838 | 789 | 1.5 | 1.7 | 10.5 | 1.4 |
| 8 | 9 | Chad | 1 | 0 | 0 | 908 | 462 | -0.9 | 1.9 | 6.9 | 0.4 |
| 9 | 10 | Congo, Peop. Rep. | 1 | 0 | 0 | 1009 | 2624 | 6.2 | 2.4 | 28.8 | 3.8 |
| 10 | 11 | Egypt | 1 | 0 | 0 | 907 | 2160 | 6 | 2.5 | 16.3 | 7 |
| 11 | 12 | Ethiopia | 1 | 1 | 0 | 533 | 608 | 2.8 | 2.3 | 5.4 | 1.1 |
| 12 | 13 | Gabon | 0 | 0 | 0 | 1307 | 5350 | 7 | 1.4 | 22.1 | 2.6 |
| 13 | 14 | Gambia, The | 0 | 0 | 0 | 799 | nan | 3.6 | nan | 18.1 | 1.5 |
| 14 | 15 | Ghana | 1 | 0 | 0 | 1009 | 727 | 1 | 2.3 | 9.1 | 4.7 |
| 15 | 16 | Guinea | 0 | 0 | 0 | 746 | 869 | 2.2 | 1.6 | 10.9 | nan |
| 16 | 17 | Ivory Coast | 1 | 1 | 0 | 1386 | 1704 | 5.1 | 4.3 | 12.4 | 2.3 |
| 17 | 18 | Kenya | 1 | 1 | 0 | 944 | 1329 | 4.8 | 3.4 | 17.4 | 2.4 |
| 18 | 19 | Lesotho | 0 | 0 | 0 | 431 | 1483 | 6.8 | 1.9 | 12.6 | 2 |
| 19 | 20 | Liberia | 1 | 0 | 0 | 863 | 944 | 3.3 | 3 | 21.5 | 2.5 |
| 20 | 21 | Madagascar | 1 | 1 | 0 | 1194 | 975 | 1.4 | 2.2 | 7.1 | 2.6 |
| 21 | 22 | Malawi | 1 | 1 | 0 | 455 | 823 | 4.8 | 2.4 | 13.2 | 0.6 |
| 22 | 23 | Mali | 1 | 1 | 0 | 737 | 710 | 2.1 | 2.2 | 7.3 | 1 |
| 23 | 24 | Mauritania | 1 | 0 | 0 | 777 | 1038 | 3.3 | 2.2 | 25.6 | 1 |
| 24 | 25 | Mauritius | 1 | 0 | 0 | 1973 | 2967 | 4.2 | 2.6 | 17.1 | 7.3 |
| 25 | 26 | Morocco | 1 | 1 | 0 | 1030 | 2348 | 5.8 | 2.5 | 8.3 | 3.6 |
| 26 | 27 | Mozambique | 1 | 0 | 0 | 1420 | 1035 | 1.4 | 2.7 | 6.1 | 0.7 |
| 27 | 28 | Niger | 1 | 0 | 0 | 539 | 841 | 4.4 | 2.6 | 10.3 | 0.5 |
| 28 | 29 | Nigeria | 1 | 1 | 0 | 1055 | 1186 | 2.8 | 2.4 | 12 | 2.3 |
| 29 | 30 | Rwanda | 1 | 0 | 0 | 460 | 696 | 4.5 | 2.8 | 7.9 | 0.4 |
| 30 | 31 | Senegal | 1 | 1 | 0 | 1392 | 1450 | 2.5 | 2.3 | 9.6 | 1.7 |
| 31 | 32 | Sierra Leone | 1 | 0 | 0 | 511 | 805 | 3.4 | 1.6 | 10.9 | 1.7 |
| 32 | 33 | Somalia | 1 | 0 | 0 | 901 | 657 | 1.8 | 3.1 | 13.8 | 1.1 |
| 33 | 34 | S. Africa | 1 | 1 | 0 | 4768 | 7064 | 3.9 | 2.3 | 21.6 | 3 |
| 34 | 35 | Sudan | 1 | 0 | 0 | 1254 | 1038 | 1.8 | 2.6 | 13.2 | 2 |
| 35 | 36 | Swaziland | 0 | 0 | 0 | 817 | nan | 7.2 | nan | 17.7 | 3.7 |
| 36 | 37 | Tanzania | 1 | 1 | 0 | 383 | 710 | 5.3 | 2.9 | 18 | 0.5 |
| 37 | 38 | Togo | 1 | 0 | 0 | 777 | 978 | 3.4 | 2.5 | 15.5 | 2.9 |
| 38 | 39 | Tunisia | 1 | 1 | 0 | 1623 | 3661 | 5.6 | 2.4 | 13.8 | 4.3 |
| 39 | 40 | Uganda | 1 | 0 | 0 | 601 | 667 | 3.5 | 3.1 | 4.1 | 1.1 |
| 40 | 41 | Zaire | 1 | 0 | 0 | 594 | 412 | 0.9 | 2.4 | 6.5 | 3.6 |
| 41 | 42 | Zambia | 1 | 1 | 0 | 1410 | 1217 | 2.1 | 2.7 | 31.7 | 2.4 |
| 42 | 43 | Zimbabwe | 1 | 1 | 0 | 1187 | 2107 | 5.1 | 2.8 | 21.1 | 4.4 |
| 43 | 44 | Afghanistan | 0 | 0 | 0 | 1224 | nan | 1.6 | nan | 6.9 | 0.9 |
| 44 | 45 | Bahrain | 0 | 0 | 0 | nan | nan | nan | nan | 30 | 12.1 |
| 45 | 46 | Bangladesh | 1 | 1 | 0 | 846 | 1221 | 4 | 2.6 | 6.8 | 3.2 |
| 46 | 47 | Burma | 1 | 1 | 0 | 517 | 1031 | 4.5 | 1.7 | 11.4 | 3.5 |
| 47 | 48 | Hong Kong | 1 | 1 | 0 | 3085 | 13372 | 8.9 | 3 | 19.9 | 7.2 |
| 48 | 49 | India | 1 | 1 | 0 | 978 | 1339 | 3.6 | 2.4 | 16.8 | 5.1 |
| 49 | 50 | Iran | 0 | 0 | 0 | 3606 | 7400 | 6.3 | 3.4 | 18.4 | 6.5 |
| 50 | 51 | Iraq | 0 | 0 | 0 | 4916 | 5626 | 3.8 | 3.2 | 16.2 | 7.4 |
| 51 | 52 | Israel | 1 | 1 | 0 | 4802 | 10450 | 5.9 | 2.8 | 28.5 | 9.5 |
| 52 | 53 | Japan | 1 | 1 | 1 | 3493 | 13893 | 6.8 | 1.2 | 36 | 10.9 |
| 53 | 54 | Jordan | 1 | 1 | 0 | 2183 | 4312 | 5.4 | 2.7 | 17.6 | 10.8 |
| 54 | 55 | Korea, Rep. of | 1 | 1 | 0 | 1285 | 4775 | 7.9 | 2.7 | 22.3 | 10.2 |
| 55 | 56 | Kuwait | 0 | 0 | 0 | 77881 | 25635 | 2.4 | 6.8 | 9.5 | 9.6 |
| 56 | 57 | Malaysia | 1 | 1 | 0 | 2154 | 5788 | 7.1 | 3.2 | 23.2 | 7.3 |
| 57 | 58 | Nepal | 1 | 0 | 0 | 833 | 974 | 2.6 | 2 | 5.9 | 2.3 |
| 58 | 59 | Oman | 0 | 0 | 0 | nan | 15584 | nan | 3.3 | 15.6 | 2.7 |
| 59 | 60 | Pakistan | 1 | 1 | 0 | 1077 | 2175 | 5.8 | 3 | 12.2 | 3 |
| 60 | 61 | Philippines | 1 | 1 | 0 | 1668 | 2430 | 4.5 | 3 | 14.9 | 10.6 |
| 61 | 62 | Saudi Arabia | 0 | 0 | 0 | 6731 | 11057 | 6.1 | 4.1 | 12.8 | 3.1 |
| 62 | 63 | Singapore | 1 | 1 | 0 | 2793 | 14678 | 9.2 | 2.6 | 32.2 | 9 |
| 63 | 64 | Sri Lanka | 1 | 1 | 0 | 1794 | 2482 | 3.7 | 2.4 | 14.8 | 8.3 |
| 64 | 65 | Syrian Arab Rep. | 1 | 1 | 0 | 2382 | 6042 | 6.7 | 3 | 15.9 | 8.8 |
| 65 | 66 | Taiwan | 0 | 0 | 0 | nan | nan | 8 | nan | 20.7 | nan |
| 66 | 67 | Thailand | 1 | 1 | 0 | 1308 | 3220 | 6.7 | 3.1 | 18 | 4.4 |
| 67 | 68 | U. Arab Emirates | 0 | 0 | 0 | nan | 18513 | nan | nan | 26.5 | nan |
| 68 | 69 | Yemen | 0 | 0 | 0 | nan | 1918 | nan | 2.5 | 17.2 | 0.6 |
| 69 | 70 | Austria | 1 | 1 | 1 | 5939 | 13327 | 3.6 | 0.4 | 23.4 | 8 |
| 70 | 71 | Belgium | 1 | 1 | 1 | 6789 | 14290 | 3.5 | 0.5 | 23.4 | 9.3 |
| 71 | 72 | Cyprus | 0 | 0 | 0 | 2948 | nan | 5.2 | nan | 31.2 | 8.2 |
| 72 | 73 | Denmark | 1 | 1 | 1 | 8551 | 16491 | 3.2 | 0.6 | 26.6 | 10.7 |
| 73 | 74 | Finland | 1 | 1 | 1 | 6527 | 13779 | 3.7 | 0.7 | 36.9 | 11.5 |
| 74 | 75 | France | 1 | 1 | 1 | 7215 | 15027 | 3.9 | 1 | 26.2 | 8.9 |
| 75 | 76 | Germany, Fed. Rep. | 1 | 1 | 1 | 7695 | 15297 | 3.3 | 0.5 | 28.5 | 8.4 |
| 76 | 77 | Greece | 1 | 1 | 1 | 2257 | 6868 | 5.1 | 0.7 | 29.3 | 7.9 |
| 77 | 78 | Iceland | 0 | 0 | 0 | 8091 | nan | 3.9 | nan | 29 | 10.2 |
| 78 | 79 | Ireland | 1 | 1 | 1 | 4411 | 8675 | 3.8 | 1.1 | 25.9 | 11.4 |
| 79 | 80 | Italy | 1 | 1 | 1 | 4913 | 11082 | 3.8 | 0.6 | 24.9 | 7.1 |
| 80 | 81 | Luxembourg | 0 | 0 | 0 | 9015 | nan | 2.8 | nan | 26.9 | 5 |
| 81 | 82 | Malta | 0 | 0 | 0 | 2293 | nan | 6 | nan | 30.9 | 7.1 |
| 82 | 83 | Netherlands | 1 | 1 | 1 | 7689 | 13177 | 3.6 | 1.4 | 25.8 | 10.7 |
| 83 | 84 | Norway | 1 | 1 | 1 | 7938 | 19723 | 4.3 | 0.7 | 29.1 | 10 |
| 84 | 85 | Portugal | 1 | 1 | 1 | 2272 | 5827 | 4.4 | 0.6 | 22.5 | 5.8 |
| 85 | 86 | Spain | 1 | 1 | 1 | 3766 | 9903 | 4.9 | 1 | 17.7 | 8 |
| 86 | 87 | Sweden | 1 | 1 | 1 | 7802 | 15237 | 3.1 | 0.4 | 24.5 | 7.9 |
| 87 | 88 | Switzerland | 1 | 1 | 1 | 10308 | 15881 | 2.5 | 0.8 | 29.7 | 4.8 |
| 88 | 89 | Turkey | 1 | 1 | 1 | 2274 | 4444 | 5.2 | 2.5 | 20.2 | 5.5 |
| 89 | 90 | United Kingdom | 1 | 1 | 1 | 7634 | 13331 | 2.5 | 0.3 | 18.4 | 8.9 |
| 90 | 91 | Barbados | 0 | 0 | 0 | 3165 | nan | 4.8 | nan | 19.5 | 12.1 |
| 91 | 92 | Canada | 1 | 1 | 1 | 10286 | 17935 | 4.2 | 2 | 23.3 | 10.6 |
| 92 | 93 | Costa Rica | 1 | 1 | 0 | 3360 | 4492 | 4.7 | 3.5 | 14.7 | 7 |
| 93 | 94 | Dominican Rep. | 1 | 1 | 0 | 1939 | 3308 | 5.1 | 2.9 | 17.1 | 5.8 |
| 94 | 95 | El Salvador | 1 | 1 | 0 | 2042 | 1997 | 3.3 | 3.3 | 8 | 3.9 |
| 95 | 96 | Guatemala | 1 | 1 | 0 | 2481 | 3034 | 3.9 | 3.1 | 8.8 | 2.4 |
| 96 | 97 | Haiti | 1 | 1 | 0 | 1096 | 1237 | 1.8 | 1.3 | 7.1 | 1.9 |
| 97 | 98 | Honduras | 1 | 1 | 0 | 1430 | 1822 | 4 | 3.1 | 13.8 | 3.7 |
| 98 | 99 | Jamaica | 1 | 1 | 0 | 2726 | 3080 | 2.1 | 1.6 | 20.6 | 11.2 |
| 99 | 100 | Mexico | 1 | 1 | 0 | 4229 | 7380 | 5.5 | 3.3 | 19.5 | 6.6 |
| 100 | 101 | Nicaragua | 1 | 1 | 0 | 3195 | 3978 | 4.1 | 3.3 | 14.5 | 5.8 |
| 101 | 102 | Panama | 1 | 1 | 0 | 2423 | 5021 | 5.9 | 3 | 26.1 | 11.6 |
| 102 | 103 | Trinidad & Tobago | 1 | 1 | 0 | 9253 | 11285 | 2.7 | 1.9 | 20.4 | 8.8 |
| 103 | 104 | United States | 1 | 1 | 1 | 12362 | 18988 | 3.2 | 1.5 | 21.1 | 11.9 |
| 104 | 105 | Argentina | 1 | 1 | 0 | 4852 | 5533 | 2.1 | 1.5 | 25.3 | 5 |
| 105 | 106 | Bolivia | 1 | 1 | 0 | 1618 | 2055 | 3.3 | 2.4 | 13.3 | 4.9 |
| 106 | 107 | Brazil | 1 | 1 | 0 | 1842 | 5563 | 7.3 | 2.9 | 23.2 | 4.7 |
| 107 | 108 | Chile | 1 | 1 | 0 | 5189 | 5533 | 2.6 | 2.3 | 29.7 | 7.7 |
| 108 | 109 | Colombia | 1 | 1 | 0 | 2672 | 4405 | 5 | 3 | 18 | 6.1 |
| 109 | 110 | Ecuador | 1 | 1 | 0 | 2198 | 4504 | 5.7 | 2.8 | 24.4 | 7.2 |
| 110 | 111 | Guyana | 0 | 0 | 0 | 2761 | nan | 1.1 | nan | 32.4 | 11.7 |
| 111 | 112 | Paraguay | 1 | 1 | 0 | 1951 | 3914 | 5.5 | 2.7 | 11.7 | 4.4 |
| 112 | 113 | Peru | 1 | 1 | 0 | 3310 | 3775 | 3.5 | 2.9 | 12 | 8 |
| 113 | 114 | Surinam | 0 | 0 | 0 | 3226 | nan | 4.5 | nan | 19.4 | 8.1 |
| 114 | 115 | Uruguay | 1 | 1 | 0 | 5119 | 5495 | 0.9 | 0.6 | 11.8 | 7 |
| 115 | 116 | Venezuela | 1 | 1 | 0 | 10367 | 6336 | 1.9 | 3.8 | 11.4 | 7 |
| 116 | 117 | Australia | 1 | 1 | 1 | 8440 | 13409 | 3.8 | 2 | 31.5 | 9.8 |
| 117 | 118 | Fiji | 0 | 0 | 0 | 3634 | nan | 4.2 | nan | 20.6 | 8.1 |
| 118 | 119 | Indonesia | 1 | 1 | 0 | 879 | 2159 | 5.5 | 1.9 | 13.9 | 4.1 |
| 119 | 120 | New Zealand | 1 | 1 | 1 | 9523 | 12308 | 2.7 | 1.7 | 22.5 | 11.9 |
| 120 | 121 | Papua New Guinea | 1 | 0 | 0 | 1781 | 2544 | 3.5 | 2.1 | 16.2 | 1.5 |