Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@psychemedia
Last active August 29, 2015 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save psychemedia/86d436aa2a3a6914f618 to your computer and use it in GitHub Desktop.
Save psychemedia/86d436aa2a3a6914f618 to your computer and use it in GitHub Desktop.
A quick test of textualising nomis (official labour market statistics) data
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:2db0deca46710975090b265884f5e6b13991217bda874f0d8b87848943a5e867"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"nomis Labour Market Statistics API"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A quick test of textualising [*nomis* data](http://www.nomisweb.co.uk/api/v01/help).\n",
"\n",
"*nomis* is a source of UK labour market statistics data. Data is published via an API in a variety of forms including JSON and XML using SDMX. Data is also published in CSV format (select the item on the API page referring to help on using HTML documents).\n",
"\n",
"This is a quick and crude attempt at generating *textualiastions* of the data (*data2text*) using simple string formating.\n",
"\n",
"This allows us to generate text from data such as the following:\n",
"\n",
"<blockquote>The most recent figure (August 2014) for persons claiming JSA for the Isle of Wight area is 1502.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a considerable decrease of 1218 since then.\n",
"Last month saw a total amount of 1624, of which 1101 applicants were male and 523 female.\n",
"Of the current total amount, 986 applicants were male and 516 were female.\n",
"At the same time last year, 1845 applicants were male and 875 female.</blockquote>\n",
"\n",
"(Note - thousands separators are easily added.)\n",
"\n",
"We can also generate sentences of the following form - italicised elements are all inserted from the original datasource:\n",
"\n",
"<blockquote>Figures came out for *August 2014* for unemployed claimants which show that *1,502* people on the *Isle of Wight* were claiming Job Seekers Allowance (JSA) in *August 2014*. Unemployment Benefit figures released by the Office for National Statistics show *a fall of 122* since *July 2014*, which reported *1,624* JSA claimants, and *a fall of 1,218* from *August 2013* (*2,720*).\n",
"<br/>\n",
"That means *1.9%* of the resident *Isle of Wight* population *aged 16-64* are *persons claiming JSA* \u2013 *0.5% more* than the rest of the *South East* (*1.4%*), and *0.5% less* than the whole of the UK (*2.4%*).</blockquote>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pandas as pd"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 258
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#We can download a CSV file containing measures for a particular region\n",
"#For example, Jobseeker allowance on the Isle of Wight\n",
"tmp=pd.read_csv('http://www.nomisweb.co.uk/api/v01/dataset/NM_1_1.data.csv?geography=2038431803&sex=5&item=1&measures=20100')\n",
"tmp[:3]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DATE</th>\n",
" <th>DATE_NAME</th>\n",
" <th>DATE_CODE</th>\n",
" <th>DATE_TYPE</th>\n",
" <th>DATE_TYPECODE</th>\n",
" <th>DATE_SORTORDER</th>\n",
" <th>GEOGRAPHY</th>\n",
" <th>GEOGRAPHY_NAME</th>\n",
" <th>GEOGRAPHY_CODE</th>\n",
" <th>GEOGRAPHY_TYPE</th>\n",
" <th>...</th>\n",
" <th>MEASURES</th>\n",
" <th>MEASURES_NAME</th>\n",
" <th>OBS_VALUE</th>\n",
" <th>OBS_STATUS</th>\n",
" <th>OBS_STATUS_NAME</th>\n",
" <th>OBS_CONF</th>\n",
" <th>OBS_CONF_NAME</th>\n",
" <th>URN</th>\n",
" <th>RECORD_OFFSET</th>\n",
" <th>RECORD_COUNT</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 1983-06</td>\n",
" <td> June 1983</td>\n",
" <td> 1983-06</td>\n",
" <td> date</td>\n",
" <td> 0</td>\n",
" <td> 0</td>\n",
" <td> 2038431803</td>\n",
" <td> Isle of Wight</td>\n",
" <td> E06000046</td>\n",
" <td> pre-2009 local authorities: district / unitary</td>\n",
" <td>...</td>\n",
" <td> 20100</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 3504</td>\n",
" <td> A</td>\n",
" <td> Normal Value</td>\n",
" <td> F</td>\n",
" <td> Free (free for publication)</td>\n",
" <td> Nm-1d1d31734e1d2038431803d5d1d20100</td>\n",
" <td> 0</td>\n",
" <td> 375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 1983-07</td>\n",
" <td> July 1983</td>\n",
" <td> 1983-07</td>\n",
" <td> date</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 2038431803</td>\n",
" <td> Isle of Wight</td>\n",
" <td> E06000046</td>\n",
" <td> pre-2009 local authorities: district / unitary</td>\n",
" <td>...</td>\n",
" <td> 20100</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 3458</td>\n",
" <td> A</td>\n",
" <td> Normal Value</td>\n",
" <td> F</td>\n",
" <td> Free (free for publication)</td>\n",
" <td> Nm-1d1d31735e1d2038431803d5d1d20100</td>\n",
" <td> 1</td>\n",
" <td> 375</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 1983-08</td>\n",
" <td> August 1983</td>\n",
" <td> 1983-08</td>\n",
" <td> date</td>\n",
" <td> 0</td>\n",
" <td> 2</td>\n",
" <td> 2038431803</td>\n",
" <td> Isle of Wight</td>\n",
" <td> E06000046</td>\n",
" <td> pre-2009 local authorities: district / unitary</td>\n",
" <td>...</td>\n",
" <td> 20100</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 3409</td>\n",
" <td> A</td>\n",
" <td> Normal Value</td>\n",
" <td> F</td>\n",
" <td> Free (free for publication)</td>\n",
" <td> Nm-1d1d31736e1d2038431803d5d1d20100</td>\n",
" <td> 2</td>\n",
" <td> 375</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>3 rows \u00d7 34 columns</p>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 259,
"text": [
" DATE DATE_NAME DATE_CODE DATE_TYPE DATE_TYPECODE DATE_SORTORDER \\\n",
"0 1983-06 June 1983 1983-06 date 0 0 \n",
"1 1983-07 July 1983 1983-07 date 0 1 \n",
"2 1983-08 August 1983 1983-08 date 0 2 \n",
"\n",
" GEOGRAPHY GEOGRAPHY_NAME GEOGRAPHY_CODE \\\n",
"0 2038431803 Isle of Wight E06000046 \n",
"1 2038431803 Isle of Wight E06000046 \n",
"2 2038431803 Isle of Wight E06000046 \n",
"\n",
" GEOGRAPHY_TYPE \\\n",
"0 pre-2009 local authorities: district / unitary \n",
"1 pre-2009 local authorities: district / unitary \n",
"2 pre-2009 local authorities: district / unitary \n",
"\n",
" ... MEASURES \\\n",
"0 ... 20100 \n",
"1 ... 20100 \n",
"2 ... 20100 \n",
"\n",
" MEASURES_NAME OBS_VALUE OBS_STATUS OBS_STATUS_NAME OBS_CONF \\\n",
"0 Persons claiming JSA 3504 A Normal Value F \n",
"1 Persons claiming JSA 3458 A Normal Value F \n",
"2 Persons claiming JSA 3409 A Normal Value F \n",
"\n",
" OBS_CONF_NAME URN \\\n",
"0 Free (free for publication) Nm-1d1d31734e1d2038431803d5d1d20100 \n",
"1 Free (free for publication) Nm-1d1d31735e1d2038431803d5d1d20100 \n",
"2 Free (free for publication) Nm-1d1d31736e1d2038431803d5d1d20100 \n",
"\n",
" RECORD_OFFSET RECORD_COUNT \n",
"0 0 375 \n",
"1 1 375 \n",
"2 2 375 \n",
"\n",
"[3 rows x 34 columns]"
]
}
],
"prompt_number": 259
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tmp.columns"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 260,
"text": [
"Index(['DATE', 'DATE_NAME', 'DATE_CODE', 'DATE_TYPE', 'DATE_TYPECODE', 'DATE_SORTORDER', 'GEOGRAPHY', 'GEOGRAPHY_NAME', 'GEOGRAPHY_CODE', 'GEOGRAPHY_TYPE', 'GEOGRAPHY_TYPECODE', 'GEOGRAPHY_SORTORDER', 'SEX', 'SEX_NAME', 'SEX_CODE', 'SEX_TYPE', 'SEX_TYPECODE', 'SEX_SORTORDER', 'ITEM', 'ITEM_NAME', 'ITEM_CODE', 'ITEM_TYPE', 'ITEM_TYPECODE', 'ITEM_SORTORDER', 'MEASURES', 'MEASURES_NAME', 'OBS_VALUE', 'OBS_STATUS', 'OBS_STATUS_NAME', 'OBS_CONF', 'OBS_CONF_NAME', 'URN', 'RECORD_OFFSET', 'RECORD_COUNT'], dtype='object')"
]
}
],
"prompt_number": 260
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#We can project just a subset of the columns using the select parameter\n",
"baseURL='http://www.nomisweb.co.uk/api/v01/dataset/NM_1_1.data.csv?'\n",
"url=baseURL+'geography=2038431803&sex=5,6,7&item=1&measures=20100'\n",
"#Projection\n",
"url+='&select=sex_name,geography_name,measures_name,date_code,date_name,obs_value'\n",
"tmp=pd.read_csv(url)\n",
"tmp[:9]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>SEX_NAME</th>\n",
" <th>GEOGRAPHY_NAME</th>\n",
" <th>MEASURES_NAME</th>\n",
" <th>DATE_CODE</th>\n",
" <th>DATE_NAME</th>\n",
" <th>OBS_VALUE</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> Male</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-06</td>\n",
" <td> June 1983</td>\n",
" <td> 3504</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> Female</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-06</td>\n",
" <td> June 1983</td>\n",
" <td> 1336</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> Total</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-06</td>\n",
" <td> June 1983</td>\n",
" <td> 4840</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> Male</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-07</td>\n",
" <td> July 1983</td>\n",
" <td> 3458</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> Female</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-07</td>\n",
" <td> July 1983</td>\n",
" <td> 1302</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td> Total</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-07</td>\n",
" <td> July 1983</td>\n",
" <td> 4760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td> Male</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-08</td>\n",
" <td> August 1983</td>\n",
" <td> 3409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td> Female</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-08</td>\n",
" <td> August 1983</td>\n",
" <td> 1264</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td> Total</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1983-08</td>\n",
" <td> August 1983</td>\n",
" <td> 4673</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 261,
"text": [
" SEX_NAME GEOGRAPHY_NAME MEASURES_NAME DATE_CODE DATE_NAME \\\n",
"0 Male Isle of Wight Persons claiming JSA 1983-06 June 1983 \n",
"1 Female Isle of Wight Persons claiming JSA 1983-06 June 1983 \n",
"2 Total Isle of Wight Persons claiming JSA 1983-06 June 1983 \n",
"3 Male Isle of Wight Persons claiming JSA 1983-07 July 1983 \n",
"4 Female Isle of Wight Persons claiming JSA 1983-07 July 1983 \n",
"5 Total Isle of Wight Persons claiming JSA 1983-07 July 1983 \n",
"6 Male Isle of Wight Persons claiming JSA 1983-08 August 1983 \n",
"7 Female Isle of Wight Persons claiming JSA 1983-08 August 1983 \n",
"8 Total Isle of Wight Persons claiming JSA 1983-08 August 1983 \n",
"\n",
" OBS_VALUE \n",
"0 3504 \n",
"1 1336 \n",
"2 4840 \n",
"3 3458 \n",
"4 1302 \n",
"5 4760 \n",
"6 3409 \n",
"7 1264 \n",
"8 4673 "
]
}
],
"prompt_number": 261
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#And can project just a subset of the columns, and also reshape them using the rows and cols parameters\n",
"url+='&rows=date_code,date_name,geography_name,measures_name,&cols=sex_name'\n",
"tmp=pd.read_csv(url)\n",
"tmp[:3]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DATE_CODE</th>\n",
" <th>DATE_NAME</th>\n",
" <th>GEOGRAPHY_NAME</th>\n",
" <th>MEASURES_NAME</th>\n",
" <th>Female</th>\n",
" <th>Male</th>\n",
" <th>Total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 1983-06</td>\n",
" <td> June 1983</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1336</td>\n",
" <td> 3504</td>\n",
" <td> 4840</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 1983-07</td>\n",
" <td> July 1983</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1302</td>\n",
" <td> 3458</td>\n",
" <td> 4760</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 1983-08</td>\n",
" <td> August 1983</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1264</td>\n",
" <td> 3409</td>\n",
" <td> 4673</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 262,
"text": [
" DATE_CODE DATE_NAME GEOGRAPHY_NAME MEASURES_NAME Female Male \\\n",
"0 1983-06 June 1983 Isle of Wight Persons claiming JSA 1336 3504 \n",
"1 1983-07 July 1983 Isle of Wight Persons claiming JSA 1302 3458 \n",
"2 1983-08 August 1983 Isle of Wight Persons claiming JSA 1264 3409 \n",
"\n",
" Total \n",
"0 4840 \n",
"1 4760 \n",
"2 4673 "
]
}
],
"prompt_number": 262
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#We can also limit the time - for example, over theprevious year\n",
"url+='&time=latest,prevyear'\n",
"df=pd.read_csv(url)\n",
"df"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DATE_CODE</th>\n",
" <th>DATE_NAME</th>\n",
" <th>GEOGRAPHY_NAME</th>\n",
" <th>MEASURES_NAME</th>\n",
" <th>Female</th>\n",
" <th>Male</th>\n",
" <th>Total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0 </th>\n",
" <td> 2013-08</td>\n",
" <td> August 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 875</td>\n",
" <td> 1845</td>\n",
" <td> 2720</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1 </th>\n",
" <td> 2013-09</td>\n",
" <td> September 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 877</td>\n",
" <td> 1810</td>\n",
" <td> 2687</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2 </th>\n",
" <td> 2013-10</td>\n",
" <td> October 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 914</td>\n",
" <td> 1867</td>\n",
" <td> 2781</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3 </th>\n",
" <td> 2013-11</td>\n",
" <td> November 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1016</td>\n",
" <td> 1996</td>\n",
" <td> 3012</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4 </th>\n",
" <td> 2013-12</td>\n",
" <td> December 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1027</td>\n",
" <td> 2053</td>\n",
" <td> 3080</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5 </th>\n",
" <td> 2014-01</td>\n",
" <td> January 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 1065</td>\n",
" <td> 2094</td>\n",
" <td> 3159</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6 </th>\n",
" <td> 2014-02</td>\n",
" <td> February 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 996</td>\n",
" <td> 2017</td>\n",
" <td> 3013</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7 </th>\n",
" <td> 2014-03</td>\n",
" <td> March 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 888</td>\n",
" <td> 1781</td>\n",
" <td> 2669</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8 </th>\n",
" <td> 2014-04</td>\n",
" <td> April 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 731</td>\n",
" <td> 1554</td>\n",
" <td> 2285</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9 </th>\n",
" <td> 2014-05</td>\n",
" <td> May 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 645</td>\n",
" <td> 1387</td>\n",
" <td> 2032</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td> 2014-06</td>\n",
" <td> June 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 560</td>\n",
" <td> 1195</td>\n",
" <td> 1755</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td> 2014-07</td>\n",
" <td> July 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 523</td>\n",
" <td> 1101</td>\n",
" <td> 1624</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td> 2014-08</td>\n",
" <td> August 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 516</td>\n",
" <td> 986</td>\n",
" <td> 1502</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 263,
"text": [
" DATE_CODE DATE_NAME GEOGRAPHY_NAME MEASURES_NAME Female \\\n",
"0 2013-08 August 2013 Isle of Wight Persons claiming JSA 875 \n",
"1 2013-09 September 2013 Isle of Wight Persons claiming JSA 877 \n",
"2 2013-10 October 2013 Isle of Wight Persons claiming JSA 914 \n",
"3 2013-11 November 2013 Isle of Wight Persons claiming JSA 1016 \n",
"4 2013-12 December 2013 Isle of Wight Persons claiming JSA 1027 \n",
"5 2014-01 January 2014 Isle of Wight Persons claiming JSA 1065 \n",
"6 2014-02 February 2014 Isle of Wight Persons claiming JSA 996 \n",
"7 2014-03 March 2014 Isle of Wight Persons claiming JSA 888 \n",
"8 2014-04 April 2014 Isle of Wight Persons claiming JSA 731 \n",
"9 2014-05 May 2014 Isle of Wight Persons claiming JSA 645 \n",
"10 2014-06 June 2014 Isle of Wight Persons claiming JSA 560 \n",
"11 2014-07 July 2014 Isle of Wight Persons claiming JSA 523 \n",
"12 2014-08 August 2014 Isle of Wight Persons claiming JSA 516 \n",
"\n",
" Male Total \n",
"0 1845 2720 \n",
"1 1810 2687 \n",
"2 1867 2781 \n",
"3 1996 3012 \n",
"4 2053 3080 \n",
"5 2094 3159 \n",
"6 2017 3013 \n",
"7 1781 2669 \n",
"8 1554 2285 \n",
"9 1387 2032 \n",
"10 1195 1755 \n",
"11 1101 1624 \n",
"12 986 1502 "
]
}
],
"prompt_number": 263
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's see if we can use that data to tell a story."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"mostRecent=df.iloc[-1]\n",
"txt1='The most recent figure ({0}) for {1} for the {2} area is {3}.'.format(mostRecent['DATE_NAME'],\n",
" mostRecent['MEASURES_NAME'],\n",
" mostRecent['GEOGRAPHY_NAME'],\n",
" mostRecent['Total'])\n",
"print(txt1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The most recent figure (August 2014) for Persons claiming JSA for the Isle of Wight area is 1502.\n"
]
}
],
"prompt_number": 264
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's just tidy up the case on the allowance title."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#http://stackoverflow.com/a/3847369/454773\n",
"decase = lambda s: s[:1].lower() + s[1:] if s else ''\n",
"\n",
"txt1='The most recent figure ({0}) for {1} for the {2} area is {3}.'.format(mostRecent['DATE_NAME'],\n",
" decase(mostRecent['MEASURES_NAME']),\n",
" mostRecent['GEOGRAPHY_NAME'],\n",
" mostRecent['Total'])\n",
"print(txt1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The most recent figure (August 2014) for persons claiming JSA for the Isle of Wight area is 1502.\n"
]
}
],
"prompt_number": 265
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's make a comparison with a year ago."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"yearago=df.iloc[0]\n",
"txt2='This compares with a figure of {0} from a year ago ({1}).'.format(yearago['Total'],yearago['DATE_NAME'])\n",
"\n",
"print(txt1)\n",
"print(txt2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The most recent figure (August 2014) for persons claiming JSA for the Isle of Wight area is 1502.\n",
"This compares with a figure of 2720 from a year ago (August 2013).\n"
]
}
],
"prompt_number": 266
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can tweak this further to calculate the difference."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"txt3=txt2[:-1]\n",
"yeardelta= mostRecent['Total'] - yearago['Total']\n",
"\n",
"if yeardelta==0:\n",
" txt3+=', exactly the same amount.'\n",
"else:\n",
" txt3+=', a change of {0}.'.format(yeardelta)\n",
"\n",
"print(txt1)\n",
"print(txt3) "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The most recent figure (August 2014) for persons claiming JSA for the Isle of Wight area is 1502.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a change of -1218.\n"
]
}
],
"prompt_number": 267
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also make it clear in which direction the change took place."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"txt4=txt2[:-1]\n",
"\n",
"if yeardelta==0:\n",
" txt4+=', exactly the same amount.'\n",
"else:\n",
" if yeardelta <0: direction='decrease'\n",
" else: direction='increase'\n",
" txt4+=', {0} of {1}.'.format(p.a(direction),abs(yeardelta))\n",
"\n",
"print(txt1)\n",
"print(txt4) "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The most recent figure (August 2014) for persons claiming JSA for the Isle of Wight area is 1502.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a decrease of 1218.\n"
]
}
],
"prompt_number": 274
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We might want to add a bit of flexibility into the text, so it's form can changes slightly each presentation."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#Library to support natural language text generation\n",
"#!pip3 install git+https://github.com/pwdyson/inflect.py\n",
"import inflect\n",
"p = inflect.engine()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 269
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import random\n",
"\n",
"def _txt5():\n",
" txt5=txt2[:-1]\n",
" \n",
" if yeardelta==0:\n",
" txt4+=', exactly the same amount.'\n",
" else:\n",
" if yeardelta <0: direction=random.choice(['decrease', 'fall'])\n",
" else: direction=random.choice(['increase','rise'])\n",
" txt5+=', and represents {0} of {1} since then.'.format(p.a(direction),abs(yeardelta))\n",
" return txt5\n",
"\n",
"print(txt1)\n",
"print(_txt5())\n",
"print(_txt5()) \n",
"print(_txt5()) "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The most recent figure (August 2014) for persons claiming JSA for the Isle of Wight area is 1502.\n",
"This compares with a figure of 2720 from a year ago (August 2013), and represents a decrease of 1218 since then.\n",
"This compares with a figure of 2720 from a year ago (August 2013), and represents a fall of 1218 since then.\n",
"This compares with a figure of 2720 from a year ago (August 2013), and represents a fall of 1218 since then.\n"
]
}
],
"prompt_number": 282
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We might want to add in an interpretation of how much the figures have differed."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def _txt6(filler=','):\n",
" \n",
" def _magnitude(term):\n",
"\n",
" #A heuristic here\n",
" if propDelta<0.05:\n",
" mod=random.choice(['slight'])\n",
" elif propDelta<0.10:\n",
" mod=random.choice(['significant'])\n",
" else:\n",
" mod=random.choice(['considerable','large' ])\n",
" term=' '.join([mod,term])\n",
" return p.a(term)\n",
" \n",
" txt6=txt2[:-1]\n",
" \n",
" propDelta= abs(yeardelta)/mostRecent['Total']\n",
" \n",
" if yeardelta==0:\n",
" txt6+=', exactly the same amount.'\n",
" else:\n",
" if yeardelta <0: direction=_magnitude(random.choice([ 'decrease','fall']))\n",
" else: direction=_magnitude(random.choice(['increase','rise']))\n",
" \n",
" txt6+='{_filler} {0} of {1} since then.'.format(p.a(direction),\n",
" abs(yeardelta),\n",
" _filler= filler )\n",
" return txt6\n",
"\n",
"print(txt1)\n",
"print(_txt6())\n",
"print(_txt6()) \n",
"print(_txt6(' and represents')) \n",
"print(_txt6()) \n",
"print(_txt6())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The most recent figure (August 2014) for persons claiming JSA for the Isle of Wight area is 1502.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a large fall of 1218 since then.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a considerable fall of 1218 since then.\n",
"This compares with a figure of 2720 from a year ago (August 2013) and represents a considerable decrease of 1218 since then.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a considerable fall of 1218 since then.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a considerable decrease of 1218 since then.\n"
]
}
],
"prompt_number": 283
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How about a monthly comparison too?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"lastMonth=df.iloc[-2]\n",
"\n",
"def updown(now, then,amount=False, magnitude=False):\n",
" \n",
" txt=[]\n",
" \n",
" delta=now - then\n",
" propdelta = delta/now\n",
" if magnitude and delta!=0:\n",
" if delta<0.05:\n",
" txt.append(random.choice(['slightly']))\n",
" elif delta<0.10:\n",
" txt.append(random.choice(['significantly']))\n",
" else:\n",
" txt.append(random.choice(['considerably']))\n",
" \n",
" if now>then: txt.append('up')\n",
" elif now<then: txt.append('down')\n",
" else: txt.append('no change')\n",
" \n",
" txt=' '.join(txt)\n",
" \n",
" if amount:\n",
" txt='{0} {1}'.format(txt, abs(now-then) )\n",
"\n",
" return txt\n",
" \n",
"def _txt7(amount=False,magnitude=False):\n",
" txt7=txt6[:-1]\n",
"\n",
" txt7+=', {0} on the previous month.'.format(updown(mostRecent['Total'],lastMonth['Total'],amount,magnitude))\n",
" return txt7\n",
"\n",
"txt6=_txt6()\n",
"print(_txt7())\n",
"txt6=_txt6()\n",
"print(_txt7(amount=True,magnitude=False))\n",
"txt6=_txt6()\n",
"print(_txt7(amount=False,magnitude=True))\n",
"txt6=_txt6()\n",
"print(_txt7(amount=True,magnitude=True))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"This compares with a figure of 2720 from a year ago (August 2013), a large fall of 1218, down on the previous month.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a considerable decrease of 1218, down 122 on the previous month.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a decrease of 1218, slightly down on the previous month.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a decrease of 1218, slightly down 122 on the previous month.\n"
]
}
],
"prompt_number": 177
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The table also contained information about the gender split. So what might we let the machine write about that?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def _txt8():\n",
" txt8='''\\\n",
"Of the current total{_figure}, {maleCount} applicants \\\n",
"were male and {femaleCount} female.\\\n",
"'''.format(femaleCount=mostRecent['Female'],\n",
" maleCount=mostRecent['Male'],\n",
" _figure=random.choice(['',' figure']))\n",
" return txt8\n",
"\n",
"print(_txt8())\n",
"print(_txt8())\n",
"print(_txt8())\n",
"print(_txt8())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Of the current total, 986 applicants were male and 516 female.\n",
"Of the current total figure, 986 applicants were male and 516 female.\n",
"Of the current total figure, 986 applicants were male and 516 female.\n",
"Of the current total figure, 986 applicants were male and 516 female.\n"
]
}
],
"prompt_number": 188
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We could perhaps introduce some variation in the order?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def _txt9():\n",
" genderCount=[ ('male',mostRecent['Male']),('female',mostRecent['Female'])]\n",
" if random.choice([True, False]):\n",
" genderCount=[genderCount[1],genderCount[0]]\n",
" \n",
" txt9='''\\\n",
"Of {_period} total{_figure}, {A_count} applicants \\\n",
"were {A_gender} and {B_count}{_space_were}{B_gender}.\\\n",
"'''.format(A_count=genderCount[0][1], A_gender=genderCount[0][0],\n",
" B_count=genderCount[1][1], B_gender=genderCount[1][0],\n",
" _figure=random.choice(['',' figure',' amount']),\n",
" _space_were=random.choice([' ',' were ']),\n",
" _period=random.choice([\"this month's\",'the current'])\n",
" )\n",
" return txt9\n",
"\n",
"print(_txt9())\n",
"print(_txt9())\n",
"print(_txt9())\n",
"print(_txt9())\n",
"print(_txt9())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Of the current total amount, 516 applicants were female and 986 male.\n",
"Of this month's total figure, 986 applicants were male and 516 were female.\n",
"Of the current total figure, 516 applicants were female and 986 male.\n",
"Of the current total amount, 516 applicants were female and 986 were male.\n",
"Of this month's total, 516 applicants were female and 986 were male.\n"
]
}
],
"prompt_number": 199
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can then try to generalise that function a little more, so it can produce things from other months.\n",
"\n",
"I iterated on the following function several times, increasing it's complexity and checking the result by inspection of multiple generated sentences at each step."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def _txt10(data, period,randGender=False, opener='Of',total=True,showTotal=False,filler=False):\n",
" genderCount=[ ('male',data['Male']),('female',data['Female'])]\n",
" if randGender and random.choice([True, False]):\n",
" genderCount=[genderCount[1],genderCount[0]]\n",
" \n",
" txt10='''\\\n",
"{_opener} {_period}{_total},{_filler} {A_count} applicants \\\n",
"were {A_gender} and {B_count}{_space_were}{B_gender}.\\\n",
"'''.format(A_count=genderCount[0][1], A_gender=genderCount[0][0],\n",
" B_count=genderCount[1][1], B_gender=genderCount[1][0],\n",
" _space_were=random.choice([' ',' were ']),\n",
" _period=random.choice(period),\n",
" _opener=opener,\n",
" _total = ' total{_figure}{_showTotal}'.format(_figure=random.choice(['',' figure',' amount']),\n",
" _showTotal= '' if not showTotal else ' of {0}'.format(data['Total'])) if total else '',\n",
" _filler='' if not filler else filler,\n",
" \n",
" )\n",
" return txt10\n",
"\n",
"print(_txt10(mostRecent,[\"this month's\",'the current','the most recent']))\n",
"print(_txt10(mostRecent,[\"this month's\",'the current','the most recent'],randGender=True))\n",
"print(_txt10(mostRecent,[\"this month's\",'the current','the most recent'],randGender=True))\n",
"print(_txt10(yearago,[\"the same month last year's\",],opener='From',showTotal=True))\n",
"print(_txt10(lastMonth,[\"last month's\"]))\n",
"print(_txt10(mostRecent,['the most recent'],opener='From',showTotal=True))\n",
"print()\n",
"print(_txt10(mostRecent,[\"this month's\",'the current','the most recent']))\n",
"print(_txt10(lastMonth,[\"last month's\"],opener='This compares with',filler=' of which'))\n",
"print(_txt10(yearago,[\"the same time last year\"],opener='At',total=False))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Of the most recent total figure, 986 applicants were male and 516 were female.\n",
"Of this month's total amount, 986 applicants were male and 516 female.\n",
"Of this month's total figure, 986 applicants were male and 516 female.\n",
"From the same month last year's total amount of 2720, 1845 applicants were male and 875 were female.\n",
"Of last month's total figure, 1101 applicants were male and 523 were female.\n",
"From the most recent total amount of 1502, 986 applicants were male and 516 female.\n",
"\n",
"Of the current total figure, 986 applicants were male and 516 were female.\n",
"This compares with last month's total amount, of which 1101 applicants were male and 523 were female.\n",
"At the same time last year, 1845 applicants were male and 875 were female.\n"
]
}
],
"prompt_number": 231
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So what have we got? Something like this perhaps?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print(txt1)\n",
"print(_txt6())\n",
"print(_txt10(lastMonth,[\"month saw a\"],opener='Last',filler=' of which',showTotal=True))\n",
"print(_txt10(mostRecent,[\"this month's\",'the current','the most recent']))\n",
"print(_txt10(yearago,[\"the same time last year\"],opener='At',total=False))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The most recent figure (August 2014) for persons claiming JSA for the Isle of Wight area is 1502.\n",
"This compares with a figure of 2720 from a year ago (August 2013), a considerable decrease of 1218 since then.\n",
"Last month saw a total amount of 1624, of which 1101 applicants were male and 523 female.\n",
"Of the current total amount, 986 applicants were male and 516 were female.\n",
"At the same time last year, 1845 applicants were male and 875 female.\n"
]
}
],
"prompt_number": 257
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Charts are often useful too..."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from ggplot import *\n",
"df_long=pd.melt(df, id_vars=['DATE_CODE','DATE_NAME','GEOGRAPHY_NAME','MEASURES_NAME'], value_vars= ['Female','Male','Total'] )\n",
"df_long['date']=pd.to_datetime(df_long['DATE_CODE'], format='%Y-%m')\n",
"df_long[:5]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DATE_CODE</th>\n",
" <th>DATE_NAME</th>\n",
" <th>GEOGRAPHY_NAME</th>\n",
" <th>MEASURES_NAME</th>\n",
" <th>variable</th>\n",
" <th>value</th>\n",
" <th>date</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 2013-08</td>\n",
" <td> August 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> Female</td>\n",
" <td> 875</td>\n",
" <td>2013-08-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 2013-09</td>\n",
" <td> September 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> Female</td>\n",
" <td> 877</td>\n",
" <td>2013-09-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 2013-10</td>\n",
" <td> October 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> Female</td>\n",
" <td> 914</td>\n",
" <td>2013-10-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 2013-11</td>\n",
" <td> November 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> Female</td>\n",
" <td> 1016</td>\n",
" <td>2013-11-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 2013-12</td>\n",
" <td> December 2013</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> Female</td>\n",
" <td> 1027</td>\n",
" <td>2013-12-01</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 236,
"text": [
" DATE_CODE DATE_NAME GEOGRAPHY_NAME MEASURES_NAME variable \\\n",
"0 2013-08 August 2013 Isle of Wight Persons claiming JSA Female \n",
"1 2013-09 September 2013 Isle of Wight Persons claiming JSA Female \n",
"2 2013-10 October 2013 Isle of Wight Persons claiming JSA Female \n",
"3 2013-11 November 2013 Isle of Wight Persons claiming JSA Female \n",
"4 2013-12 December 2013 Isle of Wight Persons claiming JSA Female \n",
"\n",
" value date \n",
"0 875 2013-08-01 \n",
"1 877 2013-09-01 \n",
"2 914 2013-10-01 \n",
"3 1016 2013-11-01 \n",
"4 1027 2013-12-01 "
]
}
],
"prompt_number": 236
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ggplot(df_long,aes(x='date',y='value',colour='variable')) + geom_line() + ylim(0,3500) + ggtitle('JSA Claims, Isle of Wight')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAoEAAAH+CAYAAADjz9QxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VfWd+P/XuWtucm+Sm33FJBDCIpuggiJhx4hCFcWl\nuHXxOyqlauc3w1RaW6ud6bS108640lYLiBsKKoq2KqJIRQ2LLAYSIIQkBLLfJcldz++PkKshCbKE\n3HOT9/Px4CE5Ocv7vD25efPZjqKqqooQQgghhBhQdOEOQAghhBBC9D0pAoUQQgghBiApAoUQQggh\nBiApAoUQQgghBiApAoUQQgghBiApAoUQQgghBiApAoUYQO644w5mzZp1RsdMnTqVu+666zxFdP58\n+OGH6HQ6qqurz/u1HA4H1157LfHx8eh0OioqKnrt3GdzH+Xl5eh0OrZs2dJrcQgh+h8pAoU4T75Z\ncAWDQX73u99x4YUXYrVasdvtjB07lp/97GfdHvujH/0InU7Hn/70p9O+Xn19Pf/2b//GsGHDsFgs\npKamUlhYyMqVKwkEAqH9FEU5o/tYt24djz322Bkdc77odDpWr14d7jC6ePLJJ/n000/55JNPqKmp\nISsrq8s+gwYNYunSpZ22rV27Fp1O1+P28vJyLr/8cmpqakhPT+/1uA0GAytWrOj18wohIoMh3AEI\n0Z91FFwPP/wwf/rTn/i///s/Jk2aRFtbG7t27WLr1q1djmlpaWHlypVMmjSJ5cuXs2TJkm+9zpEj\nR5g8eTImk4mHH36YcePGYTQa+eSTT/jd737HmDFjGD16NABnuj58fHz8Ge0/EJWWljJy5EhGjhzZ\n4z4zZ87k/fff77Tt/fffZ9CgQd1uz8vLIycnB4CUlJRejxnan095X4AQA5e0BArRB9atW8cPfvAD\nbrnlFnJzcxk+fDgLFy7k97//fZd9X3rpJaxWKy+99BL79+8/rS69e+65B5/Px7Zt27j55psZNmwY\ngwcP5rbbbmPbtm0MGTKk2+O2bdtGUVERqamp2Gw2LrnkEt59991O+0ydOpUf/vCHnb7+wQ9+wLJl\ny0hJScFut/Pzn/8cVVV56KGHSEtLIyUlhWXLlnU6z+uvv864ceOIiYnBbrdz6aWXsmPHjtNJX4/+\n/Oc/M3z4cCwWC4mJiRQWFlJVVdXj/mVlZSxYsAC73U5CQgJz5sxh9+7dp7yGz+dj6dKlZGVlYTab\nGTlyJC+88ELo+zk5Ofz1r3/lgw8+QKfTMX369G7PM336dLZv305TU1No28aNG1m2bBk7duzotP2D\nDz5g5syZQPfdwe+//z6jRo3CYrEwbtw4Pv74Y3Q6Hc8//3yna1ZVVXH11VcTExPD4MGDWbVqVae4\nA4EAd955JzqdDr1ef8o8CCH6HykChegDGRkZfPjhh6c1ruvpp5/me9/7HllZWcyfP59nnnnmlPs3\nNDSwYcMGFi9ejM1m6/J9vV5PdHR0t8c6nU5uueUWNm3axPbt25kzZw7z5s2jtLQ0tI+iKF26kNes\nWUMgEGDLli089thjPPLIIxQVFeHxeNi8eTO/+93v+PWvf80777wDQE1NDTfccAPf/e532bt3L59+\n+in3338/BsPZd0YUFxdz99138+CDD7J//342bdrE7bff3uP+x44dY/LkyaSlpbF582a2bt1KQUEB\nU6dOpa6ursfjfvrTn/LnP/+ZP/7xj+zZs4dFixaxaNEiPvjgAwC++OILFi5cyJQpU6ipqeG1117r\n9jzTp08nGAyycePGUE727dvH9ddfz8iRIzttLykpYcaMGd2ep6qqimuuuYZJkyaxfft2fv/733Pf\nffcBXbv6ly5dyh133MGuXbtYuHAhd955J2VlZaG49Xo9f/zjH6mpqeHo0aM95kAI0U+pQojz4vbb\nb1dnzpypqqqqlpSUqBdeeKGq0+nUgoIC9fbbb1eff/551e/3dzpm586dql6vVysqKlRVVdX3339f\njY6OVpuamnq8ztatW1VFUdS1a9eeUUw9GTNmjProo4+Gvp46dar6wx/+MPR1YWGhOm7cuE7HjBw5\nUh09enSX8/zrv/6rqqqqum3bNlVRFLW8vPxbYzwVRVHU559/XlVVVX3ttdfUuLg41eFwdLvvxo0b\nVUVR1KqqKlVVVfWhhx5SJ06c2GmfYDCoDh48WP2f//mfbs/hdrtVs9msPvnkk522X3vtter06dND\nX59OXlVVVUeMGKHee++9qqqq6vPPP6+OHz9eVVVVve+++zpt1+l0al1dXbf38dOf/lTNzc1Vg8Fg\n6LzvvPNOp9wcOnRIVRRF/cMf/hDax+/3q1arVX366adD2wwGg/q3v/3tW+MWQvRP0hIoRB8oKChg\n165dFBcXs3jxYrxeLz/4wQ+YOHEibW1tof2efvpprrzySrKzswGYNm0a2dnZrFy5ssdzq+cwpqu2\n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\nioiIiGQhhUARERGRLKQQKCIiIpKFFAJFREREspBCoIiIiEgWUggUERERyUIKgSIiIiJZSCFQRERE\nJAspBIqIiIhkIYVAERERkSykECgiIiKShRQCRURERLKQQqCIiIhIFlIIFBEREclCCoEiIiIiWUgh\nUERERCQLKQSKiIiIZCGFQBEREZEspBAoIiIikoUUAkVERESykEKgiIiISBZSCBQRERHJQgqBIiIi\nIllIIVBEREQkCykEioiIiGQhhUARERGRLGSYpmlaXURniUajRKNRMvkj2mw20um01WUclWEYuFwu\n4vG4+ngM1MeOlen9zOQ+ZnrvDpepvexufcxUhmHg9/utLiNrOawuoDPl5OQQDodJJBJWl3JUHo+H\nSCRidRlH5XQ68fv9NDY2qo/HQH3sWJnez0zuY6b37nCZ2svu1sdM5XQ6rS4hq+lwsIiIiEgWUggU\nERERyUIKgSIiIiJZSCFQREREJAspBIqIiIhkIYVAERERkSykECgiIiKShRQCRURERLKQQqCIiIhI\nFlIIFBEREclCCoEiIiIiWUghUERERCQLKQSKiIiIZCGFQBEREZEspBAoIiIikoUUAkVERESykEKg\niIiISBZSCBQRERHJQgqBIiIiIllIIVBEREQkCykEioiIiGQhhUARERGRLKQQKCIiIpKFFAJFRERE\nspBCoIiIiEgWUggUERERyUIOqwv4NDZu3MjSpUsxTZPx48czdepUq0sSERER6Va63UhgOp1myZIl\nXHzxxVx11VW88847VFVVWV2WiIiISLfS7ULg7t27KSwsJBAIYLfbGTVqFOvWrbO6LBEREZFupdsd\nDg6FQhQUFLTe9/l87N69m1AoRENDQ5vn5ufn43Bk9ke02+04nU6ryziqg/1TH4+N+tixMr2fmdzH\nTO/d4TK1l92tj5lK/bNWt+u+YRhH3P7GG2+wYsWKNtv69+/PeeedRyAQ6IrSeqRQKMTy5cuZMGGC\n+ngM1MeOpX5+eupdx1AfO8ahffT5fFaXk3W6XQj0er3U19e33g+FQvh8PsaMGUNlZWXr9qqqKhYt\nWkRDQ4N2rGPQ0NDAihUrqKysVB+PgfrYsdTPT0+96xjqY8dQH63V7UJg3759qampoba2Fq/Xy7vv\nvsv555+Pz+fTDiQiIiLSTt0uBNrtds4880wefPBB0uk048ePJxgMWl2WiIiISLfS7UIgQEVFBRUV\nFVaXISIiItJt2a+77rrrrC6iM5imicvlYsCAAbjdbqvL6bbUx46hPnYs9fPTU+86hvrYMdRHaxmm\naZpWFyEiIiIiXStjDgevXbuWRx99lG984xsUFxd3yHtu3ryZv//976RSKex2O6eddhoDBw4EYM+e\nPSxevJhkMklFRQWzZ88GYNu2bSxdupT9+/dz/vnnM2LECADq6up49NFHMU2TVCrFhAkTOP744zuk\nzo5UX1/PkiVLqKqqwjRNhg4dymmnnYbdbj/qa1555RUmTpx4xLm4nnzySfbs2YPdbqe0tJSzzjqr\n9b2WLFnCpk2bcDqdzJs3jz59+gCwePFiNm7cSF5eHldeeWXre7344ousX78egNzcXObNm9dmzsdM\ncf3119OrVy9SqRQ2m42xY8cyZcqUo05P1F7/+te/WL16NTabjdzcXM455xz8fj8Ab731Fi+99BIA\n06ZN47jjjgNg1apVvPrqq9TW1nL11VeTm5sLwLp161i+fDmGYWAYBrNmzWLQoEHHVF9nOdjPgy64\n4ILWz324e++9l9NPP52+ffse9f068t/1QdFolNtvv53hw4dz5plnHutH7nAd+fPxhRdeYMOGDdjt\ndgKBAPPmzSMnJweAl19+mdWrV2MYBrNnz2bIkCEALFu2jDVr1hCNRvnRj370kfd8//33eeyxx7ji\niiv+49+d1W666SauueaaY3qPbNz/Dsr039MHdZd+ZgQzQzz22GPmQw89ZL744osd9p579uwxQ6GQ\naZqmuW/fPvPmm29ufeyPf/yjuXPnTtM0TfOBBx4wN2zYYJqmadbW1pp79+41n3rqKfO9995rfX4y\nmTSTyaRpmqYZi8XMW2+91ayrq+uwWjtCOp02//jHP5qrV682TdM0U6mUuXjxYvOvf/3rf3zdb3/7\nW7OxsfGIjx3si2ma5uOPP26+9tprpmma5vr1680HHnjANE3T3Llzp3nXXXe1Pm/btm3mnj17zNtv\nv73Ne0Wj0dbbr776qrl48eJP8Om6zk033dR6u6Ghwbz//vs7ZL/csmWLGY/HTdM0zddee8187LHH\nTNM0zcbGRvO2224zm5qazKamptbbptm8D9fW1n7k7ygWi7Xe3rt3r3nbbbcdc32d5dB+fpx7773X\n3L179398Tkf+uz5oyZIl5hNPPGE+99xz7a61Kx3Lz8dUKtXm/qZNm1q3vfDCC+YLL7xgmmZzL//w\nhz+YyWTSrKmpMW+77TYznU6bptn8bzwUCh3x7zIajZr33HOPeffdd3/s353VPsm+eDQNUoefAAAN\nwUlEQVTZuP8dlOm/pw/qLv3MBBkxEhiLxdi1axeXX345Dz74IDNnzgRg69atvPLKK1x44YUAPPfc\nc5SWlnLcccexYcMGXnjhBZxOJ+Xl5dTV1bU+76CDI1MAwWCQZDJJKpWiqamJeDxOWVkZAGPHjmXd\nunVUVFS0jlAcPupz6EhaIpHIyFnst27ditPpbB1FstlsnHHGGdx2223MnDkTu93O3/72NzZv3oxh\nGIwfPx6AcDjM/2/v3oKiquMAjn/PchFE7knDrEq4oAmiCVKj6aij0gWvYKZNil0sxyx9aqaaHnrw\nrbHJGdNsSqaw1NRuoAOhSTZk7JCiCIJCgLoayHJZZJFllx6YPcOC4AV0d9vf52l32XP4//97zvn/\nzv92MjMzCQgIICMjw2GfvSfgaLVaTCYTABUVFer/GTNmDB0dHZhMJgIDA4mKiqKpqalf+nqP9+js\n7FRbtVxZQEAAixcvZvfu3cybNw+bzUZ+fj41NTVYrVaSk5OZPn06AH/88Qdnz55FURRiY2NZsGCB\nw77sd7fQU2Znz54Feu6EdTod/v7+AIwfP55Lly6RkJDgcAz35uvrq752l7LszWAwkJubq6Z92bJl\nBAYGAlBSUsLPP/+MzWZj6dKlaLVah22H87y2p+XmzZvExMRgMBgeVJbv22DXx99++40RI0ZgNBqJ\njo4mNTUVRVHYunUr06dPp7q6mtTUVMaNG6fuT6fTqa/HjBlDWVkZ0HNOJyQkqC2EYWFhXLlyhbFj\nx6plejvHjx9n1qxZFBYWPqASGF41NTUUFhbetl755JNP1PrFarWycuXKfi1ennb82blDPQ3uU56u\nwiWCwIqKCmJiYggJCWHkyJEYDIbbdinYf3CLxUJ2djavvvoqISEhHDx48I7/o6ysjMjISLy8vNQF\npu2CgoLU4GYwLS0t7N27F6PRSEpKistVvPX19f2ChhEjRhAcHIzRaKSuro6WlhY2bNiARqPBbDbj\n7+/Pn3/+ybp16wbNj9Vq5ezZs2pzvMlkum0Z2ivygdi7lXx8fHj99deHkNuHJzQ0lO7ubtra2rhw\n4QJ+fn688cYbdHV18dVXX6HT6bhx4wYVFRWsX78eHx8fzGbzoPv8+++/1QB7oLK8k/Lyco4dO4bJ\nZGLNmjVDy+QDZLFY2LVrF9BTlitWrODIkSO89NJLjBw5ktLSUo4fP87SpUvp7u6mq6uLDRs2UFtb\ny08//eQwpKCvoZ7XNpuNvLw80tLSqK6uHp4MD7PBro8Gg4G33nqL4OBgsrKyKC8vJy4uDovFwpgx\nY3jmmWcG3ffp06eZPHky0HMc9g727qb8DAYDJpOJCRMmuE0Q2FfvQEJRFAICAnjzzTfR6/UUFhay\nZMmSAbf1hOPPzh3qaXcqT1fhEkHguXPnmDFjBgDx8fGUlpYOOq7kxo0bhIaGqncDCQkJFBcXD/j9\n+vp68vPzWbt27ZDSGRwczMaNGzGZTOzZswedTkd4ePiQ9jmc7jRmrbq6muTkZDQaDYDa8nQ3cnJy\niIqKcmhRuB/z589n/vz5nDx5ktzcXJYtWzak/T1sVVVV1NfXq60nt27dwmg0Ul1dzbRp09TW4cHK\ntqSkhGvXrvHss88OKS2TJk1i0qRJ1NbW8sMPP/D2228PaX8Pio+PDxs2bFDf//vvvzQ0NPD1118D\nPRdu+82DoihqUBIVFcWtW7fo6OhQx6z1NhzntV6vJzY2lqCgILpddI7cYNdHrVarPrIsISGBuro6\n4uLi0Gg0/cZJ9fX777/j5eXFlClT7itdNpuN3Nxcli9ffl/bu6pJkyYBPS1U5eXlA37PU44/O3eo\np92pPF2F04PA9vZ2ampqqK+vR1EUbDYbiqKQkpKCRqNx+CG7urqA/sHOYD92S0sL+/fvJy0tTb1Y\nBgUF0draqn6ntbX1ji1Yvdm7PK9fv+5SQeDo0aPV4MSuo6ODlpYWwsLCgMHLaiAnTpygvb3d4Y54\noMf33a2EhAT27t17z2lxBqPRiKIojBo1CoDnn3/eoUsN4NKlS3dVtlVVVZw8eZJXXnlFHWIQGBhI\nTU2N+p3W1laHruM7iYqKwmaz0d7e7nKt0wMZPXr0XbcE3+7mZrjO6ytXrlBXV4der6ezsxOr1Yqv\nr2+/rnxnGez62Fd3d7daVt7e3oPeFJ4+fZqLFy86VLj3ek53dnbS0NBAZmYm0PP4r++++47Vq1e7\n9OSQvvWKxWJx+Lv9vLSX9+14yvFn5y71tLuUpytxehBYVlbG1KlTWbRokfrZnj17qK2tJSQkhIaG\nBrq6urBYLFRXVzNu3DjCw8NpamqiubmZkJAQzp8/f9t9m81mvv32WxYsWMDYsWPVzwMDAxkxYgRX\nrlxBq9VSUlLCU0895bBt3wO2tbUVf39/tauvrq6Op59+ehhLYujGjx9Pfn4+JSUlTJ06VW0at7dQ\n6XQ6iouLiY6OdugO9vX15datW7cNIIqLi6mqqup3dzZx4kSKiopISEjg8uXL+Pn5qUHSQBobG9Wg\nuaKiYsDxbq7k5s2bZGdnq8dHTEwMer2exx57DC8vL27cuEFQUBA6nY6CggKmTJmiHiN9WwOvXbtG\ndnY2a9asISAgQP08JiaGY8eOqV3IVVVVd7xoGY1GQkNDURRFHffiLgFgeHg47e3tXL58mbFjx2K1\nWmlsbCQiIoLu7m7Onz9PdHQ0tbW1+Pn59Vs7bDjP6/T0dPX1mTNnMBgMLlVhDHZ9BLh69SpNTU0E\nBwdz/vx5dXzqYC5evEhhYSHr1q1zGNc8ceJEDh06xIwZMzCZTBiNxn7jMXvz8/Pj3XffVd9nZmaS\nkpLi0gEg9PTo9K5X/vnnH6Kiou56e086/uzcpZ52l/J0JU4PAktLS5k1a5bDZ3FxcZSWlpKamkp8\nfDyfffYZoaGhatDg4+NDamoqWVlZ+Pj4DHihKioqwmg0UlBQQEFBAYBaAaempvLjjz9isVgcnkBy\n9epV9u/fj9lsprKykhMnTrBx40YaGhrIy8sDeu5wZs+ePWxT5IfTiy++SE5ODgUFBeoSMfPnzwcg\nMTGRxsZGdu7ciUajISkpiSeffJKkpCSysrIICgrqNzEkJyeHkJAQvvzyS6Cnq2TOnDlMmDCBixcv\n8umnn+Lr68vSpUvVbQ4ePEhNTQ1ms5lt27Yxb948pk2bRn5+Po2NjSiKQlhYGKmpqQ+vYO6BfQxb\n3yVioKcMm5ub+fzzz4GeiSOrVq0iJiaG69evs3v3bry8vIiNjVXL3e7XX3/FYrFw4MABoKcyWr16\nNf7+/syZM4cvvvgCgLlz56oB5KlTpygsLKStrY2dO3cSGxvLkiVLKCsro6SkBC8vL3x9fVmxYsXD\nKp4h8/b2ZuXKlRw9epSOjg5sNhszZswgIiICRVHw9vZm165d6sSQvobzvHZ1A10fz507x+TJk9Fq\ntRw5ckSdGGLvyhzM0aNHsVqtfPPNN0DP5JBFixYRERFBfHw8O3bsQKPRqJNMoGdZmdLSUiwWC9u2\nbSMxMZG5c+cOe34fJPsSJMHBwbetV/oaqCXVk44/O3epp8W9c9vFojs7O9UZkjk5OYSHh7vkun1C\nCPEg9J2VKQZ3/fp1fvnlF9avX+/spHgMqaddn9NbAu9XcXExJSUlWK1WIiMjSUpKcnaShBDioRnq\n4uWeRK/XU1RUNOTJWOLeSD3t+ty2JVAIIYQQQtw/jbMTIIQQQgghHj4JAoUQQgghPJAEgUIIIYQQ\nHkiCQCGEEEIIDyRBoBDCpaxbt44PP/zQ2ckQQoj/PQkChRAuRVGUu1r+ZO7cueoi5kIIIe6dBIFC\nCJdzNytXyTp5QggxNBIECiGc6vTp0yQmJhIUFMSqVavo6OgAoLm5WX2cWVhYGIsXL+bq1asAfPDB\nB5w8eZJNmzYRGBjIO++8A8CFCxdYuHAh4eHhPP7443z//fdOy5cQQrg6CQKFEE7T2dnJsmXLyMjI\noKmpiRdeeIFDhw6hKAo2m43XXnuNuro66urq8Pf3Z9OmTQBs3bqV2bNns2PHDkwmE9u3b+fmzZss\nXLiQl19+mYaGBvbt28fGjRspLy93ci6FEMI1SRAohHCaU6dO0dXVxebNm/Hy8iI9PZ3k5GQAwsLC\nWL58OX5+fowaNYr3339ffcC8Xe9u4+zsbKKjo8nIyECj0fDEE0+QlpYmrYFCCDEAt312sBDC/RkM\nBrRarcNnUVFRAJjNZrZs2UJubi5NTU0AtLW10d3drY4H7D0usLa2lr/++ovQ0FD1s66uLtauXfug\nsyGEEG5JgkAhhNNERkaq4/zsamtr0el0fPzxx1RWVlJUVERERARnzpwhMTFRDQL7TgwZN24cc+bM\nIS8v72FmQQgh3JZ0BwshnGbmzJl4e3uzfft2LBYLhw8fRq/XAz2tfv7+/gQHB2M0Gvnoo48ctn30\n0UepqqpS3y9atIjKykqysrKwWCxYLBb0ej0XLlx4qHkSQgh3IUGgEMJpfHx8OHz4MJmZmYSHh3Pg\nwAHS09NRFIUtW7ZgNpt55JFHmDlzJs8995xD69/mzZs5ePAgYWFhbNmyhVGjRpGXl8e+ffvQarVE\nRkby3nvv0dnZ6cQcCiGE61K672ZBLiGEEEII8b8iLYFCCCGEEB5IgkAhhBBCCA8kQaAQQgghhAeS\nIFAIIYQQwgNJECiEEEII4YEkCBRCCCGE8EASBAohhBBCeCAJAoUQQgghPNB/zqdPtxGtmr4AAAAA\nSUVORK5CYII=\n",
"text": [
"<matplotlib.figure.Figure at 0x7f17d60234e0>"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 241,
"text": [
"<ggplot: (8733771965346)>"
]
}
],
"prompt_number": 241
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"onTheWight Example"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hyperlocal blog OnTheWight publish JSA updates in the following style:\n",
"\n",
"<blockquote>Figures for unemployed claimants came out this morning which show that 1,502 people on the Isle of Wight were claiming Job Seekers Allowance (JSA) in August.\n",
"\n",
"Unemployment Benefit figures released by the Office for National Statistics show a fall of 122 since July, which reported 1,624 JSA claimants, and a fall of 1,218 from August 2013 (2,720).\n",
"<br/>\n",
"That means 1.9% of the resident population of area aged 16-64 is claiming JSA \u2013 0.6% more than the rest of the South East (1.3%), and 0.4% than the whole of the UK (2.3%).\n",
"\n",
"- [Isle of Wight JSA claimant numbers released - onthewight.com](http://onthewight.com/2014/09/17/isle-wight-jsa-claimant-numbers-released-8/)</blockquote>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's see if we can replicate that...\n",
"\n",
"let's also tidy up the presentation of numbers, using commas as a thousands separator."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#Thousands separator\n",
"def c(amount):\n",
" return '{:,}'.format(amount)\n",
"\n",
"def otwRiseFall(now,then,amount=False):\n",
" delta=now-then\n",
" if delta>0:\n",
" txt=p.a(random.choice(['rise','increase']))\n",
" elif delta<0:\n",
" txt=p.a(random.choice(['fall','decrease']))\n",
" if amount:\n",
" txt+=' of {0}'.format(c(abs(delta)))\n",
" return txt\n",
" \n",
"otw1='''\n",
"Figures came out for {date} for unemployed claimants which show that {currNum} people on {place} \\\n",
"were claiming Job Seekers Allowance (JSA) in {currDate}. \\\n",
"Unemployment Benefit figures released by the Office for National Statistics show \\\n",
"{monthChange} since {lastMonthDate}, which reported {lastMonthNum} JSA claimants, \\\n",
"and {yearChange} from {yearagoDate} ({yearagoNum}). \n",
"'''.format(date=mostRecent['DATE_NAME'],\n",
" currNum=c(mostRecent['Total']),\n",
" place='the '+mostRecent['GEOGRAPHY_NAME'],\n",
" currDate=mostRecent['DATE_NAME'],\n",
" monthChange=otwRiseFall(mostRecent['Total'],lastMonth['Total'],True),\n",
" lastMonthDate=lastMonth['DATE_NAME'],\n",
" lastMonthNum=c(lastMonth['Total']),\n",
" yearChange=otwRiseFall(mostRecent['Total'],yearago['Total'],True),\n",
" yearagoDate=yearago['DATE_NAME'],\n",
" yearagoNum=c(yearago['Total'])\n",
" )\n",
"print(otw1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Figures came out for August 2014 for unemployed claimants which show that 1,502 people on the Isle of Wight were claiming Job Seekers Allowance (JSA) in August 2014. Unemployment Benefit figures released by the Office for National Statistics show a fall of 122 since July 2014, which reported 1,624 JSA claimants, and a fall of 1,218 from August 2013 (2,720). \n",
"\n"
]
}
],
"prompt_number": 454
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The next paragraph in the OnTheWight report requires more data, about the JSA percentage rates.\n",
"\n",
"Calculating the rates requires dividing the JSA count by a population count - but what count?\n",
"\n",
"Simple population estimates can be found on the ONS website - [ONS population estimates](http://www.ons.gov.uk/ons/taxonomy/index.html?nscl=Population+Estimates#tab-data-tables) - but the *nomis* API provides access to a wide range of grouped population figures. Referring to the [*nomis* dataset listing](http://www.nomisweb.co.uk/api/v01/dataset/def.htm), we find the [annual population survey (NM_17_1)](http://www.nomisweb.co.uk/api/v01/dataset/NM_17_1/CELL.def.htm) family of indicators which details what figures are available.\n",
"\n",
"The [*nomis* monthly JSA report for the Isle of Wight](https://www.nomisweb.co.uk/reports/lmp/la/2038431803/subreports/jsa_time_series/report.aspx) is the one presumably used as the basis for the *onTheWight* report, although the JSA rate is not given for the Island. The calculated rates are calculated relative to the following population basis: *% is a proportion of resident population of area aged 16-64*. On *nomis*, that's the indicator *402720769 T01:22 (Aged 16-64 - All : All People )*.\n",
"\n",
"<s>*nomis* reports for [the UK](https://www.nomisweb.co.uk/reports/lmp/gor/2092957698/report.aspx) and [the South East](https://www.nomisweb.co.uk/reports/lmp/gor/2013265928/report.aspx) provide various sets of figures for JSA claimants; the figure that appears to be used as the basis for the national and regional rate on the Isle of Wight pages seem to be the figure for *JSA claimants by age and duration - All ages*. Rates in that table are calculated according to the following basis: *% is number of persons claiming JSA as a proportion of resident population of the same age*. The broken out age ranges specified are 18-24, 25-49, 50-64, although the corresponding figures total to less than the *All ages* figure. The *Working Age Client Group* table uses the following population basis: *% is a proportion of resident population of area aged 16-64*. (The 16-17 age group may count for the shortfall in the JSA summed age group figures compared to the *All ages* figure? Or can people aged 65+ claim JSA?) So I'm guessing that the population basis to use is: *402720769 T01:22 (Aged 16-64 - All : All People )*.</s>\n",
"\n",
"(An alternative rate calculation is *% is a proportion of claimant count + workforce jobs total*, either seasonally adjusted or not, which unsurprisingly gives a higher rate, but does use the possible workforce population as perhaps a more reasonable basis for the rate?)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def getLatestJSA(code):\n",
" baseURL='http://www.nomisweb.co.uk/api/v01/dataset/NM_1_1.data.csv?'\n",
" url=baseURL+'geography={code}&date=latest&sex=7&item=1&measures=20100'.format(code=code)\n",
" #Projection\n",
" url+='&select=sex_name,geography_name,measures_name,date_code,date_name,obs_value'\n",
" return pd.read_csv(url).dropna()\n",
"\n",
"def get16_64Population(code):\n",
" url='http://www.nomisweb.co.uk/api/v01/dataset/NM_17_1.data.csv?date=latest&geography={code}&measures=20100&cell=402720769'.format(code=code)\n",
" url+='&select=date_code,date_name,geography_name,measures_name,cell_name,obs_value,cell_code'#&item=1&measures=20100\n",
" \n",
" return pd.read_csv(url).dropna()\n",
"\n",
"def JSA_rate(code):\n",
" return getLatestJSA(code)['OBS_VALUE'].iloc[0]/get16_64Population(code)['OBS_VALUE'].iloc[0] \n",
"\n",
"iwCode=2038431803\n",
"ukCode=2092957697\n",
"seCode=2013265928"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 426
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"getLatestJSA(iwCode)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>SEX_NAME</th>\n",
" <th>GEOGRAPHY_NAME</th>\n",
" <th>MEASURES_NAME</th>\n",
" <th>DATE_CODE</th>\n",
" <th>DATE_NAME</th>\n",
" <th>OBS_VALUE</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> Total</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Persons claiming JSA</td>\n",
" <td> 2014-08</td>\n",
" <td> August 2014</td>\n",
" <td> 1502</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 427,
"text": [
" SEX_NAME GEOGRAPHY_NAME MEASURES_NAME DATE_CODE DATE_NAME \\\n",
"0 Total Isle of Wight Persons claiming JSA 2014-08 August 2014 \n",
"\n",
" OBS_VALUE \n",
"0 1502 "
]
}
],
"prompt_number": 427
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"get16_64Population(iwCode)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DATE_CODE</th>\n",
" <th>DATE_NAME</th>\n",
" <th>GEOGRAPHY_NAME</th>\n",
" <th>MEASURES_NAME</th>\n",
" <th>CELL_NAME</th>\n",
" <th>OBS_VALUE</th>\n",
" <th>CELL_CODE</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 2014-03</td>\n",
" <td> Apr 2013-Mar 2014</td>\n",
" <td> Isle of Wight</td>\n",
" <td> Value</td>\n",
" <td> T01:22 (Aged 16-64 - All : All People )</td>\n",
" <td> 80700</td>\n",
" <td> T01:22</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 428,
"text": [
" DATE_CODE DATE_NAME GEOGRAPHY_NAME MEASURES_NAME \\\n",
"0 2014-03 Apr 2013-Mar 2014 Isle of Wight Value \n",
"\n",
" CELL_NAME OBS_VALUE CELL_CODE \n",
"0 T01:22 (Aged 16-64 - All : All People ) 80700 T01:22 "
]
}
],
"prompt_number": 428
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def rateGetter(code):\n",
" jsa=getLatestJSA(code)\n",
" pop=get16_64Population(code)\n",
" txt='''\n",
"The percentage rate of {claim} for the {loc} region in {date} was {rate}, based on {num} claimants and \\\n",
"population {poptype} of {popnum} ({popDate} figure).\n",
"'''.format(claim=decase(jsa['MEASURES_NAME'].iloc[0]),\n",
" loc=jsa['GEOGRAPHY_NAME'].iloc[0],\n",
" date=jsa['DATE_NAME'].iloc[0],\n",
" rate='{0:.2f}%'.format(100 * JSA_rate(code)),\n",
" num=c(int(jsa['OBS_VALUE'].iloc[0])),\n",
" poptype=decase(pop['CELL_NAME'].iloc[0].split('(')[1].split(' -')[0]),\n",
" popnum=c(int(pop['OBS_VALUE'].iloc[0])),\n",
" popDate=pop['DATE_NAME'].iloc[0])\n",
" print(txt)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 455
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"rateGetter(iwCode)\n",
"rateGetter(seCode)\n",
"rateGetter(ukCode)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"The percentage rate of persons claiming JSA for the Isle of Wight region in August 2014 was 1.86%, based on 1,502 claimants and population aged 16-64 of 80,700 (Apr 2013-Mar 2014 figure).\n",
" \n",
"\n",
"The percentage rate of persons claiming JSA for the South East region in August 2014 was 1.35%, based on 73,563 claimants and population aged 16-64 of 5,445,000 (Apr 2013-Mar 2014 figure).\n",
" "
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"The percentage rate of persons claiming JSA for the United Kingdom region in August 2014 was 2.39%, based on 961,149 claimants and population aged 16-64 of 40,298,700 (Apr 2013-Mar 2014 figure).\n",
" "
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
}
],
"prompt_number": 456
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How abut the percentage rate comparison?\n",
"\n",
"Note the rounding has an effect - to nearest, or round down?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"localCode=iwCode\n",
"regionCode=seCode\n",
"\n",
"\n",
"jsaLocal=getLatestJSA(localcode)\n",
"jsaRegion=getLatestJSA(regionCode)\n",
"\n",
"jsaLocal_rate=JSA_rate(localCode)\n",
"jsaRegion_rate=JSA_rate(regionCode)\n",
"jsaUK_rate=JSA_rate(ukCode)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 489
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import decimal\n",
"\n",
"'''\n",
"ROUND_CEILING (towards Infinity),\n",
"ROUND_DOWN (towards zero),\n",
"ROUND_FLOOR (towards -Infinity),\n",
"ROUND_HALF_DOWN (to nearest with ties going towards zero),\n",
"ROUND_HALF_EVEN (to nearest with ties going to nearest even integer),\n",
"ROUND_HALF_UP (to nearest with ties going away from zero), or\n",
"ROUND_UP (away from zero).\n",
"ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)\n",
"'''\n",
"\n",
"def pc(amount,rounding=''):\n",
" if rounding=='down': rounding=decimal.ROUND_DOWN\n",
" elif rounding=='up': rounding=decimal.ROUND_UP\n",
" else: rounding=decimal.ROUND_HALF_UP\n",
"\n",
" ramount=float(decimal.Decimal(100 * amount).quantize(decimal.Decimal('.1'), rounding=rounding))\n",
" return '{0:.1f}%'.format(ramount)\n",
"\n",
"def otwMoreLess(now,then):\n",
" delta=now-then\n",
" if delta>0:\n",
" txt=random.choice(['more'])\n",
" elif delta<0:\n",
" txt=random.choice(['less'])\n",
" return txt\n",
"\n",
"def otwPCmoreLess(this,that):\n",
" delta=this-that\n",
" return '{delta} {diff}'.format(delta=pc(abs(delta)),diff=otwMoreLess(this,that))\n",
"\n",
"otw3='''\n",
"That means {localrate} of the resident {localarea} population {poptype} are {claim} \\\n",
"\u2013 {regiondiff} than the rest of the {region} ({regionrate}), \\\n",
"and {ukdiff} than the whole of the UK ({ukrate}).\n",
"'''.format(localrate=pc(jsaLocal_rate),\n",
" localarea=jsaLocal['GEOGRAPHY_NAME'].iloc[0],\n",
" poptype=decase(get16_64Population(localcode)['CELL_NAME'].iloc[0].split('(')[1].split(' -')[0]),\n",
" claim=decase(jsaLocal['MEASURES_NAME'].iloc[0]),\n",
" regiondiff=otwPCmoreLess(jsaLocal_rate,jsaRegion_rate),\n",
" region=jsaRegion['GEOGRAPHY_NAME'].iloc[0],\n",
" regionrate=pc(JSA_rate(regionCode)),\n",
" ukdiff=otwPCmoreLess(jsaLocal_rate,jsaUK_rate),\n",
" ukrate=pc(jsaUK_rate))\n",
"\n",
"print(otw3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"That means 1.9% of the resident Isle of Wight population aged 16-64 are persons claiming JSA \u2013 0.5% more than the rest of the South East (1.4%), and 0.5% less than the whole of the UK (2.4%).\n",
"\n"
]
}
],
"prompt_number": 493
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"JSA_rate(seCode)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 395,
"text": [
"0.013510192837465565"
]
}
],
"prompt_number": 395
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"JSA_rate(ukCode)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 396,
"text": [
"0.023850620491479874"
]
}
],
"prompt_number": 396
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#.....doodles and fragments..."
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 300
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#Geographies codelist\n",
"#http://www.nomisweb.co.uk/api/v01/dataset/NM_1_1/geography/2092957697.def.htm\n",
"#http://www.nomisweb.co.uk/api/v01/dataset/NM_1_1/geography/2092957697TYPE480.def.htm\n",
"'''\n",
"CL_1_1_GEOGRAPHY\n",
"value\tDescription\n",
"2013265921\tNorth East\n",
"2013265922\tNorth West\n",
"2013265923\tYorkshire and The Humber\n",
"2013265924\tEast Midlands\n",
"2013265925\tWest Midlands\n",
"2013265926\tEast\n",
"2013265927\tLondon\n",
"2013265928\tSouth East\n",
"2013265929\tSouth West\n",
"2013265930\tWales\n",
"2013265931\tScotland\n",
"2013265932\tNorthern Ireland\n",
"'''"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 300
}
],
"metadata": {}
}
]
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment