|
| 1 | +{ |
| 2 | + "cells": [ |
| 3 | + { |
| 4 | + "cell_type": "code", |
| 5 | + "execution_count": null, |
| 6 | + "metadata": {}, |
| 7 | + "outputs": [], |
| 8 | + "source": [ |
| 9 | + "import os\n", |
| 10 | + "import json\n", |
| 11 | + "\n", |
| 12 | + "import numpy as np\n", |
| 13 | + "import pandas as pd\n", |
| 14 | + "\n", |
| 15 | + "from ipywidgets import Dropdown\n", |
| 16 | + "\n", |
| 17 | + "from bqplot import Lines, Figure, LinearScale, DateScale, Axis\n", |
| 18 | + "\n", |
| 19 | + "from ipyleaflet import Map, GeoJSON, WidgetControl" |
| 20 | + ] |
| 21 | + }, |
| 22 | + { |
| 23 | + "cell_type": "code", |
| 24 | + "execution_count": null, |
| 25 | + "metadata": {}, |
| 26 | + "outputs": [], |
| 27 | + "source": [ |
| 28 | + "data = pd.read_json(os.path.abspath('nations.json'))" |
| 29 | + ] |
| 30 | + }, |
| 31 | + { |
| 32 | + "cell_type": "code", |
| 33 | + "execution_count": null, |
| 34 | + "metadata": {}, |
| 35 | + "outputs": [], |
| 36 | + "source": [ |
| 37 | + "def clean_data(data):\n", |
| 38 | + " for column in ['income', 'lifeExpectancy', 'population']:\n", |
| 39 | + " data = data.drop(data[data[column].apply(len) <= 4].index)\n", |
| 40 | + " return data\n", |
| 41 | + "\n", |
| 42 | + "def extrap_interp(data):\n", |
| 43 | + " data = np.array(data)\n", |
| 44 | + " x_range = np.arange(1800, 2009, 1.)\n", |
| 45 | + " y_range = np.interp(x_range, data[:, 0], data[:, 1])\n", |
| 46 | + " return y_range\n", |
| 47 | + "\n", |
| 48 | + "def extrap_data(data):\n", |
| 49 | + " for column in ['income', 'lifeExpectancy', 'population']:\n", |
| 50 | + " data[column] = data[column].apply(extrap_interp)\n", |
| 51 | + " return data" |
| 52 | + ] |
| 53 | + }, |
| 54 | + { |
| 55 | + "cell_type": "code", |
| 56 | + "execution_count": null, |
| 57 | + "metadata": {}, |
| 58 | + "outputs": [], |
| 59 | + "source": [ |
| 60 | + "data = clean_data(data)\n", |
| 61 | + "data = extrap_data(data)" |
| 62 | + ] |
| 63 | + }, |
| 64 | + { |
| 65 | + "cell_type": "code", |
| 66 | + "execution_count": null, |
| 67 | + "metadata": {}, |
| 68 | + "outputs": [], |
| 69 | + "source": [ |
| 70 | + "data" |
| 71 | + ] |
| 72 | + }, |
| 73 | + { |
| 74 | + "cell_type": "code", |
| 75 | + "execution_count": null, |
| 76 | + "metadata": {}, |
| 77 | + "outputs": [], |
| 78 | + "source": [ |
| 79 | + "date_start = pd.datetime(1800, 12, 31)\n", |
| 80 | + "date_end = pd.datetime(2009, 12, 31)\n", |
| 81 | + "\n", |
| 82 | + "date_scale = DateScale(min=date_start, max=date_end)" |
| 83 | + ] |
| 84 | + }, |
| 85 | + { |
| 86 | + "cell_type": "code", |
| 87 | + "execution_count": null, |
| 88 | + "metadata": {}, |
| 89 | + "outputs": [], |
| 90 | + "source": [ |
| 91 | + "date_data = pd.date_range(start=date_start, end=date_end, freq='A', normalize=True)" |
| 92 | + ] |
| 93 | + }, |
| 94 | + { |
| 95 | + "cell_type": "code", |
| 96 | + "execution_count": null, |
| 97 | + "metadata": {}, |
| 98 | + "outputs": [], |
| 99 | + "source": [ |
| 100 | + "country_name = 'Angola'\n", |
| 101 | + "data_name = 'income'\n", |
| 102 | + "\n", |
| 103 | + "x_data = data[data.name == country_name][data_name].values[0]" |
| 104 | + ] |
| 105 | + }, |
| 106 | + { |
| 107 | + "cell_type": "code", |
| 108 | + "execution_count": null, |
| 109 | + "metadata": {}, |
| 110 | + "outputs": [], |
| 111 | + "source": [ |
| 112 | + "x_scale = LinearScale()\n", |
| 113 | + "\n", |
| 114 | + "lines = Lines(x=date_data, y=x_data, scales={'x': date_scale, 'y': x_scale})\n", |
| 115 | + "\n", |
| 116 | + "ax_x = Axis(label='Year', scale=date_scale, num_ticks=10, tick_format='%Y')\n", |
| 117 | + "ax_y = Axis(label=data_name.capitalize(), scale=x_scale, orientation='vertical', side='left')\n", |
| 118 | + "\n", |
| 119 | + "figure = Figure(axes=[ax_x, ax_y], title=country_name, marks=[lines], animation_duration=500,\n", |
| 120 | + " layout={'max_height': '250px', 'max_width': '400px'})\n", |
| 121 | + "figure" |
| 122 | + ] |
| 123 | + }, |
| 124 | + { |
| 125 | + "cell_type": "code", |
| 126 | + "execution_count": null, |
| 127 | + "metadata": {}, |
| 128 | + "outputs": [], |
| 129 | + "source": [ |
| 130 | + "def update_figure(country_name, data_name):\n", |
| 131 | + " lines.y = data[data.name == country_name][data_name].values[0]\n", |
| 132 | + " ax_y.label = data_name.capitalize()\n", |
| 133 | + " figure.title = country_name" |
| 134 | + ] |
| 135 | + }, |
| 136 | + { |
| 137 | + "cell_type": "code", |
| 138 | + "execution_count": null, |
| 139 | + "metadata": {}, |
| 140 | + "outputs": [], |
| 141 | + "source": [ |
| 142 | + "country_name = 'Benin'\n", |
| 143 | + "data_name = 'income'\n", |
| 144 | + "\n", |
| 145 | + "update_figure(country_name, data_name)" |
| 146 | + ] |
| 147 | + }, |
| 148 | + { |
| 149 | + "cell_type": "code", |
| 150 | + "execution_count": null, |
| 151 | + "metadata": {}, |
| 152 | + "outputs": [], |
| 153 | + "source": [ |
| 154 | + "country_name = 'Angola'\n", |
| 155 | + "data_name = 'population'\n", |
| 156 | + "\n", |
| 157 | + "update_figure(country_name, data_name)" |
| 158 | + ] |
| 159 | + }, |
| 160 | + { |
| 161 | + "cell_type": "code", |
| 162 | + "execution_count": null, |
| 163 | + "metadata": {}, |
| 164 | + "outputs": [], |
| 165 | + "source": [ |
| 166 | + "with open('./countries.geo.json') as f:\n", |
| 167 | + " countries = json.load(f)" |
| 168 | + ] |
| 169 | + }, |
| 170 | + { |
| 171 | + "cell_type": "code", |
| 172 | + "execution_count": null, |
| 173 | + "metadata": {}, |
| 174 | + "outputs": [], |
| 175 | + "source": [ |
| 176 | + "m = Map(zoom=3)\n", |
| 177 | + "\n", |
| 178 | + "geo = GeoJSON(data=countries, style={'fillColor': 'white', 'weight': 0.5}, hover_style={'fillColor': '#1f77b4'}, name='Countries')\n", |
| 179 | + "m.add_layer(geo)\n", |
| 180 | + "\n", |
| 181 | + "m" |
| 182 | + ] |
| 183 | + }, |
| 184 | + { |
| 185 | + "cell_type": "code", |
| 186 | + "execution_count": null, |
| 187 | + "metadata": {}, |
| 188 | + "outputs": [], |
| 189 | + "source": [ |
| 190 | + "widget_control1 = WidgetControl(widget=figure, position='bottomright')\n", |
| 191 | + "\n", |
| 192 | + "m.add_control(widget_control1)\n", |
| 193 | + "\n", |
| 194 | + "def on_hover(event, feature, **kwargs):\n", |
| 195 | + " global country_name\n", |
| 196 | + "\n", |
| 197 | + " country_name = feature['properties']['name']\n", |
| 198 | + " update_figure(country_name, data_name)\n", |
| 199 | + "\n", |
| 200 | + "geo.on_hover(on_hover)" |
| 201 | + ] |
| 202 | + }, |
| 203 | + { |
| 204 | + "cell_type": "code", |
| 205 | + "execution_count": null, |
| 206 | + "metadata": {}, |
| 207 | + "outputs": [], |
| 208 | + "source": [ |
| 209 | + "dropdown = Dropdown(\n", |
| 210 | + " options=['income', 'population', 'lifeExpectancy'],\n", |
| 211 | + " value=data_name,\n", |
| 212 | + " description='Plotting:'\n", |
| 213 | + ")\n", |
| 214 | + "\n", |
| 215 | + "def on_click(change):\n", |
| 216 | + " global data_name\n", |
| 217 | + "\n", |
| 218 | + " data_name = change['new']\n", |
| 219 | + " update_figure(country_name, data_name)\n", |
| 220 | + "\n", |
| 221 | + "dropdown.observe(on_click, 'value')\n", |
| 222 | + "\n", |
| 223 | + "widget_control2 = WidgetControl(widget=dropdown, position='bottomleft')\n", |
| 224 | + "\n", |
| 225 | + "m.add_control(widget_control2)" |
| 226 | + ] |
| 227 | + } |
| 228 | + ], |
| 229 | + "metadata": { |
| 230 | + "kernelspec": { |
| 231 | + "display_name": "Python 3", |
| 232 | + "language": "python", |
| 233 | + "name": "python3" |
| 234 | + }, |
| 235 | + "language_info": { |
| 236 | + "codemirror_mode": { |
| 237 | + "name": "ipython", |
| 238 | + "version": 3 |
| 239 | + }, |
| 240 | + "file_extension": ".py", |
| 241 | + "mimetype": "text/x-python", |
| 242 | + "name": "python", |
| 243 | + "nbconvert_exporter": "python", |
| 244 | + "pygments_lexer": "ipython3", |
| 245 | + "version": "3.7.3" |
| 246 | + } |
| 247 | + }, |
| 248 | + "nbformat": 4, |
| 249 | + "nbformat_minor": 4 |
| 250 | +} |
0 commit comments