Last active
June 30, 2023 08:08
-
-
Save psd/725ec25dcec962db6037b687aa214fa1 to your computer and use it in GitHub Desktop.
Example analysis of broken endpoints on planning.data.gov.uk
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "842ea795", | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline\n", | |
"\n", | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"import urllib" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "51ddfbe6", | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [], | |
"source": [ | |
"datasette_url = \"https://datasette.planning.data.gov.uk/\"\n", | |
"\n", | |
"params = urllib.parse.urlencode({\n", | |
"\"sql\": \"\"\"\n", | |
"select\n", | |
" substr(entry_date, 1, 7) as month,\n", | |
" status,\n", | |
" count(*) as count\n", | |
"from\n", | |
" log\n", | |
" group by month, status\n", | |
"\"\"\",\n", | |
"\"_size\": \"max\"\n", | |
"})\n", | |
"\n", | |
"url = f\"{datasette_url}digital-land.csv?{params}\"\n", | |
"df = pd.read_csv(url, dtype={'status': str})" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "1635b25d", | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>month</th>\n", | |
" <th>status</th>\n", | |
" <th>count</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>2018-05</td>\n", | |
" <td>NaN</td>\n", | |
" <td>313</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2018-07</td>\n", | |
" <td>NaN</td>\n", | |
" <td>321</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>2019-08</td>\n", | |
" <td>200</td>\n", | |
" <td>22</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>2019-09</td>\n", | |
" <td>200</td>\n", | |
" <td>56</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2019-10</td>\n", | |
" <td>NaN</td>\n", | |
" <td>22</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>...</th>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>428</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>410</td>\n", | |
" <td>56</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>429</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>429</td>\n", | |
" <td>73</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>430</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>500</td>\n", | |
" <td>70</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>431</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>502</td>\n", | |
" <td>90</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>432</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>503</td>\n", | |
" <td>24</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>433 rows × 3 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" month status count\n", | |
"0 2018-05 NaN 313\n", | |
"1 2018-07 NaN 321\n", | |
"2 2019-08 200 22\n", | |
"3 2019-09 200 56\n", | |
"4 2019-10 NaN 22\n", | |
".. ... ... ...\n", | |
"428 2023-06 410 56\n", | |
"429 2023-06 429 73\n", | |
"430 2023-06 500 70\n", | |
"431 2023-06 502 90\n", | |
"432 2023-06 503 24\n", | |
"\n", | |
"[433 rows x 3 columns]" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "5553f4a8", | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>month</th>\n", | |
" <th>status</th>\n", | |
" <th>count</th>\n", | |
" <th>result</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>2018-05</td>\n", | |
" <td>NaN</td>\n", | |
" <td>313</td>\n", | |
" <td>Error</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2018-07</td>\n", | |
" <td>NaN</td>\n", | |
" <td>321</td>\n", | |
" <td>Error</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>2019-08</td>\n", | |
" <td>200</td>\n", | |
" <td>22</td>\n", | |
" <td>OK</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>2019-09</td>\n", | |
" <td>200</td>\n", | |
" <td>56</td>\n", | |
" <td>OK</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>2019-10</td>\n", | |
" <td>NaN</td>\n", | |
" <td>22</td>\n", | |
" <td>Error</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>...</th>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>428</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>410</td>\n", | |
" <td>56</td>\n", | |
" <td>Error</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>429</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>429</td>\n", | |
" <td>73</td>\n", | |
" <td>Error</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>430</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>500</td>\n", | |
" <td>70</td>\n", | |
" <td>Error</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>431</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>502</td>\n", | |
" <td>90</td>\n", | |
" <td>Error</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>432</th>\n", | |
" <td>2023-06</td>\n", | |
" <td>503</td>\n", | |
" <td>24</td>\n", | |
" <td>Error</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>433 rows × 4 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" month status count result\n", | |
"0 2018-05 NaN 313 Error\n", | |
"1 2018-07 NaN 321 Error\n", | |
"2 2019-08 200 22 OK\n", | |
"3 2019-09 200 56 OK\n", | |
"4 2019-10 NaN 22 Error\n", | |
".. ... ... ... ...\n", | |
"428 2023-06 410 56 Error\n", | |
"429 2023-06 429 73 Error\n", | |
"430 2023-06 500 70 Error\n", | |
"431 2023-06 502 90 Error\n", | |
"432 2023-06 503 24 Error\n", | |
"\n", | |
"[433 rows x 4 columns]" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df[\"result\"] = df[\"status\"].apply(lambda status: \"OK\" if status == \"200\" else \"Error\")\n", | |
"df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "20f712ac", | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th>result</th>\n", | |
" <th>Error</th>\n", | |
" <th>OK</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>month</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>2018-05</th>\n", | |
" <td>313</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2018-07</th>\n", | |
" <td>321</td>\n", | |
" <td>0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2019-08</th>\n", | |
" <td>0</td>\n", | |
" <td>22</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2019-09</th>\n", | |
" <td>0</td>\n", | |
" <td>56</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2019-10</th>\n", | |
" <td>273</td>\n", | |
" <td>1059</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2019-11</th>\n", | |
" <td>1185</td>\n", | |
" <td>3668</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2019-12</th>\n", | |
" <td>519</td>\n", | |
" <td>13574</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-01</th>\n", | |
" <td>393</td>\n", | |
" <td>15874</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-02</th>\n", | |
" <td>488</td>\n", | |
" <td>15301</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-03</th>\n", | |
" <td>790</td>\n", | |
" <td>16762</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-04</th>\n", | |
" <td>1204</td>\n", | |
" <td>16577</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-05</th>\n", | |
" <td>1569</td>\n", | |
" <td>16856</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-06</th>\n", | |
" <td>1630</td>\n", | |
" <td>15637</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-07</th>\n", | |
" <td>2426</td>\n", | |
" <td>16049</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-08</th>\n", | |
" <td>2866</td>\n", | |
" <td>15610</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-09</th>\n", | |
" <td>2960</td>\n", | |
" <td>14389</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-10</th>\n", | |
" <td>2184</td>\n", | |
" <td>16088</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-11</th>\n", | |
" <td>801</td>\n", | |
" <td>16902</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2020-12</th>\n", | |
" <td>1418</td>\n", | |
" <td>17267</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-01</th>\n", | |
" <td>1866</td>\n", | |
" <td>19184</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-02</th>\n", | |
" <td>2040</td>\n", | |
" <td>17112</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-03</th>\n", | |
" <td>2881</td>\n", | |
" <td>19278</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-04</th>\n", | |
" <td>3045</td>\n", | |
" <td>21580</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-05</th>\n", | |
" <td>3077</td>\n", | |
" <td>22454</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-06</th>\n", | |
" <td>3026</td>\n", | |
" <td>21850</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-07</th>\n", | |
" <td>3832</td>\n", | |
" <td>21882</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-08</th>\n", | |
" <td>4223</td>\n", | |
" <td>21509</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09</th>\n", | |
" <td>4479</td>\n", | |
" <td>21864</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-10</th>\n", | |
" <td>4811</td>\n", | |
" <td>28484</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-11</th>\n", | |
" <td>4802</td>\n", | |
" <td>28906</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-12</th>\n", | |
" <td>5825</td>\n", | |
" <td>29756</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-01</th>\n", | |
" <td>6822</td>\n", | |
" <td>34518</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-02</th>\n", | |
" <td>6245</td>\n", | |
" <td>30856</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-03</th>\n", | |
" <td>7230</td>\n", | |
" <td>35132</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-04</th>\n", | |
" <td>7300</td>\n", | |
" <td>34338</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-05</th>\n", | |
" <td>8064</td>\n", | |
" <td>35303</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-06</th>\n", | |
" <td>8382</td>\n", | |
" <td>34407</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-07</th>\n", | |
" <td>8982</td>\n", | |
" <td>35575</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-08</th>\n", | |
" <td>8687</td>\n", | |
" <td>32793</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-09</th>\n", | |
" <td>9191</td>\n", | |
" <td>33518</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-10</th>\n", | |
" <td>9974</td>\n", | |
" <td>34786</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-11</th>\n", | |
" <td>7859</td>\n", | |
" <td>27896</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2022-12</th>\n", | |
" <td>8856</td>\n", | |
" <td>24574</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2023-01</th>\n", | |
" <td>13090</td>\n", | |
" <td>31705</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2023-02</th>\n", | |
" <td>12407</td>\n", | |
" <td>28028</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2023-03</th>\n", | |
" <td>14043</td>\n", | |
" <td>30874</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2023-04</th>\n", | |
" <td>14223</td>\n", | |
" <td>29200</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2023-05</th>\n", | |
" <td>14590</td>\n", | |
" <td>29844</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2023-06</th>\n", | |
" <td>13609</td>\n", | |
" <td>26832</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
"result Error OK\n", | |
"month \n", | |
"2018-05 313 0\n", | |
"2018-07 321 0\n", | |
"2019-08 0 22\n", | |
"2019-09 0 56\n", | |
"2019-10 273 1059\n", | |
"2019-11 1185 3668\n", | |
"2019-12 519 13574\n", | |
"2020-01 393 15874\n", | |
"2020-02 488 15301\n", | |
"2020-03 790 16762\n", | |
"2020-04 1204 16577\n", | |
"2020-05 1569 16856\n", | |
"2020-06 1630 15637\n", | |
"2020-07 2426 16049\n", | |
"2020-08 2866 15610\n", | |
"2020-09 2960 14389\n", | |
"2020-10 2184 16088\n", | |
"2020-11 801 16902\n", | |
"2020-12 1418 17267\n", | |
"2021-01 1866 19184\n", | |
"2021-02 2040 17112\n", | |
"2021-03 2881 19278\n", | |
"2021-04 3045 21580\n", | |
"2021-05 3077 22454\n", | |
"2021-06 3026 21850\n", | |
"2021-07 3832 21882\n", | |
"2021-08 4223 21509\n", | |
"2021-09 4479 21864\n", | |
"2021-10 4811 28484\n", | |
"2021-11 4802 28906\n", | |
"2021-12 5825 29756\n", | |
"2022-01 6822 34518\n", | |
"2022-02 6245 30856\n", | |
"2022-03 7230 35132\n", | |
"2022-04 7300 34338\n", | |
"2022-05 8064 35303\n", | |
"2022-06 8382 34407\n", | |
"2022-07 8982 35575\n", | |
"2022-08 8687 32793\n", | |
"2022-09 9191 33518\n", | |
"2022-10 9974 34786\n", | |
"2022-11 7859 27896\n", | |
"2022-12 8856 24574\n", | |
"2023-01 13090 31705\n", | |
"2023-02 12407 28028\n", | |
"2023-03 14043 30874\n", | |
"2023-04 14223 29200\n", | |
"2023-05 14590 29844\n", | |
"2023-06 13609 26832" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df = df.pivot_table(index=\"month\", columns=\"result\", values=\"count\", aggfunc=np.sum, fill_value=0)\n", | |
"df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "ce072100", | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[[]]" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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", | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"ax = df.plot.bar(stacked=True)\n", | |
"ax.set(xticks=())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "8879b72b", | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"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.8" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment