7.11. HTML GDP

7.11.1. Code

"""
>>> result.loc['Polska']
PKB          6.741270e+11
Ludność      3.842069e+07
PerCapita    1.754594e+04
Name: Polska, dtype: float64
"""

import pandas as pd
import matplotlib.pyplot as plt


pd.set_option('display.width', 200)
pd.set_option('display.max_columns', 15)
pd.set_option('display.max_rows', 100)
pd.set_option('display.min_rows', 100)
pd.set_option('display.max_seq_items', 100)


USD = 1

# PKB = 'https://pl.wikipedia.org/wiki/Lista_pa%C5%84stw_%C5%9Bwiata_wed%C5%82ug_PKB_nominalnego'
PKB = 'https://python3.info/_static/percapita-pkb.html'

# LUDNOSC = 'https://pl.wikipedia.org/wiki/Lista_pa%C5%84stw_%C5%9Bwiata_wed%C5%82ug_liczby_ludno%C5%9Bci'
LUDNOSC = 'https://python3.info/_static/percapita-ludnosc.html'

LUDNOSC_PANSTWA = {
    'Chińska Republika Ludowa': 'Chiny',
    'Korea Północna': pd.NA,
    'Republika Chińska': 'Tajwan',
    'Kuba': pd.NA,
    'Zachodni Brzeg': pd.NA,
    'Strefa Gazy': pd.NA}

LUDNOSC_COLUMNS = {
    'Państwo, obszar lub terytorium zależne': 'Państwo',
    '2018': 'Ludność'}


def clean(column):
    return (column
        .str.replace('\xa0', '')
        .str.replace(' ', ''))

pkb = (pd
    .read_html(PKB)[1]
    .rename(columns={'2021 r.': 'PKB'})
    .loc[:, ['Państwo', 'PKB']]
    .replace('b.d.', pd.NA)
    .dropna(how='any', axis='rows')
    .apply(clean)
    .astype({'PKB': 'int64'})
    .set_index('Państwo')
    .mul(1_000_000*USD))

ludnosc = (pd
    .read_html(LUDNOSC)[0]
    .droplevel(level=0, axis='columns')
    .rename(columns=LUDNOSC_COLUMNS)
    .loc[:, ['Państwo', 'Ludność']]
    .replace(LUDNOSC_PANSTWA)
    .set_index('Państwo')
    .query('index in @pkb.index')
    .apply(clean)
    .astype({'Ludność': 'int64'}))

result = (pkb
    .merge(ludnosc, left_index=True, right_index=True)
    .sort_index(ascending=True)
    .eval('PerCapita = PKB / Ludność'))

plot = (result
    .loc[:, ['PerCapita']]
    .round({'PerCapita': 1})
    .sort_values('PerCapita', ascending=False)
    .head(n=30)
    .plot(kind='bar', legend=True, grid=True, figsize=(16,10)))

# plt.show()
import pandas as pd
from matplotlib import pyplot as plt


PKB = 'https://pl.wikipedia.org/wiki/Lista_pa%C5%84stw_%C5%9Bwiata_wed%C5%82ug_PKB_(parytet_si%C5%82y_nabywczej)'
LUDNOSC = 'https://pl.wikipedia.org/wiki/Lista_pa%C5%84stw_%C5%9Bwiata_wed%C5%82ug_liczby_ludno%C5%9Bci'
USD = 1


COUNTRIES = {
    'Chińska Republika Ludowa': 'Chiny',
    'Republika Chińska': 'Tajwan',
    # 'Strefa Gazy':'Zachodni Brzeg i Strefa Gazy',
    # 'Zachodni Brzeg': 'Zachodni Brzeg i Strefa Gazy',
    # 'Korea Północna': ''
    # 'Syria': ''
    # 'Kuba': ''
    # 'Zachodni Brzeg': ''
    # 'Strefa Gazy': ''
    # 'Polinezja Francuska': ''
    # 'Nowa Kaledonia': ''
    # 'Guam': ''
    # 'Curaçao': ''
    # 'Wyspy Dziewicze': ''
    # 'Jersey': ''
    # 'Wyspa Man': ''
    # 'Andora': ''
    # 'Bermudy': ''
    # 'Guernsey': ''
    # 'Kajmany': ''
    # 'Turks i Caicos': ''
    # 'Grenlandia': ''
    # 'Wyspy Owcze': ''
    # 'Mariany Północne': ''
    # 'Samoa Amerykańskie': ''
    # 'Sint Maarten': ''
    # 'Liechtenstein': ''
    # 'Brytyjskie Wyspy Dziewicze': ''
    # 'Saint-Martin[a]': ''
    # 'Monako': ''
    # 'Gibraltar': ''
    # 'Anguilla': ''
    # 'Wallis i Futuna': ''
    # 'Wyspy Cooka': ''
    # 'Wyspa Świętej Heleny, Wyspa Wniebowstąpienia i ...': ''
    # 'Saint-Barthélemy[a]': ''
    # 'Montserrat': ''
    # 'Saint-Pierre i Miquelon': ''
    # 'Falklandy': ''
    # 'Svalbard': ''
    # 'Niue': ''
    # 'Tokelau': ''
    # 'Watykan': ''
    # 'Pitcairn': ''

}

pkb = (pd
    .read_html(PKB)[0]
    .rename(columns={'Kraj':'kraj', '2019':'pkb'})
    .loc[:, ['kraj', 'pkb']]
    .replace(regex=True, to_replace={
        'pkb': {'b.d': pd.NA, '\s':''},
        'kraj': {'\[2\]': ''}})
    .dropna()
    .set_index('kraj', drop=True)
    .astype('int')
    .convert_dtypes()
    .mul(1_000_000*USD))

ludnosc = (pd
    .read_html(LUDNOSC)[0]
    .droplevel(level=0, axis='columns')
    .rename(columns={'Państwo, obszar lub terytorium zależne':'kraj', '2022':'ludnosc'})
    .loc[:, ['kraj','ludnosc']]
    .replace(regex=True, to_replace={
        'kraj':COUNTRIES,
        'ludnosc':{'–': pd.NA, '\[3\]': '', '\s':''}})
    .set_index('kraj', drop=True)
    .dropna()
    .astype('int')
    .convert_dtypes())

per_capita = (pd
    .merge(left=pkb, right=ludnosc, left_index=True, right_index=True)
    .assign(per_capita=lambda df: df.pkb / df.ludnosc)
    .round(1)
    .convert_dtypes()
    .sort_values(by='per_capita', ascending=False))


plot_percapita = (
    per_capita
    .loc[:, 'per_capita']
    .sort_values(ascending=False)
    .head(n=10)
    .plot(
        kind='bar',
        title='PKB Per Capita',
        xlabel='Państwo',
        ylabel='PKB Per Capita',
        grid=False,
        legend=False,
        figsize=(16,10)))

plt.tight_layout()
plt.show()

7.11.2. Plots

../../_images/html-gdp-top10.png

Figure 7.10. Top 10 countries with highest Global Domestic Product Per Capita