{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bovine Tuberculosis by county\n", "\n", "This analysis shows the Bovine TB statistics for counties in Ireland. The data used can be found here.\n", "https://data.gov.ie/dataset/bovine-tuberculosis-by-regional-veterinary-offices-year-and-statistic \n" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [], "source": [ "from pyjstat import pyjstat\n", "import pandas as pd\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "from pathlib import Path\n", "import folium\n", "from folium import plugins\n", "import os\n", "import json\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Global vars" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [], "source": [ "reg_vet_office = 'Regional Veterinary Offices'\n", "stat = 'Reactors to date (Number)'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Utility functions" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "def strip_file_name(input, chars_to_strip = '/:.'):\n", " \"\"\" \n", " We are going to use the url as a key for our local filesystem cache.\n", " To get this to work we need to remove some characters from the filename which are invalid in filenames.\n", " \"\"\"\n", " for char in chars_to_strip:\n", " input = input.replace(char, '')\n", " return input" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [], "source": [ "def read_jsonstat(file_name):\n", " \"\"\"\n", " This class helps us avoid hitting the CSO website every time we want to produce the graph.\n", " Instead the stripped url is used as a file name to store the json locally.\n", "\n", " Steps in this function:\n", " Strip the filename. \n", " If that version exists locally, return it as json-stat\n", " otherwise read it from the url and write to the fs before returning as json-stat\n", " https://pypi.org/project/pyjstat/\n", " \"\"\"\n", " temp_file_name = strip_file_name(file_name)\n", " local_file_name = Path(temp_file_name)\n", " if local_file_name.is_file():\n", " print(\"File exists\")\n", " f = open(local_file_name, 'r')\n", " content = f.read()\n", " # convert to pyjstat format from str\n", " content = pyjstat.Dataset.read(content)\n", " else:\n", " print(\"File is missing\")\n", " content = pyjstat.Dataset.read(file_name)\n", " f = open(temp_file_name, 'w')\n", " f.write(content.write())\n", " f.close()\n", " return content" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "def get_counties_from_y(data, desired_column = 'county', exclusions = []):\n", " \"\"\"\n", " Given the dataframe containing the counties return the sorted set of counties\n", " \"\"\"\n", " before_exclusions = set(data[desired_column])\n", " for label in exclusions:\n", " before_exclusions.discard(label)\n", " return before_exclusions" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "def merge_counties(df, county_tuples):\n", " \"\"\"\n", " To create a choropleth we need to make sure the labels in the geojson match those in the data for display.\n", " This function takes 2 county names and a new name and merges the 2 into the new one by summing.\n", " For example Wicklow W and Wicklow E go to Wicklow.\n", " \"\"\"\n", " for county_tuple in county_tuples:\n", " df.loc[df[reg_vet_office]==county_tuple[0],reg_vet_office] = county_tuple[1]\n", " df = df.groupby([reg_vet_office, 'Year', 'Statistic'], as_index=False).sum() \n", " df.loc[df[reg_vet_office]==county_tuple[1],reg_vet_office] = county_tuple[2]\n", " return df" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "def get_counties_from_geojson():\n", " ireland_counties = os.path.join('data', 'ireland.json')\n", " geo_json_data = json.load(open(ireland_counties))\n", " return [x[\"properties\"]['id'] for x in geo_json_data['features']]" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [], "source": [ "def set_diff_described(list1, list2):\n", " first = set(list1).difference(set(list2))\n", " second = set(list2).difference(set(list1))\n", " if not len(first) and not len(second):\n", " return 'Lists match.'\n", " else:\n", " return 'In first but not second '+str(first)+\\\n", " '. in second, but not first '+str(second)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Main body of the program\n" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "File exists\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", "
Regional Veterinary OfficesYearStatisticvalue
24Cork2010Reactors to date (Number)2670.0
25Cork2011Reactors to date (Number)2505.0
26Cork2012Reactors to date (Number)2497.0
27Cork2013Reactors to date (Number)2051.0
28Cork2014Reactors to date (Number)2068.0
\n", "
" ], "text/plain": [ " Regional Veterinary Offices Year Statistic value\n", "24 Cork 2010 Reactors to date (Number) 2670.0\n", "25 Cork 2011 Reactors to date (Number) 2505.0\n", "26 Cork 2012 Reactors to date (Number) 2497.0\n", "27 Cork 2013 Reactors to date (Number) 2051.0\n", "28 Cork 2014 Reactors to date (Number) 2068.0" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "URL = 'https://www.cso.ie/StatbankServices/StatbankServices.svc/\\\n", "jsonservice/responseinstance/DAA01'\n", "\n", "# read from json-stat\n", "dataset = read_jsonstat(URL)\n", "\n", "df = dataset.write('dataframe')\n", "\n", "# Change the year to an int\n", "df['Year'] = df['Year'].map(int)\n", "\n", "# Filter the df to only contain 'Reactors to date (Number)'\n", "# Remove 'State' from the list => counties only\n", "df = df[(df[reg_vet_office]!='State') & (df['Statistic']==stat)]\n", "\n", "df = merge_counties(df, \n", " [('Wicklow W', 'Wicklow E', 'Wicklow'), \n", " ('Cork North', 'Cork South', 'Cork'), \n", " ('Tipperary North', 'Tipperary South', 'Tipperary')]\n", " )\n", "\n", "# Show that Cork North and Cork South are merged\n", "df[df[reg_vet_office]=='Cork'].head()" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Lists match.\n" ] } ], "source": [ "counties_from_df = get_counties_from_y(df, desired_column = reg_vet_office, exclusions = ['State'])\n", "counties_from_geojson = get_counties_from_geojson()\n", "print(set_diff_described(counties_from_df, counties_from_geojson))" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "df.rename(columns={'Regional Veterinary Offices': 'county'}, inplace=True)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nT/wNNEpMY3Aof2kAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = df[df['Year']==2014]\n", "ax = df.plot(kind='bar', x = 'county', y = 'value', figsize=(10,4))\n", "ax.set_ylabel(stat)\n", "ax.set_xlabel('County')\n", "ax.set_title('2010')\n", "legend = ax.legend()\n", "legend.remove()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#ffffe5\n" ] }, { "data": { "text/html": [ "31.02068.0" ], "text/plain": [ "" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from branca.colormap import linear\n", "colormap = linear.YlGn_09.scale(\n", " df['value'].min(),\n", " df['value'].max())\n", "print(colormap(5.0))\n", "colormap" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "tb_dict = df.set_index('county')['value']" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ireland_counties = os.path.join('data', 'ireland.json')\n", "geo_json_data = json.load(open(ireland_counties))\n", " \n", "m = folium.Map([53.14, -7.69], zoom_start=7, tiles='Mapbox Bright')\n", "colormap.add_to(m)\n", "folium.GeoJson(\n", " geo_json_data,\n", " name='tb',\n", " style_function=lambda feature: {\n", " 'fillColor': colormap(tb_dict[feature['properties']['id']]), \n", " 'color': 'black',\n", " 'weight': 1,\n", " 'dashArray': '5, 5',\n", " 'fillOpacity': 0.5,\n", " }\n", ").add_to(m)\n", "\n", "plugins.ScrollZoomToggler().add_to(m)\n", "#folium.LayerControl().add_to(m)\n", "m" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 }