{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n", "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0RegionIDClusterIDlonlatcountry.code.ISO.3166.alpha.3year.of.interviewmonth.of.interviewruralcountrycontinentiwi_meaniwi_variwi_skewnessiwi_kurtosisgeometrydate
01AO.Estavel MesoendemicaAO.Estavel Mesoendemica.51.113.859255-12.16928324200612UrbanAngolaAfrica0.63235651.530785-1.1364354.376306POINT (13.85925 -12.16928)2006-12-15
12AO.Estavel MesoendemicaAO.Estavel Mesoendemica.51.113.859255-12.16928324200611UrbanAngolaAfrica0.63235651.530785-1.1364354.376306POINT (13.85925 -12.16928)2006-11-15
23AO.Estavel MesoendemicaAO.Estavel Mesoendemica.51.213.845458-12.16775324200611UrbanAngolaAfrica0.59626299.839389-1.1219123.897659POINT (13.84546 -12.16775)2006-11-15
34AO.Estavel MesoendemicaAO.Estavel Mesoendemica.51.313.607121-12.74731224200611UrbanAngolaAfrica0.64098596.416849-0.1995222.731744POINT (13.60712 -12.74731)2006-11-15
45AO.Estavel MesoendemicaAO.Estavel Mesoendemica.51.414.060841-11.50291924200612UrbanAngolaAfrica0.505828359.699498-0.5078872.371137POINT (14.06084 -11.50292)2006-12-15
......................................................
6602466025ZM.LusakaZM.Lusaka.71.54128.370067-15.41608189420189UrbanZambiaAfrica0.530495201.920771-0.2967643.270728POINT (28.37007 -15.41608)2018-09-15
6602566026ZM.MuchingaZM.Muchinga.71.54232.946955-11.15045389420189RuralZambiaAfrica0.17934770.9172660.1869242.157706POINT (32.94696 -11.15045)2018-09-15
6602666027ZM.LusakaZM.Lusaka.71.54328.299570-15.769918894201812RuralZambiaAfrica0.340004305.6198750.6453952.523493POINT (28.29957 -15.76992)2018-12-15
6602766028ZM.CentralZM.Central.71.54430.039495-12.87639289420189RuralZambiaAfrica0.13588659.7942520.0615901.959555POINT (30.0395 -12.87639)2018-09-15
6602866029ZM.MuchingaZM.Muchinga.71.54532.608905-9.421954894201812RuralZambiaAfrica0.205844261.4271061.1397793.475082POINT (32.6089 -9.42195)2018-12-15
\n", "

65655 rows × 17 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 RegionID ClusterID \\\n", "0 1 AO.Estavel Mesoendemica AO.Estavel Mesoendemica.51.1 \n", "1 2 AO.Estavel Mesoendemica AO.Estavel Mesoendemica.51.1 \n", "2 3 AO.Estavel Mesoendemica AO.Estavel Mesoendemica.51.2 \n", "3 4 AO.Estavel Mesoendemica AO.Estavel Mesoendemica.51.3 \n", "4 5 AO.Estavel Mesoendemica AO.Estavel Mesoendemica.51.4 \n", "... ... ... ... \n", "66024 66025 ZM.Lusaka ZM.Lusaka.71.541 \n", "66025 66026 ZM.Muchinga ZM.Muchinga.71.542 \n", "66026 66027 ZM.Lusaka ZM.Lusaka.71.543 \n", "66027 66028 ZM.Central ZM.Central.71.544 \n", "66028 66029 ZM.Muchinga ZM.Muchinga.71.545 \n", "\n", " lon lat country.code.ISO.3166.alpha.3 year.of.interview \\\n", "0 13.859255 -12.169283 24 2006 \n", "1 13.859255 -12.169283 24 2006 \n", "2 13.845458 -12.167753 24 2006 \n", "3 13.607121 -12.747312 24 2006 \n", "4 14.060841 -11.502919 24 2006 \n", "... ... ... ... ... \n", "66024 28.370067 -15.416081 894 2018 \n", "66025 32.946955 -11.150453 894 2018 \n", "66026 28.299570 -15.769918 894 2018 \n", "66027 30.039495 -12.876392 894 2018 \n", "66028 32.608905 -9.421954 894 2018 \n", "\n", " month.of.interview rural country continent iwi_mean iwi_var \\\n", "0 12 Urban Angola Africa 0.632356 51.530785 \n", "1 11 Urban Angola Africa 0.632356 51.530785 \n", "2 11 Urban Angola Africa 0.596262 99.839389 \n", "3 11 Urban Angola Africa 0.640985 96.416849 \n", "4 12 Urban Angola Africa 0.505828 359.699498 \n", "... ... ... ... ... ... ... \n", "66024 9 Urban Zambia Africa 0.530495 201.920771 \n", "66025 9 Rural Zambia Africa 0.179347 70.917266 \n", "66026 12 Rural Zambia Africa 0.340004 305.619875 \n", "66027 9 Rural Zambia Africa 0.135886 59.794252 \n", "66028 12 Rural Zambia Africa 0.205844 261.427106 \n", "\n", " iwi_skewness iwi_kurtosis geometry date \n", "0 -1.136435 4.376306 POINT (13.85925 -12.16928) 2006-12-15 \n", "1 -1.136435 4.376306 POINT (13.85925 -12.16928) 2006-11-15 \n", "2 -1.121912 3.897659 POINT (13.84546 -12.16775) 2006-11-15 \n", "3 -0.199522 2.731744 POINT (13.60712 -12.74731) 2006-11-15 \n", "4 -0.507887 2.371137 POINT (14.06084 -11.50292) 2006-12-15 \n", "... ... ... ... ... \n", "66024 -0.296764 3.270728 POINT (28.37007 -15.41608) 2018-09-15 \n", "66025 0.186924 2.157706 POINT (32.94696 -11.15045) 2018-09-15 \n", "66026 0.645395 2.523493 POINT (28.29957 -15.76992) 2018-12-15 \n", "66027 0.061590 1.959555 POINT (30.0395 -12.87639) 2018-09-15 \n", "66028 1.139779 3.475082 POINT (32.6089 -9.42195) 2018-12-15 \n", "\n", "[65655 rows x 17 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np \n", "import pandas as pd \n", "import json \n", "from ipyleaflet import Map, GeoJSON,Heatmap\n", "import matplotlib.pyplot as plt \n", "from fetch_data import fetch_data\n", "import geopandas as gp \n", "import seaborn as sns \n", "\n", "\n", "geo_json_data = fetch_data(\"data/ground_truth/ground_truth.geojson\")\n", "\n", "ground_truth_df = fetch_data('data/ground_truth/ground_truth_R.csv')\n", "\n", "gdf = gp.GeoDataFrame(ground_truth_df, geometry=gp.points_from_xy(ground_truth_df['lon'], ground_truth_df['lat']), crs=\"EPSG:4326\")\n", "gdf['iwi_mean'] = gdf['iwi_mean']/100 #scale IWIs by 100 \n", "gdf = gdf[gdf['month.of.interview'] > 0]\n", "gdf['date'] = pd.to_datetime(dict(year = gdf['year.of.interview'], month = gdf['month.of.interview'], day = 15))\n", "\n", "# fiilter data by the start and end year for a single band \n", "def create_band(gdf, start, end):\n", " gdf = gdf[['country','year.of.interview','date','iwi_mean','geometry']]\n", " return gdf[(gdf['year.of.interview'] >= start) & (gdf['year.of.interview'] <= end)]\n", "\n", "# create a dictionary storing each band's data based on their year range \n", "empty_dict = {}\n", "def create_dict(ground_truth_dict):\n", " start = 1990 \n", " for i in range(1,11): \n", " end = start +2 \n", " band = create_band(gdf, start, end)\n", " ground_truth_dict[f'band_{i}'] = band \n", " temp = end \n", " start = temp +1 \n", " return ground_truth_dict\n", "\n", "ground_truth_dict = create_dict(empty_dict)\n", "\n", "gdf" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Band 1 upload complete!\n", "Band 2 upload complete!\n", "Band 3 upload complete!\n", "Band 4 upload complete!\n", "Band 5 upload complete!\n", "Band 6 upload complete!\n", "Band 7 upload complete!\n", "Band 8 upload complete!\n", "Band 9 upload complete!\n", "Band 10 upload complete!\n" ] } ], "source": [ "#load data for each band \n", "band_dict= {}\n", "for i in range(1,11): \n", " band_json = fetch_data(f'data/band_geojson/band_{i}.geojson')\n", " band_dict[f'band_{i}'] = band_json\n", " print(f'Band {i} upload complete!')\n", "\n", "with open('data/band_json.geojson', 'w') as w:\n", " json.dump(band_dict, w, indent=4)\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing Band 1...\n", "Processing Band 2...\n", "Processing Band 3...\n", "Processing Band 4...\n", "Processing Band 5...\n", "Processing Band 6...\n", "Processing Band 7...\n", "Processing Band 8...\n", "Processing Band 9...\n", "Processing Band 10...\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countryyear.of.interviewdateiwi_meangeometryindex_rightiwi_predresidual
2364Cameroon19911991-08-150.210099POINT (14.9 12.3833)302590.2399900.029891
2365Cameroon19911991-07-150.254330POINT (14.15 11.05)375630.240723-0.013607
2366Cameroon19911991-07-150.174986POINT (14.15 10.8667)385280.166138-0.008848
2367Cameroon19911991-07-150.174986POINT (13.8833 10.8667)385270.150146-0.024839
2368Cameroon19911991-07-150.178511POINT (13.8 10.75)391750.1794430.000933
...........................
66019Zambia20182018-10-150.348706POINT (28.09312 -15.34204)1082810.5048830.156177
66022Zambia20182018-08-150.547186POINT (28.34869 -15.39249)1083740.5566410.009455
66023Zambia20182018-08-150.530495POINT (28.37007 -15.41608)1084550.439209-0.091286
66024Zambia20182018-09-150.530495POINT (28.37007 -15.41608)1084550.439209-0.091286
66028Zambia20182018-12-150.205844POINT (32.6089 -9.42195)1012680.182495-0.023349
\n", "

52102 rows × 8 columns

\n", "
" ], "text/plain": [ " country year.of.interview date iwi_mean \\\n", "2364 Cameroon 1991 1991-08-15 0.210099 \n", "2365 Cameroon 1991 1991-07-15 0.254330 \n", "2366 Cameroon 1991 1991-07-15 0.174986 \n", "2367 Cameroon 1991 1991-07-15 0.174986 \n", "2368 Cameroon 1991 1991-07-15 0.178511 \n", "... ... ... ... ... \n", "66019 Zambia 2018 2018-10-15 0.348706 \n", "66022 Zambia 2018 2018-08-15 0.547186 \n", "66023 Zambia 2018 2018-08-15 0.530495 \n", "66024 Zambia 2018 2018-09-15 0.530495 \n", "66028 Zambia 2018 2018-12-15 0.205844 \n", "\n", " geometry index_right iwi_pred residual \n", "2364 POINT (14.9 12.3833) 30259 0.239990 0.029891 \n", "2365 POINT (14.15 11.05) 37563 0.240723 -0.013607 \n", "2366 POINT (14.15 10.8667) 38528 0.166138 -0.008848 \n", "2367 POINT (13.8833 10.8667) 38527 0.150146 -0.024839 \n", "2368 POINT (13.8 10.75) 39175 0.179443 0.000933 \n", "... ... ... ... ... \n", "66019 POINT (28.09312 -15.34204) 108281 0.504883 0.156177 \n", "66022 POINT (28.34869 -15.39249) 108374 0.556641 0.009455 \n", "66023 POINT (28.37007 -15.41608) 108455 0.439209 -0.091286 \n", "66024 POINT (28.37007 -15.41608) 108455 0.439209 -0.091286 \n", "66028 POINT (32.6089 -9.42195) 101268 0.182495 -0.023349 \n", "\n", "[52102 rows x 8 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#load all data at once and perform spatial join for each band \n", "with open('data/band_json.geojson') as d: \n", " band_data = json.load(d)\n", "\n", "joined_gdf_list = []\n", "for i in range(1, 11):\n", " print(f'Processing Band {i}...')\n", " pred_gdf = gp.GeoDataFrame.from_features(band_data[f'band_{i}'], crs = \"EPSG:4326\")\n", " pred_gdf = pred_gdf.rename(columns={'IWI':'iwi_pred'})\n", "\n", " joined_gdf = gp.sjoin(ground_truth_dict[f'band_{i}'], pred_gdf, predicate='intersects')\n", " joined_gdf['residual'] = joined_gdf['iwi_pred'] - joined_gdf['iwi_mean']\n", " joined_gdf_list.append(joined_gdf)\n", "\n", "\n", "#join all the dataframes together into a single dataframe \n", "full_gdf = pd.concat(joined_gdf_list)\n", "\n", "full_gdf\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2364 Cameroon\n", "2365 Cameroon\n", "2366 Cameroon\n", "2367 Cameroon\n", "2368 Cameroon\n", " ... \n", "66019 Zambia\n", "66022 Zambia\n", "66023 Zambia\n", "66024 Zambia\n", "66028 Zambia\n", "Name: country, Length: 52102, dtype: object" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#rename two-word countries to standardized names \n", "full_gdf['country'].replace('Côte d’Ivoire', 'Ivory Coast')\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "#write to csv \n", "full_gdf.to_csv('data/residual_by_country.csv')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABgiElEQVR4nO3deXhU5f3//9fJdiYIRAgkLAZQPy6guIECogYU44Ia0X6JohErYhHQqq39SK1lUQvVuiKKO6407nH7YGlZXCAWw2LdcBdEAopsLjPZ7t8flPyIZJlk5uScufN8XFeuKzlz5sz7xUyYvOe+z30cY4wRAAAAAACIuyS/CwAAAAAAwFY03QAAAAAAeISmGwAAAAAAj9B0AwAAAADgEZpuAAAAAAA8QtMNAAAAAIBHaLoBAAAAAPAITTcAAAAAAB6h6QYAAAAAwCM03QAAz82ZM0eO4+idd96RJP3tb3+T4zh6++23a+1XXV2tjh07ynEcrV69utZt5eXlatOmjc4666yabY7jaOLEiY0+fq9eveQ4Ts3XHnvsoSOOOEJ33XWXjDFxSFg3x3E0ZcqURvfb+e/z5ZdfelZLU+rZ9d/KcRxlZGRoyJAheuWVV2rt16tXL1144YVNruOnn37SlClTtGjRoqj2//LLL3eraedX//79m/z4zfXdd9/Jdd1ar+UgmTJlihzH8bsMAMAv0HQDAFrc0KFDJUkLFy6stX3VqlXavHmz9thjj91ue/vtt/Xzzz/X3LepBg8erKVLl2rp0qV67LHH1KZNG1122WWaPn1680JEYenSpbr44os9O76XfvWrX2np0qV66623NGvWLJWVlen000/frfFujp9++klTp06Nuune6bLLLqt5Dnd+zZkzJ+Z6ovXYY4+pvLxckvTggw+22OMCABIbTTcAoMUdfvjh2nPPPXdruhYtWqRu3brpjDPO2K3p3rlvc5vuPffcUwMHDtTAgQN11lln6dVXX1VGRobuvffeZh0vGgMHDtRee+3l2fG9lJ2drYEDB+roo4/W+eefr1deeUXGGN1+++2+1dSjR4+a53Dn18EHHxzzcSsqKlRZWdnofg899JCysrJ05JFHau7cufr5559jfmwAgP1ougEALS4pKUnHHXec3nrrrVrNzqJFizRkyBDl5ubW2ZB37txZBx10UFxqaN++vfbff39t2LCh1vby8nLdcMMNOvDAA+W6rjp37qxf//rX+vbbb2vtt2DBAg0ZMkSZmZlKT09Xjx49dPbZZ+unn36q2aeu6dwlJSUaPHiwQqGQunXrpkmTJqmiomK3+uqbCv7LKd3ffvutxo8frz59+qht27bKysrS8ccfrzfeeKPp/ygN2HfffdW5c2d99dVXDe63Zs0anX/++crKypLruurdu7duueUWVVdXS9oxVbxz586SpKlTp9ZME2/ONPVfeu+995Sfn68OHTooFArpsMMO0yOPPFJrn0WLFslxHD322GP63e9+p+7du8t1XX366acNHvvtt9/We++9p8LCQo0dO1Zbt27Vs88+u9t+Q4YM0cEHH6xly5bp2GOPVZs2bbTPPvtoxowZNf8GO73//vvKy8tTmzZt1LlzZ02YMEGvvPKKHMfZ7fX/0EMP6dBDD1UoFFLHjh01YsQIffjhh43+mxQVFSkvL09du3ZVenq6evfurWuuuUY//vhjo/cFAMQHTTcAwBdDhw7VDz/8oGXLlknacT7366+/rtzcXOXm5mrjxo364IMPJO1ohJcuXaohQ4bE7ZzVyspKrV27Vvvvv3/NturqauXn52vGjBkaNWqUXnnlFc2YMUPz58/XkCFDakY2v/zySw0fPlxpaWl66KGHNG/ePM2YMUN77LFHzfTjunzwwQc64YQTtGXLFs2ZM0ezZ8/WihUrdMMNNzQ7x/fffy9Jmjx5sl555RU9/PDD2meffTRkyJAmT99uyObNm7Vp06aahrku3377rY4++mj94x//0PXXX68XX3xRw4YN0+9///uac++7du2qefPmSZLGjBlTM038uuuua7SG6upqVVZW1vraeU7+6tWrdfTRR+v999/XnXfeqeeee059+vTRhRdeqJtuumm3Y02aNElr1qzR7Nmz9dJLLykrK6vBx945nfyiiy7SOeecozZt2tQ7xbysrEznnXeezj//fL344os65ZRTNGnSJD3++OM1+6xfv165ublavXq17rnnHj366KPavn17nWsUTJ8+XWPGjNFBBx2k5557TnfccYfeffddDRo0SJ988kmDdX/yySc69dRT9eCDD2revHm64oor9NRTT+n0009v8H4AgDgyAAB47OGHHzaSzLJly2q2rVy50kgyf/nLX4wxxpSWlhpJ5qOPPjLGGJOdnW3uuusuY4wxixcvNpLM3XffXeu4ksyECRMaffyePXuaU0891VRUVJiKigrz1VdfmbFjx5rU1FTz8ssv1+w3d+5cI8k8++yzte6/bNmyWo//zDPPGElm5cqVDT6uJDN58uSanwsKCkx6eropKyur2VZZWWkOPPBAI8l88cUX9d531yyjR4+u9zErKytNRUWFOeGEE8yIESMarKehusePH28qKipMeXm5+fDDD80pp5xiJJlZs2bVW8s111xjJJm333671vEuvfRS4ziOWb16tTHGmG+//TbqWowx5osvvjCS6vyaP3++McaYc845x7iua9asWVPrvqeccopp06aN2bJlizHGmIULFxpJ5rjjjovqsY0x5scffzTt27c3AwcOrNk2evRo4ziO+fTTT2vtm5ubW+e/QZ8+fcxJJ51U8/PVV19tHMcx77//fq39TjrpJCPJLFy40BhjzObNm016ero59dRTa+23Zs0a47quGTVqVM22yZMnm4b+tKuurjYVFRU1v0+rVq2K7h8AABATRroBAL445JBDlJmZWTMau2jRInXp0kUHHHCAJOm4446rOa871vO5JenVV19VamqqUlNT1bNnT91///2aOXOmhg8fXrPPyy+/rD333FOnn356rdHUww47TF26dKmp47DDDlNaWpouueQSPfLII/r888+jqmHhwoU64YQTlJ2dXbMtOTlZBQUFzc4lSbNnz9YRRxyhUCiklJQUpaam6l//+ldU04/rc/fddys1NVVpaWnq3bu3lixZomnTpmn8+PH13mfBggXq06ePjjrqqFrbL7zwQhljtGDBgmbXI0m//e1vtWzZslpfAwYMqHnsE044QTk5Obs99k8//aSlS5fW2n722WdH/bhPPfWUtm3bposuuqhm20UXXSRjjB5++OHd9u/Spctu/waHHHJIran5ixcv1sEHH6w+ffrU2u/cc8+t9fPSpUv1888/7zb9PicnR8cff7z+9a9/NVj7559/rlGjRqlLly5KTk5WamqqcnNzJSmm1wcAIHo03QAAXziOo9zcXL311luqqKjQwoULa5oBScrNzdXixYtljNHChQvVpUsXHXjggc1+vGOOOUbLli1TSUmJHnvsMfXq1UsTJ07Um2++WbPPhg0btGXLFqWlpdU06Du/ysrK9N1330nacX7zP//5T2VlZWnChAnad999te++++qOO+5osIZNmzapS5cuu22va1u0br31Vl166aUaMGCAnn32WZWUlGjZsmU6+eSTY1roa+TIkVq2bJneeecdrV69Wps2bWp0CvimTZvUtWvX3bZ369at5vZY7LXXXurfv3+tr3bt2jXrsevatz4PPvigQqGQTj75ZG3ZskVbtmzRIYccol69emnOnDmqqqqqtX9mZuZux3Bdt9bzsWnTplofvuz0y207664vW0P/pj/88IOOPfZYvf3227rhhhu0aNEiLVu2TM8995wksRAcALSQFL8LAAC0XkOHDtVzzz2nt99+W2+88Uaty3fl5ubqu+++U2lpqUpKSjRixIiYHisjI6Pmms4DBgzQgAEDdOihh2r8+PFauXKlkpKS1KlTJ2VmZtacc/xLOxs8STr22GN17LHHqqqqSu+8845mzpypK664QtnZ2TrnnHPqvH9mZqbKysp2217XNtd1FYlEdtv+yybr8ccf15AhQ3TPPffU2r59+/Y6a4hW586dm3wN7MzMTK1fv3637d98840kqVOnTjHVFM/HjnZtgI8//rjmg5kePXrUuc9rr72mU089tSnlKjMzc7dF/KTdXws7G/j6sjX0b7pgwQJ98803WrRoUa0PtLZs2dKkWgEAsWGkGwDgm53TxW+77TZt3bpVQ4YMqbntoIMOUmZmpqZPn65wOBzT1PK67LfffvrDH/6g//znPyoqKpIknXbaadq0aZOqqqp2G1Ht379/zdT3XSUnJ2vAgAGaNWuWJGn58uX1PubQoUP1r3/9q1azVVVVVfP4u+rVq5fefffdWtsWLFigH374odY2x3Hkum6tbe++++5u06lbwgknnKAPPvhgt3+DRx99VI7j1DyHO+uN50jrCSecUNNk/vKx27Rpo4EDBzbruDsXS7v//vu1cOHCWl87T1l46KGHmnzc3NxcvffeezWLBe7097//vdbPgwYNUnp6eq1F2CTp66+/rplSX5+dHyz88vXh5WXyAAC7Y6QbAOCbgw46SFlZWXr++efVuXNn9e7du+Y2x3F03HHH6fnnn5cU2/nc9fn973+v2bNna+rUqRo5cqTOOeccPfHEEzr11FP129/+VkcddZRSU1P19ddfa+HChcrPz9eIESM0e/ZsLViwQMOHD1ePHj0UDodrGq9hw4bV+3h/+tOf9OKLL+r444/Xn//8Z7Vp00azZs2q8/JNhYWFuu666/TnP/9Zubm5+uCDD3TXXXcpIyOj1n6nnXaarr/+ek2ePLlmNexp06Zp7733jura0/F05ZVX6tFHH9Xw4cM1bdo09ezZU6+88oruvvtuXXrppTUrxbdr1049e/ZUcXGxTjjhBHXs2FGdOnVSr169mv3YkydP1ssvv6yhQ4fqz3/+szp27KgnnnhCr7zyim666abd/t2iUVlZqUcffVS9e/fWxRdfXOc+p59+ul588UV9++23Da7s/ktXXHGFHnroIZ1yyimaNm2asrOz9eSTT+qjjz6StOOyetKO68tfd911+uMf/6gLLrhA5557rjZt2qSpU6cqFApp8uTJ9T7G0UcfrQ4dOmjcuHGaPHmyUlNT9cQTT2jVqlVN+FcAAMSKkW4AgK+GDBkiY0yt6a875ebmyhij7t2763/+53/i/tht27bVn//8Z61evVpPPPGEkpOT9eKLL+qPf/yjnnvuOY0YMUJnnnmmZsyYoVAopL59+0rasZBaZWWlJk+erFNOOUWFhYX69ttv9eKLLyovL6/exzv44IP1z3/+U+3bt9fo0aN1ySWX6JBDDqnzXOmrr75aV199tebMmaPTTz9dzz77rJ566intueeetfa79tpr9bvf/U4PPvighg8frgceeECzZ8/WMcccE9d/q2h07txZS5Ys0fHHH69JkybptNNO02uvvaabbrpJM2fOrLXvgw8+qDZt2uiMM87QkUceWec1yZvigAMO0JIlS3TAAQdowoQJOvPMM/Xee+/p4Ycf1tVXX92sY77yyisqKyvTb37zm3r3ueSSS1RRUaHHHnusScfu1q2bFi9erP3331/jxo3Teeedp7S0NE2bNk2Saj3PkyZN0gMPPKBVq1bpzDPP1MSJE3XQQQdpyZIl2m+//ep9jMzMTL3yyitq06aNzj//fF100UVq27ZtnTMrAADecYz57wUuAQAA4KtLLrlEc+fO1aZNm5SWluZ3OQCAOGB6OQAAgA+mTZumbt26aZ999tEPP/ygl19+WQ888ID+9Kc/0XADgEVougEAAHyQmpqqm2++WV9//bUqKyu133776dZbb9Vvf/tbv0sDAMQR08sBAAAAAPAIC6kBAAAAAOARmm4AAAAAADxC0w0AAAAAgEdYSK0R1dXV+uabb9SuXTs5juN3OQAAAACAADDGaPv27erWrZuSkuofz6bpbsQ333yjnJwcv8sAAAAA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a+MRbaPADBvYgNkgAAAkPk+bbgBoiOM4Uf/Rn56e7nE1AAAgWhWVjc/CaYwxRhVV5ZKk1OS0mGffxKMmwAs03QAABBSzQQAE1S3PTvC7BCBh0HQDABBQzAYBdqiO06iqqdwxquqkxD6qGo+aALQOnjbdLNACAACAWH32yFV+lwBFP/smWuFwuGYdiqKioriuM8FsHgQJC6l5hBVnAQAAYJOmzL5pqlAoxOKOsJanTff27du9PHygseIsAADwVWW54jH8YYyRKit2/JCSGvsH//+d4t0YRlUB2CLqpvuII47Qv/71L3Xo0EGHH354g//hLl++PC7F7Wrz5s26/PLL9eKLL0qSzjjjDM2cOVN77rlnnftXVFToT3/6k1599VV9/vnnysjI0LBhwzRjxgx169Yt7vUBAAAEyU+P3ex3CTFhVBWALaJuuvPz82s+xcvPz2/x6c2jRo3S119/rXnz5kmSLrnkEhUWFuqll16qc/+ffvpJy5cv13XXXadDDz1Umzdv1hVXXKEzzjhD77zzjuf1suIsAAAAdlUZpwXhqv47WyA5DgvCxaMmAA2LuumePHlyzfdTpkzxopZ6ffjhh5o3b55KSko0YMAASdL999+vQYMGafXq1TrggAN2u09GRobmz59fa9vMmTN11FFHac2aNerRo4enNbPiLAAAaGnxnpItMS07nooe4zJbQGvUrHO6r732Wg0ZMkSDBw9WmzZt4l3TbpYuXaqMjIyahluSBg4cqIyMDC1ZsqTOprsuW7duleM49U5Jl3aci73rAmjbtm1rdt0AAAAtycsp2RLTsgGgOZrVdJeWlmrmzJmKRCI64ogjNGTIEOXm5uqYY45R27Zt412jysrKlJWVtdv2rKwslZWVRXWMcDisa665RqNGjVL79u3r3W/69OmaOnVqs2sFAAAAdmJBOADNarrnzZunqqoq/fvf/9bixYu1aNEi3X333fr55591xBFHqKSkJKrjTJkypdEGd9myZZLqvua3MSaq81gqKip0zjnnqLq6WnfffXeD+06aNElXXfX/Xwty27ZtysnJafQxAAAAgF9iQTgAzb5kWHJysgYNGqSOHTuqQ4cOateunV544QV99tlnUR9j4sSJOueccxrcp1evXnr33Xe1YcOG3W779ttvlZ2d3eD9KyoqNHLkSH3xxRdasGBBg6Pc0o5P+PiUDwAAAAAQD81quu+55x4tXrxYixcvVlVVlY499ljl5ubquuuu0yGHHBL1cTp16qROnTo1ut+gQYO0detW/fvf/9ZRRx0lSXr77be1detWHX300fXeb2fD/cknn2jhwoXKzMyMujYAAAAAAGLVrKZ7woQJ6ty5s373u99p3LhxjY4ex6p37946+eSTNXbsWN17772Sdlwy7LTTTqu1iNqBBx6o6dOna8SIEaqsrNSvfvUrLV++XC+//LKqqqpqzv/u2LGj0tLSPK0ZAAAAAICk5tzpueee03nnnae///3vysrK0oABA/S///u/+r//+z/98MMP8a5RkvTEE0+ob9++ysvLU15eng455BA99thjtfZZvXq1tm7dKkn6+uuv9eKLL+rrr7/WYYcdpq5du9Z8LVmyxJMaAQAAAADYVbNGus8880ydeeaZknZchuuNN97QM888o/z8fDmOU+uSW/HSsWNHPf744w3uY4yp+b5Xr161fgYAAAAAoKU1eyG177//vmbl8kWLFum9995TZmamcnNz41kfAAAAAAAJq1lN9yGHHKIPPvhAHTt21HHHHaexY8dqyJAhOvjgg+NdHwAAAAAACatZTfcll1xCk41AKq+SpNhOKzDGqKJqx/epyXVfI77pNQEAAABojaJuuq+66ipdf/312mOPPfT555/r888/r3ffW2+9NS7FAU019f/K/S4BAAAAAGpE3XSvWLFCFRUVNd/XJ9ZRQQAAAAAAbBF1071w4cI6vwf85rquiouL43a8cDisgoICSVJRUZFCoVDcju26btyOBQAAACD4mr16ORAUjuPEtTHeVSgU8uzYAAAAAOyX5HcBAAAAAADYiqYbAAAAAACP0HQDAAAAAOARzumGJClSVR3zMYwxKv/vcdKSk2JeyT4eNQEAAAC2i1QF87K5Qa2rpdF0Q5J02bxSv0sAAAAA0AwTF071uwQ0gOnlAAAAAAB4hJHuVozrWwMAAACJ766hk+Ump/ldxm4iVeWMwoumu1Xj+tYAAABA4nOT0+SmBK/pxg5MLwcAAAAAwCOMdAMAAABolSJVkZiPYYxRefWOVbrTktLicAWf2GtCsNB0AwAAAGiVrl5wmd8loBVgejkAAAAAAB5hpBsAAABAq8EVfNDSaLoBAAAAtBpcwQctjenlAAAAAAB4hKYbAAAAAACPML0cAGAdY4wikcYvuRIO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NHv2bI0ZM0aStNdee2nWrFm65JJLfK60YTwnwWPLc/Kf//xHw4YN08CBA2u2GWO0atUqDR06VFlZWT5W1zRml1HuG264QePGjdOsWbNqtk2aNEl/+ctfdNJJJ/lRXtRseU+U7Pk9seU5seX5kOx5L7HltXXzzTfr7rvvrvn339WZZ56pI488UjfeeKPGjh3rQ3VNE/T3Rcfs+m4HzyUnJ+uwww5T+/bt67z9hx9+0PLlyxPiXApbsmRkZGj58uXad999a7bNnTtXY8eO1dy5c3XUUUepW7du5GhBbdq00UcffaQePXpIkkKhkEpLS3XQQQdJkj799FMdeeSR2rx5s59lNornJHhseU7eeustjR49Wuedd54mT56spKQdZ4ulpqZq1apV6tOnj88VRi8pKUllZWXKyspSt27d9Pzzz2vAgAE1t3/wwQc67rjjdptSGzS2vCdK9vye2PKc2PJ8SPa8l9jy2kpPT9fKlSt1wAEH1Hn7Rx99pMMPPzwQ50Q3Jujvi4x0t7D99ttPV155pc4///w6b1+5cqX69evXwlU1jy1ZXNfVli1bam0799xzlZSUpHPOOUe33HKLP4U1kS05pB1vyj/++GPNz507d1bbtm1r7VNZWdnSZTUZz0nw2PKcDB48WMuXL9dvfvMbDRo0SE8++WStP8gTzfbt2xUKhZSeni7XdWvdlpaWlhB/8NnynijZ83tiy3Niy/Mh2fNeYstr66CDDtJ9991X72vo/vvvr/lAJOiC/r5I093C+vXrp9LS0np/SR3HUaJMPrAly2GHHaaFCxfu9p9jQUGBqqurNXr0aJ8qaxpbckjSgQceqHfffVe9e/eWJK1du7bW7R999JF69erlQ2VNw3MSPDY9J+3bt9fcuXP18MMP65hjjtHUqVPlOI7fZTXL/vvvL2nHVMDS0lIddthhNbe9//776t69u0+VRc+W90TJnt8TW54TW54PyZ73ElteW7fccouGDx+uefPmKS8vT9nZ2XIcR2VlZZo/f76++uorvfrqq36XGbUgvy/SdLewW265RZFIpN7bDz30UFVXV7dgRc1nS5ZLL71Ur7/+ep23nXvuuZKk++67ryVLahZbckjSX//6V+2xxx713r5mzRr95je/acGKmofnJHhsek52+vWvf61jjjlG5513XkKMEP3SwoULa/3ctWvXWj9/+eWXCXE+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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_country(country_name, gdf):\n", " gdf = gdf[gdf['country'] == country_name]\n", " modified_xticks = gdf['date'].dt.to_period('M')\n", " plt.figure(figsize=(10,6))\n", " sns.boxplot(x=modified_xticks, y=gdf['residual'])\n", " plt.xlabel('date')\n", " plt.xticks(rotation=90)\n", " plt.ylabel('iwi_value')\n", " plt.title(f'IWI Residual Plot For {country_name}')\n", " plt.tight_layout()\n", "\n", "\n", "plot_country('Angola', full_gdf)\n", "\n", "\n" ] } ], "metadata": { "kernelspec": { "display_name": "myenv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 2 }