{ "cells": [ { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "np=pd.np\n", "from sdd_api.api import Api\n", "from credentials import *\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "pd.options.display.max_columns=None\n", "api = Api(username=username, password=password, client_id=client_id, client_secret=client_secret)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonhome_nameaway_namefull_game_typeaway_first_downsaway_pass_ydsaway_ptsaway_rush_ydsaway_toaway_yardsgame_datetimegame_locationgame_outcomegame_timegame_typehad_overtimehome_first_downshome_pass_ydshome_ptshome_rush_ydshome_tohome_yardsteamsweek_numaway_conferenceconference_playhome_lineover_underhandicap_differencehome_conferenceline_movesmatchup_id
762016DENCARWeek 121.0176.020.0157.01.0333.01473367200000NoneW8:40PM ETRegularFalse21.0159.021.0148.03.0307.0CAR,DEN1.0NFCInter3.040.53.0AFC1920160908CAR@DEN
1192016JACGBWeek 118.0199.027.095.0NaN294.01473599040000NoneL1:04PM ETRegularFalse20.0300.023.048.01.0348.0GB,JAC1.0NFCInter3.547.00.5AFC2420160911GB@JAC
182016BALBUFWeek 111.095.07.065.0NaN160.01473599040000NoneW1:04PM ETRegularFalse18.0225.013.083.01.0308.0BAL,BUF1.0AFCAFC-3.044.50.5AFC420160911BUF@BAL
172016ATLTBWeek 120.0281.031.090.01.0371.01473599100000NoneL1:05PM ETRegularFalse19.0322.024.052.0NaN374.0ATL,TB1.0NFCNFC-2.547.00.5NFC1820160911TB@ATL
1832016NOOAKWeek 125.0319.035.0167.0NaN486.01473599100000NoneL1:05PM ETRegularFalse27.0419.034.088.01.0507.0NO,OAK1.0AFCInter-3.050.52.0NFC2520160911OAK@NO
2112016PHICLEWeek 114.0168.010.0120.01.0288.01473599100000NoneW1:05PM ETRegularFalse23.0270.029.0133.0NaN403.0CLE,PHI1.0AFCInter-4.041.53.0NFC3620160911CLE@PHI
1272016KCLACWeek 125.0233.027.0155.0NaN388.01473599100000NoneW1:05PM ETRegularTrue26.0330.033.083.01.0413.0KC,LAC1.0AFCAFC-6.546.00.5AFC1220160911LAC@KC
1962016NYJCINWeek 118.0324.023.057.01.0381.01473599100000NoneL1:05PM ETRegularFalse22.0188.022.0152.01.0340.0CIN,NYJ1.0AFCAFC1.042.00.0AFC3020160911CIN@NYJ
2582016TENMINWeek 115.0236.025.065.0NaN301.01473599100000NoneL1:05PM ETRegularFalse19.0252.016.064.03.0316.0MIN,TEN1.0NFCInter2.540.00.5AFC3220160911MIN@TEN
1002016HOUCHIWeek 114.0185.014.073.01.0258.01473599100000NoneW1:05PM ETRegularFalse17.0215.023.0129.01.0344.0CHI,HOU1.0NFCInter-5.542.50.0AFC2720160911CHI@HOU
2332016SEAMIAWeek 111.0150.010.064.0NaN214.01473610080000NoneW4:08PM ETRegularFalse21.0240.012.0112.02.0352.0MIA,SEA1.0AFCInter-10.544.03.0NFC4020160911MIA@SEA
712016DALNYGWeek 118.0203.020.0113.01.0316.01473611220000NoneL4:27PM ETRegularFalse24.0227.019.0101.0NaN328.0DAL,NYG1.0NFCNFC1.048.04.5NFC3320160911NYG@DAL
1102016INDDETWeek 128.0332.039.0116.0NaN448.01473611220000NoneL4:27PM ETRegularFalse25.0368.035.082.0NaN450.0DET,IND1.0NFCInter-2.551.03.0AFC3120160911DET@IND
12016ARINEWeek 119.0257.023.0106.02.0363.01473622200000NoneL7:30PM ETRegularFalse21.0252.021.092.0NaN344.0ARI,NE1.0AFCInter-9.044.59.0NFC1920160911NE@ARI
2672016WASPITWeek 123.0290.038.0147.01.0437.01473707460000NoneL7:11PM ETRegularFalse18.0329.016.055.02.0384.0PIT,WAS1.0AFCInter2.549.00.5NFC1320160912PIT@WAS
2382016SFLARWeek 110.0120.00.065.02.0185.01473718800000NoneW10:20PM ETRegularFalse28.0170.028.0150.01.0320.0LAR,SF1.0NFCNFC2.543.00.5NFC920160912LAR@SF
312016BUFNYJWeek 228.0370.037.0123.01.0493.01473971160000NoneL8:26PM ETRegularFalse16.0307.031.086.01.0393.0BUF,NYJ2.0AFCAFC-1.040.51.5AFC2920160915NYJ@BUF
1052016HOUKCWeek 214.0172.012.0119.03.0291.01474203720000NoneW1:02PM ETRegularFalse15.0254.019.097.02.0351.0HOU,KC2.0AFCAFC-1.042.00.5AFC2820160918KC@HOU
892016DETTENWeek 222.0224.016.0139.01.0363.01474203720000NoneL1:02PM ETRegularFalse22.0238.015.0137.01.0375.0DET,TEN2.0AFCInter-6.048.00.5NFC1720160918TEN@DET
582016CLEBALWeek 222.0302.025.080.02.0382.01474203720000NoneL1:02PM ETRegularFalse17.0242.020.0145.02.0387.0BAL,CLE2.0AFCAFC4.042.01.0AFC2620160918BAL@CLE
1732016NEMIAWeek 223.0387.024.070.04.0457.01474203720000NoneW1:02PM ETRegularFalse29.0302.031.0161.01.0463.0MIA,NE2.0AFCAFC-5.542.51.0AFC1520160918MIA@NE
2192016PITCINWeek 221.0366.016.046.02.0412.01474203720000NoneW1:02PM ETRegularFalse19.0250.024.0124.02.0374.0CIN,PIT2.0AFCAFC-3.048.50.5AFC1020160918CIN@PIT
1912016NYGNOWeek 216.0247.013.041.0NaN288.01474203780000NoneW1:03PM ETRegularFalse22.0353.016.064.03.0417.0NO,NYG2.0NFCNFC-3.554.00.5NFC1620160918NO@NYG
2622016WASDALWeek 224.0278.027.0102.01.0380.01474203780000NoneL1:03PM ETRegularFalse24.0350.023.082.01.0432.0DAL,WAS2.0NFCNFC-3.547.00.0NFC2020160918DAL@WAS
402016CARSFWeek 216.0237.027.065.03.0302.01474203780000NoneW1:03PM ETRegularFalse26.0353.046.0176.04.0529.0CAR,SF2.0NFCNFC-12.044.50.5NFC2520160918SF@CAR
62016ARITBWeek 221.0221.07.085.05.0306.01474203900000NoneW1:05PM ETRegularFalse20.0311.040.0105.0NaN416.0ARI,TB2.0NFCNFC-7.049.50.5NFC1520160918TB@ARI
1482016LARSEAWeek 217.0239.03.067.01.0306.01474214880000NoneW4:08PM ETRegularFalse17.0219.09.064.0NaN283.0LAR,SEA2.0NFCNFC5.538.02.0NFC4020160918SEA@LAR
1352016LACJACWeek 220.0319.014.069.03.0388.01474215900000NoneW4:25PM ETRegularFalse25.0207.038.0150.01.0357.0JAC,LAC2.0AFCAFC-3.047.50.5AFC1320160918JAC@LAC
782016DENINDWeek 219.0170.020.083.02.0253.01474215900000NoneW4:25PM ETRegularFalse24.0266.034.0134.01.0400.0DEN,IND2.0AFCAFC-6.047.02.0AFC1420160918IND@DEN
2022016OAKATLWeek 227.0389.035.0139.01.0528.01474215900000NoneL4:25PM ETRegularFalse29.0299.028.0155.0NaN454.0ATL,OAK2.0NFCInter-4.047.52.5AFC1420160918ATL@OAK
...................................................................................................
1232017KCMIAWeek 1615.0286.013.059.02.0345.01514120400000W1:00PM ETRegularFalse23.0301.029.0103.0NaN404.0KC,MIA16.0AFCAFC-11.043.51.0AFCNone20171224MIA@KC
2502017WASDENWeek 1618.0171.011.0159.03.0330.01514120400000W1:00PM ETRegularFalse19.0299.027.087.02.0386.0DEN,WAS16.0AFCInter-3.039.51.0NFCNone20171224DEN@WAS
392017CARTBWeek 1620.0326.019.066.03.0392.01514120400000W1:00PM ETRegularFalse20.0140.022.0115.01.0255.0CAR,TB16.0NFCNFC-10.047.01.0NFCNone20171224TB@CAR
2452017TENLARWeek 1620.0286.027.0116.01.0402.01514120400000L1:00PM ETRegularFalse19.0269.023.097.01.0366.0LAR,TEN16.0NFCInter5.546.51.0AFCNone20171224LAR@TEN
422017CHICLEWeek 1612.0178.03.075.03.0253.01514120400000W1:00PM ETRegularFalse16.0161.020.097.0NaN258.0CHI,CLE16.0AFCInter-6.037.01.0NFCNone20171224CLE@CHI
1612017NEBUFWeek 1617.0242.016.084.0NaN326.01514120400000W1:00PM ETRegularFalse28.0218.037.0193.01.0411.0BUF,NE16.0AFCAFC-11.047.50.5AFCNone20171224BUF@NE
1682017NOATLWeek 1615.0264.013.067.02.0331.01514120400000W1:00PM ETRegularFalse15.0229.023.086.01.0315.0ATL,NO16.0NFCNFC-5.552.00.5NFCNone20171224ATL@NO
1892017NYJLACWeek 1621.0290.014.089.0NaN379.01514120400000L1:00PM ETRegularFalse13.098.07.0197.03.0295.0LAC,NYJ16.0AFCAFC7.042.50.5AFCNone20171224LAC@NYJ
522017CINDETWeek 1615.0189.017.087.01.0276.01514120400000W1:00PM ETRegularFalse28.0222.026.0142.01.0364.0CIN,DET16.0NFCInter3.043.50.0AFCNone20171224DET@CIN
2272017SFJACWeek 1632.0380.033.092.03.0472.01514131500000W4:05PM ETRegularFalse26.0238.044.0131.01.0369.0JAC,SF16.0AFCInter4.043.01.5NFCNone20171224JAC@SF
702017DALSEAWeek 1615.060.021.076.0NaN136.01514132700000L4:25PM ETRegularFalse21.0155.012.0128.03.0283.0DAL,SEA16.0NFCNFC-4.547.51.5NFCNone20171224SEA@DAL
32017ARINYGWeek 1612.0250.00.043.03.0293.01514132700000W4:25PM ETRegularFalse19.0215.023.074.02.0289.0ARI,NYG16.0NFCNFC-3.039.02.0NFCNone20171224NYG@ARI
1012017HOUPITWeek 1620.0226.034.0104.0NaN330.01514219400000L4:30PM ETRegularFalse13.051.06.0176.02.0227.0HOU,PIT16.0AFCAFC9.045.51.0AFCNone20171225PIT@HOU
2052017PHIOAKWeek 1613.0137.010.0137.05.0274.01514233800000W8:30PM ETRegularFalse12.0138.019.078.02.0216.0OAK,PHI16.0AFCInter-10.046.02.0NFCNone20171225OAK@PHI
2022017PHIDALWeek 17NaNNaNNaNNaNNaNNaN15147252000001:00PM ETRegularFalseNaNNaNNaNNaNNaNNaNDAL,PHI17.0NFCNFCNaNNaNNaNNFCNone20171231DAL@PHI
2102017PITCLEWeek 17NaNNaNNaNNaNNaNNaN15147252000001:00PM ETRegularFalseNaNNaNNaNNaNNaNNaNCLE,PIT17.0AFCAFCNaNNaNNaNAFCNone20171231CLE@PIT
1672017NENYJWeek 17NaNNaNNaNNaNNaNNaN15147252000001:00PM ETRegularFalseNaNNaNNaNNaNNaNNaNNE,NYJ17.0AFCAFCNaNNaNNaNAFCNone20171231NYJ@NE
1532017MINCHIWeek 17NaNNaNNaNNaNNaNNaN15147252000001:00PM ETRegularFalseNaNNaNNaNNaNNaNNaNCHI,MIN17.0NFCNFCNaNNaNNaNNFCNone20171231CHI@MIN
852017DETGBWeek 17NaNNaNNaNNaNNaNNaN15147252000001:00PM ETRegularFalseNaNNaNNaNNaNNaNNaNDET,GB17.0NFCNFCNaNNaNNaNNFCNone20171231GB@DET
1832017NYGWASWeek 17NaNNaNNaNNaNNaNNaN15147252000001:00PM ETRegularFalseNaNNaNNaNNaNNaNNaNNYG,WAS17.0NFCNFCNaNNaNNaNNFCNone20171231WAS@NYG
1072017INDHOUWeek 17NaNNaNNaNNaNNaNNaN15147252000001:00PM ETRegularFalseNaNNaNNaNNaNNaNNaNHOU,IND17.0AFCAFCNaNNaNNaNAFCNone20171231HOU@IND
742017DENKCWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNDEN,KC17.0AFCAFCNaNNaNNaNAFCNone20171231KC@DEN
1422017LARSFWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNLAR,SF17.0NFCNFCNaNNaNNaNNFCNone20171231SF@LAR
92017ATLCARWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNATL,CAR17.0NFCNFCNaNNaNNaNNFCNone20171231CAR@ATL
172017BALCINWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNBAL,CIN17.0AFCAFCNaNNaNNaNAFCNone20171231CIN@BAL
1332017LACOAKWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNLAC,OAK17.0AFCAFCNaNNaNNaNAFCNone20171231OAK@LAC
2372017TBNOWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNNO,TB17.0NFCNFCNaNNaNNaNNFCNone20171231NO@TB
2162017SEAARIWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNARI,SEA17.0NFCNFCNaNNaNNaNNFCNone20171231ARI@SEA
2442017TENJACWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNJAC,TEN17.0AFCAFCNaNNaNNaNAFCNone20171231JAC@TEN
1442017MIABUFWeek 17NaNNaNNaNNaNNaNNaN15147375000004:25PM ETRegularFalseNaNNaNNaNNaNNaNNaNBUF,MIA17.0AFCAFCNaNNaNNaNAFCNone20171231BUF@MIA
\n", "

524 rows × 32 columns

\n", "
" ], "text/plain": [ " season home_name away_name full_game_type away_first_downs \\\n", "76 2016 DEN CAR Week 1 21.0 \n", "119 2016 JAC GB Week 1 18.0 \n", "18 2016 BAL BUF Week 1 11.0 \n", "17 2016 ATL TB Week 1 20.0 \n", "183 2016 NO OAK Week 1 25.0 \n", "211 2016 PHI CLE Week 1 14.0 \n", "127 2016 KC LAC Week 1 25.0 \n", "196 2016 NYJ CIN Week 1 18.0 \n", "258 2016 TEN MIN Week 1 15.0 \n", "100 2016 HOU CHI Week 1 14.0 \n", "233 2016 SEA MIA Week 1 11.0 \n", "71 2016 DAL NYG Week 1 18.0 \n", "110 2016 IND DET Week 1 28.0 \n", "1 2016 ARI NE Week 1 19.0 \n", "267 2016 WAS PIT Week 1 23.0 \n", "238 2016 SF LAR Week 1 10.0 \n", "31 2016 BUF NYJ Week 2 28.0 \n", "105 2016 HOU KC Week 2 14.0 \n", "89 2016 DET TEN Week 2 22.0 \n", "58 2016 CLE BAL Week 2 22.0 \n", "173 2016 NE MIA Week 2 23.0 \n", "219 2016 PIT CIN Week 2 21.0 \n", "191 2016 NYG NO Week 2 16.0 \n", "262 2016 WAS DAL Week 2 24.0 \n", "40 2016 CAR SF Week 2 16.0 \n", "6 2016 ARI TB Week 2 21.0 \n", "148 2016 LAR SEA Week 2 17.0 \n", "135 2016 LAC JAC Week 2 20.0 \n", "78 2016 DEN IND Week 2 19.0 \n", "202 2016 OAK ATL Week 2 27.0 \n", ".. ... ... ... ... ... \n", "123 2017 KC MIA Week 16 15.0 \n", "250 2017 WAS DEN Week 16 18.0 \n", "39 2017 CAR TB Week 16 20.0 \n", "245 2017 TEN LAR Week 16 20.0 \n", "42 2017 CHI CLE Week 16 12.0 \n", "161 2017 NE BUF Week 16 17.0 \n", "168 2017 NO ATL Week 16 15.0 \n", "189 2017 NYJ LAC Week 16 21.0 \n", "52 2017 CIN DET Week 16 15.0 \n", "227 2017 SF JAC Week 16 32.0 \n", "70 2017 DAL SEA Week 16 15.0 \n", "3 2017 ARI NYG Week 16 12.0 \n", "101 2017 HOU PIT Week 16 20.0 \n", "205 2017 PHI OAK Week 16 13.0 \n", "202 2017 PHI DAL Week 17 NaN \n", "210 2017 PIT CLE Week 17 NaN \n", "167 2017 NE NYJ Week 17 NaN \n", "153 2017 MIN CHI Week 17 NaN \n", "85 2017 DET GB Week 17 NaN \n", "183 2017 NYG WAS Week 17 NaN \n", "107 2017 IND HOU Week 17 NaN \n", "74 2017 DEN KC Week 17 NaN \n", "142 2017 LAR SF Week 17 NaN \n", "9 2017 ATL CAR Week 17 NaN \n", "17 2017 BAL CIN Week 17 NaN \n", "133 2017 LAC OAK Week 17 NaN \n", "237 2017 TB NO Week 17 NaN \n", "216 2017 SEA ARI Week 17 NaN \n", "244 2017 TEN JAC Week 17 NaN \n", "144 2017 MIA BUF Week 17 NaN \n", "\n", " away_pass_yds away_pts away_rush_yds away_to away_yards \\\n", "76 176.0 20.0 157.0 1.0 333.0 \n", "119 199.0 27.0 95.0 NaN 294.0 \n", "18 95.0 7.0 65.0 NaN 160.0 \n", "17 281.0 31.0 90.0 1.0 371.0 \n", "183 319.0 35.0 167.0 NaN 486.0 \n", "211 168.0 10.0 120.0 1.0 288.0 \n", "127 233.0 27.0 155.0 NaN 388.0 \n", "196 324.0 23.0 57.0 1.0 381.0 \n", "258 236.0 25.0 65.0 NaN 301.0 \n", "100 185.0 14.0 73.0 1.0 258.0 \n", "233 150.0 10.0 64.0 NaN 214.0 \n", "71 203.0 20.0 113.0 1.0 316.0 \n", "110 332.0 39.0 116.0 NaN 448.0 \n", "1 257.0 23.0 106.0 2.0 363.0 \n", "267 290.0 38.0 147.0 1.0 437.0 \n", "238 120.0 0.0 65.0 2.0 185.0 \n", "31 370.0 37.0 123.0 1.0 493.0 \n", "105 172.0 12.0 119.0 3.0 291.0 \n", "89 224.0 16.0 139.0 1.0 363.0 \n", "58 302.0 25.0 80.0 2.0 382.0 \n", "173 387.0 24.0 70.0 4.0 457.0 \n", "219 366.0 16.0 46.0 2.0 412.0 \n", "191 247.0 13.0 41.0 NaN 288.0 \n", "262 278.0 27.0 102.0 1.0 380.0 \n", "40 237.0 27.0 65.0 3.0 302.0 \n", "6 221.0 7.0 85.0 5.0 306.0 \n", "148 239.0 3.0 67.0 1.0 306.0 \n", "135 319.0 14.0 69.0 3.0 388.0 \n", "78 170.0 20.0 83.0 2.0 253.0 \n", "202 389.0 35.0 139.0 1.0 528.0 \n", ".. ... ... ... ... ... \n", "123 286.0 13.0 59.0 2.0 345.0 \n", "250 171.0 11.0 159.0 3.0 330.0 \n", "39 326.0 19.0 66.0 3.0 392.0 \n", "245 286.0 27.0 116.0 1.0 402.0 \n", "42 178.0 3.0 75.0 3.0 253.0 \n", "161 242.0 16.0 84.0 NaN 326.0 \n", "168 264.0 13.0 67.0 2.0 331.0 \n", "189 290.0 14.0 89.0 NaN 379.0 \n", "52 189.0 17.0 87.0 1.0 276.0 \n", "227 380.0 33.0 92.0 3.0 472.0 \n", "70 60.0 21.0 76.0 NaN 136.0 \n", "3 250.0 0.0 43.0 3.0 293.0 \n", "101 226.0 34.0 104.0 NaN 330.0 \n", "205 137.0 10.0 137.0 5.0 274.0 \n", "202 NaN NaN NaN NaN NaN \n", "210 NaN NaN NaN NaN NaN \n", "167 NaN NaN NaN NaN NaN \n", "153 NaN NaN NaN NaN NaN \n", "85 NaN NaN NaN NaN NaN \n", "183 NaN NaN NaN NaN NaN \n", "107 NaN NaN NaN NaN NaN \n", "74 NaN NaN NaN NaN NaN \n", "142 NaN NaN NaN NaN NaN \n", "9 NaN NaN NaN NaN NaN \n", "17 NaN NaN NaN NaN NaN \n", "133 NaN NaN NaN NaN NaN \n", "237 NaN NaN NaN NaN NaN \n", "216 NaN NaN NaN NaN NaN \n", "244 NaN NaN NaN NaN NaN \n", "144 NaN NaN NaN NaN NaN \n", "\n", " game_datetime game_location game_outcome game_time game_type \\\n", "76 1473367200000 None W 8:40PM ET Regular \n", "119 1473599040000 None L 1:04PM ET Regular \n", "18 1473599040000 None W 1:04PM ET Regular \n", "17 1473599100000 None L 1:05PM ET Regular \n", "183 1473599100000 None L 1:05PM ET Regular \n", "211 1473599100000 None W 1:05PM ET Regular \n", "127 1473599100000 None W 1:05PM ET Regular \n", "196 1473599100000 None L 1:05PM ET Regular \n", "258 1473599100000 None L 1:05PM ET Regular \n", "100 1473599100000 None W 1:05PM ET Regular \n", "233 1473610080000 None W 4:08PM ET Regular \n", "71 1473611220000 None L 4:27PM ET Regular \n", "110 1473611220000 None L 4:27PM ET Regular \n", "1 1473622200000 None L 7:30PM ET Regular \n", "267 1473707460000 None L 7:11PM ET Regular \n", "238 1473718800000 None W 10:20PM ET Regular \n", "31 1473971160000 None L 8:26PM ET Regular \n", "105 1474203720000 None W 1:02PM ET Regular \n", "89 1474203720000 None L 1:02PM ET Regular \n", "58 1474203720000 None L 1:02PM ET Regular \n", "173 1474203720000 None W 1:02PM ET Regular \n", "219 1474203720000 None W 1:02PM ET Regular \n", "191 1474203780000 None W 1:03PM ET Regular \n", "262 1474203780000 None L 1:03PM ET Regular \n", "40 1474203780000 None W 1:03PM ET Regular \n", "6 1474203900000 None W 1:05PM ET Regular \n", "148 1474214880000 None W 4:08PM ET Regular \n", "135 1474215900000 None W 4:25PM ET Regular \n", "78 1474215900000 None W 4:25PM ET Regular \n", "202 1474215900000 None L 4:25PM ET Regular \n", ".. ... ... ... ... ... \n", "123 1514120400000 W 1:00PM ET Regular \n", "250 1514120400000 W 1:00PM ET Regular \n", "39 1514120400000 W 1:00PM ET Regular \n", "245 1514120400000 L 1:00PM ET Regular \n", "42 1514120400000 W 1:00PM ET Regular \n", "161 1514120400000 W 1:00PM ET Regular \n", "168 1514120400000 W 1:00PM ET Regular \n", "189 1514120400000 L 1:00PM ET Regular \n", "52 1514120400000 W 1:00PM ET Regular \n", "227 1514131500000 W 4:05PM ET Regular \n", "70 1514132700000 L 4:25PM ET Regular \n", "3 1514132700000 W 4:25PM ET Regular \n", "101 1514219400000 L 4:30PM ET Regular \n", "205 1514233800000 W 8:30PM ET Regular \n", "202 1514725200000 1:00PM ET Regular \n", "210 1514725200000 1:00PM ET Regular \n", "167 1514725200000 1:00PM ET Regular \n", "153 1514725200000 1:00PM ET Regular \n", "85 1514725200000 1:00PM ET Regular \n", "183 1514725200000 1:00PM ET Regular \n", "107 1514725200000 1:00PM ET Regular \n", "74 1514737500000 4:25PM ET Regular \n", "142 1514737500000 4:25PM ET Regular \n", "9 1514737500000 4:25PM ET Regular \n", "17 1514737500000 4:25PM ET Regular \n", "133 1514737500000 4:25PM ET Regular \n", "237 1514737500000 4:25PM ET Regular \n", "216 1514737500000 4:25PM ET Regular \n", "244 1514737500000 4:25PM ET Regular \n", "144 1514737500000 4:25PM ET Regular \n", "\n", " had_overtime home_first_downs home_pass_yds home_pts home_rush_yds \\\n", "76 False 21.0 159.0 21.0 148.0 \n", "119 False 20.0 300.0 23.0 48.0 \n", "18 False 18.0 225.0 13.0 83.0 \n", "17 False 19.0 322.0 24.0 52.0 \n", "183 False 27.0 419.0 34.0 88.0 \n", "211 False 23.0 270.0 29.0 133.0 \n", "127 True 26.0 330.0 33.0 83.0 \n", "196 False 22.0 188.0 22.0 152.0 \n", "258 False 19.0 252.0 16.0 64.0 \n", "100 False 17.0 215.0 23.0 129.0 \n", "233 False 21.0 240.0 12.0 112.0 \n", "71 False 24.0 227.0 19.0 101.0 \n", "110 False 25.0 368.0 35.0 82.0 \n", "1 False 21.0 252.0 21.0 92.0 \n", "267 False 18.0 329.0 16.0 55.0 \n", "238 False 28.0 170.0 28.0 150.0 \n", "31 False 16.0 307.0 31.0 86.0 \n", "105 False 15.0 254.0 19.0 97.0 \n", "89 False 22.0 238.0 15.0 137.0 \n", "58 False 17.0 242.0 20.0 145.0 \n", "173 False 29.0 302.0 31.0 161.0 \n", "219 False 19.0 250.0 24.0 124.0 \n", "191 False 22.0 353.0 16.0 64.0 \n", "262 False 24.0 350.0 23.0 82.0 \n", "40 False 26.0 353.0 46.0 176.0 \n", "6 False 20.0 311.0 40.0 105.0 \n", "148 False 17.0 219.0 9.0 64.0 \n", "135 False 25.0 207.0 38.0 150.0 \n", "78 False 24.0 266.0 34.0 134.0 \n", "202 False 29.0 299.0 28.0 155.0 \n", ".. ... ... ... ... ... \n", "123 False 23.0 301.0 29.0 103.0 \n", "250 False 19.0 299.0 27.0 87.0 \n", "39 False 20.0 140.0 22.0 115.0 \n", "245 False 19.0 269.0 23.0 97.0 \n", "42 False 16.0 161.0 20.0 97.0 \n", "161 False 28.0 218.0 37.0 193.0 \n", "168 False 15.0 229.0 23.0 86.0 \n", "189 False 13.0 98.0 7.0 197.0 \n", "52 False 28.0 222.0 26.0 142.0 \n", "227 False 26.0 238.0 44.0 131.0 \n", "70 False 21.0 155.0 12.0 128.0 \n", "3 False 19.0 215.0 23.0 74.0 \n", "101 False 13.0 51.0 6.0 176.0 \n", "205 False 12.0 138.0 19.0 78.0 \n", "202 False NaN NaN NaN NaN \n", "210 False NaN NaN NaN NaN \n", "167 False NaN NaN NaN NaN \n", "153 False NaN NaN NaN NaN \n", "85 False NaN NaN NaN NaN \n", "183 False NaN NaN NaN NaN \n", "107 False NaN NaN NaN NaN \n", "74 False NaN NaN NaN NaN \n", "142 False NaN NaN NaN NaN \n", "9 False NaN NaN NaN NaN \n", "17 False NaN NaN NaN NaN \n", "133 False NaN NaN NaN NaN \n", "237 False NaN NaN NaN NaN \n", "216 False NaN NaN NaN NaN \n", "244 False NaN NaN NaN NaN \n", "144 False NaN NaN NaN NaN \n", "\n", " home_to home_yards teams week_num away_conference conference_play \\\n", "76 3.0 307.0 CAR,DEN 1.0 NFC Inter \n", "119 1.0 348.0 GB,JAC 1.0 NFC Inter \n", "18 1.0 308.0 BAL,BUF 1.0 AFC AFC \n", "17 NaN 374.0 ATL,TB 1.0 NFC NFC \n", "183 1.0 507.0 NO,OAK 1.0 AFC Inter \n", "211 NaN 403.0 CLE,PHI 1.0 AFC Inter \n", "127 1.0 413.0 KC,LAC 1.0 AFC AFC \n", "196 1.0 340.0 CIN,NYJ 1.0 AFC AFC \n", "258 3.0 316.0 MIN,TEN 1.0 NFC Inter \n", "100 1.0 344.0 CHI,HOU 1.0 NFC Inter \n", "233 2.0 352.0 MIA,SEA 1.0 AFC Inter \n", "71 NaN 328.0 DAL,NYG 1.0 NFC NFC \n", "110 NaN 450.0 DET,IND 1.0 NFC Inter \n", "1 NaN 344.0 ARI,NE 1.0 AFC Inter \n", "267 2.0 384.0 PIT,WAS 1.0 AFC Inter \n", "238 1.0 320.0 LAR,SF 1.0 NFC NFC \n", "31 1.0 393.0 BUF,NYJ 2.0 AFC AFC \n", "105 2.0 351.0 HOU,KC 2.0 AFC AFC \n", "89 1.0 375.0 DET,TEN 2.0 AFC Inter \n", "58 2.0 387.0 BAL,CLE 2.0 AFC AFC \n", "173 1.0 463.0 MIA,NE 2.0 AFC AFC \n", "219 2.0 374.0 CIN,PIT 2.0 AFC AFC \n", "191 3.0 417.0 NO,NYG 2.0 NFC NFC \n", "262 1.0 432.0 DAL,WAS 2.0 NFC NFC \n", "40 4.0 529.0 CAR,SF 2.0 NFC NFC \n", "6 NaN 416.0 ARI,TB 2.0 NFC NFC \n", "148 NaN 283.0 LAR,SEA 2.0 NFC NFC \n", "135 1.0 357.0 JAC,LAC 2.0 AFC AFC \n", "78 1.0 400.0 DEN,IND 2.0 AFC AFC \n", "202 NaN 454.0 ATL,OAK 2.0 NFC Inter \n", ".. ... ... ... ... ... ... \n", "123 NaN 404.0 KC,MIA 16.0 AFC AFC \n", "250 2.0 386.0 DEN,WAS 16.0 AFC Inter \n", "39 1.0 255.0 CAR,TB 16.0 NFC NFC \n", "245 1.0 366.0 LAR,TEN 16.0 NFC Inter \n", "42 NaN 258.0 CHI,CLE 16.0 AFC Inter \n", "161 1.0 411.0 BUF,NE 16.0 AFC AFC \n", "168 1.0 315.0 ATL,NO 16.0 NFC NFC \n", "189 3.0 295.0 LAC,NYJ 16.0 AFC AFC \n", "52 1.0 364.0 CIN,DET 16.0 NFC Inter \n", "227 1.0 369.0 JAC,SF 16.0 AFC Inter \n", "70 3.0 283.0 DAL,SEA 16.0 NFC NFC \n", "3 2.0 289.0 ARI,NYG 16.0 NFC NFC \n", "101 2.0 227.0 HOU,PIT 16.0 AFC AFC \n", "205 2.0 216.0 OAK,PHI 16.0 AFC Inter \n", "202 NaN NaN DAL,PHI 17.0 NFC NFC \n", "210 NaN NaN CLE,PIT 17.0 AFC AFC \n", "167 NaN NaN NE,NYJ 17.0 AFC AFC \n", "153 NaN NaN CHI,MIN 17.0 NFC NFC \n", "85 NaN NaN DET,GB 17.0 NFC NFC \n", "183 NaN NaN NYG,WAS 17.0 NFC NFC \n", "107 NaN NaN HOU,IND 17.0 AFC AFC \n", "74 NaN NaN DEN,KC 17.0 AFC AFC \n", "142 NaN NaN LAR,SF 17.0 NFC NFC \n", "9 NaN NaN ATL,CAR 17.0 NFC NFC \n", "17 NaN NaN BAL,CIN 17.0 AFC AFC \n", "133 NaN NaN LAC,OAK 17.0 AFC AFC \n", "237 NaN NaN NO,TB 17.0 NFC NFC \n", "216 NaN NaN ARI,SEA 17.0 NFC NFC \n", "244 NaN NaN JAC,TEN 17.0 AFC AFC \n", "144 NaN NaN BUF,MIA 17.0 AFC AFC \n", "\n", " home_line over_under handicap_difference home_conference line_moves \\\n", "76 3.0 40.5 3.0 AFC 19 \n", "119 3.5 47.0 0.5 AFC 24 \n", "18 -3.0 44.5 0.5 AFC 4 \n", "17 -2.5 47.0 0.5 NFC 18 \n", "183 -3.0 50.5 2.0 NFC 25 \n", "211 -4.0 41.5 3.0 NFC 36 \n", "127 -6.5 46.0 0.5 AFC 12 \n", "196 1.0 42.0 0.0 AFC 30 \n", "258 2.5 40.0 0.5 AFC 32 \n", "100 -5.5 42.5 0.0 AFC 27 \n", "233 -10.5 44.0 3.0 NFC 40 \n", "71 1.0 48.0 4.5 NFC 33 \n", "110 -2.5 51.0 3.0 AFC 31 \n", "1 -9.0 44.5 9.0 NFC 19 \n", "267 2.5 49.0 0.5 NFC 13 \n", "238 2.5 43.0 0.5 NFC 9 \n", "31 -1.0 40.5 1.5 AFC 29 \n", "105 -1.0 42.0 0.5 AFC 28 \n", "89 -6.0 48.0 0.5 NFC 17 \n", "58 4.0 42.0 1.0 AFC 26 \n", "173 -5.5 42.5 1.0 AFC 15 \n", "219 -3.0 48.5 0.5 AFC 10 \n", "191 -3.5 54.0 0.5 NFC 16 \n", "262 -3.5 47.0 0.0 NFC 20 \n", "40 -12.0 44.5 0.5 NFC 25 \n", "6 -7.0 49.5 0.5 NFC 15 \n", "148 5.5 38.0 2.0 NFC 40 \n", "135 -3.0 47.5 0.5 AFC 13 \n", "78 -6.0 47.0 2.0 AFC 14 \n", "202 -4.0 47.5 2.5 AFC 14 \n", ".. ... ... ... ... ... \n", "123 -11.0 43.5 1.0 AFC None \n", "250 -3.0 39.5 1.0 NFC None \n", "39 -10.0 47.0 1.0 NFC None \n", "245 5.5 46.5 1.0 AFC None \n", "42 -6.0 37.0 1.0 NFC None \n", "161 -11.0 47.5 0.5 AFC None \n", "168 -5.5 52.0 0.5 NFC None \n", "189 7.0 42.5 0.5 AFC None \n", "52 3.0 43.5 0.0 AFC None \n", "227 4.0 43.0 1.5 NFC None \n", "70 -4.5 47.5 1.5 NFC None \n", "3 -3.0 39.0 2.0 NFC None \n", "101 9.0 45.5 1.0 AFC None \n", "205 -10.0 46.0 2.0 NFC None \n", "202 NaN NaN NaN NFC None \n", "210 NaN NaN NaN AFC None \n", "167 NaN NaN NaN AFC None \n", "153 NaN NaN NaN NFC None \n", "85 NaN NaN NaN NFC None \n", "183 NaN NaN NaN NFC None \n", "107 NaN NaN NaN AFC None \n", "74 NaN NaN NaN AFC None \n", "142 NaN NaN NaN NFC None \n", "9 NaN NaN NaN NFC None \n", "17 NaN NaN NaN AFC None \n", "133 NaN NaN NaN AFC None \n", "237 NaN NaN NaN NFC None \n", "216 NaN NaN NaN NFC None \n", "244 NaN NaN NaN AFC None \n", "144 NaN NaN NaN AFC None \n", "\n", " matchup_id \n", "76 20160908CAR@DEN \n", "119 20160911GB@JAC \n", "18 20160911BUF@BAL \n", "17 20160911TB@ATL \n", "183 20160911OAK@NO \n", "211 20160911CLE@PHI \n", "127 20160911LAC@KC \n", "196 20160911CIN@NYJ \n", "258 20160911MIN@TEN \n", "100 20160911CHI@HOU \n", "233 20160911MIA@SEA \n", "71 20160911NYG@DAL \n", "110 20160911DET@IND \n", "1 20160911NE@ARI \n", "267 20160912PIT@WAS \n", "238 20160912LAR@SF \n", "31 20160915NYJ@BUF \n", "105 20160918KC@HOU \n", "89 20160918TEN@DET \n", "58 20160918BAL@CLE \n", "173 20160918MIA@NE \n", "219 20160918CIN@PIT \n", "191 20160918NO@NYG \n", "262 20160918DAL@WAS \n", "40 20160918SF@CAR \n", "6 20160918TB@ARI \n", "148 20160918SEA@LAR \n", "135 20160918JAC@LAC \n", "78 20160918IND@DEN \n", "202 20160918ATL@OAK \n", ".. ... \n", "123 20171224MIA@KC \n", "250 20171224DEN@WAS \n", "39 20171224TB@CAR \n", "245 20171224LAR@TEN \n", "42 20171224CLE@CHI \n", "161 20171224BUF@NE \n", "168 20171224ATL@NO \n", "189 20171224LAC@NYJ \n", "52 20171224DET@CIN \n", "227 20171224JAC@SF \n", "70 20171224SEA@DAL \n", "3 20171224NYG@ARI \n", "101 20171225PIT@HOU \n", "205 20171225OAK@PHI \n", "202 20171231DAL@PHI \n", "210 20171231CLE@PIT \n", "167 20171231NYJ@NE \n", "153 20171231CHI@MIN \n", "85 20171231GB@DET \n", "183 20171231WAS@NYG \n", "107 20171231HOU@IND \n", "74 20171231KC@DEN \n", "142 20171231SF@LAR \n", "9 20171231CAR@ATL \n", "17 20171231CIN@BAL \n", "133 20171231OAK@LAC \n", "237 20171231NO@TB \n", "216 20171231ARI@SEA \n", "244 20171231JAC@TEN \n", "144 20171231BUF@MIA \n", "\n", "[524 rows x 32 columns]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "matchups=api.get_dataframe(\"matchups\",season_start=2016)\n", "matchups.sort_values(by=\"game_datetime\")" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "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", "
home_nameaway_namefull_game_typeaway_first_downsaway_pass_ydsaway_ptsaway_rush_ydsaway_toaway_yardsgame_datetimegame_locationgame_outcomegame_timegame_typehad_overtimehome_first_downshome_pass_ydshome_ptshome_rush_ydshome_tohome_yardsteamsweek_numaway_conferenceconference_playhome_lineover_underhandicap_differencehome_conferenceline_movesmatchup_id
season
2016268268268268.0268.0268.0268.0268.0268.0268268268268268268268.0268.0268.0268.0268.0268.0268268.0268268268.0268.0268.0268268268
2017256256256256.0256.0256.0256.0256.0256.0256256256256256256256.0256.0256.0256.0256.0256.0256256.0256256256.0256.0256.0256256256
\n", "
" ], "text/plain": [ " home_name away_name full_game_type away_first_downs away_pass_yds \\\n", "season \n", "2016 268 268 268 268.0 268.0 \n", "2017 256 256 256 256.0 256.0 \n", "\n", " away_pts away_rush_yds away_to away_yards game_datetime \\\n", "season \n", "2016 268.0 268.0 268.0 268.0 268 \n", "2017 256.0 256.0 256.0 256.0 256 \n", "\n", " game_location game_outcome game_time game_type had_overtime \\\n", "season \n", "2016 268 268 268 268 268 \n", "2017 256 256 256 256 256 \n", "\n", " home_first_downs home_pass_yds home_pts home_rush_yds home_to \\\n", "season \n", "2016 268.0 268.0 268.0 268.0 268.0 \n", "2017 256.0 256.0 256.0 256.0 256.0 \n", "\n", " home_yards teams week_num away_conference conference_play \\\n", "season \n", "2016 268.0 268 268.0 268 268 \n", "2017 256.0 256 256.0 256 256 \n", "\n", " home_line over_under handicap_difference home_conference \\\n", "season \n", "2016 268.0 268.0 268.0 268 \n", "2017 256.0 256.0 256.0 256 \n", "\n", " line_moves matchup_id \n", "season \n", "2016 268 268 \n", "2017 256 256 " ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "matchups.sort_values(by=\"game_datetime\").groupby(\"season\").agg(len)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Lets Predict the Game Winner \n", "We'll use data from 2011 season and on since we have line information for these games" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonhome_nameaway_namefull_game_typeaway_first_downsaway_pass_ydsaway_ptsaway_rush_ydsaway_toaway_yardsgame_datetimegame_locationgame_outcomegame_timegame_typehad_overtimehome_first_downshome_pass_ydshome_ptshome_rush_ydshome_tohome_yardsteamsweek_numaway_conferenceconference_playhome_lineover_underhandicap_differencehome_conferenceline_movesmatchup_id
2142017PITNEWeek 1521.0283.027.077.01.0360.01513527900000L4:25PM ETRegularFalse21.0270.024.0143.01.0413.0NE,PIT15.0AFCAFC2.552.51.5AFCNone20171217NE@PIT
2312017SFTENWeek 1523.0238.023.090.01.0328.01513527900000W4:25PM ETRegularFalse23.0363.025.051.0NaN414.0SF,TEN15.0AFCInter-2.544.52.5NFCNone20171217TEN@SF
1932017OAKDALWeek 1521.0204.020.0126.02.0330.01513542600000L8:30PM ETRegularFalse19.0171.017.0122.01.0293.0DAL,OAK15.0NFCInter3.046.51.5AFCNone20171217DAL@OAK
2322017TBATLWeek 1524.0209.024.0201.0NaN410.01513629000000L8:30PM ETRegularFalse22.0289.021.084.01.0373.0ATL,TB15.0NFCNFC7.049.53.0NFCNone20171218ATL@TB
212017BALINDWeek 1617.0203.016.093.0NaN296.01514046600000W4:30PM ETRegularFalse23.0220.023.0103.0NaN323.0BAL,IND16.0AFCAFC-13.541.01.0AFCNone20171223IND@BAL
922017GBMINWeek 1615.0124.016.0112.0NaN236.01514061000000L8:30PM ETRegularFalse12.0126.00.0113.02.0239.0GB,MIN16.0NFCNFC9.041.00.0NFCNone20171223MIN@GB
392017CARTBWeek 1620.0326.019.066.03.0392.01514120400000W1:00PM ETRegularFalse20.0140.022.0115.01.0255.0CAR,TB16.0NFCNFC-10.047.01.0NFCNone20171224TB@CAR
1232017KCMIAWeek 1615.0286.013.059.02.0345.01514120400000W1:00PM ETRegularFalse23.0301.029.0103.0NaN404.0KC,MIA16.0AFCAFC-11.043.51.0AFCNone20171224MIA@KC
1612017NEBUFWeek 1617.0242.016.084.0NaN326.01514120400000W1:00PM ETRegularFalse28.0218.037.0193.01.0411.0BUF,NE16.0AFCAFC-11.047.50.5AFCNone20171224BUF@NE
2452017TENLARWeek 1620.0286.027.0116.01.0402.01514120400000L1:00PM ETRegularFalse19.0269.023.097.01.0366.0LAR,TEN16.0NFCInter5.546.51.0AFCNone20171224LAR@TEN
1892017NYJLACWeek 1621.0290.014.089.0NaN379.01514120400000L1:00PM ETRegularFalse13.098.07.0197.03.0295.0LAC,NYJ16.0AFCAFC7.042.50.5AFCNone20171224LAC@NYJ
422017CHICLEWeek 1612.0178.03.075.03.0253.01514120400000W1:00PM ETRegularFalse16.0161.020.097.0NaN258.0CHI,CLE16.0AFCInter-6.037.01.0NFCNone20171224CLE@CHI
1682017NOATLWeek 1615.0264.013.067.02.0331.01514120400000W1:00PM ETRegularFalse15.0229.023.086.01.0315.0ATL,NO16.0NFCNFC-5.552.00.5NFCNone20171224ATL@NO
522017CINDETWeek 1615.0189.017.087.01.0276.01514120400000W1:00PM ETRegularFalse28.0222.026.0142.01.0364.0CIN,DET16.0NFCInter3.043.50.0AFCNone20171224DET@CIN
2502017WASDENWeek 1618.0171.011.0159.03.0330.01514120400000W1:00PM ETRegularFalse19.0299.027.087.02.0386.0DEN,WAS16.0AFCInter-3.039.51.0NFCNone20171224DEN@WAS
2272017SFJACWeek 1632.0380.033.092.03.0472.01514131500000W4:05PM ETRegularFalse26.0238.044.0131.01.0369.0JAC,SF16.0AFCInter4.043.01.5NFCNone20171224JAC@SF
702017DALSEAWeek 1615.060.021.076.0NaN136.01514132700000L4:25PM ETRegularFalse21.0155.012.0128.03.0283.0DAL,SEA16.0NFCNFC-4.547.51.5NFCNone20171224SEA@DAL
32017ARINYGWeek 1612.0250.00.043.03.0293.01514132700000W4:25PM ETRegularFalse19.0215.023.074.02.0289.0ARI,NYG16.0NFCNFC-3.039.02.0NFCNone20171224NYG@ARI
1012017HOUPITWeek 1620.0226.034.0104.0NaN330.01514219400000L4:30PM ETRegularFalse13.051.06.0176.02.0227.0HOU,PIT16.0AFCAFC9.045.51.0AFCNone20171225PIT@HOU
2052017PHIOAKWeek 1613.0137.010.0137.05.0274.01514233800000W8:30PM ETRegularFalse12.0138.019.078.02.0216.0OAK,PHI16.0AFCInter-10.046.02.0NFCNone20171225OAK@PHI
\n", "
" ], "text/plain": [ " season home_name away_name full_game_type away_first_downs \\\n", "214 2017 PIT NE Week 15 21.0 \n", "231 2017 SF TEN Week 15 23.0 \n", "193 2017 OAK DAL Week 15 21.0 \n", "232 2017 TB ATL Week 15 24.0 \n", "21 2017 BAL IND Week 16 17.0 \n", "92 2017 GB MIN Week 16 15.0 \n", "39 2017 CAR TB Week 16 20.0 \n", "123 2017 KC MIA Week 16 15.0 \n", "161 2017 NE BUF Week 16 17.0 \n", "245 2017 TEN LAR Week 16 20.0 \n", "189 2017 NYJ LAC Week 16 21.0 \n", "42 2017 CHI CLE Week 16 12.0 \n", "168 2017 NO ATL Week 16 15.0 \n", "52 2017 CIN DET Week 16 15.0 \n", "250 2017 WAS DEN Week 16 18.0 \n", "227 2017 SF JAC Week 16 32.0 \n", "70 2017 DAL SEA Week 16 15.0 \n", "3 2017 ARI NYG Week 16 12.0 \n", "101 2017 HOU PIT Week 16 20.0 \n", "205 2017 PHI OAK Week 16 13.0 \n", "\n", " away_pass_yds away_pts away_rush_yds away_to away_yards \\\n", "214 283.0 27.0 77.0 1.0 360.0 \n", "231 238.0 23.0 90.0 1.0 328.0 \n", "193 204.0 20.0 126.0 2.0 330.0 \n", "232 209.0 24.0 201.0 NaN 410.0 \n", "21 203.0 16.0 93.0 NaN 296.0 \n", "92 124.0 16.0 112.0 NaN 236.0 \n", "39 326.0 19.0 66.0 3.0 392.0 \n", "123 286.0 13.0 59.0 2.0 345.0 \n", "161 242.0 16.0 84.0 NaN 326.0 \n", "245 286.0 27.0 116.0 1.0 402.0 \n", "189 290.0 14.0 89.0 NaN 379.0 \n", "42 178.0 3.0 75.0 3.0 253.0 \n", "168 264.0 13.0 67.0 2.0 331.0 \n", "52 189.0 17.0 87.0 1.0 276.0 \n", "250 171.0 11.0 159.0 3.0 330.0 \n", "227 380.0 33.0 92.0 3.0 472.0 \n", "70 60.0 21.0 76.0 NaN 136.0 \n", "3 250.0 0.0 43.0 3.0 293.0 \n", "101 226.0 34.0 104.0 NaN 330.0 \n", "205 137.0 10.0 137.0 5.0 274.0 \n", "\n", " game_datetime game_location game_outcome game_time game_type \\\n", "214 1513527900000 L 4:25PM ET Regular \n", "231 1513527900000 W 4:25PM ET Regular \n", "193 1513542600000 L 8:30PM ET Regular \n", "232 1513629000000 L 8:30PM ET Regular \n", "21 1514046600000 W 4:30PM ET Regular \n", "92 1514061000000 L 8:30PM ET Regular \n", "39 1514120400000 W 1:00PM ET Regular \n", "123 1514120400000 W 1:00PM ET Regular \n", "161 1514120400000 W 1:00PM ET Regular \n", "245 1514120400000 L 1:00PM ET Regular \n", "189 1514120400000 L 1:00PM ET Regular \n", "42 1514120400000 W 1:00PM ET Regular \n", "168 1514120400000 W 1:00PM ET Regular \n", "52 1514120400000 W 1:00PM ET Regular \n", "250 1514120400000 W 1:00PM ET Regular \n", "227 1514131500000 W 4:05PM ET Regular \n", "70 1514132700000 L 4:25PM ET Regular \n", "3 1514132700000 W 4:25PM ET Regular \n", "101 1514219400000 L 4:30PM ET Regular \n", "205 1514233800000 W 8:30PM ET Regular \n", "\n", " had_overtime home_first_downs home_pass_yds home_pts home_rush_yds \\\n", "214 False 21.0 270.0 24.0 143.0 \n", "231 False 23.0 363.0 25.0 51.0 \n", "193 False 19.0 171.0 17.0 122.0 \n", "232 False 22.0 289.0 21.0 84.0 \n", "21 False 23.0 220.0 23.0 103.0 \n", "92 False 12.0 126.0 0.0 113.0 \n", "39 False 20.0 140.0 22.0 115.0 \n", "123 False 23.0 301.0 29.0 103.0 \n", "161 False 28.0 218.0 37.0 193.0 \n", "245 False 19.0 269.0 23.0 97.0 \n", "189 False 13.0 98.0 7.0 197.0 \n", "42 False 16.0 161.0 20.0 97.0 \n", "168 False 15.0 229.0 23.0 86.0 \n", "52 False 28.0 222.0 26.0 142.0 \n", "250 False 19.0 299.0 27.0 87.0 \n", "227 False 26.0 238.0 44.0 131.0 \n", "70 False 21.0 155.0 12.0 128.0 \n", "3 False 19.0 215.0 23.0 74.0 \n", "101 False 13.0 51.0 6.0 176.0 \n", "205 False 12.0 138.0 19.0 78.0 \n", "\n", " home_to home_yards teams week_num away_conference conference_play \\\n", "214 1.0 413.0 NE,PIT 15.0 AFC AFC \n", "231 NaN 414.0 SF,TEN 15.0 AFC Inter \n", "193 1.0 293.0 DAL,OAK 15.0 NFC Inter \n", "232 1.0 373.0 ATL,TB 15.0 NFC NFC \n", "21 NaN 323.0 BAL,IND 16.0 AFC AFC \n", "92 2.0 239.0 GB,MIN 16.0 NFC NFC \n", "39 1.0 255.0 CAR,TB 16.0 NFC NFC \n", "123 NaN 404.0 KC,MIA 16.0 AFC AFC \n", "161 1.0 411.0 BUF,NE 16.0 AFC AFC \n", "245 1.0 366.0 LAR,TEN 16.0 NFC Inter \n", "189 3.0 295.0 LAC,NYJ 16.0 AFC AFC \n", "42 NaN 258.0 CHI,CLE 16.0 AFC Inter \n", "168 1.0 315.0 ATL,NO 16.0 NFC NFC \n", "52 1.0 364.0 CIN,DET 16.0 NFC Inter \n", "250 2.0 386.0 DEN,WAS 16.0 AFC Inter \n", "227 1.0 369.0 JAC,SF 16.0 AFC Inter \n", "70 3.0 283.0 DAL,SEA 16.0 NFC NFC \n", "3 2.0 289.0 ARI,NYG 16.0 NFC NFC \n", "101 2.0 227.0 HOU,PIT 16.0 AFC AFC \n", "205 2.0 216.0 OAK,PHI 16.0 AFC Inter \n", "\n", " home_line over_under handicap_difference home_conference line_moves \\\n", "214 2.5 52.5 1.5 AFC None \n", "231 -2.5 44.5 2.5 NFC None \n", "193 3.0 46.5 1.5 AFC None \n", "232 7.0 49.5 3.0 NFC None \n", "21 -13.5 41.0 1.0 AFC None \n", "92 9.0 41.0 0.0 NFC None \n", "39 -10.0 47.0 1.0 NFC None \n", "123 -11.0 43.5 1.0 AFC None \n", "161 -11.0 47.5 0.5 AFC None \n", "245 5.5 46.5 1.0 AFC None \n", "189 7.0 42.5 0.5 AFC None \n", "42 -6.0 37.0 1.0 NFC None \n", "168 -5.5 52.0 0.5 NFC None \n", "52 3.0 43.5 0.0 AFC None \n", "250 -3.0 39.5 1.0 NFC None \n", "227 4.0 43.0 1.5 NFC None \n", "70 -4.5 47.5 1.5 NFC None \n", "3 -3.0 39.0 2.0 NFC None \n", "101 9.0 45.5 1.0 AFC None \n", "205 -10.0 46.0 2.0 NFC None \n", "\n", " matchup_id \n", "214 20171217NE@PIT \n", "231 20171217TEN@SF \n", "193 20171217DAL@OAK \n", "232 20171218ATL@TB \n", "21 20171223IND@BAL \n", "92 20171223MIN@GB \n", "39 20171224TB@CAR \n", "123 20171224MIA@KC \n", "161 20171224BUF@NE \n", "245 20171224LAR@TEN \n", "189 20171224LAC@NYJ \n", "42 20171224CLE@CHI \n", "168 20171224ATL@NO \n", "52 20171224DET@CIN \n", "250 20171224DEN@WAS \n", "227 20171224JAC@SF \n", "70 20171224SEA@DAL \n", "3 20171224NYG@ARI \n", "101 20171225PIT@HOU \n", "205 20171225OAK@PHI " ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "matchups=matchups[(matchups['game_type'].isin(['Regular','Playoffs']))]\n", "#drop any unscored/unplayed games\n", "matchups=matchups.dropna(subset=[\"home_pts\",\"away_pts\"])\n", "matchups=matchups.sort_values(by=[\"game_datetime\"])\n", "matchups.tail(20)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", "
seasonaway_first_downsaway_pass_ydsaway_ptsaway_rush_ydsaway_toaway_yardsgame_datetimehome_first_downshome_pass_ydshome_ptshome_rush_ydshome_tohome_yardsweek_numhome_lineover_underhandicap_difference
count507.000000507.000000507.000000507.000000507.000000370.000000507.0000005.070000e+02507.000000507.000000507.000000507.000000359.000000507.000000507.000000507.000000507.000000507.000000
mean2016.47337319.136095229.37869821.043393104.0749511.943243333.4536491.493335e+1220.558185239.57988223.737673114.1656801.874652353.7455628.658777-2.07495145.0759371.345168
std0.4997844.90132173.8788579.44874349.0560531.08925382.2307521.574378e+104.75174972.93385310.04162448.6850431.02122679.2387974.9287355.4830234.0450351.361233
min2016.0000006.0000006.0000000.0000006.0000001.000000100.0000001.473367e+125.00000051.0000000.00000014.0000001.000000123.0000001.000000-17.00000036.5000000.000000
25%2016.00000016.000000178.00000014.00000067.0000001.000000279.0000001.478443e+1217.000000189.00000017.00000080.0000001.000000295.5000004.000000-6.00000042.0000000.500000
50%2016.00000019.000000228.00000020.00000095.0000002.000000333.0000001.483288e+1220.000000238.00000024.000000106.0000002.000000349.0000009.000000-3.00000044.5000001.000000
75%2017.00000022.000000281.50000027.000000134.0000002.000000387.0000001.509282e+1224.000000287.00000030.000000142.0000002.000000408.00000013.0000002.50000047.5000002.000000
max2017.00000033.000000498.00000051.000000298.0000008.000000626.0000001.514234e+1237.000000486.00000057.000000313.0000005.000000589.00000017.00000011.50000060.0000009.000000
\n", "
" ], "text/plain": [ " season away_first_downs away_pass_yds away_pts \\\n", "count 507.000000 507.000000 507.000000 507.000000 \n", "mean 2016.473373 19.136095 229.378698 21.043393 \n", "std 0.499784 4.901321 73.878857 9.448743 \n", "min 2016.000000 6.000000 6.000000 0.000000 \n", "25% 2016.000000 16.000000 178.000000 14.000000 \n", "50% 2016.000000 19.000000 228.000000 20.000000 \n", "75% 2017.000000 22.000000 281.500000 27.000000 \n", "max 2017.000000 33.000000 498.000000 51.000000 \n", "\n", " away_rush_yds away_to away_yards game_datetime home_first_downs \\\n", "count 507.000000 370.000000 507.000000 5.070000e+02 507.000000 \n", "mean 104.074951 1.943243 333.453649 1.493335e+12 20.558185 \n", "std 49.056053 1.089253 82.230752 1.574378e+10 4.751749 \n", "min 6.000000 1.000000 100.000000 1.473367e+12 5.000000 \n", "25% 67.000000 1.000000 279.000000 1.478443e+12 17.000000 \n", "50% 95.000000 2.000000 333.000000 1.483288e+12 20.000000 \n", "75% 134.000000 2.000000 387.000000 1.509282e+12 24.000000 \n", "max 298.000000 8.000000 626.000000 1.514234e+12 37.000000 \n", "\n", " home_pass_yds home_pts home_rush_yds home_to home_yards \\\n", "count 507.000000 507.000000 507.000000 359.000000 507.000000 \n", "mean 239.579882 23.737673 114.165680 1.874652 353.745562 \n", "std 72.933853 10.041624 48.685043 1.021226 79.238797 \n", "min 51.000000 0.000000 14.000000 1.000000 123.000000 \n", "25% 189.000000 17.000000 80.000000 1.000000 295.500000 \n", "50% 238.000000 24.000000 106.000000 2.000000 349.000000 \n", "75% 287.000000 30.000000 142.000000 2.000000 408.000000 \n", "max 486.000000 57.000000 313.000000 5.000000 589.000000 \n", "\n", " week_num home_line over_under handicap_difference \n", "count 507.000000 507.000000 507.000000 507.000000 \n", "mean 8.658777 -2.074951 45.075937 1.345168 \n", "std 4.928735 5.483023 4.045035 1.361233 \n", "min 1.000000 -17.000000 36.500000 0.000000 \n", "25% 4.000000 -6.000000 42.000000 0.500000 \n", "50% 9.000000 -3.000000 44.500000 1.000000 \n", "75% 13.000000 2.500000 47.500000 2.000000 \n", "max 17.000000 11.500000 60.000000 9.000000 " ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "matchups.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### We will use 538's Elo Algorithm\n", "- [538's Elo Introduction](https://fivethirtyeight.com/datalab/introducing-nfl-elo-ratings/)\n", "- [More Elo Description](https://fivethirtyeight.com/datalab/nfl-elo-ratings-are-back/) \n", "\n", "### The features for this model are:\n", "- game location (home, away, neutral)\n", "- team score\n", "- opponent score" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": true }, "outputs": [], "source": [ "matchups['is_neutral']=matchups['game_location'].apply(lambda x: True if x==\"N\" else False)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(1, ('NE', 1806.2242573188869)),\n", " (2, ('PHI', 1792.6452135564753)),\n", " (3, ('NO', 1787.9023382585831)),\n", " (4, ('MIN', 1776.1899411706868)),\n", " (5, ('PIT', 1764.1860335994625)),\n", " (6, ('LAR', 1752.3472338578288)),\n", " (7, ('CAR', 1721.6010986323781)),\n", " (8, ('ATL', 1712.6057392284827)),\n", " (9, ('BAL', 1708.0830352371711)),\n", " (10, ('KC', 1701.5410154038477)),\n", " (11, ('SEA', 1700.7222410483578)),\n", " (12, ('JAC', 1686.923804818282)),\n", " (13, ('LAC', 1677.9601149524478)),\n", " (14, ('DAL', 1652.7571320137151)),\n", " (15, ('DET', 1619.2894998012846)),\n", " (16, ('BUF', 1614.5297022791335)),\n", " (17, ('WAS', 1606.3205507025741)),\n", " (18, ('TEN', 1605.7120729931769)),\n", " (19, ('GB', 1591.2914627291802)),\n", " (20, ('ARI', 1585.8295026335654)),\n", " (21, ('CHI', 1563.7927380700064)),\n", " (22, ('MIA', 1560.0262753096611)),\n", " (23, ('SF', 1559.138656280099)),\n", " (24, ('OAK', 1559.0911884068314)),\n", " (25, ('CIN', 1558.1544925397311)),\n", " (26, ('NYJ', 1542.1580233534039)),\n", " (27, ('TB', 1535.4824356996987)),\n", " (28, ('DEN', 1530.5459957956239)),\n", " (29, ('HOU', 1496.8524064385265)),\n", " (30, ('IND', 1473.2985494125467)),\n", " (31, ('NYG', 1461.1059097051573)),\n", " (32, ('CLE', 1372.3462344241079))]" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from collections import defaultdict\n", "def silverK(MOV, elo_diff):\n", " K_0=20\n", " multiplier=np.log(abs(MOV)+1)*(2.2/((elo_diff)*.001+2.2))\n", " return K_0*multiplier,K_0*multiplier\n", "\n", "def silverS(home_score, away_score):\n", " S_home,S_away=0,0\n", " if home_score>away_score:\n", " S_home=1\n", " elif away_score>home_score:\n", " S_away=1\n", " else:\n", " S_home,S_away=.5,.5\n", " return S_home,S_away\n", "\n", "def silver_elo_update(home_score, away_score, home_rating, away_rating, isNeutral):\n", " HOME_AD=65.\n", " if not isNeutral:\n", " pass#home_rating+=HOME_AD\n", " E_home = elo_prediction(home_rating,away_rating)\n", " E_away=1-E_home\n", " elo_diff=home_rating-away_rating\n", " MOV=home_score-away_score\n", " \n", " S_home,S_away = silverS(home_score,away_score)\n", " if home_score>=away_score:\n", " elo_winner=home_rating\n", " elo_loser=away_rating\n", " else:\n", " elo_loser=home_rating\n", " elo_winner=away_rating\n", "\n", " K_home,K_away = silverK(MOV,elo_winner-elo_loser)\n", " \n", " return K_home*(S_home-E_home),K_away*(S_away-E_away)\n", "\n", "def elo_prediction(home_rating,away_rating):\n", " E_home = 1./(1 + 10 ** ((away_rating - home_rating) / (400.)))\n", " return E_home\n", "\n", "def score_prediction(home_rating,away_rating):\n", " return (home_rating-away_rating)/25.\n", "class HeadToHeadModel(object):\n", " def __init__(self, events, update_function, prediction_function=None):\n", " self.update_function=update_function\n", " self.events=events\n", " self.ratings=defaultdict(lambda: 1505)\n", " self.prediction_function = prediction_function\n", " self.predictions = []\n", " self.curr_season=defaultdict(lambda: self.events[0][1]['season'])\n", "\n", " def compute_elo_ratings(self):\n", " for idx, event in self.events:\n", " new_year=event['season']\n", " label_i=event['home_name']\n", " label_j=event['away_name']\n", " \n", " if self.curr_season[label_i]!=new_year:\n", " self.curr_season[label_i]=new_year\n", " self.ratings[label_i]=self.ratings[label_i]*.25+1505.*.75\n", " elif self.curr_season[label_j]!=new_year:\n", " self.curr_season[label_j]=new_year\n", " self.ratings[label_j]=self.ratings[label_j]*.75+1505.*.25\n", " #todo change below to just use event\n", " update=self.update_function(event['home_pts'],event['away_pts'], self.ratings[label_i], self.ratings[label_j], event['is_neutral'])\n", " self.ratings[label_i]+=update[0]\n", " self.ratings[label_j]+=update[1]\n", " \n", "\n", " def power_rankings(self):\n", " from operator import itemgetter\n", " #sort dictionary by value to get ascending list of teams\n", " power_rankings = sorted(self.ratings.items(), key=itemgetter(1), reverse=True)\n", " power = []\n", " #Make the 0-th team 1st\n", " for i, x in enumerate(power_rankings):\n", " power.append((i + 1, x))\n", " return power\n", "m=HeadToHeadModel(list(matchups.iterrows()), silver_elo_update, elo_prediction)\n", "m.compute_elo_ratings()\n", "m.power_rankings()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### What Good are Rankings without Testing?\n", "Elo is a robust algorithm for strength of schedule based ratings. But what good are rankings without testing them?!?. Let's test our rankings at picking the winners and against the spread." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(1, ('NE', 1686.8247048770047)),\n", " (2, ('PHI', 1667.1115127144103)),\n", " (3, ('NO', 1663.7663170125279)),\n", " (4, ('MIN', 1657.0373492036902)),\n", " (5, ('PIT', 1641.2494007990233)),\n", " (6, ('LAR', 1633.3470749369756)),\n", " (7, ('CAR', 1596.3033075113656)),\n", " (8, ('ATL', 1588.8871296442694)),\n", " (9, ('BAL', 1583.8110481968999)),\n", " (10, ('KC', 1580.2516595946611)),\n", " (11, ('SEA', 1577.1386861899484)),\n", " (12, ('JAC', 1563.3842300893075)),\n", " (13, ('LAC', 1556.7095643009777)),\n", " (14, ('DAL', 1533.220824137682)),\n", " (15, ('DET', 1499.5159388812194)),\n", " (16, ('BUF', 1493.8212705903575)),\n", " (17, ('WAS', 1487.5994547778589)),\n", " (18, ('TEN', 1486.224416917114)),\n", " (19, ('GB', 1471.0810101436889)),\n", " (20, ('ARI', 1461.9538668485861)),\n", " (21, ('CHI', 1443.037416783995)),\n", " (22, ('SF', 1441.2024552207763)),\n", " (23, ('CIN', 1440.433702226368)),\n", " (24, ('OAK', 1438.2056708463833)),\n", " (25, ('MIA', 1434.7143210093607)),\n", " (26, ('NYJ', 1420.883821694438)),\n", " (27, ('TB', 1411.6113469222712)),\n", " (28, ('DEN', 1409.050633257574)),\n", " (29, ('HOU', 1378.6692624072318)),\n", " (30, ('IND', 1350.2651435422003)),\n", " (31, ('NYG', 1337.5988691604612)),\n", " (32, ('CLE', 1252.143123892517))]" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Let's redo our elo model with the addition of elo ranking output\n", "class HeadToHeadModel(object):\n", " def __init__(self, events, update_function, prediction_function=None):\n", " self.update_function=update_function\n", " self.events=events\n", " self.ratings=defaultdict(lambda: 1505)\n", " self.prediction_function = prediction_function\n", " self.predictions = []\n", " self.curr_season=defaultdict(lambda: self.events[0][1]['season'])\n", " self.elos=[]\n", " def compute_elo_ratings(self):\n", " for idx, event in self.events:\n", " new_year=event['season']\n", " label_i=event['home_name']\n", " label_j=event['away_name']\n", " \n", " if self.curr_season[label_i]!=new_year:\n", " self.curr_season[label_i]=new_year\n", " self.ratings[label_i]=self.ratings[label_i]*.25+1505.*.75\n", " elif self.curr_season[label_j]!=new_year:\n", " self.curr_season[label_j]=new_year\n", " self.ratings[label_j]=self.ratings[label_j]*.75+1505.*.25\n", " #todo change below to just use event\n", " update=self.update_function(event['home_pts'],event['away_pts'], self.ratings[label_i], self.ratings[label_j], event['is_neutral'])\n", " self.elos.append({\n", " \"home_elo\":self.ratings[label_i],\n", " \"away_elo\":self.ratings[label_j],\n", " \"index\": idx,\n", " \n", " })\n", " self.ratings[label_i]+=update[0]\n", " self.ratings[label_j]+=update[1]\n", " \n", "\n", " \n", "\n", " def power_rankings(self):\n", " from operator import itemgetter\n", " #sort dictionary by value to get ascending list of teams\n", " power_rankings = sorted(self.ratings.items(), key=itemgetter(1), reverse=True)\n", " power = []\n", " #Make the 0-th team 1st\n", " for i, x in enumerate(power_rankings):\n", " power.append((i + 1, x))\n", " return power\n", "m=HeadToHeadModel(list(matchups.iterrows()), silver_elo_update, elo_prediction)\n", "m.compute_elo_ratings()\n", "m.power_rankings()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "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", "
away_elohome_eloseasonhome_nameaway_namefull_game_typeaway_first_downsaway_pass_ydsaway_ptsaway_rush_ydsaway_toaway_yardsgame_datetimegame_locationgame_outcomegame_timegame_typehad_overtimehome_first_downshome_pass_ydshome_ptshome_rush_ydshome_tohome_yardsteamsweek_numaway_conferenceconference_playhome_lineover_underhandicap_differencehome_conferenceline_movesmatchup_idis_neutral
01511.2307021499.0932782016ARILARWeek 412.0247.017.041.01.0288.01475421900000NoneL3:25PM ETRegularFalse26.0302.013.0118.05.0420.0ARI,LAR4.0NFCNFC-10.043.51.5NFC2920161002LAR@ARIFalse
01511.2307021499.0932782017ARIDALWeek 315.0174.028.099.0NaN273.01506371400000L8:30PM ETRegularFalse22.0283.017.049.0NaN332.0ARI,DAL3.0NFCNFC3.046.50.5NFCNone20170925DAL@ARIFalse
\n", "
" ], "text/plain": [ " away_elo home_elo season home_name away_name full_game_type \\\n", "0 1511.230702 1499.093278 2016 ARI LAR Week 4 \n", "0 1511.230702 1499.093278 2017 ARI DAL Week 3 \n", "\n", " away_first_downs away_pass_yds away_pts away_rush_yds away_to \\\n", "0 12.0 247.0 17.0 41.0 1.0 \n", "0 15.0 174.0 28.0 99.0 NaN \n", "\n", " away_yards game_datetime game_location game_outcome game_time game_type \\\n", "0 288.0 1475421900000 None L 3:25PM ET Regular \n", "0 273.0 1506371400000 L 8:30PM ET Regular \n", "\n", " had_overtime home_first_downs home_pass_yds home_pts home_rush_yds \\\n", "0 False 26.0 302.0 13.0 118.0 \n", "0 False 22.0 283.0 17.0 49.0 \n", "\n", " home_to home_yards teams week_num away_conference conference_play \\\n", "0 5.0 420.0 ARI,LAR 4.0 NFC NFC \n", "0 NaN 332.0 ARI,DAL 3.0 NFC NFC \n", "\n", " home_line over_under handicap_difference home_conference line_moves \\\n", "0 -10.0 43.5 1.5 NFC 29 \n", "0 3.0 46.5 0.5 NFC None \n", "\n", " matchup_id is_neutral \n", "0 20161002LAR@ARI False \n", "0 20170925DAL@ARI False " ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "elo=pd.DataFrame(m.elos).set_index(\"index\").join(matchups)\n", "elo.head(2)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
away_elohome_eloseasonaway_first_downsaway_pass_ydsaway_ptsaway_rush_ydsaway_toaway_yardsgame_datetimehome_first_downshome_pass_ydshome_ptshome_rush_ydshome_tohome_yardsweek_numhome_lineover_underhandicap_difference
count985.000000985.000000985.000000985.000000985.000000985.000000985.000000721.000000985.0000009.850000e+02985.000000985.000000985.000000985.000000696.000000985.000000985.000000985.000000985.000000985.000000
mean1510.0495481504.5885242016.48629419.100508228.39898520.906599104.0497461.951456332.4487311.493761e+1220.556345238.82538123.730964114.3005081.876437353.1258888.697462-2.09492445.0477161.345685
std70.92888570.7192790.5000664.88808273.5115879.42371049.0706781.09373382.0673781.573130e+104.74567972.30727110.04348848.4243511.02443178.5699574.9035255.5089894.0521571.364118
min1267.4710581275.4883622016.0000006.0000006.0000000.0000006.0000001.000000100.0000001.473367e+125.00000051.0000000.00000014.0000001.000000123.0000001.000000-17.00000036.5000000.000000
25%1475.3083751467.4480072016.00000016.000000178.00000014.00000067.0000001.000000278.0000001.478464e+1217.000000189.00000017.00000080.0000001.000000295.0000004.000000-6.00000042.0000000.500000
50%1508.1456831505.0000002016.00000019.000000227.00000020.00000095.0000002.000000331.0000001.484412e+1220.000000237.00000024.000000108.0000002.000000349.0000009.000000-3.00000044.5000001.000000
75%1553.8391911546.6331782017.00000022.000000279.00000027.000000134.0000002.000000386.0000001.509294e+1224.000000286.00000030.000000142.0000002.000000408.00000013.0000002.50000047.5000002.000000
max1695.7874981731.3406322017.00000033.000000498.00000051.000000298.0000008.000000626.0000001.514234e+1237.000000486.00000057.000000313.0000005.000000589.00000017.00000011.50000060.0000009.000000
\n", "
" ], "text/plain": [ " away_elo home_elo season away_first_downs away_pass_yds \\\n", "count 985.000000 985.000000 985.000000 985.000000 985.000000 \n", "mean 1510.049548 1504.588524 2016.486294 19.100508 228.398985 \n", "std 70.928885 70.719279 0.500066 4.888082 73.511587 \n", "min 1267.471058 1275.488362 2016.000000 6.000000 6.000000 \n", "25% 1475.308375 1467.448007 2016.000000 16.000000 178.000000 \n", "50% 1508.145683 1505.000000 2016.000000 19.000000 227.000000 \n", "75% 1553.839191 1546.633178 2017.000000 22.000000 279.000000 \n", "max 1695.787498 1731.340632 2017.000000 33.000000 498.000000 \n", "\n", " away_pts away_rush_yds away_to away_yards game_datetime \\\n", "count 985.000000 985.000000 721.000000 985.000000 9.850000e+02 \n", "mean 20.906599 104.049746 1.951456 332.448731 1.493761e+12 \n", "std 9.423710 49.070678 1.093733 82.067378 1.573130e+10 \n", "min 0.000000 6.000000 1.000000 100.000000 1.473367e+12 \n", "25% 14.000000 67.000000 1.000000 278.000000 1.478464e+12 \n", "50% 20.000000 95.000000 2.000000 331.000000 1.484412e+12 \n", "75% 27.000000 134.000000 2.000000 386.000000 1.509294e+12 \n", "max 51.000000 298.000000 8.000000 626.000000 1.514234e+12 \n", "\n", " home_first_downs home_pass_yds home_pts home_rush_yds home_to \\\n", "count 985.000000 985.000000 985.000000 985.000000 696.000000 \n", "mean 20.556345 238.825381 23.730964 114.300508 1.876437 \n", "std 4.745679 72.307271 10.043488 48.424351 1.024431 \n", "min 5.000000 51.000000 0.000000 14.000000 1.000000 \n", "25% 17.000000 189.000000 17.000000 80.000000 1.000000 \n", "50% 20.000000 237.000000 24.000000 108.000000 2.000000 \n", "75% 24.000000 286.000000 30.000000 142.000000 2.000000 \n", "max 37.000000 486.000000 57.000000 313.000000 5.000000 \n", "\n", " home_yards week_num home_line over_under handicap_difference \n", "count 985.000000 985.000000 985.000000 985.000000 985.000000 \n", "mean 353.125888 8.697462 -2.094924 45.047716 1.345685 \n", "std 78.569957 4.903525 5.508989 4.052157 1.364118 \n", "min 123.000000 1.000000 -17.000000 36.500000 0.000000 \n", "25% 295.000000 4.000000 -6.000000 42.000000 0.500000 \n", "50% 349.000000 9.000000 -3.000000 44.500000 1.000000 \n", "75% 408.000000 13.000000 2.500000 47.500000 2.000000 \n", "max 589.000000 17.000000 11.500000 60.000000 9.000000 " ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "elo.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prediction and Testing\n", "Since we are seeding our rankings starting with the 2011 season it would be unfair to our model to expect to it be right in the beginning. For our purposes, we'll look at performance during the whole season and during weeks 4-15 to allow rating to settle and not lose when a team rests their players in weeks 16 and 17" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def predict_home_margin(row):\n", " #how many points the home team is expected to win bye\n", " return score_prediction(row['home_elo']+65, row['away_elo'])\n", "elo['predicted_home_margin']=elo.apply(predict_home_margin,axis=1)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "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", "
away_elohome_eloseasonhome_nameaway_namefull_game_typeaway_first_downsaway_pass_ydsaway_ptsaway_rush_ydsaway_toaway_yardsgame_datetimegame_locationgame_outcomegame_timegame_typehad_overtimehome_first_downshome_pass_ydshome_ptshome_rush_ydshome_tohome_yardsteamsweek_numaway_conferenceconference_playhome_lineover_underhandicap_differencehome_conferenceline_movesmatchup_idis_neutralpredicted_home_margin
01511.2307021499.0932782016ARILARWeek 412.0247.017.041.01.0288.01475421900000NoneL3:25PM ETRegularFalse26.0302.013.0118.05.0420.0ARI,LAR4.0NFCNFC-10.043.51.5NFC2920161002LAR@ARIFalse2.114503
\n", "
" ], "text/plain": [ " away_elo home_elo season home_name away_name full_game_type \\\n", "0 1511.230702 1499.093278 2016 ARI LAR Week 4 \n", "\n", " away_first_downs away_pass_yds away_pts away_rush_yds away_to \\\n", "0 12.0 247.0 17.0 41.0 1.0 \n", "\n", " away_yards game_datetime game_location game_outcome game_time game_type \\\n", "0 288.0 1475421900000 None L 3:25PM ET Regular \n", "\n", " had_overtime home_first_downs home_pass_yds home_pts home_rush_yds \\\n", "0 False 26.0 302.0 13.0 118.0 \n", "\n", " home_to home_yards teams week_num away_conference conference_play \\\n", "0 5.0 420.0 ARI,LAR 4.0 NFC NFC \n", "\n", " home_line over_under handicap_difference home_conference line_moves \\\n", "0 -10.0 43.5 1.5 NFC 29 \n", "\n", " matchup_id is_neutral predicted_home_margin \n", "0 20161002LAR@ARI False 2.114503 " ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "elo.head(1)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#1 is home winning\n", "elo['predicted_winner']=elo.apply(lambda row: 1 if row['predicted_home_margin']>=0 else 0, axis=1)\n" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": true }, "outputs": [], "source": [ "elo['vegas_predicted_winner']=elo.apply(lambda row: 0 if row['home_line']>0 else 1, axis=1)#line assigns negative value\n", "elo['winner']=elo.apply(lambda row: 1 if row['home_pts']>row['away_pts'] else 0, axis=1)#does not account for ties" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since this is a binary decision problem, either win or lose our bet, we will use [confusion matrices](https://en.wikipedia.org/wiki/Confusion_matrix) to judge the performance of our model" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from sklearn.metrics import confusion_matrix\n", "def print_confusion_matrix(y_true, y_pred):\n", " conf_matrix=confusion_matrix(y_true, y_pred)\n", " success_rate=np.trace(conf_matrix)/np.sum(conf_matrix)\n", " print(success_rate)\n", " print(conf_matrix)\n", "test_period=elo[(elo['week_num'].between(4,15,inclusive=True))&(elo['game_type']=='Regular')&(elo['season'].between(2012,2016))]" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.607142857143\n", "[[ 48 98]\n", " [ 34 156]]\n" ] } ], "source": [ "y_true='winner'\n", "y_pred='predicted_winner'\n", "print_confusion_matrix(test_period['winner'],test_period['predicted_winner'])" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.639880952381\n", "[[ 67 79]\n", " [ 42 148]]\n" ] } ], "source": [ "y_true='winner'\n", "y_pred='vegas_predicted_winner'\n", "print_confusion_matrix(test_period['winner'],test_period[y_pred])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Vegas is pretty good huh\n", "We were good at predicting winners but vegas is slightly better... The highest we've gotten with a pure elo approach using more years of training is 67%. Let's look at our against the spread performance and see if we can find an edge." ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "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", "
away_elohome_eloseasonhome_nameaway_namefull_game_typeaway_first_downsaway_pass_ydsaway_ptsaway_rush_ydsaway_toaway_yardsgame_datetimegame_locationgame_outcomegame_timegame_typehad_overtimehome_first_downshome_pass_ydshome_ptshome_rush_ydshome_tohome_yardsteamsweek_numaway_conferenceconference_playhome_lineover_underhandicap_differencehome_conferenceline_movesmatchup_idis_neutralpredicted_home_marginpredicted_winnervegas_predicted_winnerwinner
01511.2307021499.0932782016ARILARWeek 412.0247.017.041.01.0288.01475421900000NoneL3:25PM ETRegularFalse26.0302.013.0118.05.0420.0ARI,LAR4.0NFCNFC-10.043.51.5NFC2920161002LAR@ARIFalse2.114503110
\n", "
" ], "text/plain": [ " away_elo home_elo season home_name away_name full_game_type \\\n", "0 1511.230702 1499.093278 2016 ARI LAR Week 4 \n", "\n", " away_first_downs away_pass_yds away_pts away_rush_yds away_to \\\n", "0 12.0 247.0 17.0 41.0 1.0 \n", "\n", " away_yards game_datetime game_location game_outcome game_time game_type \\\n", "0 288.0 1475421900000 None L 3:25PM ET Regular \n", "\n", " had_overtime home_first_downs home_pass_yds home_pts home_rush_yds \\\n", "0 False 26.0 302.0 13.0 118.0 \n", "\n", " home_to home_yards teams week_num away_conference conference_play \\\n", "0 5.0 420.0 ARI,LAR 4.0 NFC NFC \n", "\n", " home_line over_under handicap_difference home_conference line_moves \\\n", "0 -10.0 43.5 1.5 NFC 29 \n", "\n", " matchup_id is_neutral predicted_home_margin predicted_winner \\\n", "0 20161002LAR@ARI False 2.114503 1 \n", "\n", " vegas_predicted_winner winner \n", "0 1 0 " ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "elo.head(1)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.491071428571\n", "[[95 86]\n", " [85 70]]\n" ] } ], "source": [ "elo['home_margin']=elo.apply(lambda x: x['home_pts']-x['away_pts'], axis=1)\n", "elo['home_bet']=elo.apply(lambda x: (x['predicted_home_margin']+x['home_line'])<0,axis=1)\n", "elo['home_covers']=elo.apply(lambda x: (x['home_margin']+x['home_line'])>0,axis=1)\n", "test_period=elo[(elo['week_num'].between(4,15,inclusive=True))&(elo['game_type']=='Regular')&(elo['season'].between(2012,2016))]\n", "y_true='home_covers'\n", "y_pred='home_bet'\n", "print_confusion_matrix(test_period[y_true],test_period[y_pred])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That won't win for us. Under standard wagering strategies you need to be better than 52.4%" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Performance each season during test period" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": true }, "outputs": [], "source": [ "elo['predicted_winner_right']=elo.apply(lambda x: 1 if x['winner']==x['predicted_winner'] else 0, axis=1)\n", "elo['vegas_favored_wins']=elo.apply(lambda x: 1 if x['winner']==x['vegas_predicted_winner'] else 0, axis=1)\n", "elo['ats_right']=elo.apply(lambda x: 1 if x['home_covers']==x['home_bet'] else 0, axis=1)\n", "test_period=elo[(elo['week_num'].between(4,15,inclusive=True))&(elo['game_type']=='Regular')&(elo['season'].between(2012,2016))]\n" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "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", "
predicted_winner_rightvegas_favored_winsats_right
meanvarmeanvarmeanvar
season
20160.6071430.2392320.6398810.2311210.4910710.250666
\n", "
" ], "text/plain": [ " predicted_winner_right vegas_favored_wins \\\n", " mean var mean var \n", "season \n", "2016 0.607143 0.239232 0.639881 0.231121 \n", "\n", " ats_right \n", " mean var \n", "season \n", "2016 0.491071 0.250666 " ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_period[['predicted_winner_right','vegas_favored_wins','ats_right','season']].groupby(\"season\").agg([np.mean, np.var])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Results\n", "ATS is chancey but performance against vegas for winners is pretty close." ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "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", "
predicted_winner_rightvegas_favored_winsats_right
meanvarmeanvarmeanvar
00.6071430.2392320.6398810.2311210.4910710.250666
\n", "
" ], "text/plain": [ " predicted_winner_right vegas_favored_wins ats_right \\\n", " mean var mean var mean \n", "0 0.607143 0.239232 0.639881 0.231121 0.491071 \n", "\n", " \n", " var \n", "0 0.250666 " ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# for all years in our sample we do about just as good as vegas but no better\n", "test_period[['predicted_winner_right','vegas_favored_wins','ats_right']].groupby(lambda x: 0).agg([np.mean, np.var])" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Next Steps\n", "So now you've seen how to build a strength of schedule (SOS) model. You might think you can make it better, and you probably can, but it would be a better use of your team to create orthogonal features not based on SOS. Something like how a team plays using: \n", "- offensive scheme: e.g. vertical \"Air Coryell\" offense\n", "- base_defense: e.g. 3-4\n", "- running yards (and if they are a great running team)\n", " \n", "Check out our team_season_log table and our team_game_logs to get the data you need to build it." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "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", "
coachesleague_namelossesplayoff_resultpointspoints_diffpoints_opprank_def_ptsrank_def_ydsrank_off_ptsrank_off_ydsrank_points_diffrank_takeaway_giveawayrank_yds_diffhistorical_team_nameteam_nameteams_in_leaguetieswinsseasondefensive_coordinatoroffensive_coordinatoroffensive_schemebase_defensestadium
0AriansNFL8269-683371762522252214Arizona CardinalsARI32072017James BettcherHarold GoodwinAir Coryell3-4University of Phoenix
1QuinnNFL633126305111015913246Atlanta FalconsATL32092017Marquand ManuelSteve SarkisianWest Coast4-3
2HarbaughNFL636896272499267120Baltimore RavensBAL32092017Dean PeesMarty MornhinwegWest Coast3-4M&T; Bank
3McDermottNFL7280-633431825242922629Buffalo BillsBUF32082017Leslie FrazierRick DennisonWest Coast4-3New Era Field
4RiveraNFL4353483051171117111411Carolina PanthersCAR320112017Steve WilksMike ShulaErhardt-Perkins4-3Bank of America
\n", "
" ], "text/plain": [ " coaches league_name losses playoff_result points points_diff points_opp \\\n", "0 Arians NFL 8 269 -68 337 \n", "1 Quinn NFL 6 331 26 305 \n", "2 Harbaugh NFL 6 368 96 272 \n", "3 McDermott NFL 7 280 -63 343 \n", "4 Rivera NFL 4 353 48 305 \n", "\n", " rank_def_pts rank_def_yds rank_off_pts rank_off_yds rank_points_diff \\\n", "0 17 6 25 22 25 \n", "1 11 10 15 9 13 \n", "2 4 9 9 26 7 \n", "3 18 25 24 29 22 \n", "4 11 7 11 17 11 \n", "\n", " rank_takeaway_giveaway rank_yds_diff historical_team_name team_name \\\n", "0 22 14 Arizona Cardinals ARI \n", "1 24 6 Atlanta Falcons ATL \n", "2 1 20 Baltimore Ravens BAL \n", "3 6 29 Buffalo Bills BUF \n", "4 14 11 Carolina Panthers CAR \n", "\n", " teams_in_league ties wins season defensive_coordinator \\\n", "0 32 0 7 2017 James Bettcher \n", "1 32 0 9 2017 Marquand Manuel \n", "2 32 0 9 2017 Dean Pees \n", "3 32 0 8 2017 Leslie Frazier \n", "4 32 0 11 2017 Steve Wilks \n", "\n", " offensive_coordinator offensive_scheme base_defense \\\n", "0 Harold Goodwin Air Coryell 3-4 \n", "1 Steve Sarkisian West Coast 4-3 \n", "2 Marty Mornhinweg West Coast 3-4 \n", "3 Rick Dennison West Coast 4-3 \n", "4 Mike Shula Erhardt-Perkins 4-3 \n", "\n", " stadium \n", "0 University of Phoenix \n", "1 \n", "2 M&T; Bank \n", "3 New Era Field \n", "4 Bank of America " ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "team_season_log = api.get_dataframe(\"team_season_log\")\n", "team_season_log.head()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "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", "
seasonteam_namefull_game_typeopp_first_downsteam_first_downsgame_locationgame_outcomegame_timeopp_pass_ydsteam_pass_ydsopp_ptsteam_ptsopp_rush_ydsteam_rush_ydsopp_toteam_toopp_yardsteam_yardsgame_typeweek_numopp_namehad_overtimegame_datetime
02017ARIWeek 11924@L1:00PM ET2852633523824514367308Regular1DETFalse1505048400000
12017ATLWeek 12018@W1:00PM ET176308172312564301372Regular1CHIFalse1505048400000
22017BALWeek 11417@W1:00PM ET1441110207715751221268Regular1CINFalse1505048400000
32017BUFWeek 11123W1:00PM ET17621812213819021214408Regular1NYJFalse1505048400000
42017CARWeek 11320@W4:25PM ET1661713235111622217287Regular1SFFalse1505060700000
\n", "
" ], "text/plain": [ " season team_name full_game_type opp_first_downs team_first_downs \\\n", "0 2017 ARI Week 1 19 24 \n", "1 2017 ATL Week 1 20 18 \n", "2 2017 BAL Week 1 14 17 \n", "3 2017 BUF Week 1 11 23 \n", "4 2017 CAR Week 1 13 20 \n", "\n", " game_location game_outcome game_time opp_pass_yds team_pass_yds opp_pts \\\n", "0 @ L 1:00PM ET 285 263 35 \n", "1 @ W 1:00PM ET 176 308 17 \n", "2 @ W 1:00PM ET 144 111 0 \n", "3 W 1:00PM ET 176 218 12 \n", "4 @ W 4:25PM ET 166 171 3 \n", "\n", " team_pts opp_rush_yds team_rush_yds opp_to team_to opp_yards team_yards \\\n", "0 23 82 45 1 4 367 308 \n", "1 23 125 64 301 372 \n", "2 20 77 157 5 1 221 268 \n", "3 21 38 190 2 1 214 408 \n", "4 23 51 116 2 2 217 287 \n", "\n", " game_type week_num opp_name had_overtime game_datetime \n", "0 Regular 1 DET False 1505048400000 \n", "1 Regular 1 CHI False 1505048400000 \n", "2 Regular 1 CIN False 1505048400000 \n", "3 Regular 1 NYJ False 1505048400000 \n", "4 Regular 1 SF False 1505060700000 " ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "team_game_logs = api.get_dataframe(\"team_game_logs\")\n", "team_game_logs.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }