afd/data-prep.qmd

248 lines
5.6 KiB
Plaintext

```{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
```