```{python}
#| echo: false
import matplotlib.pyplot as plt
def prepare_plot_colors():
    # "Tableau 20" colors as RGB.
    colors = [(31, 119, 180), (174, 199, 232), (255, 127, 14), (255, 187, 120),
                 (44, 160, 44), (152, 223, 138), (214, 39, 40), (255, 152, 150),
                 (148, 103, 189), (197, 176, 213), (140, 86, 75), (196, 156, 148),
                 (227, 119, 194), (247, 182, 210), (127, 127, 127), (199, 199, 199),
                 (188, 189, 34), (219, 219, 141), (23, 190, 207), (158, 218, 229)]

    # Scale RGB values to the [0, 1] range for matplotlib
    for i in range(len(colors)):
        r, g, b = colors[i]
        colors[i] = (r / 255., g / 255., b / 255.)
    return colors

colors=prepare_plot_colors()
```

```{python}
#| echo: false
import openpyxl
import pandas as pd

df = pd.read_csv('data/cleaned/UNU-WIDER-WIID/WIID-30JUN2022_cty-select.csv', index_col="id", parse_dates=True)
```

```{python}
#| echo: false
df = df.loc[df['year'] > 1990]
ben = df.loc[df['c3'] == "BEN"]
dji = df.loc[df['c3'] == "DJI"]
uga = df.loc[df['c3'] == "UGA"]
vnm = df.loc[df['c3'] == "VNM"]
```

```{python}
from IPython.display import Markdown
from tabulate import tabulate
```

```{python}
# Set up the data extraction and figure drawing functions
import plotly.express as px
import plotly.io as pio

def gini_plot(country_df):
    if svg_render:
        pio.renderers.default = "png"

    fig = px.line(country_df, x="year", y="gini", markers=True, labels={"year": "Year", "gini": "Gini coefficient"}, template="seaborn", range_y=[0,100])
    fig.update_traces(marker_size=10)
    fig.show()

def plot_consumption_gini_percapita(country_df):
    gni_cnsmpt = country_df[country_df['resource'].str.contains("Consumption")]
    gni_cnsmpt_percapita = gni_cnsmpt[gni_cnsmpt['scale'].str.contains("Per capita")]
    gini_plot(gni_cnsmpt_percapita)

def plot_consumption_gini_percapita_ruralurban(country_df):
    gni_cnsmpt = country_df[country_df['resource'].str.contains("Consumption")]
    gni_cnsmpt = gni_cnsmpt[gni_cnsmpt['scale'].str.contains("Per capita")]
    gni_cnsmpt = gni_cnsmpt[gni_cnsmpt['source'].str.contains("World Bank")]
    gni_cnsmpt = gni_cnsmpt[gni_cnsmpt['areacovr'].str.contains("All")]
    gini_plot(gni_cnsmpt)
```

```{python}
## Set up functions to grab development aids by type of donating body
## ODA donor type map, see DAC code sheet xlsx
donortypes = {
    1: 'dac',
    2: 'dac',
    3: 'dac',
    4: 'dac',
    5: 'dac',
    6: 'dac',
    7: 'dac',
    8: 'dac',
    9: 'dac',
    10: 'dac',
    11: 'dac',
    12: 'dac',
    18: 'dac',
    20: 'dac',
    21: 'dac',
    22: 'dac',
    40: 'dac',
    50: 'dac',
    61: 'dac',
    68: 'dac',
    69: 'dac',
    75: 'dac',
    76: 'dac',
    301: 'dac',
    302: 'dac',
    701: 'dac',
    742: 'dac',
    801: 'dac',
    820: 'dac',
    918: 'dac',
    104: 'mlt',
    807: 'mlt',
    811: 'mlt',
    812: 'mlt',
    901: 'mlt',
    902: 'mlt',
    903: 'mlt',
    905: 'mlt',
    906: 'mlt',
    907: 'mlt',
    909: 'mlt',
    913: 'mlt',
    914: 'mlt',
    915: 'mlt',
    921: 'mlt',
    923: 'mlt',
    926: 'mlt',
    928: 'mlt',
    932: 'mlt',
    940: 'mlt',
    944: 'mlt',
    948: 'mlt',
    951: 'mlt',
    952: 'mlt',
    953: 'mlt',
    954: 'mlt',
    956: 'mlt',
    958: 'mlt',
    959: 'mlt',
    960: 'mlt',
    963: 'mlt',
    964: 'mlt',
    966: 'mlt',
    967: 'mlt',
    971: 'mlt',
    974: 'mlt',
    976: 'mlt',
    978: 'mlt',
    979: 'mlt',
    980: 'mlt',
    981: 'mlt',
    982: 'mlt',
    983: 'mlt',
    988: 'mlt',
    990: 'mlt',
    992: 'mlt',
    997: 'mlt',
    1011: 'mlt',
    1012: 'mlt',
    1013: 'mlt',
    1014: 'mlt',
    1015: 'mlt',
    1016: 'mlt',
    1017: 'mlt',
    1018: 'mlt',
    1019: 'mlt',
    1020: 'mlt',
    1023: 'mlt',
    1024: 'mlt',
    1025: 'mlt',
    1037: 'mlt',
    1038: 'mlt',
    1311: 'mlt',
    1312: 'mlt',
    1313: 'mlt',
    30: 'nondac',
    45: 'nondac',
    55: 'nondac',
    62: 'nondac',
    70: 'nondac',
    72: 'nondac',
    77: 'nondac',
    82: 'nondac',
    83: 'nondac',
    84: 'nondac',
    87: 'nondac',
    130: 'nondac',
    133: 'nondac',
    358: 'nondac',
    543: 'nondac',
    546: 'nondac',
    552: 'nondac',
    561: 'nondac',
    566: 'nondac',
    576: 'nondac',
    611: 'nondac',
    613: 'nondac',
    732: 'nondac',
    764: 'nondac',
    765: 'nondac',
    1601: 'private',
    1602: 'private',
    1603: 'private',
    1604: 'private',
    1605: 'private',
    1606: 'private',
    1607: 'private',
    1608: 'private',
    1609: 'private',
    1610: 'private',
    1611: 'private',
    1612: 'private',
    1613: 'private',
    1614: 'private',
    1615: 'private',
    1616: 'private',
    1617: 'private',
    1618: 'private',
    1619: 'private',
    1620: 'private',
    1621: 'private',
    1622: 'private',
    1623: 'private',
    1624: 'private',
    1625: 'private',
    1626: 'private',
    1627: 'private',
    1628: 'private',
    1629: 'private',
    1630: 'private',
    1631: 'private',
    1632: 'private',
    1633: 'private',
    1634: 'private',
    1635: 'private',
    1636: 'private',
    1637: 'private',
    1638: 'private',
    1639: 'private',
}

def totals_by_donortype(oda_frame):
    totals = oda_frame.loc[
        (df['RECIPIENT'] == 236) &
        (df['SECTOR'] == 1000) &
        (df['FLOW'] == 100) &
        (df['CHANNEL'] == 100) &
        (df['AMOUNTTYPE'] == 'D') &
        (df['FLOWTYPE'] == 112) &
        (df['AIDTYPE'] == "100") # contains mixed int and string representations
        ]
    donortotals = totals.copy()
    donortotals["Donortype"] = donortotals["DONOR"].map(donortypes)
    return donortotals
```
