Skip to content

Instantly share code, notes, and snippets.

@timcowlishaw
Last active January 4, 2019 12:35
Show Gist options
  • Save timcowlishaw/e6bd3c98626540bf32707f29e18c940d to your computer and use it in GitHub Desktop.
Save timcowlishaw/e6bd3c98626540bf32707f29e18c940d to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 'Fat Cat Friday' at the BBC"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Today, Friday the 4th of Jan, is when the average UK executive has *already earned* the average worker's UK salary for the year. I'm curious how the BBC compares to this, and thankfully the data is publicly available!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's start by setting up our workspace and importing a few things we'll need:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import scipy as sp\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"import seaborn as sns\n",
"%matplotlib inline\n",
"matplotlib.rcParams[\"figure.figsize\"] = (16, 12)\n",
"sns.set()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"import bs4\n",
"from urllib.parse import urljoin\n",
"import re"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We need to scrape the individual executive salaries from the BBC's management biographies page. We'll do this by looking at the biographies index pagae and follow all links to pages underneath that in the URL structure:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"base_url = \"http://www.bbc.co.uk/corporate2/insidethebbc/managementstructure/biographies/\""
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"index_soup = bs4.BeautifulSoup(requests.get(base_url).text)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [],
"source": [
"soups = {}\n",
"names = {}\n",
"for a in index_soup.find_all('a'):\n",
" if a[\"href\"].find(\"managementstructure/biographies/\")>=0:\n",
" href = a[\"href\"].strip()\n",
" url_key = re.match(\".*biographies/(.*)\", href)[1] \n",
" names[url_key] = a.text\n",
" soups[url_key] = bs4.BeautifulSoup(requests.get(base_url + url_key).text)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we've got a collection of each management biography page, let's try and parse out the remuneration details with some deft regex work. Different types of exec have the salaries reported differently (for example the chairman and the non-exec directors), so there's a few different cases to deal with here:"
]
},
{
"cell_type": "code",
"execution_count": 139,
"metadata": {},
"outputs": [],
"source": [
"salaries = {}\n",
"total_remunerations = {}\n",
"non_exec_fees = {}\n",
"chairman_fees = {}\n",
"total_fees = {}\n",
"no_salary = []\n",
"no_total_remuneration = []\n",
"no_non_exec_fees = []\n",
"no_chairman_fees = []\n",
"no_total_fees = []\n",
"for key in soups:\n",
" salary_match = re.search(\"(Salary|Total salary): (.*)\", soups[key].text)\n",
" if salary_match is not None:\n",
" salaries[key] = int(re.sub(\"[^\\\\d]\", \"\", salary_match[2]))\n",
" else:\n",
" no_salary.append(key)\n",
" total_match = re.search(\"Total remuneration:\\s(.*)\", soups[key].text)\n",
" if total_match is not None:\n",
" total_remunerations[key] = int(re.sub(\"[^\\\\d]\", \"\", total_match[1]))\n",
" else:\n",
" no_total_remuneration.append(key)\n",
" non_exec_match = re.search(\"Non-executive directors receive a base fee of (.*) per annum.\", soups[key].text)\n",
" if non_exec_match is not None:\n",
" non_exec_fees[key] = int(re.sub(\"[^\\\\d]\", \"\", non_exec_match[1]))\n",
" else:\n",
" no_non_exec_fees.append(key)\n",
" chairman_match = re.search(\"The Chairman receives fees of (.*) per annum.\", soups[key].text)\n",
" if chairman_match is not None:\n",
" chairman_fees[key] = int(re.sub(\"[^\\\\d]\", \"\", chairman_match[1]))\n",
" else:\n",
" no_chairman_fees.append(key)\n",
" total_match = re.search(\"Total fees paid each year: (.*) (per annum.|p.a.)\", soups[key].text)\n",
" if total_match is not None:\n",
" total_fees[key] = int(re.sub(\"[^\\\\d]\", \"\", total_match[1]))\n",
" else:\n",
" no_total_fees.append(key)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As a sanity check, let's make sure we've gathered some remuneration data for everyone on the index page:"
]
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {},
"outputs": [],
"source": [
"for key in names:\n",
" if key in no_salary and key in no_total_remuneration and key in no_non_exec_fees and key in no_chairman_fees and key in no_total_fees:\n",
" print(key)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Good! Now let's put all that data together into a pandas dataframe so we can start doing some MATHS with it:"
]
},
{
"cell_type": "code",
"execution_count": 209,
"metadata": {},
"outputs": [],
"source": [
"from collections import defaultdict\n",
"all_data = defaultdict(dict)\n",
"for key in names:\n",
" all_data[key][\"url\"] = base_url + key\n",
" all_data[key][\"name\"] = names.get(key)\n",
" all_data[key][\"salary\"] = salaries.get(key)\n",
" all_data[key][\"total_remuneration\"] = total_remunerations.get(key)\n",
" all_data[key][\"non_exec_fees\"] = non_exec_fees.get(key)\n",
" all_data[key][\"chairman_fees\"] = chairman_fees.get(key)\n",
" all_data[key][\"total_fees\"] = total_fees.get(key)"
]
},
{
"cell_type": "code",
"execution_count": 210,
"metadata": {},
"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>url</th>\n",
" <th>name</th>\n",
" <th>salary</th>\n",
" <th>total_remuneration</th>\n",
" <th>non_exec_fees</th>\n",
" <th>chairman_fees</th>\n",
" <th>total_fees</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>allen_gavin.html</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Gavin Allen</td>\n",
" <td>160000.0</td>\n",
" <td>160000.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>allen_shane.html</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Shane Allen</td>\n",
" <td>208000.0</td>\n",
" <td>208000.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>almond_philip</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Philip Almond</td>\n",
" <td>211000.0</td>\n",
" <td>211000.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>angus_jamie</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Jamie Angus</td>\n",
" <td>195000.0</td>\n",
" <td>195000.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>aslett_wendy</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Wendy Aslett</td>\n",
" <td>160000.0</td>\n",
" <td>160000.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" url \\\n",
"allen_gavin.html http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"allen_shane.html http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"almond_philip http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"angus_jamie http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"aslett_wendy http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"\n",
" name salary total_remuneration non_exec_fees \\\n",
"allen_gavin.html Gavin Allen 160000.0 160000.0 NaN \n",
"allen_shane.html Shane Allen 208000.0 208000.0 NaN \n",
"almond_philip Philip Almond 211000.0 211000.0 NaN \n",
"angus_jamie Jamie Angus 195000.0 195000.0 NaN \n",
"aslett_wendy Wendy Aslett 160000.0 160000.0 NaN \n",
"\n",
" chairman_fees total_fees \n",
"allen_gavin.html NaN NaN \n",
"allen_shane.html NaN NaN \n",
"almond_philip NaN NaN \n",
"angus_jamie NaN NaN \n",
"aslett_wendy NaN NaN "
]
},
"execution_count": 210,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = pd.DataFrame.from_dict(all_data, orient='index')\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We need to do some work to calculate the *real* total remuneration per person. Those with a salary *always* have 'total remuneration' declared, but non-execs have neither, although they all have 'total fees' declared, except the chairman, who's salary is reported differently. Therefore if we sum the total remuneration, total fees, and chairman fees column, we get the grand total, as each person has one-and-only-one of each of these forms of remuneration (and each of these includes the other figures such as non exec fees and salary):"
]
},
{
"cell_type": "code",
"execution_count": 152,
"metadata": {},
"outputs": [],
"source": [
"data = data.fillna(0)\n",
"data[\"grand_total\"] = data[\"total_remuneration\"] + data[\"total_fees\"] + data[\"chairman_fees\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can see who the fattest cats are, and who are the comparatively mangy mogs:"
]
},
{
"cell_type": "code",
"execution_count": 201,
"metadata": {},
"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>url</th>\n",
" <th>name</th>\n",
" <th>salary</th>\n",
" <th>total_remuneration</th>\n",
" <th>non_exec_fees</th>\n",
" <th>chairman_fees</th>\n",
" <th>total_fees</th>\n",
" <th>grand_total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>tony_hall</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Tony Hall</td>\n",
" <td>450000.0</td>\n",
" <td>450000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>450000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>bulford_anne/</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Anne Bulford</td>\n",
" <td>435000.0</td>\n",
" <td>435000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>435000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>moore_charlotte_h/</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Charlotte Moore</td>\n",
" <td>370000.0</td>\n",
" <td>370000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>370000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>bright_kerris/</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Kerris Bright</td>\n",
" <td>360000.0</td>\n",
" <td>360000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>360000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>unsworth_francesca</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Francesca Unsworth</td>\n",
" <td>340000.0</td>\n",
" <td>340000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>340000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>isherwood_glyn</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Glyn Isherwood</td>\n",
" <td>325000.0</td>\n",
" <td>325000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>325000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>macquarrie_ken</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Ken MacQuarrie</td>\n",
" <td>325000.0</td>\n",
" <td>325000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>325000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>samra_bal</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Bal Samra</td>\n",
" <td>316000.0</td>\n",
" <td>323800.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>323800.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>purnell_james</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>James Purnell</td>\n",
" <td>315000.0</td>\n",
" <td>315000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>315000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>hughesdaeth_valerie</th>\n",
" <td>http://www.bbc.co.uk/corporate2/insidethebbc/m...</td>\n",
" <td>Valerie Hughes-D'Aeth</td>\n",
" <td>310000.0</td>\n",
" <td>310000.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>310000.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" url \\\n",
"tony_hall http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"bulford_anne/ http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"moore_charlotte_h/ http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"bright_kerris/ http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"unsworth_francesca http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"isherwood_glyn http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"macquarrie_ken http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"samra_bal http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"purnell_james http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"hughesdaeth_valerie http://www.bbc.co.uk/corporate2/insidethebbc/m... \n",
"\n",
" name salary total_remuneration \\\n",
"tony_hall Tony Hall 450000.0 450000.0 \n",
"bulford_anne/ Anne Bulford 435000.0 435000.0 \n",
"moore_charlotte_h/ Charlotte Moore 370000.0 370000.0 \n",
"bright_kerris/ Kerris Bright 360000.0 360000.0 \n",
"unsworth_francesca Francesca Unsworth 340000.0 340000.0 \n",
"isherwood_glyn Glyn Isherwood 325000.0 325000.0 \n",
"macquarrie_ken Ken MacQuarrie 325000.0 325000.0 \n",
"samra_bal Bal Samra 316000.0 323800.0 \n",
"purnell_james James Purnell 315000.0 315000.0 \n",
"hughesdaeth_valerie Valerie Hughes-D'Aeth 310000.0 310000.0 \n",
"\n",
" non_exec_fees chairman_fees total_fees grand_total \n",
"tony_hall 0.0 0.0 0.0 450000.0 \n",
"bulford_anne/ 0.0 0.0 0.0 435000.0 \n",
"moore_charlotte_h/ 0.0 0.0 0.0 370000.0 \n",
"bright_kerris/ 0.0 0.0 0.0 360000.0 \n",
"unsworth_francesca 0.0 0.0 0.0 340000.0 \n",
"isherwood_glyn 0.0 0.0 0.0 325000.0 \n",
"macquarrie_ken 0.0 0.0 0.0 325000.0 \n",
"samra_bal 0.0 0.0 0.0 323800.0 \n",
"purnell_james 0.0 0.0 0.0 315000.0 \n",
"hughesdaeth_valerie 0.0 0.0 0.0 310000.0 "
]
},
"execution_count": 201,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.sort_values(\"grand_total\", ascending=False).head(n=10)"
]
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"20562981.0"
]
},
"execution_count": 159,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[\"grand_total\"].sum()"
]
},
{
"cell_type": "code",
"execution_count": 160,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"186936.19090909092"
]
},
"execution_count": 160,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[\"grand_total\"].mean()"
]
},
{
"cell_type": "code",
"execution_count": 161,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"175900.0"
]
},
"execution_count": 161,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[\"grand_total\"].median()"
]
},
{
"cell_type": "code",
"execution_count": 163,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"175900.0"
]
},
"execution_count": 163,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[\"total_remuneration\"].median()"
]
},
{
"cell_type": "code",
"execution_count": 164,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11c9a54e0>"
]
},
"execution_count": 164,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"data.boxplot()"
]
},
{
"cell_type": "code",
"execution_count": 166,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(110, 8)"
]
},
"execution_count": 166,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To work out when Fat Cat day is, we also need to get the average salary across the BBC in total. We can get this from last year's annual report:"
]
},
{
"cell_type": "code",
"execution_count": 167,
"metadata": {},
"outputs": [],
"source": [
"total_wage_bill = 1_053_200_000\n",
"total_employees = 21_583\n",
"#both via http://downloads.bbc.co.uk/aboutthebbc/insidethebbc/reports/pdf/bbc_annualreport_201718.pdf"
]
},
{
"cell_type": "code",
"execution_count": 168,
"metadata": {},
"outputs": [],
"source": [
"average_wage = total_wage_bill / float(total_employees)"
]
},
{
"cell_type": "code",
"execution_count": 169,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"48797.66482880044"
]
},
"execution_count": 169,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"average_wage"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We also don't want to double-count our execs, so lets work out the corporation average with them excluded:"
]
},
{
"cell_type": "code",
"execution_count": 170,
"metadata": {},
"outputs": [],
"source": [
"non_reportable_wage_bill = total_wage_bill - data[\"salary\"].sum()\n",
"non_reportable_employees = total_employees - data[data.salary > 0].shape[0]"
]
},
{
"cell_type": "code",
"execution_count": 184,
"metadata": {},
"outputs": [],
"source": [
"average_non_reportable_wage = non_reportable_wage_bill / float(non_reportable_employees)"
]
},
{
"cell_type": "code",
"execution_count": 185,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"48096.11390931943"
]
},
"execution_count": 185,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"average_non_reportable_wage"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That's actually well above the national average, so we can feel pretty proud of ourselves there (and especially of our wonderful trade unions, Unite, the NUJ and BECTU) - although it'd be interesting to get figures for outsourced and freelance staff too, and to see how this breaks down by band. \n",
"\n",
"Now, we can work out when we'll be celebrating Fat Cat Day! We're going to limit this to execs only (so excluding non-exec directors and the chairman), and we'll base it only on salary, since we don't have expenses and benefits info for BBC staff in general. First up, what's the average exec salary at the beeb?"
]
},
{
"cell_type": "code",
"execution_count": 186,
"metadata": {},
"outputs": [],
"source": [
"average_reportable_wage = data[\"salary\"].mean()"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"181811.64545454545"
]
},
"execution_count": 187,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"average_reportable_wage"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Crikey! next we need to work out what that is per day. There were 252 working days last year (excluding corporation day):"
]
},
{
"cell_type": "code",
"execution_count": 212,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"721.4747835497835"
]
},
"execution_count": 212,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"average_reportable_daily_wage = average_reportable_wage / 252.0 #working days of the year plus corporation day per http://www.work-day.co.uk/workingdays_holidays_2018.htm#\n",
"average_reportable_daily_wage"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With these two figures, we now simply divide the average non-exec yearly wage by the average exec *daily* wage, in order to get the number of days it takes for the average exec to earn what the average worker earns in a year:"
]
},
{
"cell_type": "code",
"execution_count": 213,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"67"
]
},
"execution_count": 213,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import math\n",
"days = math.ceil(average_non_reportable_wage / average_reportable_daily_wage)\n",
"days"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And from that, we just calculate the offset from January the first, to get the date of our very own 'Fat Cat Day':"
]
},
{
"cell_type": "code",
"execution_count": 214,
"metadata": {},
"outputs": [],
"source": [
"from datetime import date, timedelta"
]
},
{
"cell_type": "code",
"execution_count": 215,
"metadata": {},
"outputs": [],
"source": [
"start_of_year = date(year=2019, month=1, day=1)"
]
},
{
"cell_type": "code",
"execution_count": 216,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.date(2019, 3, 9)"
]
},
"execution_count": 216,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fat_cat_day = start_of_year + timedelta(days=days)\n",
"fat_cat_day"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... and there you have it. By **March the 9th**, on average, members of our exec team will have made what our average staff member takes a year to earn, but they've shown admirable restraint compared to their counterparts in the private sector - waiting a whole extra two months!"
]
},
{
"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.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment