{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# LFC Data Analysis: The Elite Strikers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "See Terry's blog [LFC: The Elite Strikers](http://terrydolan.blogspot.co.uk/2015/07/lfc-the-elite-strikers.html) for a discussion of of the data analysis." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook analyses Liverpool FC's elite strikers data from 1962-1963 to 2014-2015. An elite striker is defined as a player who scored 20 or more league goals in a season. I've started the analysis at 1962 as this was when Bill Shankly returned Liverpool to the top flight of English football. The analysis uses [IPython Notebook](http://ipython.org/notebook.html), [python](https://www.python.org/), [pandas](http://pandas.pydata.org/) and [matplotlib](http://matplotlib.org/) to explore the data. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Notebook Change Log" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%html\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Date | Change Description |\n", "| :------------ | :----------------- |\n", "| 23rd July 2015 | Initial baseline |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set-up" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import the modules needed for the analysis." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import sys\n", "import collections\n", "from datetime import datetime\n", "from __future__ import division\n", "\n", "# enable inline plotting\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Print version numbers." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "python version: 2.7.8 |Anaconda 2.3.0 (64-bit)| (default, Jul 2 2014, 15:12:11) [MSC v.1500 64 bit (AMD64)]\n", "pandas version: 0.16.2\n", "matplotlib version: 1.4.3\n", "numpy version: 1.9.2\n" ] } ], "source": [ "print 'python version: {}'.format(sys.version)\n", "print 'pandas version: {}'.format(pd.__version__)\n", "print 'matplotlib version: {}'.format(mpl.__version__)\n", "print 'numpy version: {}'.format(np.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load the LFC data into a dataframes and munge" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "#### Create dataframe of scorers in top level seasons" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(1398, 3)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LFC_SCORERS_CSV_FILE = 'data\\lfc_scorers_1892-1893_2014-2015.csv'\n", "dflfc_scorers = pd.read_csv(LFC_SCORERS_CSV_FILE)\n", "\n", "# sort by season, then league goals\n", "dflfc_scorers = dflfc_scorers.sort(['season', 'league'], ascending=([False, False]))\n", "dflfc_scorers.shape" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleague
13822014-2015Steven Gerrard9
13832014-2015Raheem Sterling7
13852014-2015Jordan Henderson6
13842014-2015Philippe Coutinho5
13862014-2015Adam Lallana5
\n", "
" ], "text/plain": [ " season player league\n", "1382 2014-2015 Steven Gerrard 9\n", "1383 2014-2015 Raheem Sterling 7\n", "1385 2014-2015 Jordan Henderson 6\n", "1384 2014-2015 Philippe Coutinho 5\n", "1386 2014-2015 Adam Lallana 5" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_scorers.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleague
51892-1893Jonathan Cameron4
61892-1893Jim McBride4
71892-1893Hugh McQueen3
91892-1893Joe McQue2
81892-1893Own goals1
\n", "
" ], "text/plain": [ " season player league\n", "5 1892-1893 Jonathan Cameron 4\n", "6 1892-1893 Jim McBride 4\n", "7 1892-1893 Hugh McQueen 3\n", "9 1892-1893 Joe McQue 2\n", "8 1892-1893 Own goals 1" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_scorers.tail()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleague
13882014-2015Own goals4
13742013-2014Own goals5
13562012-2013Own goals4
13432011-2012Own goals5
13342010-2011Own goals1
\n", "
" ], "text/plain": [ " season player league\n", "1388 2014-2015 Own goals 4\n", "1374 2013-2014 Own goals 5\n", "1356 2012-2013 Own goals 4\n", "1343 2011-2012 Own goals 5\n", "1334 2010-2011 Own goals 1" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# note that scorers includes own goals\n", "dflfc_scorers[dflfc_scorers.player == 'Own goals'].head()" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "Filter out seasons that LFC weren't in top level" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(1250, 3)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# note: war years already excluded\n", "LANCS_YRS = ['1892-1893']\n", "SECOND_DIV_YRS = ['1893-1894', '1895-1896', '1904-1905', '1961-1962', \n", " '1954-1955', '1955-1956', '1956-1957', '1957-1958', \n", " '1958-1959', '1959-1960', '1960-1961']\n", "\n", "NOT_TOP_LEVEL_YRS = LANCS_YRS + SECOND_DIV_YRS\n", "dflfc_scorers_tl = dflfc_scorers[~dflfc_scorers.season.isin(NOT_TOP_LEVEL_YRS)].copy()\n", "dflfc_scorers_tl.shape" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "num seasons is 100\n" ] } ], "source": [ "## check number of seasons aligns with http://www.lfchistory.net/Stats/LeagueOverall.aspx\n", "## expect 100 total\n", "print 'num seasons is {}'.format(len(dflfc_scorers_tl.season.unique()))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
league
season
2013-2014101
\n", "
" ], "text/plain": [ " league\n", "season \n", "2013-2014 101" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show most league goals in a season in top level\n", "# cross-check with http://en.wikipedia.org/wiki/List_of_Liverpool_F.C._records_and_statistics#Goalscorers\n", "# expect 101 in 2013-14\n", "dflfc_scorers_tl[['season', 'league']].groupby(['season']).sum().sort('league', ascending=False).head(1)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(1181, 3)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# remove OG\n", "dflfc_scorers_tl = dflfc_scorers_tl[dflfc_scorers_tl.player != 'Own goals']\n", "dflfc_scorers_tl.shape" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleague
13692013-2014Luis Suarez31
13702013-2014Daniel Sturridge21
13712013-2014Steven Gerrard13
13722013-2014Raheem Sterling9
13732013-2014Martin Skrtel7
13752013-2014Philippe Coutinho5
13762013-2014Jordan Henderson4
13782013-2014Daniel Agger2
13772013-2014Victor Moses1
13792013-2014Joe Allen1
\n", "
" ], "text/plain": [ " season player league\n", "1369 2013-2014 Luis Suarez 31\n", "1370 2013-2014 Daniel Sturridge 21\n", "1371 2013-2014 Steven Gerrard 13\n", "1372 2013-2014 Raheem Sterling 9\n", "1373 2013-2014 Martin Skrtel 7\n", "1375 2013-2014 Philippe Coutinho 5\n", "1376 2013-2014 Jordan Henderson 4\n", "1378 2013-2014 Daniel Agger 2\n", "1377 2013-2014 Victor Moses 1\n", "1379 2013-2014 Joe Allen 1" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check 2013-14\n", "dflfc_scorers_tl[dflfc_scorers_tl.season == '2013-2014'].head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Create dataframe of squads giving age of each player" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2902, 3)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LFC_SQUADS_CSV_FILE = 'data/lfc_squads_1892-1893_2014-2015.csv'\n", "dflfc_squads = pd.read_csv(LFC_SQUADS_CSV_FILE)\n", "dflfc_squads.shape" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerposition
01892-1893Sydney RossGoalkeeper
11892-1893Billy McOwenGoalkeeper
21892-1893Jim McBrideDefender
31892-1893John McCartneyDefender
41892-1893Andrew HannahDefender
\n", "
" ], "text/plain": [ " season player position\n", "0 1892-1893 Sydney Ross Goalkeeper\n", "1 1892-1893 Billy McOwen Goalkeeper\n", "2 1892-1893 Jim McBride Defender\n", "3 1892-1893 John McCartney Defender\n", "4 1892-1893 Andrew Hannah Defender" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_squads.head()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerposition
28972014-2015Kristoffer PetersonStriker
28982014-2015SusoStriker
28992014-2015Mario BalotelliStriker
29002014-2015Fabio BoriniStriker
29012014-2015Jerome SinclairStriker
\n", "
" ], "text/plain": [ " season player position\n", "2897 2014-2015 Kristoffer Peterson Striker\n", "2898 2014-2015 Suso Striker\n", "2899 2014-2015 Mario Balotelli Striker\n", "2900 2014-2015 Fabio Borini Striker\n", "2901 2014-2015 Jerome Sinclair Striker" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_squads.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Create dataframe of league tables" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(112, 18)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LFC_LEAGUE_CSV_FILE = 'data/lfc_league_1892-1893_2014-2015.csv'\n", "dflfc_league = pd.read_csv(LFC_LEAGUE_CSV_FILE)\n", "dflfc_league.shape" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SeasonLeaguePosPLDHWHDHLHFHAAWADALAFAAPTSGFGAGD
01893-18942nd Division1281400466860311250771859
11894-18951st Division1530645382814101342225170-19
21895-18962nd Division130141065118164121461063274
31896-18971st Division530762251053721283346388
41897-18981st Division930744271642921292848453
\n", "
" ], "text/plain": [ " Season League Pos PLD HW HD HL HF HA AW AD AL AF AA \\\n", "0 1893-1894 2nd Division 1 28 14 0 0 46 6 8 6 0 31 12 \n", "1 1894-1895 1st Division 15 30 6 4 5 38 28 1 4 10 13 42 \n", "2 1895-1896 2nd Division 1 30 14 1 0 65 11 8 1 6 41 21 \n", "3 1896-1897 1st Division 5 30 7 6 2 25 10 5 3 7 21 28 \n", "4 1897-1898 1st Division 9 30 7 4 4 27 16 4 2 9 21 29 \n", "\n", " PTS GF GA GD \n", "0 50 77 18 59 \n", "1 22 51 70 -19 \n", "2 46 106 32 74 \n", "3 33 46 38 8 \n", "4 28 48 45 3 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_league.head()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SeasonLeaguePosPLDHWHDHLHFHAAWADALAFAAPTSGFGAGD
1072010-2011Premier League638124337145311223058594415
1082011-2012Premier League8386942416811023245247407
1092012-2013Premier League7389643316775382761714328
1102013-2014Premier League2381612531810544832841015051
1112014-2015Premier League6381054302083822286252484
\n", "
" ], "text/plain": [ " Season League Pos PLD HW HD HL HF HA AW AD AL AF \\\n", "107 2010-2011 Premier League 6 38 12 4 3 37 14 5 3 11 22 \n", "108 2011-2012 Premier League 8 38 6 9 4 24 16 8 1 10 23 \n", "109 2012-2013 Premier League 7 38 9 6 4 33 16 7 7 5 38 \n", "110 2013-2014 Premier League 2 38 16 1 2 53 18 10 5 4 48 \n", "111 2014-2015 Premier League 6 38 10 5 4 30 20 8 3 8 22 \n", "\n", " AA PTS GF GA GD \n", "107 30 58 59 44 15 \n", "108 24 52 47 40 7 \n", "109 27 61 71 43 28 \n", "110 32 84 101 50 51 \n", "111 28 62 52 48 4 " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_league.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Create merged dataframe, combining scorers with position" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(1181, 4)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_scorers_tl_pos = pd.DataFrame.merge(dflfc_scorers_tl, dflfc_squads)\n", "dflfc_scorers_tl_pos.shape" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleagueposition
02014-2015Steven Gerrard9Midfielder
12014-2015Raheem Sterling7Midfielder
22014-2015Jordan Henderson6Midfielder
32014-2015Philippe Coutinho5Midfielder
42014-2015Adam Lallana5Midfielder
\n", "
" ], "text/plain": [ " season player league position\n", "0 2014-2015 Steven Gerrard 9 Midfielder\n", "1 2014-2015 Raheem Sterling 7 Midfielder\n", "2 2014-2015 Jordan Henderson 6 Midfielder\n", "3 2014-2015 Philippe Coutinho 5 Midfielder\n", "4 2014-2015 Adam Lallana 5 Midfielder" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_scorers_tl_pos.head()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleagueposition
11761894-1895Frank Becton4Striker
11771894-1895Neil Kerr3Midfielder
11781894-1895Hugh McQueen2Midfielder
11791894-1895Joe McQue1Defender
11801894-1895Patrick Gordon1Midfielder
\n", "
" ], "text/plain": [ " season player league position\n", "1176 1894-1895 Frank Becton 4 Striker\n", "1177 1894-1895 Neil Kerr 3 Midfielder\n", "1178 1894-1895 Hugh McQueen 2 Midfielder\n", "1179 1894-1895 Joe McQue 1 Defender\n", "1180 1894-1895 Patrick Gordon 1 Midfielder" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_scorers_tl_pos.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Create dataframe of players giving birthdate of each player" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(748, 3)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LFC_PLAYERS_CSV_FILE = 'data\\lfc_players_july2015_upd.csv' \n", "dflfc_players = pd.read_csv(LFC_PLAYERS_CSV_FILE, parse_dates=['birthdate'])\n", "dflfc_players.shape" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
playerbirthdatecountry
0Gary Ablett1965-11-19England
1Alan A'Court1934-09-30England
2Charlie Adam1985-12-10Scotland
3Daniel Agger1984-12-12Denmark
4Andrew Aitken1909-08-25England
\n", "
" ], "text/plain": [ " player birthdate country\n", "0 Gary Ablett 1965-11-19 England\n", "1 Alan A'Court 1934-09-30 England\n", "2 Charlie Adam 1985-12-10 Scotland\n", "3 Daniel Agger 1984-12-12 Denmark\n", "4 Andrew Aitken 1909-08-25 England" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_players.head()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
playerbirthdatecountry
743Ron Yeats1937-11-15Scotland
744Samed Yesil1994-05-25Germany
745Tommy Younger1930-04-10Scotland
746Bolo Zenden1976-08-15Netherlands
747Christian Ziege1972-02-01Germany
\n", "
" ], "text/plain": [ " player birthdate country\n", "743 Ron Yeats 1937-11-15 Scotland\n", "744 Samed Yesil 1994-05-25 Germany\n", "745 Tommy Younger 1930-04-10 Scotland\n", "746 Bolo Zenden 1976-08-15 Netherlands\n", "747 Christian Ziege 1972-02-01 Germany" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_players.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Add players age to the dataframe" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def age_at_season(row):\n", " \"\"\"Return player's age at mid-point of season, assumed to be 1st Jan.\n", " \n", " row.player -> player's name\n", " row.season -> season\n", " \n", " uses dflfc_players to look-up birthdate, keyed on player\n", " - return average age if player is missing from dflfc_players\n", " \"\"\"\n", " \n", " AVERAGE_AGE = 26.5\n", " \n", " mid_point = '01 January {}'.format(row.season[-4:])\n", " try:\n", " dob = dflfc_players[dflfc_players.player == row.player].birthdate.values[0]\n", " except:\n", " # use average age if player's birthdate not available\n", " print 'error: age not found for player {} in season {}, using average age {}'.format(row.player, \n", " row.season, \n", " AVERAGE_AGE)\n", " return AVERAGE_AGE\n", " return round((pd.Timestamp(mid_point) - dob).days/365.0, 1)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "error: age not found for player William Walker in season 1897-1898, using average age 26.5\n" ] } ], "source": [ "# add age column\n", "dflfc_scorers_tl_pos['age'] = dflfc_scorers_tl_pos.apply(lambda row: age_at_season(row), axis=1)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dflfc_scorers_tl_pos_age = dflfc_scorers_tl_pos.copy()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleaguepositionage
02014-2015Steven Gerrard9Midfielder34.6
12014-2015Raheem Sterling7Midfielder20.1
22014-2015Jordan Henderson6Midfielder24.6
32014-2015Philippe Coutinho5Midfielder22.6
42014-2015Adam Lallana5Midfielder26.7
\n", "
" ], "text/plain": [ " season player league position age\n", "0 2014-2015 Steven Gerrard 9 Midfielder 34.6\n", "1 2014-2015 Raheem Sterling 7 Midfielder 20.1\n", "2 2014-2015 Jordan Henderson 6 Midfielder 24.6\n", "3 2014-2015 Philippe Coutinho 5 Midfielder 22.6\n", "4 2014-2015 Adam Lallana 5 Midfielder 26.7" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dflfc_scorers_tl_pos_age.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analyse the data\n", "\n", "Ask a question and find the answer." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "('1962-1963', '2014-2015', 53)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check number of seasons in top flight between 1960 and 2014 (expect 53)\n", "tf = dflfc_scorers_tl_pos_age[(dflfc_scorers_tl_pos_age.season.str[0:4] >= '1960') &\n", " (dflfc_scorers_tl_pos_age.season.str[0:4] <= '2014')].season.unique()\n", "tf[-1], tf[0], len(tf)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleaguepositionage
01983-1984Ian Rush32Striker22.2
11963-1964Roger Hunt31Striker25.5
22013-2014Luis Suarez31Striker27.0
31986-1987Ian Rush30Striker25.2
41965-1966Roger Hunt29Striker27.5
51995-1996Robbie Fowler28Striker20.7
61987-1988John Aldridge26Striker29.3
71994-1995Robbie Fowler25Striker19.7
81964-1965Roger Hunt25Striker26.5
91967-1968Roger Hunt25Striker29.5
102007-2008Fernando Torres24Striker23.8
111982-1983Ian Rush24Striker21.2
121962-1963Roger Hunt24Striker24.5
132012-2013Luis Suarez23Striker26.0
141985-1986Ian Rush22Striker24.2
151989-1990John Barnes22Striker26.2
162013-2014Daniel Sturridge21Striker24.4
171979-1980David Johnson21Striker28.2
181978-1979Kenny Dalglish21Striker27.8
191988-1989John Aldridge21Striker30.3
201963-1964Ian St John21Striker25.6
211977-1978Kenny Dalglish20Striker26.8
\n", "
" ], "text/plain": [ " season player league position age\n", "0 1983-1984 Ian Rush 32 Striker 22.2\n", "1 1963-1964 Roger Hunt 31 Striker 25.5\n", "2 2013-2014 Luis Suarez 31 Striker 27.0\n", "3 1986-1987 Ian Rush 30 Striker 25.2\n", "4 1965-1966 Roger Hunt 29 Striker 27.5\n", "5 1995-1996 Robbie Fowler 28 Striker 20.7\n", "6 1987-1988 John Aldridge 26 Striker 29.3\n", "7 1994-1995 Robbie Fowler 25 Striker 19.7\n", "8 1964-1965 Roger Hunt 25 Striker 26.5\n", "9 1967-1968 Roger Hunt 25 Striker 29.5\n", "10 2007-2008 Fernando Torres 24 Striker 23.8\n", "11 1982-1983 Ian Rush 24 Striker 21.2\n", "12 1962-1963 Roger Hunt 24 Striker 24.5\n", "13 2012-2013 Luis Suarez 23 Striker 26.0\n", "14 1985-1986 Ian Rush 22 Striker 24.2\n", "15 1989-1990 John Barnes 22 Striker 26.2\n", "16 2013-2014 Daniel Sturridge 21 Striker 24.4\n", "17 1979-1980 David Johnson 21 Striker 28.2\n", "18 1978-1979 Kenny Dalglish 21 Striker 27.8\n", "19 1988-1989 John Aldridge 21 Striker 30.3\n", "20 1963-1964 Ian St John 21 Striker 25.6\n", "21 1977-1978 Kenny Dalglish 20 Striker 26.8" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show modern scorers who scored >20, with age - aka elite strikers\n", "dflfc_elite = dflfc_scorers_tl_pos_age[(dflfc_scorers_tl_pos_age.season.str[0:4] >= '1962') & \n", " (dflfc_scorers_tl_pos_age.league >= 20)].sort('league', ascending=False)\n", "dflfc_elite.reset_index(drop=True, inplace=True)\n", "dflfc_elite" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleaguepositionage
1592002-2003Michael Owen19Striker23.1
1692001-2002Michael Owen19Striker22.1
6481962-1963Ian St John19Striker24.6
682009-2010Fernando Torres18Striker25.8
2101998-1999Michael Owen18Striker19.1
2221997-1998Michael Owen18Striker18.1
2331996-1997Robbie Fowler18Striker21.7
3201989-1990Ian Rush18Striker28.2
3761984-1985John Wark18Midfielder27.4
4011982-1983Kenny Dalglish18Midfielder31.9
\n", "
" ], "text/plain": [ " season player league position age\n", "159 2002-2003 Michael Owen 19 Striker 23.1\n", "169 2001-2002 Michael Owen 19 Striker 22.1\n", "648 1962-1963 Ian St John 19 Striker 24.6\n", "68 2009-2010 Fernando Torres 18 Striker 25.8\n", "210 1998-1999 Michael Owen 18 Striker 19.1\n", "222 1997-1998 Michael Owen 18 Striker 18.1\n", "233 1996-1997 Robbie Fowler 18 Striker 21.7\n", "320 1989-1990 Ian Rush 18 Striker 28.2\n", "376 1984-1985 John Wark 18 Midfielder 27.4\n", "401 1982-1983 Kenny Dalglish 18 Midfielder 31.9" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show near misses - modern scorers who scored >=18 and <=19, with age\n", "dflfc_scorers_tl_pos_age[(dflfc_scorers_tl_pos_age.season.str[0:4] >= '1962') & \n", " (dflfc_scorers_tl_pos_age.league >= 18) &\n", " (dflfc_scorers_tl_pos_age.league <= 19)].sort('league', ascending=False)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SeasonLeaguePosPLD
591962-19631st Division842
601963-19641st Division142
611964-19651st Division742
621965-19661st Division142
641967-19681st Division342
741977-19781st Division242
751978-19791st Division142
761979-19801st Division142
791982-19831st Division142
801983-19841st Division142
821985-19861st Division142
831986-19871st Division242
841987-19881st Division140
851988-19891st Division238
861989-19901st Division138
911994-1995Premier League442
921995-1996Premier League338
1042007-2008Premier League438
1092012-2013Premier League738
1102013-2014Premier League238
\n", "
" ], "text/plain": [ " Season League Pos PLD\n", "59 1962-1963 1st Division 8 42\n", "60 1963-1964 1st Division 1 42\n", "61 1964-1965 1st Division 7 42\n", "62 1965-1966 1st Division 1 42\n", "64 1967-1968 1st Division 3 42\n", "74 1977-1978 1st Division 2 42\n", "75 1978-1979 1st Division 1 42\n", "76 1979-1980 1st Division 1 42\n", "79 1982-1983 1st Division 1 42\n", "80 1983-1984 1st Division 1 42\n", "82 1985-1986 1st Division 1 42\n", "83 1986-1987 1st Division 2 42\n", "84 1987-1988 1st Division 1 40\n", "85 1988-1989 1st Division 2 38\n", "86 1989-1990 1st Division 1 38\n", "91 1994-1995 Premier League 4 42\n", "92 1995-1996 Premier League 3 38\n", "104 2007-2008 Premier League 4 38\n", "109 2012-2013 Premier League 7 38\n", "110 2013-2014 Premier League 2 38" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show number of games played in seasons when strikers scored >20\n", "dflfc_league[['Season', 'League', 'Pos', 'PLD']][dflfc_league.Season.isin(dflfc_elite.season)]" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Tot
Player
Roger Hunt134
Ian Rush108
Luis Suarez54
Robbie Fowler53
John Aldridge47
\n", "
" ], "text/plain": [ " Tot\n", "Player \n", "Roger Hunt 134\n", "Ian Rush 108\n", "Luis Suarez 54\n", "Robbie Fowler 53\n", "John Aldridge 47" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show strikers with total scored >20\n", "df_striker_tot = dflfc_elite[['player', 'league']].groupby('player').sum()\n", "df_striker_tot.rename(columns={'league': 'Tot'}, inplace=True)\n", "df_striker_tot.index.name = 'Player'\n", "df_striker_tot.sort('Tot', ascending=False).head()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "22" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show number of elite strikers who scored >20\n", "len(dflfc_elite)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "11\n", "['Ian Rush' 'Roger Hunt' 'Luis Suarez' 'Robbie Fowler' 'John Aldridge'\n", " 'Fernando Torres' 'John Barnes' 'Daniel Sturridge' 'David Johnson'\n", " 'Kenny Dalglish' 'Ian St John']\n" ] } ], "source": [ "# show number of unique strikers who scored >20\n", "top20_lu = dflfc_elite.sort('league', ascending=False).player.unique()\n", "print len(top20_lu)\n", "print top20_lu" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Daniel Sturridge: 2013-2014 (21)\n", "Roger Hunt: 1963-1964 (31), 1965-1966 (29), 1964-1965 (25), 1967-1968 (25), 1962-1963 (24)\n", "Fernando Torres: 2007-2008 (24)\n", "Luis Suarez: 2013-2014 (31), 2012-2013 (23)\n", "John Barnes: 1989-1990 (22)\n", "Ian Rush: 1983-1984 (32), 1986-1987 (30), 1982-1983 (24), 1985-1986 (22)\n", "David Johnson: 1979-1980 (21)\n", "Kenny Dalglish: 1978-1979 (21), 1977-1978 (20)\n", "Robbie Fowler: 1995-1996 (28), 1994-1995 (25)\n", "John Aldridge: 1987-1988 (26), 1988-1989 (21)\n", "Ian St John: 1963-1964 (21)\n" ] } ], "source": [ "# show number of unique scorers who scored >20 - pretty print\n", "player_d = collections.defaultdict(list)\n", "top20_l = dflfc_elite.sort('league', ascending=False).values\n", "for season, player, goals, position, age, in top20_l:\n", " # season, player, goals, age\n", " player_d[player].append('{} ({})'.format(season, goals))\n", "\n", "for k,v in player_d.iteritems():\n", " print '{}: {}'.format(k, ', '.join(v))" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Times 20+ AchievedSeasons in which player scored 20+ goals (with number of league goals scored)
Player
Roger Hunt51963-1964 (31), 1965-1966 (29), 1964-1965 (25), 1967-1968 (25), 1962-1963 (24)
Ian Rush41983-1984 (32), 1986-1987 (30), 1982-1983 (24), 1985-1986 (22)
Luis Suarez22013-2014 (31), 2012-2013 (23)
Robbie Fowler21995-1996 (28), 1994-1995 (25)
John Aldridge21987-1988 (26), 1988-1989 (21)
Kenny Dalglish21978-1979 (21), 1977-1978 (20)
Fernando Torres12007-2008 (24)
John Barnes11989-1990 (22)
Daniel Sturridge12013-2014 (21)
David Johnson11979-1980 (21)
Ian St John11963-1964 (21)
\n", "
" ], "text/plain": [ " Times 20+ Achieved \\\n", "Player \n", "Roger Hunt 5 \n", "Ian Rush 4 \n", "Luis Suarez 2 \n", "Robbie Fowler 2 \n", "John Aldridge 2 \n", "Kenny Dalglish 2 \n", "Fernando Torres 1 \n", "John Barnes 1 \n", "Daniel Sturridge 1 \n", "David Johnson 1 \n", "Ian St John 1 \n", "\n", " Seasons in which player scored 20+ goals (with number of league goals scored) \n", "Player \n", "Roger Hunt 1963-1964 (31), 1965-1966 (29), 1964-1965 (25), 1967-1968 (25), 1962-1963 (24) \n", "Ian Rush 1983-1984 (32), 1986-1987 (30), 1982-1983 (24), 1985-1986 (22) \n", "Luis Suarez 2013-2014 (31), 2012-2013 (23) \n", "Robbie Fowler 1995-1996 (28), 1994-1995 (25) \n", "John Aldridge 1987-1988 (26), 1988-1989 (21) \n", "Kenny Dalglish 1978-1979 (21), 1977-1978 (20) \n", "Fernando Torres 2007-2008 (24) \n", "John Barnes 1989-1990 (22) \n", "Daniel Sturridge 2013-2014 (21) \n", "David Johnson 1979-1980 (21) \n", "Ian St John 1963-1964 (21) " ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# construct table (dataframe) to summarise the data\n", "\n", "# col 0 of dataframe is the list of season (goals) converted to a comma separated string\n", "df = pd.DataFrame.from_dict({k: ', '.join(v) for k,v in player_d.iteritems()}, orient='index')\n", "\n", "# col 1 is number of times player has scored 20+ (derived from number of brackets)\n", "df[1] = df[0].apply(lambda x: x.count('('))\n", "\n", "# change column order and rename\n", "df = df[[1, 0]]\n", "df.rename(columns={1: 'Times 20+ Achieved', \n", " 0: 'Seasons in which player scored 20+ goals (with number of league goals scored)'}, inplace=True)\n", "df.index.name = 'Player'\n", "\n", "# add total (sum of goals in brackets)\n", "df = df.merge(df_striker_tot, left_index=True, right_index=True)\n", "\n", "# set pandas option that avoids the default curtailing of long rows with ...\n", "pd.set_option('display.max_colwidth', -1)\n", "\n", "# show dataframe sorted by number of times achieved\n", "df = df.sort(['Times 20+ Achieved', 'Tot'], ascending=(False, False))\n", "df[['Times 20+ Achieved', 'Seasons in which player scored 20+ goals (with number of league goals scored)']]" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleaguepositionage
71994-1995Robbie Fowler25Striker19.7
51995-1996Robbie Fowler28Striker20.7
111982-1983Ian Rush24Striker21.2
01983-1984Ian Rush32Striker22.2
102007-2008Fernando Torres24Striker23.8
\n", "
" ], "text/plain": [ " season player league position age\n", "7 1994-1995 Robbie Fowler 25 Striker 19.7\n", "5 1995-1996 Robbie Fowler 28 Striker 20.7\n", "11 1982-1983 Ian Rush 24 Striker 21.2\n", "0 1983-1984 Ian Rush 32 Striker 22.2\n", "10 2007-2008 Fernando Torres 24 Striker 23.8" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show youngest elite scorers who scored >20\n", "dflfc_elite.sort('league', ascending=False).sort('age').head(5)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleaguepositionage
2561994-1995Robbie Fowler25Striker19.7
2461995-1996Robbie Fowler28Striker20.7
4001982-1983Ian Rush24Striker21.2
3881983-1984Ian Rush32Striker22.2
9681914-1915Fred Pagnam24Striker23.3
\n", "
" ], "text/plain": [ " season player league position age\n", "256 1994-1995 Robbie Fowler 25 Striker 19.7\n", "246 1995-1996 Robbie Fowler 28 Striker 20.7\n", "400 1982-1983 Ian Rush 24 Striker 21.2\n", "388 1983-1984 Ian Rush 32 Striker 22.2\n", "968 1914-1915 Fred Pagnam 24 Striker 23.3" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check to see if anyone has matched Robbie's feat...\n", "# show youngest elite scorers who scored >20 for ALL seasons\n", "dflfc_scorers_tl_pos_age[(dflfc_scorers_tl_pos_age.league >= 20)].sort('league', ascending=False).sort('age').head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No, only God has done that!" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleaguepositionage
181978-1979Kenny Dalglish21Striker27.8
171979-1980David Johnson21Striker28.2
61987-1988John Aldridge26Striker29.3
91967-1968Roger Hunt25Striker29.5
191988-1989John Aldridge21Striker30.3
\n", "
" ], "text/plain": [ " season player league position age\n", "18 1978-1979 Kenny Dalglish 21 Striker 27.8\n", "17 1979-1980 David Johnson 21 Striker 28.2\n", "6 1987-1988 John Aldridge 26 Striker 29.3\n", "9 1967-1968 Roger Hunt 25 Striker 29.5\n", "19 1988-1989 John Aldridge 21 Striker 30.3" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show oldest elite scorers who scored >20\n", "dflfc_elite.sort('league', ascending=False).sort('age').tail(5)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Roger Hunt 5\n", "Ian Rush 4\n", "John Aldridge 2\n", "Robbie Fowler 2\n", "Luis Suarez 2\n", "Kenny Dalglish 2\n", "Ian St John 1\n", "Fernando Torres 1\n", "Daniel Sturridge 1\n", "David Johnson 1\n", "John Barnes 1\n", "dtype: int64" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show most appearances of elite strikers who scored >20\n", "dflfc_elite.sort('league', ascending=False).player.value_counts()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "league 24.818182\n", "age 25.550000\n", "dtype: float64" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show average (mean) age of elite strikers who scored >20\n", "dflfc_elite.sort('league', ascending=False).mean()" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "league 24.0\n", "age 25.8\n", "dtype: float64" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show average (median) age of elite strikers who scored >20\n", "dflfc_elite.sort('league', ascending=False).median()" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Gordon Hodgson 7\n", "Roger Hunt 5\n", "Ian Rush 4\n", "Joe Hewitt 2\n", "John Aldridge 2\n", "Harry Chambers 2\n", "Kenny Dalglish 2\n", "Albert Stubbins 2\n", "Robbie Fowler 2\n", "Luis Suarez 2\n", "Dick Forshaw 1\n", "David Johnson 1\n", "Daniel Sturridge 1\n", "Jimmy Smith 1\n", "Ian St John 1\n", "John Barnes 1\n", "Fred Pagnam 1\n", "Sam Raybould 1\n", "Jack Balmer 1\n", "Ronald Orr 1\n", "Fernando Torres 1\n", "Jack Parkinson 1\n", "dtype: int64" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show most appearances of elite strikers who scored >20 for ALL seasons\n", "dflfc_scorers_tl_pos_age[(dflfc_scorers_tl_pos_age.league >= 20)].sort('league', ascending=False).player.value_counts()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Gordon Hodgson 4\n", "Roger Hunt 4\n", "Ian Rush 2\n", "Robbie Fowler 2\n", "Dick Forshaw 1\n", "Luis Suarez 1\n", "John Aldridge 1\n", "Sam Raybould 1\n", "Jack Parkinson 1\n", "dtype: int64" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show most appearances of elite strikers who scored >25 for ALL seasons\n", "dflfc_scorers_tl_pos_age[(dflfc_scorers_tl_pos_age.league >= 25)].sort('league', ascending=False).player.value_counts()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "season\n", "1962-1963 1\n", "1963-1964 2\n", "1964-1965 1\n", "1965-1966 1\n", "1967-1968 1\n", "1977-1978 1\n", "1978-1979 1\n", "1979-1980 1\n", "1982-1983 1\n", "1983-1984 1\n", "1985-1986 1\n", "1986-1987 1\n", "1987-1988 1\n", "1988-1989 1\n", "1989-1990 1\n", "1994-1995 1\n", "1995-1996 1\n", "2007-2008 1\n", "2012-2013 1\n", "2013-2014 2\n", "Name: player, dtype: int64" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show frequency of elite scorers who scored >20\n", "top20_freq = dflfc_elite['player'].groupby(dflfc_elite.season).count()\n", "top20_freq" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "53\n" ] }, { "data": { "text/plain": [ "['1962-1963', '1963-1964', '1964-1965', '1965-1966', '1966-1967']" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# produce list of all modern seasons (since 1962)\n", "START_MOD_YR = 1962\n", "END_MOD_YR = 2015\n", "all_mod_yrs = list('{}-{}'.format(i, i+1) for i in range(START_MOD_YR, END_MOD_YR))\n", "print len(all_mod_yrs) # expect 53\n", "all_mod_yrs[0:5]" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "season\n", "1962-1963 1\n", "1963-1964 2\n", "1964-1965 1\n", "1965-1966 1\n", "1966-1967 0\n", "Name: player, dtype: int64" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# identify missing years and update frequency so it shows all years \n", "missing_mod_years = [year for year in all_mod_yrs if year not in top20_freq.index.values]\n", "for yr in missing_mod_years:\n", " top20_freq[yr] = 0\n", "top20_freq = top20_freq.sort_index()\n", "top20_freq[0:5]" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['1900-1901', '1905-1906', '1921-1922', '1922-1923', '1946-1947']" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create list of seasons when LFC were champions\n", "CHAMPS = ['1900-1901', '1905-1906', '1921-1922', '1922-1923', '1946-1947', '1963-1964',\\\n", " '1965-1966', '1972-1973', '1975-1976', '1976-1977', '1978-1979', '1979-1980',\\\n", " '1981-1982', '1982-1983', '1983-1984', '1985-1986', '1987-1988', '1989-1990']\n", "CHAMPS[0:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the number of players scoring 20 or more goals by season" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n3md06NAhbr75Zj788EM6deoU7ghcfPHFPPDAA9x7770A3HHHHXz11VckJSXxxBNPkJqaypAhQ2ja\ntCkNGzbkueeeA7xOSZs2bejRowd169Zl+vTp6d6npKSku+Ny99138+STT1KuXDn279/Pn3/+yd69\nezlw4ADly5cH4NNPP+XMM8+kcePGvPPOO+F1f/vtN/72t7/RsGFDWrRowQ8//HBY+7I7Fv3796d9\n+/bUqFEj7+7ijMi0AEbBFUu+frQ1aPnGEjee2hq0mH7GjRNBHk0hIsFQuHBh/vzzz6iXL3CdGYDl\ny5czePBglixZwoknnsiYMWMA75P9U045he+++44OHTowcuRIpkyZwnfffUfjxo0ZPXq0txxQpkwZ\nFi5cyI033sitt94KQJs2bfjmm2+YP38+vXv35uGHHw7HXLZsGVOmTGH8+PHcfPPN3HbbbcyZM4c3\n33yTa6+9FvDKwrVt25ZFixZx4YUXsn79+kzz37NnD02aNGHRokW0a9eOESNGUKNGDUqXLs33338P\nwEsvvUT//v354IMPSElJOWwbU6ZMoXPnzpQvX54XXniBRo0ace2119KvXz/OOeeccAdh1KhRtGnT\nhv/973/ccsstvPDCC5QpU4Y5c+YwZ84cnn/+edauXQvA//73P5588kl+/PFHnHPp3vfv359x48YB\n3qdvb7zxBv369ePMM8+kc+fOVKhQgUqVKnHeeedxxhlnsG/fPq677jo+/PBDvvvuO7Zs2RLucKWk\npNC4cWO+//57HnjgAa644gog/X+C2R2L5cuX89lnnzFnzhxGjBihcdkiIlKgzZ49m+bNm2c5f/36\n9SQkJByVwgmtW7cOfwgbi5zaJFJQFMjOTJUqVWjRogXgPXA4c+bM8LzevXsD8M0337BkyRJatmxJ\nUlIS48aNS9e5SHuG5NJLL2X27NkAbNiwgc6dO9OgQQMeffRRlixZAnidpO7du1O8eHEAvvjiC268\n8UaSkpLo0aMHu3btYs+ePXz11VdcfvnlAJx//vmULVs20/wLFSoUzjMy/2uvvZaXXnqJ1NRUJk6c\nSN++fenWrRsjMvkkceHChTRv3pxffvmFV199lW+++Ybrr78+3JYKFSqwbdu2wz4l++yzzxg3bhxJ\nSUk0b96c3377jZUrVwLeeOeqVauGl418X7VqVU4++WQWLFjAZ599RqNGjShbtiwzZsxg6tSpbNq0\n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\nC9qxiSVfP9oatHxjiRtPbQ1aTD/jioiIL47NamYiIiKSp1TNTETym6qZiYiIiIhI3FBnRkRERI5Z\n3bt359VXX/U7Dd9VrVqV9evX+51GgZeQkMDatWuPaJ1JkybRs2fPPMshL8/ZpKQkZsyYkSfbKqjU\nmREREZFAS0pKokqVKlStWpU6depw0003sWfPHsAbnmKW6eiUuLJu3TpOO+20PN/u66+/TocOHahW\nrRoNGjRgxIgRHDp0KDx/+/btXHHFFVStWpWkpCTeeuutPM/Bbz179mTSpEm5WnfUqFEMGjQo3bS8\nPGfj4dxXZ0ZEREQCzcwYP34869atY8qUKSxYsIDRo0f7lk/kxbzfDh48mK/b37t3Lw888AArVqxg\n8uTJzJgxg2eeeSY8f+jQoRQvXpylS5fy7LPPMmTIEH788cdMt5WUlMTGjRvzNV859hybnZnhw+Mr\nruQsaMcmlnz9aGvQ8o0lbjy1NWgx/Ywbx3744ZR8+cmtChUqcM4557Bs2bLD5q1Zs4a//e1v1KpV\nizPOOIPrr7+enTt3AvDUU09x9dVXp1v+zjvv5O677wZg586d3HLLLdStW5f69evz4IMPkpqaCsBr\nr73G+eefzz/+8Q9q1arFww8/zOrVq+nWrRvVq1fnjDPOSPcwc6R9+/Zx/fXXU6tWLWrUqEGnTp34\n5ZdfAO+uxk033US9evWoWbMmV1xxRXi9cePG0aRJE04//XQuv/xytmzZEp6XkJDAiy++SJMmTWje\nvHl4WtrwqRtvvJGhQ4fSp08fEhMTOffcc9MNrZo6dSrNmjWjevXqDB06lG7dumU57Onqq6+mWbNm\nFClShAoVKnDJJZfw7bffArBnzx4++ugj7rzzTkqWLEmzZs3o0qULEydOzHRb0d5FSE1N5Z577uGM\nM86gcePGvPDCCyQkJISPx+bNm7nssss4/fTTadKkCa+88kp43fnz53PeeedRo0YN6tatG37YPDOf\nf/45rVq1IjExkfr166frpEV67bXXuOCCC8LvExISGDt2LE2bNqVGjRoMGzYs0/WmTJnCE088wbvv\nvkvVqlVp3759eN769evp2rUriYmJ9OzZk99++y08b968eXTp0oUaNWqQnJzM119/HdV+c87xxBNP\n0KRJE2rVqsU111zD77//Hp7fv39/6tSpQ/Xq1enWrVu6Tudvv/1G3759qVatGp06deKBBx4It3n9\n+vXp9j8cPlRu/PjxtGzZkpo1a9KrV6887bQem52ZESPiK67kLGjHJpZ8/Whr0PKNJW48tTVoMf2M\nKwXGpk2bmDJlCvXr1890/u23387ixYuZNWsWmzZtYtSoUQD06tWLL7/8Mty5OXjwIO+++y69e/cG\nvA5A0aJFmTdvHlOnTmXq1KmHXSRXq1aNZcuWcdttt/Hggw/SoUMHVq9ezQ8//MB1112XaT6vv/46\nu3btYuHChaxcuZLHHnuMEiVKADBo0CD27dvHrFmzWLZsWXg40owZMxg5ciQvvvgiixcvpkqVKgwY\nMCDddj/55BO++OKLLC903333XYYOHcqqVauoVq0aI0eOBODXX3+lf//+pKSksHLlSmrWrMm8efOi\n7mjMmjWLM888E4BVq1ZRpEgRqlevHp5ft27dTDuaR+Lll1/myy+/ZNq0aXz55Zd8/PHH6fIbMGAA\nlStXZvHixbz00kuMHDmSr776CoDChQuH7yR9+umnzJgxgxdffDHTOLfccgujR49m7dq1fP3117Rp\n0ybqHD///HOmTJnCjBkzeO+99/jyyy8PW6ZDhw7ceuutXHjhhaxbt46pU6cCXqfj7bff5qmnnmLZ\nsmXs378/3JHavHkzffv25e9//zurVq1ixIgRXH311fz666855vTcc8/x6aef8v7777N48WLKlCnD\n0KFDw/M7derE3Llz+fHHH2nQoAHXX399eN7QoUMpVaoUS5cu5ZlnnuGNN97INlbkULmPP/6Yf/3r\nX7z88sssX76c5s2bZ/n7kBvHZmdGRERE4oZzjn79+lGjRg0uuOACWrVqxW233XbYctWqVaNt27YU\nLVqUk08+mUGDBjFr1iwAypUrR/PmzXnvvfcA71Pzk046iQYNGrB161amTJnC/fffz3HHHccpp5zC\nwIEDeeedd8LbLl++PNdccw2FChWiRIkSFCtWjPXr17N582aKFStG06ZNM829WLFibN++ndWrV2Nm\nNGjQgBNOOIEtW7bw5Zdf8thjj3HiiSdSpEgRWrRoAcBbb73FZZddRv369SlWrBj/+Mc/mDdvXrpP\nu2+55RZKly5N8eLFD4tpZnTt2pWkpCQKFy7MJZdcwqJFiwD44osvOPPMMzn//PMpVKgQ1113Haee\nempUx2H8+PEsXLiQwYMHA96dmVKlSqVbplSpUuzevTvLbUTzlR3vvfceAwcOpEKFCpQuXZpbb701\nvN6mTZuYO3cu9957L8WKFaNevXpcfvnl4btBDRs2pFGjRhQqVIgqVapwxRVXhM+BjIoVK8ayZcvY\ntWsXJ554Ig0aNIhqP4C3/0844QQqVapEq1atwvs3s/ZmbLOZ0bdvX6pXr06JEiXo0aNHeP1JkybR\nsWNHOnToAEC7du0466yz+OKLL3LM6eWXX+bOO++kQoUKFC1alCFDhvDBBx+E76j06dOH448/nqJF\nizJ06FAWLVrErl27OHToEB999BHDhg2jRIkS1KpVi0svvTTqffHyyy9z6623cvrpp1OoUCFuvfVW\nFi1axKZNm6LeRnZUKF5EREQCzcx45ZVXaNu2bbbLbd26lbvuuotvv/2W3bt3k5qaStmyZcPze/fu\nzdixY+nXrx+TJk0K35XZuHEjBw4coG7duuFlU1NTqVy5cvh9pUqV0sVKSUnhwQcfpFOnTpQpU4Yb\nbriBvn37HpZTr1692LRpEwMGDGDHjh307NmTu+++m59++omyZcty4oknHrbOzz//TMOGDcPvjz/+\neMqWLcvmzZvDOWXMJ6PIDkqJEiXCBRO2bNlChQoV0i1bsWLFbLcF3qfvI0eO5O233w7v0+OPP/6w\njsvOnTvDHZyNGzfSrl278Lxdu3bRtm1bChXyPmt/5JFHuOiiiw6L9fPPP6drX2S+W7ZsoWzZshx/\n/PHhaZUqVWLBggUArFy5knvuuYfvv/+evXv3cujQoXT7MtJLL73E6NGj+ec//0mdOnW49957Ofvs\ns3PcF5B+/5YsWTK8f6MVuf5xxx0XXn/Dhg28//77TJ48OTz/4MGDtG7dOsdtbtiwgSuvvDK8fwGK\nFCnC1q1bSUhIYOTIkXzwwQds27aNQoUKYWb89ttv/PHHHxw8eDDLfR5N3Lvuuot777033fTNmzfn\neJ5GQ50ZERERiQsjR46kcOHCzJw5k9KlS/Pxxx9zxx13hOd36dKFoUOHsnTpUj7//HPuu+8+wLuY\nL168OCtWrEh3IRgp4zCsU089lccffxyAb7/9losvvpiWLVuSmJiYbrkiRYowZMgQhgwZwoYNG7j0\n0kupWbMmHTt2ZPv27ezcufOwDk25cuXYsGFD+P2ePXvYvn17ugvM3FaxKl++fLoLZeccP/30U7br\nTJkyhdtvv53XXnuN2rVrh6fXqFGDgwcPsnr16vBQs8WLF4eHoVWuXJlVq1aFl2/UqBHvv/9+uk5i\nZsqVK5fuU/3I/MqXL8/27dvZvXt3uNO0adOmcIdsyJAhNGzYkBdeeIHjjz+eZ599lg8//DDTOElJ\nSbzyyiscOnSI559/nmuuuYbvv/8+29yOVFbnU1YqV65Mz549w+fWkahUqRJPPfUUTZo0OWzexIkT\n+fTTT3n77bepUqUKO3bsoGbNmjjnOOWUUyhSpAibNm2iRo0aQPp9XrJkSQD++OOP8D7funVrupz/\n7//+j4svvviIc46GhpmJiIhIrtWvvy1ffvLD7t27KVmyJCeccAKbN2/m6aefTjf/uOOO44ILLmDg\nwIE0btw4fAFcvnx5kpOTueeee9i1axepqamsWbMmy+FJ4A2FSrvgK126NGaW6YXrzJkzWbJkCYcO\nHaJUqVIULVqUwoULU65cOTp06MCQIUPYsWMHBw4cCMe7+OKLee2111i0aBF//vknI0eOpHHjxjl2\nAtJkN5SrY8eOLFmyhI8//piDBw/y3//+N92FaUYzZszg+uuvZ+zYsSQlJaWbd/zxx9O1a1ceeugh\n/vjjD7755hsmT55Mr169osozKz169OC5555j8+bN7NixgyeffDLceatUqRJNmjTh/vvv588//2Tx\n4sVMmDCBSy65BPhr6FvJkiVZsWIFL730UqYxDhw4wKRJk9i5cyeFCxemVKlSFC5cOFf5Zre/ExIS\n2LBhw2HLZLVOz549mTx5MlOnTuXQoUPs27ePmTNnsnnz5hzzuOqqq7j//vvDwxG3bdvGJ598Ani/\nG8WLF6dMmTLs2bOH+++/P7xe4cKF6dq1Kw8//DB79+5lxYoV6Yo4nHLKKVSoUIGJEydy6NAhxo8f\nn66gxFVXXcW//vWvcEGBnTt3hodz5oVjszOTkhJfcSVnQTs2seTrR1uDlm8sceOprUGL6WdcCYSh\nQ4eycOFCqlWrRt++fbngggsOu4Nx6aWXsnTp0sMuuMeMGcP+/ftp1aoVNWvWpH///uGL/MzugixY\nsIBzzz2XqlWr0q9fPx544IFMv+dl69at9O/fn+rVq9OqVStatWoVjv3vf/+bokWL0qJFC84880ye\nf/55ANq2bcsdd9zB1VdfTb169Vi3bl14Xlb5RE7Lbv7JJ5/Miy++yIgRI6hVqxbLly/nrLPOolix\nYpnu09GjR7N792569+5N1apVqVq1arrnKR555BH27dvHmWeeyaBBg3j00UepVatWptuK1hVXXEFy\n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\ny8nM/CWT1a7UoAUARipl7GfbbxpupxL7mqPdSeqriIjkM56TmaWT1a7UsHhx7goGk1Jvhr6mjP1s\n+03D7VRiX3O0O0l9FRGRfMZyMiMiIiIiIuNPkxkRERERESmSJjMiIiIiIlIkTWZERERERKRIYzmZ\nWb1gstqVGhYtyl3BYFLqzdDXlLGfbb9puJ1K7GuOdiepryIiks94TmYWTla7UoOWZh6plLGfbb9p\nuJ1K7GuOdiepryIiks9YTmZERERERGT8aTIjIiIiIiJF0mRGRERERESKpMmMiIiIiIgUaSwnM/OX\nTFa7UoMWABiplLGfbb9puJ1K7GuOdiepryIiks94TmaWTla7UsPixbkrGExKvRn6mjL2s+03DbdT\niX3N0e4k9VVERPIZy8mMiIiIiIiMP01mRERERESkSJrMiIiIiIhIkTSZERERERGRIo3lZGb1gslq\nV2pYtCh3BYNJqTdDX1PGfrb9puF2KrGvOdqdpL6KiEg+4zmZWThZ7UoNWpp5pFLGfrb9puF2KrGv\nOdqdpL6KiEg+YzmZERERERGR8afJjIiIiIiIFEmTGRERERERKZImMyIiIiIiUqSxnMzMXzJZ7UoN\nWgBgpFLGfrb9puF2KrGvOdqdpL6KiEg+4zmZWTpZ7UoNixfnrmAwKfVm6GvK2M+23zTcTiX2NUe7\nk9RXERHJZywnMyIiIiIiMv40mRERERERkSJpMiMiIiIiIkXSZEZERERERIo0lpOZ1Qsmq12pYdGi\n3BUMJqXeDH1NGfvZ9puG26nEvuZod5L6KiIi+YznZGbhZLUrNWhp5pFKGfvZ9puG26nEvuZod5L6\nKiIi+YzlZEZERERERMafJjMiIiIiIlIkTWZERERERKRImsyIiIiIiEiRxnIyM3/JZLUrNWgBgJFK\nGfvZ9puG26nEvuZod5L6KiIi+YznZGbpZLUrNSxenLuCwaTUm6GvKWM/237TcDuV2Ncc7U5SX0VE\nJJ+xnMyIiIiIiMj402RGRERERESKpMmMiIiIiIgUSZMZEREREREp0lhOZlYvmKx2pYZFi3JXMJiU\nejP0NWXsZ9tvGm6nEvuao91J6quIiOQznpOZhZPVrtSgpZlHKmXsZ9tvGm6nEvuao91J6quIiOQz\nlpMZEREREREZf5rMiIiIiIhIkTSZERERERGRImkyIyIiIiIiRRrLycz8JZPVrtSgBQBGKmXsZ9tv\nGm6nEvuao91J6quIiOQznpOZpZPVrtSweHHuCgaTUm+GvqaM/Wz7TcPtVGJfc7Q7SX0VEZF8xnIy\nIyIiIiIi40+TGRERERERKZImMyIiIiIiUiRNZkREREREpEhjOZlZvWCy2pUaFi3KXcFgUurN0NeU\nsZ9tv2m4nUrsa452J6mvIiKSz3hOZhZOVrtSg5ZmHqmUsZ9tv2m4nUrsa452J6mvIiKSz1hOZkRE\nREREZPxpMiMiIiIiIkXSZEZERERERIqkyYyIiIiIiBRpLCcz85dMVrtSgxYAGKmUsZ9tv2m4nUrs\na452J6mvIiKSz3hOZpZOVrtSw+LFuSsYTEq9GfqaMvaz7TcNt1OJfc3R7iT1VURE8hnLyYyIiIiI\niIw/TWZERERERKRImsyIiIiIiEiRNJkREREREZEijeVkZvWCyWpXali0KHcFg0mpN0NfU8Z+tv2m\n4XYqsa852p2kvoqISD7jOZlZOFntSg1amnmkUsZ+tv2m4XYqsa852p2kvoqISD5jOZkREREREZHx\np8mMiIiIiIgUSZMZEREREREpkiYzIiIiIiJSpLGczMxfMlntSg1aAGCkUsZ+tv2m4XYqsa852p2k\nvoqISD4jncyY2UFmdrWZXWtm7xtlW53mL52pltrRrtSweHHuCgaTUm+GvqaM/Wz7TcPtVGJfc7Q7\nSX0VEZF8RjaZMbN1gM8DBwG7Aa82s10HeY7LLmvW9tnNYkltprZ79tnN0kn1NmwzJZujTcjzf5Ot\n3oRsjn0uKZthGzdvsby+5no9zNFuttemDK8vKds3x++c0v5vUrKl1ZuSzVWvxnA9TbdTju07yk9m\n9gWuc/fV7n4vcCLwkkGeQJOZ/jSZqZltnNRkZtRtJmU1mRlpu5rMtDerycx4ZkurNyVb2h/pKe2W\n9n8DmsxMeRRwQ8fPN8bbREREREREko1yMuMjfG4REREREZlw5j6aOYeZPRU4xt0Pij//A/CAu3+i\n4zGa8IiIiIiISCV3t263j3IyMxtYBTwb+C1wIfBqd79qJA2KiIiIiMhEmT2qJ3b3+8zsbcBpwDrA\n8ZrIiIiIiIjIsIzskxkREREREZFRGulJM0VEREREREZFkxkRERGRITOz4yrum21mbzazD5vZ06fd\nd3Sf593UzI6O+dlmtsjMfmBmHzKz9RvUeU3Nx+3ecX1dM/snM/u+mX3UzDaoyL3dzLaM13c0s3PN\n7A4zu8DMntinze+Y2WvMbKO6/enIPs7MvhK38cZm9iUzu8LM/svM5vfJrmNmR5jZD81shZktM7MT\nzWz/Prk58f/lVDNbGS+nxtvmDNqHjuftOZbi/a0YT6MeS720YjJT2obMsWPm2Cljdug7Zik7ZXy+\nvuOptLEUs43GU9vGUnzekYynHGMpPm7Gx1OOsRSzrRpPpbw2tXksxcdPzO85M9u8x2UL4IUV0X8H\nngXcChxrZp/uuO8VfUpeAmwG7E44T+wjgU8C6wP/2qfeNWZ2Z/x3jZmtAR43dXufdpd2XP848Djg\nU8AGwBcrcm9x95vj9WOBz8T639cnB+EE7C8Frjezk8zsZWa2bp/MlCWExafuBn5BWJTq+cCpwJf7\nZI8Htif08yfAD2LmaDM7siL3H8CTgGOAF8TLYmAP4D+rGkwYS5BhPGUaS91racN3ZszsO8CvCBtu\nd2AFcCJwMLC5ux/RI7eGcD6bzqXaNgD+BLi7b1LR5jJ33zNe/zSwOfAV4GWxzcMrsle6+27x+o+A\nLwHfBfYDPuLuT6/I3gT8HDgQOBM4Afihu/+1Vybmfgp8HZgLvCbWehLwHOAwdz+wIrsE+E1s75XA\nncBPgfcCJ7v7sRXZE4HbCQPvpnjzo4EFwGbufmiP3Oa9nhJY4e49T6BqZscTxsJFhL6e4+7vivc9\n+P/WI9toLMVso/FU2liK2UbjKcdYitkZH085xtL0mmZqPOUYSzG7BL026ffcQ7mixlLMPhDb7eZR\n7t71D28zW+nuT4zX5wBfALYA/ifw8z5jaYW7725mBvwO2NbdH4g/L3f33SuyxxK273vd/fcx8yt3\n36FXpiPbOZ6WA/u4+1/jc6yY6k+X3Cp3f3y8fpG77zO9L/3aNLNNCJOaVwP7AN8HTnD302vWe4O7\nb9dx32XuvkdFdmVnf8zsAnd/ipmtR9jGu/TIXevuOw16X7y/0ViaXu9MjaccY6knd89+iYVDeLH+\nPTCr4+cVFbljga8CW3c8/tc121zWcX05sG7Hc6zsk13Vcf2ibn3p1y6wCXA4cApwC+FF+7k1671h\n2n2X9Wlz5bSfL4j/rgdc3Sd7bcP7HgB+3ePy17r1AnMIv0S/DTyiczsMcyyljKfSxlLKeMoxlnKN\npxxjKdd4yjGWco2nHGMpZTyVNpZSxlNpYynefx2wfY/7bqjIrVUTsAg4v0abl3Vc/8og/zfxMXsD\nPwbeQVhttu54+hXwcsI7/dfUbRf4COHd/8cCRwHvJHzq8TrgB3XHcMdt84A3Az/pt52AxxM+3bmV\n8AczwE419tdLgB3j9b2Aczvuu7IidwFwyNT+HW+bBRw6NSaHPZZyjqeZHku9Lq04zIzwywUPvTjF\n3Tt/7sndjyS80H/dzN7BYIfNbWpmLzezVwDre3zHKLZZ2S7wTTNbYmaPBb5jZu80s+3N7HXA9XUa\nd/c73f2r7v58YBfCDvAPFREzs8eb2b7ABma2T7xxpxr1/tXMdoyP3wv4S6zhL8RtX+E2MzvEzB7c\ntmY2y8wOBW6ryP0K2N/dd5h+Af7Qp80HP9Z393vd/Y2EX8RnAf0OW2g0luJjmo6n0sYSNB9POcYS\n5BlPOcYSZBxPMzyWQK9N+j33cKWNJYDPEg7R6eafK3KXmNnzO29w98WECd/8Pm1eYmYbx8zrOmre\nkfCJVCV3v5jwaReEw4oe0S8TnQu8GHgRcL6ZbR3b3Qa4uVfI3f8ROIfwCd27gA8SDvXaGTisT5tr\nujzfLe7+RXc/oE/2KMLpQT4HPBdYambXxVr6va69B/hxfPy3CJ/wYeHQyx9U5P6O8MngH8zsWjO7\nlvC68op4X5WmYwkyjaeZHktVhWS/EI5N3LjL7TsC59XIr0OYFf4U+F3NNpcQ/pOnLlPvem0DnFUj\n/zrCC/MthJ3tKuBjwKZ9cufWqa9L7gXAasJH93sBVxJm8b8FDuqTPZDwy+e6+BxPjbdvBXyyT3YH\nwsf8NwPXxsvN8bYdKnJvA/bocd+Rfdr8GvD8Lre/Abh3lGOpyXjKOJZ+2mQspYynirG05ajGUq7x\nlGMs5RpPNHxdShlLfcaTXpsKHUsp42lEY2mkr01tu9DxiUDNx28LvCB33TO0bYzwfZBa24jwxsGW\nCW3NixfL3feUbTbAY7ONpVZ8Z6aKmc3y+A5WjcduS/gl9aMRl5VdfAdpHnCz1/hPjI/fArilzuO7\n5C3mAW5t8hy5mZkNUvcEjqctCeOpcn8b5lhy91salJvdIK9L8fGTNpbmEcZH3200xPHkwG2Fvjbp\n91wX8f92K2q8LsXHzwK28Ie+bN6kvanvVNUeS2Y2FzgImPq+1Y3Aae5+xyhymbObEr5E37Sv28ab\nbspQrw/Y7lR2W8LkpHa7PZ7vOe5+xiRkZ7rNVhxmZmaPsbiaS/xo9wgz+7yZvYWKGuNH3g/mCIP9\nBWb2FjOb3bTNGtntE7KN2p2eAxYCHwDeXKdNYL34Am8D1nuwmT3Cg1vipc7k6WAzq/tx44xk+9U9\nPevuv63zB0Mb+zpo1t0fcPc/1JjIHEw47r7WJLpL/lnAznESs4uZvdvM+q3SMpXdz8ymvkT6DDN7\nzwDZZzXJ9mqz5h9WD2YJx4o/YdT1pmSHtX2BpxG+OP38ikinZxC+jO4N2t2IcEjHawmHqzzPOg4V\nqshtbGavsnDo1DvM7KA6uVFla+x3D+Zifx8YoM2NhlTvkTOxnTrrBd4O9PzichcbAPs37OumhO81\nLCSM30Ms/BHdL3c44fsV+xMWd1if8CnRpWa2YNi5FmQvTezrBvGSo95B253KbjBIuxX6raA2TtkZ\nbbMVn8yY2RWEL2b9ycw+SfjF/13g2YS/QXut8tIoV2I2Y733EFbN+RHheNfT3P3+Xo9PzZWYLa3e\nlGxim58jrEIzh3C89LMJXwzej/AFxHe3KVtavRPY10OAdxNWBTuAcGiSEVYKO8zdVwwzlytbWr2F\n9vVwwpelzyC8+w6wHeG7AIvdfWlF9hpg3+nv1pvZZsCF3ntlq0a5ErOl1ZuSNbPv93pO4NnuXnU+\nnqKyuertyttxTN6VHdcvBdbp+LlqhYxGuRKzGetdRvhC2psIK1b8kbAG+H6jyJWYLa3ejH29kvBJ\n64bAHcCG8fY5wBVty5ZW7wT2dSWwQbw+Dzg9Xt8d+Nmwc7mypdVbaF+vAeZ2uX0z+q8E1Ss7tyrb\nNFditrR6E/t6O+FL7ft3XPaL//6xT5tFZXPV2+1SeYjRDLrRzJ7t7mcRlsfcDlhtZvOoXsGkaa7E\nbK56cffbgeOA4yysNHEI8Akze5R3rNs+rFyJ2dLqzdRXj5f7O65DWGmo3zjMkS2t3pRsafVO+XP8\n927Cd75w9xXxkKFR5HJlS6s3JZur3m7qjMGPEFaDOp2Hf6rzXOBDI8iVmC2t3pTsBcCf3P3s6XeY\n2ao+bZaWzVXvWtpymNljCOvor0N4d+6ZhPXB5wLvdvczh5krMZux3qqTCs5399XDzJWYLa3elGxi\nm8cCTwbWBU4nHAoydUjR5e7+zjZlS6t3Avv6CcL3Kc4lfF/yR+7+UQtnyz7X3Z8wzFyubGn1FtrX\nBYTvoHb9w9Xdv9IrG/ObA8/j4V9uP93dK5d1bporMVtavalZmVmtmMxMMbPdCOuOzya8oFzk9Y7j\nb5QrMTvTbZrZAe7+kzrPP4xcidnS6k3JJrZphD9S/+juV1pYDOBvgavc/eS2ZUurd9L6GvMvBHYl\nnKX6jHjbLMIiFX8edi5XtrR6C+1r8h+uceKEu99aN5OSKzFbWr0p2TimaDL5KS2bq94H+YDHpY36\nQjhGdZOZypWYVb3tzZZWr/ra3jbVV/W1DW1OYF+3ICzvXPfx2wMnEs5Lc1283Bxvmz/sXInZ0upV\nX9vd167PN2hgFBfC+t9fBf4/4VjpG+LlGGDOsHMlZlVve7Ol1au+qq9taFN9Hc96C+1ryh9lvyAs\n6Ty747bZhLO9/2LYuRKzpdWrvra7r90us2iH/yScnXguYQ39bxE+Kp4D/OsIciVmVW97s6XVm5It\nrd6UbGn1pmRLqzclq3rbm81V7zeA7wDbuPuO7r4jsA3hFAYn9slu4e7fcPf7pm5w9/vc/UQeOtH0\nMHMlZkurNyVbWr0p2Vz1rm3Q2c8oLoTjWzt/vrTj+qph50rMqt72ZkurV31VX9vQpvo6nvUW2teq\npXb7LeH7DeALwFMI37fZFngq8G/AScPOlZgtrV71td197XZpy9LMt5jZawnnrXgFYfngqS/u2Qhy\nJWZVb3uzpdWbki2t3pRsafWmZEurNyWretubzVXvpWb2BWAp4dA0gMcACwjn1qpyOPB6YDHhUDcI\niwecDBw/glyJ2dLqTcmWVm9KNle9axt09jOKC+F41f8CLge+RvioF8JHTa8cdq7ErOptb7a0etVX\n9bUNbaqv41lvoX1dD3grcCrh5Jsr4/W3AutVZXXRRZf8l1YtzSwiIiJSEjM7iPDu8lneca4tMzvC\n3b887FyJ2dLqTcmWVm9KNle907VlAYCezOwDM5krMat625strd6UbGn1pmRLqzclW1q9KVnV297s\nqNs0s4PM7PVmNn/a7Uf0yX0MOAp4InCWmR3Zcffbh50rMVtavSnZ0upNyeaqt6vcHw31uwA3zGSu\nxKzqbW+2tHrV1/a2qb6qr21ocxz7CnwMOBf4LPBL4MiO+5b1yV5OXPqZsJLaKfF5rCrbNFditrR6\n1dd297XbpRULAJjZmoq71x92rsSs6m1vtrR6U7Kl1ZuSLa3elGxp9aZkVW97s7nqBV4M7Onu95rZ\nMcAJZvZY4J19cgDruPu9AO5+h5m9GDiO8P2ddUeQKzFbWr0p2dLqTcnmqndtg85+RnEBrge27nFf\nz3dUmuZKzKre9mZLq1d9VV/b0Kb6Op71FtrXq6b9PBv4MvBN4Io+2R8C+3W5/cPAA8POlZgtrV71\ntd197XZpy3dm/oOwDGI3J4wgV2JW9bY3W1q9KdnS6k3JllZvSra0elOyqre92Vz1/srM9pv6wcPJ\n+44AriaceLPKK4ELp9/o7kdX1JOSKzFbWr0p2dLqTcnmqnctWs1MREREJpaZrQ/g7vd0ue/R7n7j\ngM93jLsf06CORrkSs6XVm5Itrd6UbK562/LJzFricaszlisxq3rbmy2t3pRsafWmZEurNyVbWr0p\nWdXb3uxMtOnu90yfyExlB53IRC9pkEnJlZgtrd6UbGn1pmSz1NvayQyFbchMWdXb3mxp9aZkS6s3\nJVtavSnZ0upNyare9mZLqxfCikwlSam3aTZHm6kmqa9NZelrmyczTeUaNKUN1tJevHIp7cVrUsZS\najaH0rZTaX8wpGQ1ltqdzdFmSvbJDXN7J7SZkm1ab0o2R5uQZzuV2Nem2Sx9be13ZsxsHXe/v0Fu\nlrs/0LDNorJNt1FKmynZxDZT+jrj26m0sRSzk7TPNe1rUftcSjbj/jpJfZ2kfW5sf89ZOJP5Swln\nMwe4Efieu5/asO0PuPsHa7TZ5Iztc4BDgVvc/VQzWwDsAywDvuwD/lFoZj929wP7PGaeu9/S8fNr\ngX2BlcCXqto0s5cD57j7rWa2FfApwh+9VwB/X3UYoJl9BviWu583SJ9idgvgbcBNhJXt/gF4GnAl\n8FF3v70ieyDwCmA74H5gFfD/3P26Gu0OdSzF5xzJeMoxlnpm2zKZKWlD5tgxc+2UMd9oxyxpp4z3\nD208tXksxWyj8ZRrLMXsjI+nNoyl+HwjHU8l/sEQ82P/2lTaWIqPnaTfc58DdgK+GtsGeDTwWuA6\ndz+yV7biOW9w9+0q7v8Y8HTgUsI5cj7n7sfG+5a5+54V2eOBTQnn8rgHWA/4FvAi4Hp3f09FdiXg\nPPxTq52BawB399175B6sycyOBp4JfD3WfoO79zyfj5ld5e67xusnAT8nLJn9bOAwd39ORfZm4DfA\nVsCJwAnuvqzX46dlTwFWAJsQVrRbSTgHynOA3d2962GIZvZxYGvgLMJrzK8J2+ctwMfc/aSKNoc+\nluLzjmQ85RhLPZ+vDZOZ0jZkjh0zx04Zs412zNJ2ynh/o/FU2liKj280nnKMpZid8fFU2h8M0+sa\nZDyV9gdDzE7Ea1NpYyk+fiJ+z8Xste6+U5fbDbjW3Xfskas8yae79zypuZldzkMn+ZxLWHp6RVZz\nGwAADjNJREFUFeEkn5f2eW26wt2fECfJfwC2cfe/mNnsmK0aEycDawjnAvkTYVz9FHgG4e/J1T1y\nnWNpGfBMd78r1rDM3f+mos1V7v74eP0Sd9+r477l7v6kiuwyd9/TzHYG/o7wpsBswjg+wd2vqcgu\nd/cnxf/Hm9x92zrtmtnlU/2J2/Rcd3+amW0GnOfuT6hos9FYio+Z8fGUYyz15AOemGYUF+ByYE68\nPhc4Bfhs7NyyitwV8d85wG3AevHn2cCKPm2eDHyN8KK3PTAfuGHqep/sss7rwEYddVzeJ7uq4/ol\n0+5b3q9Nwi+iDxDe4VoFLAJ27tPm8vivAb+t2+bU/03H9dnAz+L1zag4mRhhx+t2uxH+YKhqc03F\n5b5RjKWU8VTaWEoZTznGUq7xlGMs5RpPOcZSrvGUYyyljKfSxlLKeCptLMXHrAT27XL7U4CVFblc\nJ/m8rOP6aYNsp/iYlxP+6HxJ/PnXNTJXEz6Z22v62Knxf3Mc8EFgfeD/Ai+Ptx9A+PSv1hjuuO1J\nwMeBX9b4f92ccM6TO4Ed4u3z+vy/Lge2iNe3B37Rcd9IxlKu8ZRjLPW6tGUBgHXc/V4Ad7+D8M7P\nJoR3VdatyE1l7gUucve/xJ/vI7wb1ZO7H0x4d+s4YA8Ps8D73P033n9GuL6ZPdnM9iL8crqro45+\nx/aeY2YftLCu/dnx43jM7ADgjj5Z3P0ad/+gh9n9IYQd/JQ+sVlmtjnh4/ONzGyH2OY8+i8CcX/8\n+B7C4RGzYh2VH9kDfzazfbvcvi/h3cUqtwM7ufvG0y/A7/pkm44laDieSh1LsZ1Bx1OOsQR5xtOM\nj6X4mBzjKcdYAr026fdc97pLGUsAC4HPm9lVZnZGvFwFHBvv6yXXST5/b2Ybxdzzpm40s22Av/TJ\n4u7fBp4P7G9m36P/ayHA7wkTkU8BN5vZtrHNecTxXeFthHG+CngV8E0zuwt4E+HT1IG4+3J3f7+7\nP67PQz8NXAv8GHg1cKaZnQlcBvxzRe6jwKXxsecRPnnAwuGWy/u0uZBmYwnyjKccY6nnk2W/AD8E\n9uty+4eBBypypxLfLZp2+zbAhTXb3gj4DPA9wkeJdTJnAz/puGwbb58HXNwnuy6wmDCLvh54ALiL\nMNgeU5GrfCe4T5uvA24FrgNeCPwSOJNwnPjhfbKHEj72P5Pwjt6L4u1bAV+vyO1FOLvrVcAZ8XIV\ncAGwV582P0KXdyfifZ8cxVgaxngqZSyljKccY2lI4+kpg46nIYyljZuOpZkeTznGUq7xNISxNKOv\nTej3XGvHUpf/j73ipes75MO6ECZ36/e479ENn3NDYKsBM3sAb07oxzrAhgM8fm4cf1bz8Wu9Bg9Y\n37rArHh9E8InJFvWyG1B+F7b3IbtbkNYTWxvwqFbIxtLoxhPOcZSW74zswHh+N1hnX13Q8KL/x8G\nyOwBPNXdvzhIW9OeYx3gEe5+d83HzwVme8eXLCseu7G7Vx0T2S+/LuEduQfMbBNgF+BXNdveAngs\n4RCMOu9UdWa34aEv2d7k7v3evUxiQz6Tc8xtSHjB/WPNxw9rLK3n7n+q+fi5hI+Gb/UaO3XKeOoy\nlnYljKWba2Qbj6WY7xxPN7r77wd9jgHaGurrUsy1/rVpJsdSzHd7bfr1qMdTx1hywmFJRb02Dfq6\nFDPZfs9RYzyNYCw1eW261sMnZ4O0a4Q/dDsXlLiwRn87c074DlffXObsLMKnmNsSDukbtK9T3z0Z\ntN596fhbokG9TbfTvoTv1NXOpvS14jl3cferS8nOdJttmcw8+AIUfz6QuPKJu/f8aLlpLj52PeDe\nhtlht7sncOUI+zrjWTPb3d1XVD33uGRLqzclm6vemH8McKe73xEPIdkLuNrdL2+Q3ZtwnHBltmmu\nxOy03PyYG+n27dHuPg2zg7a7D+GPlPuBawb55dk0G//I2XvQbNNcajbm9+ahFb5Gns1c78D/r2b2\nXOALhE+EpiakjyYsMvFWdz9tmLkSs6XVm6uvVazPAiNtyya2eb279zpkrjsf8cdXdS6EFUg2i9ff\nA/wMOJrw8f/Hh50rMVtgvfcTduYPAbsNOB7uJxyrWkS2tHoL7ev7CSsMrQLeQDiW93geWup16Nkc\nbaqvM9LX/YCLCYcU3U44/Ot8wmFV2/Vpc8azpdU7gX29mi6LKQA7EN4MGGquxGxp9Wbs679UXNa0\nLZur3q7PN2hgFBcevpLIJcRj9wgfTVetGtEoV2K2wHqXAX9D+DLcdYRJ0fu77eSlZ0urt9C+Xkk4\nrnce4dj7LePtG9J/hZhG2Rxtqq8z0tfLOh67A/DdeP05wOl92pzxbGn1TmBfryWuUjft9nWpWB2v\naa7EbGn1ZuzrGuB/Eb7sv6DjspBwmGarsrnq7Xbpue70DFtjZk9095XAzYRfUPcQloC0EeRKzJZW\nLx4O9TgKOMrMnkJY5/28+BHi08YpW1q9Bfb1Pne/x8z+SliT/rb4fHebWb+zdDfN5mhTfR19dpY/\n9B2K6wnLp+LuZ1g4B02VHNnS6k3JllYvhCVsLzKzE3josKLtCK9tPU+sm5ArMVtavSnZlDYvJryB\nfP70O8zsmBZmc9W7lrZ8Z2Z3wrJyKwhfsnoGcC7wRODT7v61YeZKzBZYb9eTwFn4Mt6z3P3sijaL\nypZWb0o2Y71TS0tuSFjzf33gO8CBwLru/pphZ3O0qb7OSF+/Qlhd6yfAwYSFJN5l4Qv1l7j7LhVt\nzni2tHonra8xvxvwEh7+he+T3f3KUeRKzJZWb0o2Ibc58GevufBP7myuers+XxsmMwAWzhj6XMLJ\nsmYTlkc8zfusKtI0V2K2pHrN7LCqSVKf9orKllZvSjZjvY8gvLP1O3c/zcxeAzyNcHzyv3s898Yw\nsznaVF9npK/rAm8krHS1HPiyu99vYbWxR3rF+VdyZEurd9L6KiL5tWYyIyIiIlISC0tPvx94KfBI\nwhEMfwS+S1gkp+ubfk1zJWZLq1d9bXdfu+l3VtwZYWYbWzhb8BVmdqeZ3WJmF5jZwlHkSsyq3vZm\nS6t3jPr6i1Fmc7Spvmbrq/a5FmRLqzc6ibAC2v7A5u6+OXAAcEe8b9i5ErOl1ZuSLa3elGyuetfS\nik9mzOxkwrHOZwKvIpyt+ETCEsA3uvtRw8yVmFW97c2WVq/6qr62oU31dTzrncC+XuPuO8/UfSVm\nS6s3JVtavSnZXPV25QMufzaKC7Bi2s8Xx39nAauGnSsxq3rbmy2tXvVVfW1Dm+rreNY7gX09A3gv\n4bs1U7dtDbwPOHPYuRKzpdWrvra7r90urTjMDLjbzJ4JYGYvAW4F8HjW+RHkSsyq3vZmS6s3JVta\nvSnZ0upNyZZWb0pW9bY3W1q9AIcSznV0jpndbma3E062uQVwyAhyJWZLqzclW1q9Kdlc9a5t0NnP\nKC7Ak4CLCMfKnQ88Pt6+JXDksHMlZlVve7Ol1au+qq9taFN9Hc96J62v8XG7Av8D2Hja7QeNIldi\ntrR61dd293Wt5xo0MNMX4IiZzJWYVb3tzZZWr/ra3jbVV/W1DW2qr2vdfySwirAK02+Al3bct2zY\nuRKzpdWrvra7r12fb9DATF+AG2YyV2JW9bY3W1q96mt721Rf1dc2tKm+rnX/5cBG8fp84BLg/8Sf\nq/4QbJQrMVtavepru/va7TKbFjCzlRV3P3LYuRKzqre92dLqTcmWVm9KtrR6U7Kl1ZuSVb3tzZZW\n71Tc3e8CcPfVZrYf8C0z2x6wEeRKzJZWr/ra7r6upRWTGWAr4CDCmtPT/WwEuRKzqre92dLqTcmW\nVm9KtrR6U7Kl1ZuSVb3tzZZWL8AfzWwPd78MwN3vMrMXAccDu48gV2K2tHrV13b3dS1tmcz8kPBx\n07Lpd5jZOSPIlZhVve3NllZvSra0elOypdWbki2t3pSs6m1vtrR6AQ4H7u28wd3vNbMFwHEjyJWY\nLa3elGxp9aZkc9W7llacNFNERERERGRQbTnPjIiIiIiIyEA0mRERERERkSJpMiMiIiIiIkXSZEZE\nRIbGzP7RzC43s+VmtszM9s1dk4iIjK+2rGYmIiKFM7O/BV4I7BlXptkcWC9zWSIiMsb0yYyIiAzL\n1sAt7n4vgLvf5u6/M7O9zOxsM7vYzE41s60BzOyNZnahmV1mZt80s/Xj7a8ys5Xx9nPibY8ws6+Y\n2Qozu9TM9o+3LzSzb5vZKWZ2jZl9Ik/XRUQkBy3NLCIiQ2FmGwLnARsAZwLfAH4OnAO82N1vNbND\ngee6++vNbHN3vy1mPwT8wd0/b2YrgOfFidAm7n6nmf09sKu7v8HMHg+cDuwMvBr4J2AP4K/AKuDp\n7n7TjHZeRESy0GFmIiIyFO5+t5ntBTwTOIAwmfkw8ATgTDMDWAf4bYw80cw+DGwKbAScGm8/H1hq\nZicB3463PR04Nrazysx+Q5jMOHCWu68BMLMrgfmAJjMiIhNAkxkRERkad3+A8EnMOWa2EvjfwBXu\n/rQuD18CHOzuK+OZn/ePz/GWuHDAC4FL4gQJwHo0+5eO6/cTJkwiIjIB9J0ZEREZCjPb2cx26rhp\nT+AqYJ6ZPTU+Zo6Z7Rbv3wj4vZnNAV7T8TyPc/cL3X0RcDOwHfBT4LCpdoDHAFfTfYLTa9IjIiJj\nRp/MiIjIsGwE/IuZzQXuA64F3gQcBxxrZpsSfu98BriS8F2XCwgTlgtiHuCTcVJkwJnuvtzMrgb+\nLX6f5j5gQVwxzQmHmnXSl0FFRCaEFgAQEREREZEi6TAzEREREREpkiYzIiIiIiJSJE1mRERERESk\nSJrMiIiIiIhIkTSZERERERGRImkyIyIiIiIiRdJkRkREREREiqTJjIiIiIiIFOm/AXlk8RDHbYnJ\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = top20_freq.plot(kind='bar', figsize=(14, 5), color='y', yticks=[0, 1, 2], ylim=(0,2.5), grid=False)\n", "ax.set_xlabel('Season')\n", "ax.set_ylabel('Number of players')\n", "ax.set_title('Number of players scoring 20 or more goals by Season')\n", "ax.text(-0.2, 2.36, 'prepared by: @terry8dolan', bbox=dict(facecolor='none', edgecolor='none', alpha=0.6))\n", "\n", "# add vertical line for title winning seasons since 1962\n", "champs_since_62 = [list(top20_freq.index.values).index(yr) for yr in CHAMPS if yr[0:4] >= '1962']\n", "for x in champs_since_62:\n", " plt.axvline(x, color='r', linestyle='--')\n", " \n", "# create fake legend\n", "l1 = plt.Line2D([], [], linewidth=1, color='r', linestyle='--')\n", "l2 = plt.Line2D([], [], linewidth=5, color='y')\n", "labels = ['LFC Title Winning Seasons', 'Players scoring 20+ goals in the league']\n", "ax.legend([l1, l2], labels, fancybox=True, shadow=True, framealpha=0.8)\n", "\n", "# plot and save current figure\n", "fig = plt.gcf() \n", "plt.show()\n", "fig.savefig('20+PlayervsGoals.png', bbox_inches='tight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Show percentage of title winning seasons that have had striker with >20 goals" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonpos
591962-19638
601963-19641
611964-19657
621965-19661
631966-19675
\n", "
" ], "text/plain": [ " season pos\n", "59 1962-1963 8 \n", "60 1963-1964 1 \n", "61 1964-1965 7 \n", "62 1965-1966 1 \n", "63 1966-1967 5 " ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create a dataframe showing position in league in top flight season since 1962\n", "dflfc_league_pos = dflfc_league[['Season', 'Pos']][dflfc_league.Season.str[0:4] >= '1962']\n", "dflfc_league_pos.rename(columns={'Season': 'season', 'Pos': 'pos'}, inplace=True)\n", "dflfc_league_pos.head()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonpos
591962-19638
601963-19641
611964-19657
621965-19661
641967-19683
\n", "
" ], "text/plain": [ " season pos\n", "59 1962-1963 8 \n", "60 1963-1964 1 \n", "61 1964-1965 7 \n", "62 1965-1966 1 \n", "64 1967-1968 3 " ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create dataframe showing position in league when players have scored >20\n", "top20_seasons = dflfc_elite.season.unique()\n", "dflfc_elite_pos = dflfc_league_pos[dflfc_league_pos.season.isin(top20_seasons)]\n", "dflfc_elite_pos.head()" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1 9\n", "2 4\n", "7 2\n", "4 2\n", "3 2\n", "8 1\n", "dtype: int64" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show position in league when players have scored >20\n", "val_cnts = dflfc_league_pos[['season', 'pos']][dflfc_league_pos.season.isin(top20_seasons)]['pos'].value_counts()\n", "val_cnts" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9 of 13 (69.2%) of title winning seasons have had striker with >20 goals\n" ] } ], "source": [ "# show % of title winning seasons that have had striker with >20 goals\n", "tot_champs_since_62 = len(dflfc_league_pos[(dflfc_league_pos.pos == 1)])\n", "tot_elite_champs = len(dflfc_elite_pos[(dflfc_elite_pos.pos == 1)])\n", "print '{} of {} ({}%) of title winning seasons have had striker with >20 goals'\\\n", " .format(tot_elite_champs,\n", " tot_champs_since_62,\n", " round(100*tot_elite_champs/tot_champs_since_62, 1))" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleaguepositionage
4721976-1977Kevin Keegan12Striker25.9
5221972-1973Kevin Keegan13Striker21.9
4851975-1976John Toshack16Striker26.8
4111981-1982Ian Rush17Striker20.2
\n", "
" ], "text/plain": [ " season player league position age\n", "472 1976-1977 Kevin Keegan 12 Striker 25.9\n", "522 1972-1973 Kevin Keegan 13 Striker 21.9\n", "485 1975-1976 John Toshack 16 Striker 26.8\n", "411 1981-1982 Ian Rush 17 Striker 20.2" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show the 4 title winning seasons since 1962 that didn't have an elite scorer\n", "dflfc_scorers_tl_pos_age[(dflfc_scorers_tl_pos_age.season.str[0:4] >= '1962') & \n", " (dflfc_scorers_tl_pos_age.season.isin(CHAMPS))].sort(['season', 'league'], ascending=[True, False])\\\n", " .groupby(dflfc_scorers_tl_pos_age.season).head(1).sort('league').head(4)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonplayerleaguepositionage
4111981-1982Ian Rush17Striker20.2
4121981-1982Terry McDermott14Midfielder30.1
4131981-1982Kenny Dalglish13Striker30.9
4721976-1977Kevin Keegan12Striker25.9
4731976-1977John Toshack10Striker27.8
4741976-1977Steve Heighway8Midfielder29.1
4851975-1976John Toshack16Striker26.8
4861975-1976Kevin Keegan12Striker24.9
4871975-1976David Fairclough7Striker19.0
5221972-1973Kevin Keegan13Striker21.9
5231972-1973John Toshack13Striker23.8
5241972-1973Peter Cormack8Midfielder26.5
\n", "
" ], "text/plain": [ " season player league position age\n", "411 1981-1982 Ian Rush 17 Striker 20.2\n", "412 1981-1982 Terry McDermott 14 Midfielder 30.1\n", "413 1981-1982 Kenny Dalglish 13 Striker 30.9\n", "472 1976-1977 Kevin Keegan 12 Striker 25.9\n", "473 1976-1977 John Toshack 10 Striker 27.8\n", "474 1976-1977 Steve Heighway 8 Midfielder 29.1\n", "485 1975-1976 John Toshack 16 Striker 26.8\n", "486 1975-1976 Kevin Keegan 12 Striker 24.9\n", "487 1975-1976 David Fairclough 7 Striker 19.0\n", "522 1972-1973 Kevin Keegan 13 Striker 21.9\n", "523 1972-1973 John Toshack 13 Striker 23.8\n", "524 1972-1973 Peter Cormack 8 Midfielder 26.5" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show top goalscorers in modern seasons when Liverpool won the league without a striker scoring >20\n", "s = ['1976-1977', '1972-1973', '1975-1976', '1981-1982']\n", "dflfc_scorers_tl_pos_age[dflfc_scorers_tl_pos_age.season.isin(s)].groupby('season').head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Show distribution of strikers with more than 20 goals by age" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(26, 27] 4\n", "(25, 26] 4\n", "(24, 25] 3\n", "(29, 30] 2\n", "(27, 28] 2\n", "(30, 31] 1\n", "(28, 29] 1\n", "(23, 24] 1\n", "(22, 23] 1\n", "(21, 22] 1\n", "(20, 21] 1\n", "(19, 20] 1\n", "dtype: int64" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create 'cut' of value counts\n", "pd.value_counts(pd.cut(dflfc_elite.age.values, range(19,32)))" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0
19 to 201
20 to 211
21 to 221
22 to 231
23 to 241
24 to 253
25 to 264
26 to 274
27 to 282
28 to 291
29 to 302
30 to 311
\n", "
" ], "text/plain": [ " 0\n", "19 to 20 1\n", "20 to 21 1\n", "21 to 22 1\n", "22 to 23 1\n", "23 to 24 1\n", "24 to 25 3\n", "25 to 26 4\n", "26 to 27 4\n", "27 to 28 2\n", "28 to 29 1\n", "29 to 30 2\n", "30 to 31 1" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create dataframe of value counts of age cut into 1 year bins from 19 to 31\n", "MIN_AGE = int(np.floor(dflfc_elite.age.min()))\n", "MAX_AGE = int(np.ceil(dflfc_elite.age.max()))\n", "\n", "df = pd.DataFrame(pd.value_counts(pd.cut(dflfc_elite.age.values, \n", " range(MIN_AGE, MAX_AGE+1), \n", " labels=['{} to {}'.format(i, i+1) for i in range(MIN_AGE, MAX_AGE)])))\n", "df.sort_index(inplace=True)\n", "df" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nHt3peCZNmqTjjjuu09cAALqnhi04WlrS/IzAhx9+WPZr7fZ/mbuj/ktr2rRpOvjggzVmzBjNmDFD\n06dP10477aTdd9+9tdCZOXOmLrvssqUab+k8djbPzc3Nuv/++/XII4/okUce0b333qupU5ftd7cq\ntVwAAI2n7gqOWbNmacCAARo7dqwGDhyoAw88UO+++66k7IjCKaecoqFDh+rKK6/UTTfdpB133FFD\nhw7VQQcdpAULFrS+7r//+7+19dZba7vtttOzzz4rSbr22mu1/fbba9ttt9WoUaP02muvSZImTJig\nww47TJ/97Gd1+OGHa/bs2frSl76k4cOHa/jw4brzzjslSW+88YZ23XVXbbXVVvrqV7/a6fXGJ510\nkrbaait94Qtf0OzZs/Xss89q6NChrcOffvrpxbpLffTRRzr++ON13XXXadSoUa076wMOOEDnnHOO\nTj89+zmBU045Rbfddpu22WYbnXfeeWppadHJJ5+s4cOHa/DgwbrwwgslZYXDiBEj9MUvflFbbrml\npk6dulj3+PHjdd5557VO/9RTT9XEiRO13nrraeHChXr//ff17rvv6oMPPtDHP579+vONN96oLbbY\nQkOHDtXkyZNb3ztnzhztu+++Gjx4sHbYYQc9/PDDbeavs89i3LhxGjlypPr376/zzz+/w2UEAGgg\ntbzhSDb5xc2cOTNsx5133hkREePGjYtzzz03IiL69esXP/nJTyIi4vXXX4+dd9453nnnnYiI+NGP\nfhRnnnlm6+vOOeeciIi45JJLYu+9946IiLlz57ZO53e/+11861vfioiI8ePHx7Bhw+K9996LiIgx\nY8bE7bffHhERzz//fGyxxRYREXHcccfFWWedFRER119/fdiON954o8082I7LLrssIiLOPPPMOPbY\nYyMiYuTIkfHggw9GRMR3v/vd+OUvfxnXXHNNnH766W3G8Y9//CNOO+201qzbbLNNHHXUUTF27NiI\niNh5550jIqK5ubl1/iIifvvb38bZZ58dERHvvfdeDBs2LGbOnBlTpkyJVVZZJWbNmhUR0aZ71qxZ\nse2220ZExEcffRT9+/ePOXPmRETEqaeeGmuuuWasscYarZnefffd2GijjeKZZ56JiIiDDjooRo8e\nHRERxx57bOtnccstt8SQIUMiIuKiiy5qXRadfRY77bRTLFy4MGbPnh19+vSJDz/8sM3yAQDUp3zf\n3mafX9Nbm3dko4020g477CBJGjt2rCZOnKhvfetbkqSDDz5YknT33Xfrscce04477ihJWrhwYetz\nSRozZowk6ZBDDtGJJ54oSXrxxRd10EEH6ZVXXtHChQu12WabScoO9e+zzz5accUVJUk333yzHn/8\n8dZxzZ8/XwsWLNBtt93W+p/8nnvuqbXWWqvd/D169GjNOXbsWO2///6SpKOPPloXXXSRfvazn+mK\nK67Qvffeq7XWWqvdtg8zZszQ9ttvr9dff12XXnqp7r77bs2YMUOHHHKIJGn99dfX7Nmz2xxluemm\nm/Twww/rqquukiTNmzdPzzzzjHr27Knhw4drk002aX1tcfcmm2yiPn366MEHH9Qrr7yibbfdVmut\ntZZuvfVWTZkyRS+99JIiQqNGjdJuu+2mVVddVZtuuqn69+/fOp+Foyl33HGH/vrX7BekR44cqTfe\neEPz589fLGdnn8Vee+2lXr16qU+fPlp33XX16quvaoMNNmh3WQMAGkNdFhzF5/ojYrHuVVZZpfX5\nqFGjymq/UHj/cccdp29/+9vae++9NXXqVE2YMKH1NSuvvPJi05w2bZp69+7dZlylO/glKc6///77\n64wzztAuu+yiYcOGdViwFPTo0UMzZ87UDjvsoN69e2vYsGFaZ511JElz587V2muv3e77fvnLX2rU\nqFGL9Wtubl5s2Ulq010oiF599VWNGzdOUlbY7bHHHq3LZ4899tBdd92lXXfdtc18dtZd2n6js8+i\neLmvsMIKS9WuBgBQn+quDYckvfDCC7r77rslSZdddplGjBjR5jXbbbed7rjjjtb2GQsWLNDTTz/d\nOvwvf/lL69/CkY958+a1/qc8adKk1teW7hx33XVXTZw4sbX7oYcekiTtvPPOrQXO3//+d82dO7fd\n/C0tLbryyivb5F9ppZW022676ZhjjtGRRx7Z6TLYaqutNG3aNG222Wa66667tHDhQt1///2aPXu2\npkyZog033FA9evTQaqutttjRg912200XXHBB6076qaee0jvvvNPptAr2228/3XjjjZo+fbp22203\nSdKAAQM0depUffTRR/rggw80depUDRw4UAMGDNCsWbP03HPPSdJiV8qMGDFCf/rTnyRlhU7fvn3b\nXLlT7mcBAOge6rLg2HzzzfWrX/1KAwcO1FtvvaVjjjlG0uL/Jfft21eTJk3SmDFjNHjwYO244456\n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\nJcn2UEnvS1JEvK98O1An2BeVqWc1JpLIIZJ+LOlXtt/M+60paUo+rF78QtJaar+y/EmVs3TmPtt7\nRMTfCz0i4oz8MPGva5ir1H22V4uI+RFxZKFnvmGaV8NcbUTEdNujJB2r7CcLVqptonbdKml0/vwO\n2x/Pj8isL+n1GuZaTEScmhcXl0vqL2lFSV9Tdlrly7XMVmR+aY+ImC3pN/mjXnxP0j+UHSHcVdIf\nbfdWdsqvLk5J5k6WdIvthcr2VYdIUt6W57paBivBvqhMDXtKpSA/9Nsn73yj3v7TRfXYdr1+/rY3\nkDQkIm6odRagWP6feV9JrxeOGNaLPFsfSbPr9btdwL5oyer1MG9Z8nOlm0XE7PwRef+an88tZnt1\n2/3b6U/OZdBRTkl10d6goDhnRPynUGw0yvJsoJyDa5GnPY2QUWqzbrZExKt5W6i6+syVnc5dvXTn\nXW85bX9CWQPR2cqObuxv+9M1jtWG7U8UGo86u9rrS9XM2bAFh+2DJD0h6Wrbj+XnIwsurlGsNkpy\nPkrOrmnQnI2yfjZqzkm1SbW4Jaybk2qTqi2+Q5WVt9G6XdI029+UdIOkPSVdY7survKSOsy5h6qZ\nMyIa8qGsQeP6+fPhylbM/fPuB2qdj5zkJOfylbMRMpIzSc5HJa0iaR1ll70XMq9FzsUfjdxodIWI\neFmSIuIe2yMlXWd7oyW8r9rIWVnkrCxyVk4jZJTIWWkLI2KBpAW2nynKPDdv11Evap6zYU+pSJpX\nfK40X3gjld0AasuapWqLnJVFzsoiZ+U0QkaJnJXW4kV3FN2z0NPZnY/rqeCoec6GvUrF9hBJCyLi\n6ZL+vSUdFBGX1ibZ4shZWeSsLHJWTiNklMhZabY3kfSfiPigpP+GkraIiJtrk2xx9ZCzYQsOAADQ\nOBr5lAoAAGgQFBwAACC5Rr5KpVV+Tm9zZb8D8GTpOap6Qc7KImdlkbNyGiGjRM5KI+cSptvobThs\nNym7CUzh/vAbSzo8IqbWLFQ7yFlZ5KwsclZOI2SUyFlp5CxDNW72kfIh6X5Jmxd1f1rS/bXORU5y\nknP5zNkIGclJzlrk7A5tOHpGxJOFjoh4SvV5qoiclUXOyiJn5TRCRomclUbOJU24GhNJ7D7bv5d0\nqbKbl3xZ0vTaRmoXOSuLnJVFzspphIwSOSuNnEvQHdpwrCjpWEk75b1uk3RBRLxfu1RtkbOyyFlZ\n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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot\n", "ax = df.plot(kind='bar', figsize=(9, 6), grid=False, ylim=(0, 4.5), yticks=range(1,5), legend=False, color='r')\n", "ax.set_xlabel('Age')\n", "ax.set_ylabel('Number of players')\n", "ax.set_title('Number of players scoring 20 or more goals by Age')\n", "ax.text(-0.4, 4.3, 'prepared by: @terry8dolan', bbox=dict(facecolor='none', edgecolor='none', alpha=0.6))\n", "\n", "# plot and save current figure\n", "fig = plt.gcf() \n", "plt.show()\n", "fig.savefig('20+PlayervsAge.png', bbox_inches='tight')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.8" } }, "nbformat": 4, "nbformat_minor": 0 }