Skip to content

Instantly share code, notes, and snippets.

Last active April 27, 2021 19:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/5b71956520a8f7caf1eda340ee21316a to your computer and use it in GitHub Desktop.
Save anonymous/5b71956520a8f7caf1eda340ee21316a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Anaconda3\\envs\\threesix\\lib\\site-packages\\IPython\\html.py:14: ShimWarning: The `IPython.html` package has been deprecated since IPython 4.0. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.\n",
" \"`IPython.html.widgets` has moved to `ipywidgets`.\", ShimWarning)\n"
]
}
],
"source": [
"%matplotlib inline\n",
"from matplotlib import pyplot as plt\n",
"import seaborn as sns\n",
"import pandas as pd\n",
"import numpy as np\n",
"from scipy import optimize"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"df = pd.read_csv(\"superleague1617.csv\", usecols=[1,2,3,4])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"teams = list(set(df.home.unique()) & set(df.away.unique()))\n",
"\n",
"# pre-make some indices for use with the objective function\n",
"\n",
"df['hidx'] = df.home.apply(lambda x: teams.index(x))\n",
"df['aidx'] = df.away.apply(lambda x: teams.index(x))\n",
"df['xhdefidx'] = df.hidx + len(teams)\n",
"df['xhoffidx'] = df.hidx\n",
"df['xadefidx'] = df.aidx + len(teams)\n",
"df['xaoffidx'] = df.aidx"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The inputs are:\n",
"\n",
"* $o$: offensive rating vector\n",
"* $d$: defensive rating vector \n",
"* $g$: adjusted average number of goals scored (not per team, but for the whole league)\n",
"\n",
"The $x$ vector will have length `2 * n_teams + 2`. The first `n_teams` portion is offense, the second is defense.\n",
"\n",
"The constraint is that $o$ and $d$ must both average to one."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"n_teams = len(teams)\n",
"ghome = n_teams*2\n",
"gaway = n_teams*2+1\n",
"\n",
"def off_constr(x):\n",
" return np.mean(x[:n_teams]) - 1\n",
"\n",
"def def_constr(x):\n",
" return np.mean(x[n_teams:n_teams*2]) - 1\n",
"\n",
"def obj(x):\n",
" err = ((df['GH'] - x[ghome] * df.xhoffidx.apply(lambda i: x[i]) * df.xadefidx.apply(lambda i: x[i]))**2).sum()\n",
" err += ((df['GA'] - x[gaway] * df.xaoffidx.apply(lambda i: x[i]) * df.xhdefidx.apply(lambda i: x[i]))**2).sum()\n",
" return err"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Both of these work well for initializations.\n",
"# Starting at all zeros gets bad results, probably because of how the minimizer handles the constraints\n",
"x0 = np.random.random(size=len(teams)*2 + 2)\n",
"#x0 = np.ones(shape=len(teams)*2 + 2)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"(True, 'Optimization terminated successfully.')"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res = optimize.minimize(obj, x0, constraints=[{'type':'eq', 'fun':off_constr}, {'type':'eq', 'fun':def_constr}],\n",
" options={'maxiter':300})\n",
"res.success, res.message"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"57"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res.nit"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Home average points: 1.448\n",
"Away average points: 0.836\n",
"\n",
" Team Off Rate Def Rate\n",
" PAS 0.8041 1.1211\n",
" Levadiakos 0.8245 1.3710\n",
" Olympiacos 1.6307 0.4995\n",
" PAOK 1.4840 0.5731\n",
" PAO 1.3208 0.6781\n",
" Veroia 0.8034 1.7478\n",
" Xanthi 1.0216 0.7469\n",
" AEK 1.6083 0.7055\n",
" Iraklis 0.7620 1.0261\n",
" Asteras 0.8934 1.3617\n",
" Atromitos 0.7370 1.0214\n",
" AEL 0.6964 1.1276\n",
" Kerkira 0.6324 1.2594\n",
" Platanias 0.9914 1.0990\n",
" Panionios 0.9138 0.5325\n",
" Panaitolikos 0.8761 1.1292\n"
]
}
],
"source": [
"print(\"Home average points: {:.3f}\".format(res.x[ghome]))\n",
"print(\"Away average points: {:.3f}\".format(res.x[gaway]))\n",
"print()\n",
"print(\" Team Off Rate Def Rate\")\n",
"for i, t in enumerate(teams):\n",
" print(\"{:>20s} {:.4f} {:.4f}\".format(t, res.x[i], res.x[i+n_teams]))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfwAAAFjCAYAAADYYrmFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X14VOWd//HPJCEPEkOiCTQ2hBUERWIFZCEWUoGIKfJM\ngFA0uOJi6VasFZ/qAtIWBQG7yiAr0AIVLQ8CIuGq4BK0KD8iD4XQsIKuIN2wgSQ/J4Q8M5nz+4Nf\nZonJZBKSmcnMeb+ui+vynJPMfG8z53zmnHOf+7YYhmEIAAAEtCBfFwAAADyPwAcAwAQIfAAATIDA\nBwDABAh8AABMgMAHAMAECHwAAEyAwAcAwAQIfAAATIDABwDABAh8AABMwK8D3263Kz8/X3a73del\nAADQrvl14F+4cEGpqam6cOGCr0sBAKBd8+vABwAAzUPgAwBgAgQ+AAAmQOADAGACBD4AACZA4AMA\nYAIEPgAAJkDgAwBgAgQ+AAAmQOADAGACBD4AACZA4AMAYAIEvh+rqrGroLhcVTXMFggAaFqIrwtA\ny9XWOrQ266Ry8gpUVFKpuOgIJSfFa8aYPgoO5jscAKAhAt8Prc06qZ2fnnEuF9oqncszx9/lq7IA\nAO0Yp4N+pqrGrpy8gka35eQVcHkfANAoAt/P2EqrVVRS2ei24pJK2UqrvVwRAMAfEPh+JiYqTHHR\nEY1ui42OUExUmJcrAgD4AwLfz4SHhig5Kb7RbclJ8QoP9d9uGTx1AACe47/pYGIzxvSRdPWefXFJ\npWKv6aXvj3jqAAA8j8D3Q8HBQZo5/i5lPthbttJqxUSF+fWZPU8dAIDnefT0KTc3V5mZmQ3Wnzhx\nQtOmTdNPfvITPfnkk6qupqPZ9QgPDVF8bEe/DnueOgAA7/BYUqxZs0Y7d+5URET9DmaGYWjevHla\nvny5unXrpvfee0/nz59X9+7dPVUK2rHmPHUQH+u/X2gAoL3w2Bl+YmKirFZrg/Vnz55VdHS01q9f\nr4cfflglJSWEvYnx1AEAeIfHAj8tLU0hIQ3PzGw2m44dO6aHH35Y69atU05Ojg4ePOj29axWq26/\n/fZ6/1JTUz1ROrwokJ86AID2xOtH0+joaHXr1k09evSQJKWkpCgvL0/33ntvk783e/ZszZ49u966\n/Px8Qj8ABNpTBwDQHnk98Lt27ary8nKdO3dO3bp105EjRzRp0iRvl4F2JNCeOgCA9shrR9WsrCxV\nVFQoIyNDL7/8subMmSPDMNSvXz8NHTrUW2WgHbv61AFBDwCeYDEMw/B1Eder7pJ+dna2EhISfF0O\nAADtFsOYAQBgAgQ+AAAmQOADAGACBD4AACZA4AMAYAIEPgAAJkDgAwBgAgQ+AAAmQOADAGACBD4A\nACZA4AMAYAIEPgAAJkDgAwBgAgQ+AAAmQOADAGACBD4AACZA4AMAYAIEPgAAJkDgAwBgAgQ+AAAm\nQOBDklRVY1dBcbmqauy+LgUA4AEhvi4AvlVb69DarJPKyStQUUml4qIjlJwUrxlj+ig4mO+DABAo\nCHyTW5t1Ujs/PeNcLrRVOpdnjr/LV2UBANoYp3AmVlVjV05eQaPbcvIKuLwPAAGEwDcxW2m1ikoq\nG91WXFIpW2m1lysCAHgKgW9iMVFhiouOaHRbbHSEYqLCvFwRAMBTCHwTCw8NUXJSfKPbkpPiFR5K\nFw8ACBQc0U1uxpg+kq7esy8uqVTsNb30AQCBg8A3ueDgIM0cf5cyH+wtW2m1YqLCOLMHgADEkR2S\nrl7ej4/l4wAAgYp7+AAAmACBDwCACRD4AACYAIEPAIAJEPgAAJgAgQ8AgAkQ+AAAmACBDwCACRD4\nAACYAIEPAIAJEPgAAJiARwM/NzdXmZmZLrfPmzdPy5Yt82QJAABAHgz8NWvWaO7cuaqurm50+6ZN\nm/Tll1966u0BAMA1PBb4iYmJslqtjW7761//qtzcXGVkZHjq7QEAwDU8FvhpaWkKCWk43WphYaHe\nfPNNzZ8/31NvDQAAvsPrE6Dv3r1bNptNjz/+uIqKilRVVaXu3btr4sSJTf6e1WrVihUrvFQlAACB\nxWIYhuGpF8/Pz9fTTz+tLVu2NLp9+/btOnPmjJ555pnrfv3U1FRlZ2crISGhNaUCABDQvPZYXlZW\nljZv3uyttwMAANfw6Bm+p3GGDwBA8zDwDgAAJkDgAwBgAgQ+AAAmQOADAGACBD4AACZA4AMAYAIE\nPgAAJkDgAwBgAgQ+AAAmQOADAGACBD4AACZA4MOrqmrsKiguV1WN3delAICphPi6AJhDba1Da7NO\nKievQEUllYqLjlByUrxmjOmj4GC+dwKApxH48Iq1WSe189MzzuVCW6Vzeeb4u3xVFgCYBqdW8Liq\nGrty8goa3ZaTV8DlfQDwAgIfHmcrrVZRSWWj24pLKmUrrfZyRQBgPgQ+PC4mKkxx0RGNbouNjlBM\nVJiXKwIA8yHw4XHhoSFKTopvdFtyUrzCQ+lKAgCexpEWXjFjTB9JV+/ZF5dUKvaaXvoAAM8j8OEV\nwcFBmjn+LmU+2Fu20mrFRIVxZg8AXsQRF14VHhqi+Fg+dgDgbdzDBwDABAh8AABMgMAHAMAECHwA\nAEyAwAcAwAQIfAAATIDABwDABAh8AABMgMAHAMAECHwAAEzA7RinmZmZslgszmWLxaLw8HB1795d\ns2bNUqdOnTxaIAAAaD23gX/bbbcpJCRE6enpkqRdu3bpwoUL6tKli/71X/9VK1as8HiRAACgddwG\nfm5urrZv3+5cvuOOO5Senq5ly5Zpx44dHi0OAAC0Dbf38K9cuaKvvvrKufzVV1/J4XCoqqpKV65c\n8WhxAACgbbg9w587d65mzpypm2++WQ6HQ6WlpVqyZImsVqvGjRvnjRoBAEAruQ38QYMGae/evfry\nyy8VFBSkHj16qEOHDurfv3+9znwAAKD9chv458+f1zvvvKNLly7JMAzn+kWLFnm0MAAA0HbcBv5T\nTz2lAQMGaMCAAZzRAwDgp9wGvt1u1/PPP++NWgAAgIe47aV/zz33aN++faqpqfFGPQAAwAPcnuHv\n3r1b77zzTr11FotFX3zxhceKAgAAbctt4H/22WfX/eK5ublatmyZNmzYUG/9rl279Mc//lHBwcHq\n1auXFixYoKAghvUHAMBTXAb+5s2blZGR4XLo3CeeeKLJF16zZo127typiIiIeuurqqr0+uuvKysr\nSxEREXr66af18ccfKzU19TrKBwAAzeHytPraR/CuR2JioqxWa4P1oaGh2rRpk/OLgN1uV1hYWKve\nCwAANM3lGf7UqVMlSd///vc1YcKEetveffddty+clpam/Pz8BuuDgoIUGxsrSdqwYYMqKio0ePBg\nt69ntVqZqAcAgOvkMvDXr1+vsrIybdq0SefPn3eur62tVVZWlh566KHrflOHw6GlS5fq7Nmzslqt\nzXq+f/bs2Zo9e3a9dfn5+dwKAACgGVxe0u/WrVuj60NDQ7V48eJWven8+fNVXV2tlStXNrjHDwAA\n2p7LM/xhw4Zp2LBhGjlypHr06FFvW1VVVYvfKCsrSxUVFUpKStLWrVs1YMAAPfLII5Kk6dOna8SI\nES1+TQAA0DwWw03vvD179ujNN99URUWFDMOQw+FQZWWlcnJyvFWjS3WX9LOzs5WQkODrcgAAaLfc\nPoe/dOlSLVy4UOvWrdOsWbP02WefyWazeaM2AADQRtyOdhMVFaXk5GTdfffdunz5smbPnq3jx497\nozYAANBG3AZ+eHi4zp49qx49eujQoUOqqanR5cuXvVEbAABoI24D/6mnntLrr7+uYcOG6eDBgxo8\neLDuv/9+b9QGAADaiNt7+AMHDtTAgQMlSdu2bdOlS5c4wwcAwM+4PMM/e/asnn76af36179WeXm5\nJKmsrExvvfWWRo0a5bUCAQBA67kM/F/96leKjY1VSUmJVq5cqb/85S9KS0vTsWPHtG7dOm/WCAAA\nWsnlJX2bzaYXX3xRNTU1Gj16tD788EO9+OKLnN0DAOCHXAZ+3ZC3oaGhqq6u1vr163Xrrbd6rTAA\nANB2XF7Sv3ZCm5iYGMIeAAA/5vIMv6SkRDt27JBhGLp06ZJ27NhRb/v48eM9XhwAAGgbLgM/OTlZ\nn3/+eYP/rkPgAwDgP1wG/qJFi7xZBwAA8CC3I+0BAAD/R+ADAGACBD4AACbgNvDPnz+vRx99VA88\n8IAKCws1ffp05efne6M2AADQRtwG/vz58/XYY4+pY8eOiouL0+jRo/X88897ozYAANBG3Aa+zWbT\nkCFDZBiGLBaLpkyZorKyMm/UBgAA2ojbwA8PD9eFCxecI+8dOXJEoaGhHi8MAAC0HZfP4dd54YUX\n9NOf/lR///vfNW7cOF26dElvvPGGN2oDAABtxG3gJyQkaOvWrfrmm29UW1ur7t27c4YPAICfcXtJ\nf8KECXriiSf05Zdf6tZbbyXsAQDwQ24D/+OPP9YjjzyiAwcOaOTIkXrhhRd08OBBb9QGAADaiMUw\nDKO5P/z555/r1Vdf1blz53T06FFP1tUs+fn5Sk1NVXZ2thISEnxdDgAA7Zbbe/gnT57Url27tHfv\nXv3DP/yDHn30UY0YMcIbtQEAgDbiNvDnzZuncePGaePGjYqNjfVGTQAAoI25DPyioiLFxcXJarXK\nYrGopqZG//M//+Pcfsstt3ilQAAA0HouA3/u3LlatWqVMjMzZbFYdO2tfovFouzsbK8UCAAAWs9l\n4K9atUqStG/fPq8VAwAAPMPtY3knTpzQunXrVFNToxkzZig5OVl79uzxRm0AAKCNuA38hQsXqk+f\nPtqzZ4/CwsK0fft2rV692hu1AQCANuI28B0OhwYOHKhPPvlEaWlpuuWWW1RbW+uN2gAAQBtxG/gR\nERFau3atcnJyNGzYMP3xj39Ux44dvVEbAABoI24Df9myZaqoqJDValWnTp1UWFio3/3ud96oDQAA\ntBG3gd+lSxelpaXJ4XDo8OHDGjp0qP7+9797ozYAANBG3I609+tf/1off/yxunbt6lxnsVj09ttv\ne7QwoClVNXbZSqsVExWm8FC3H2MAMD23R8oDBw5o9+7dCg8P90Y9QJNqax1am3VSOXkFKiqpVFx0\nhJKT4jVjTB8FB7u9YAUApuU28Lt27aoWTKgHeNTarJPa+ekZ53KhrdK5PHP8Xb4qCwDaPbeB36lT\nJ40aNUr9+vVTaGioc/2iRYs8WhjwXVU1duXkFTS6LSevQJkP9ubyPgC44PbomJKSopSUFG/UAjTJ\nVlqtopLKRrcVl1TKVlqt+FgCHwAa4/boOGHCBOXn5+u//uu/NGTIEBUUFNTrwAd4S0xUmOKiI1Ro\naxj6sdERiokK80FVAOAf3PZy+vOf/6yf/exnevnll3Xp0iVNnTpVH3zwQbNePDc3V5mZmQ3W79u3\nT+np6crIyNCWLVtaXjVMKTw0RMlJ8Y1uS06K53I+ADTBbeCvWbNGGzduVMeOHXXzzTfr/fffb9ZY\n+mvWrNHcuXNVXV1db/2VK1e0aNEirV27Vhs2bNDmzZtVXFx8/S2AqcwY00djU7qrc0yEgixS55gI\njU3prhlj+vi6tIBUVWNXQXG5qmrsvi4FQCu5PSUKCgpSZGSkc7lz584KCnL/+FNiYqKsVquee+65\neuu//vprJSYmqlOnTpKke+65R4cPH9bIkSNbWjtMKDg4SDPH36XMB3vzHL4H8fgjEHjcHil79uyp\nd955R3a7XV988YX+9Kc/6Y477nD7wmlpacrPz2+wvqysTDfeeKNzuWPHjiorK3P7elarVStWrHD7\nczCH8NAQOuh5EI8/AoHH5Vf1iooKSdL8+fN18eJFhYWF6cUXX1RkZKReeuml637DyMhIlZeXO5fL\ny8vrfQFwZfbs2Tp9+nS9f9nZ2dddB4DGuXv8kcv7gH9yeYqUmZmpbdu2acmSJVqwYIHmzJnTJm/Y\no0cPnTt3TiUlJbrhhht05MgRPfbYY23y2gBaj8cfgcDkcq+tqKjQM888o08//bRBxzup5QPvZGVl\nqaKiQhkZGXrhhRf02GOPyTAMpaenq0uXLi2vHIBH8PgjEJhcBv7atWv1+eef6+jRoxo4cOB1vXhC\nQoLzsbsxY8Y41w8fPlzDhw+/rtcE4Fl1jz9eew+/Do8/Av7L5Z77/PPP6+2339b58+c1YcIEb9YE\nwMfqHnPMyStQcUmlYq/ppQ/AP7kM/PPnz+vf/u3ftG3btkYnz3niiSc8WhgA3+HxRyDwuOylb7Va\n602WA8B8rj7+2JGwBwKAy734zjvv1J133qmkpCTdd9993qwJAAC0sSaHzDp8+LDWrVunAQMGaMCA\nAXr00Ud15MgRb9UGAADaiMvAP3jwoJ5++mk98MAD2rhxo95++23df//9+uUvf6nPP//cmzUCAIBW\ncnlJ/80339Tq1avVu3dv57o777xTd999txYtWqR3333XKwUCAIDWc3mGX1ZWVi/s6yQlJenSpUse\nLQoAALStJsfSt9sbjpltt9sbXQ8AANovl4E/ZMgQLVu2rN662tpaLVq0SEOHDvV0XQAAoA25vIf/\nzDPPaNasWRoxYoSSkpJUW1urvLw83XbbbUxTCwCAn3EZ+DfccIPefvttHTp0SH/7299ksVg0ffp0\nDRgwwJv1AQCANuB2+KyBAwde9+Q5AACgfWhy4B34t6oauwqKy1VVQydLADA7BsgOQLW1Dq3NOqmc\nvAIVlVQq7pqZzoKD+Y4HAGZE4AegtVkn681lXmirdC7PHH+Xr8oCAPgQp3sBpqrGrpy8gka35eQV\ncHkfAEyKwA8wttJqFZVUNrqtuKRSttJqL1cEAGgPCPwAExMVprjoiEa3xUZHKCYqzMsVAYGBTrDw\nd9zDDzDhoSFKToqvdw+/TnJSvMJD+ZMDLUEnWAQKjv4BaMaYPpKu3rMvLqlU7DUHKAAtQydYBAoC\nPwAFBwdp5vi7lPlgb9lKqxUTFcaZPXAd3HWCzXywN/sW/AbXowJYeGiI4mM7ckCCxwT6fW06wSKQ\nkAQAWsws97XrOsEW2hqGPp1g4W8CZ88E4DV197ULbZUyjP+9r70266SvS2tTdZ1gG0MnWPgbAh9A\ni5htcKcZY/pobEp3dY6JUJBF6hwTobEp3ekEC7/D11MALdKc+9rxsYFzaKETLAIFZ/gAWsSsgzvR\nCRb+jsAH0CLc1wb8E3smgBZjcCfA/xD4AFqM+9qA/2EPBXDdrt7X5jAC+APu4QMAYAIEPgAAJkDg\nAwBgAgQ+ALRAoE8YhMBFbxsAaAazTBiEwEXgA0Az1E0YVKduwiBJmjn+Ll+VBTQbX0sBwA2zTRiE\nwETgA4AbzZkwCGjvCHwALWLGTmtmnTCoPTLj56+tcA8fQLOYudNa3YRB197Dr8OEQd5h5s9fW/HY\np9ThcGjBggU6ffq0QkNDtXDhQnXr1s25fefOnVq3bp2CgoKUnp6uadOmeaoUAG3A7J3WmDDIt8z+\n+WsLHgv8vXv3qqamRps3b9bx48e1ePFi/fu//7tz+5IlS7Rr1y7dcMMNGjVqlEaNGqVOnTp5qhwA\nreCu01rmg70D/iyXCYN8h89f2/DYdZCjR48qJSVFktS3b1/l5eXV23777bfr8uXLqqmpkWEYslgs\nnioFQCvRae1/XZ0wqCMB40V8/tqGxz6xZWVlioyMdC4HBwfLbrcrJOTqW/bs2VPp6emKiIjQiBEj\nFBUV1eTrWa1WrVixwlPlAmhCXae1QlvDgy6d1uBpfP7ahsfO8CMjI1VeXu5cdjgczrA/deqUPvnk\nE2VnZ2vfvn369ttv9eGHHzb5erNnz9bp06fr/cvOzvZU+QCuUddprTF0WoOn8flrGx4L/P79+2v/\n/v2SpOPHj6tXr17ObTfeeKPCw8MVFham4OBg3XTTTSotLfVUKQDawIwxfTQ2pbs6x0QoyCJ1jonQ\n2JTudFqDV/D5az2LYRiGJ164rpf+l19+KcMw9Morr+g///M/VVFRoYyMDG3cuFHbtm1Thw4dlJiY\nqN/+9rcKDQ1t0Xvk5+crNTVV2dnZSkhI8EQzAHxHVY2dTmvwGT5/189jge8NBD4AAM3DaAVAgGEk\nMgCN4XoIECAYiQxAUwh8IEAwEhmApvC1HwgATN8KwB0CHwgAjEQGwB0CHwgATN8KwB0CHwgAjEQG\nwB2OAkCAmDGmj+y1DuXkFchWWq24GKZvBfC/OMMHAkDdI3lHvrgo2+Vq3RQVrgG9u/BIHgAnzvCB\nAPDdR/L+b2mV/vx/vlHI/5/DHQD46g/4OR7JA9AcBD7g53gkD0BzEPiAn+ORPADNQeADfo5H8gA0\nB0cCIADUPXqXk1eg4pJKxUbzSB6A+gh8IAAE///e+JkP9pattFoxUWGc2QOohyMCEEDCQ0MUH8tu\nDaAh7uEDuC5VNXYVFJfz2B/gJzgVANAidaP65eQVqKikUnHX9BdgVD+g/SLwAbTId0f1K7RVOpcZ\n1Q9ov/g6DqDZGNUP8F8EPoBmY1Q/wH8R+ACajVH9AP9F4ANoNkb1A/wXeyeAFmFUP8A/EfgAWoRR\n/QD/xF4K4Lowqh/gX7iHDwCACRD4AACYAIEPAIAJEPgAAJgAgQ8AgAkQ+AAAmACBD8CvVdXYVVBc\nzsQ9gBs8RAvAL9XWOrQ266Ry8gpUVFKpuGtG/AsO5lwG+C4CH4BfWpt1Ujs/PeNcLrRVOpdnjr/L\nV2UB7RZfgwH4naoau3LyChrdlpNXwOV9oBEEPgC/YyutVlFJZaPbiksqZSut9nJFQPtH4APwOzFR\nYYqLjmh0W2x0hGKiwrxcEdD+EfgA/E54aIiSk+Ib3ZacFM/sfUAj2CsA+KUZY/pIunrPvrikUrHX\n9NIH0BCBD8AvBQcHaeb4u5T5YG/ZSqsVExXGmT3QBI/tHQ6HQwsWLNDp06cVGhqqhQsXqlu3bs7t\nJ06c0OLFi2UYhuLi4rR06VKFhXHfDUDLhIeGKD6WoAfc8dg9/L1796qmpkabN2/WnDlztHjxYuc2\nwzA0b948LVq0SBs3blRKSorOnz/vqVIAADA9j30tPnr0qFJSUiRJffv2VV5ennPb2bNnFR0drfXr\n1+urr77Sfffdp+7du3uqFAAATM9jgV9WVqbIyEjncnBwsOx2u0JCQmSz2XTs2DHNnz9fiYmJmjVr\nlpKSknTvvfe6fD2r1aoVK1Z4qlwAAAKaxy7pR0ZGqry83LnscDgUEnL1+0V0dLS6deumHj16qEOH\nDkpJSal3BaAxs2fP1unTp+v9y87O9lT5AAAEFI8Ffv/+/bV//35J0vHjx9WrVy/ntq5du6q8vFzn\nzp2TJB05ckQ9e/b0VCkAAJiexy7pjxgxQgcOHNDUqVNlGIZeeeUVZWVlqaKiQhkZGXr55Zc1Z84c\nGYahfv36aejQoZ4qBQAA07MYhmH4uojrlZ+fr9TUVGVnZyshIcHX5QAA0G4xtC4AACZA4AMAYAIE\nPgAAJkDgAwBgAgQ+AAAmQOADAGACBD4AACZA4AMAYAIEPgAAJkDgAwBgAgQ+AAAmQOADAGACBD4A\nACZA4AMAYAIEPgAAJkDgAwBgAgQ+AAAmQOADAGACBD4AACYQ4usCWqO2tlaSdOHCBR9XAgCAd33v\ne99TSEjzY9yvA7+oqEiS9NBDD/m4EgAAvCs7O1sJCQnN/nmLYRiGB+vxqKqqKuXl5SkuLk7BwcG+\nLqeB1NRUZWdn+7qMNkFb2ifa0j7RlvYp0Npy8uRJ85zhh4eHa8CAAb4uo0kt+fbV3tGW9om2tE+0\npX0KpLa0JOwlOu0BAGAKBD4AACZA4AMAYALBCxYsWODrIgLZoEGDfF1Cm6Et7RNtaZ9oS/tk5rb4\ndS99AADQPFzSBwDABAh8AABMgMAHAMAECHwAAEyAwAcAwAQI/FZyOByaP3++MjIylJmZqXPnzjX6\nc/PmzdOyZcu8XF3LuGvLiRMnNG3aNP3kJz/Rk08+qerqah9V6p67tuzcuVMTJkxQenq6/vSnP/mo\nypbJzc1VZmZmg/X79u1Tenq6MjIytGXLFh9U1nKu2rJr1y5NnjxZU6dO1fz58+VwOHxQXcu4aksd\nf9j367hqiz/t+3VctcWf9v0rV67o2Wef1bRp0zRp0qQG8wC0eN830Cp79uwxnn/+ecMwDOPYsWPG\nrFmzGvzMxo0bjSlTphhLly71dnkt0lRbHA6HMXbsWOObb74xDMMwtmzZYnz99dc+qbM53P1dBg8e\nbNhsNqO6utq4//77jZKSEl+U2WyrV682Ro8ebUyePLne+pqaGmf91dXVxsSJE42ioiIfVdk8rtpS\nWVlppKamGhUVFYZhGMYvf/lLY+/evb4osdlctaWOv+z7huG6Lf627xtG038Xf9r3t27daixcuNAw\nDMOw2WzGfffd59x2Pfs+Z/itdPToUaWkpEiS+vbtq7y8vHrb//rXvyo3N1cZGRm+KK9FmmrL2bNn\nFR0drfXr1+vhhx9WSUmJunfv7qtS3XL3d7n99tt1+fJl1dTUyDAMWSwWX5TZbImJibJarQ3Wf/31\n10pMTFSnTp0UGhqqe+65R4cPH/ZBhc3nqi2hoaHatGmTIiIiJEl2u11hYWHeLq9FXLVF8q99X3Ld\nFn/b96Wm/y7+tO//+Mc/1i9+8QtJkmEY9WaFvZ59n8BvpbKyMkVGRjqXg4ODZbfbJUmFhYV68803\nNX/+fF+V1yJNtcVms+nYsWN6+OGHtW7dOuXk5OjgwYO+KtWtptoiST179lR6erpGjRqloUOHKioq\nyhdlNltaWlqjM2OVlZXpxhtvdC537NhRZWVl3iytxVy1JSgoSLGxsZKkDRs2qKKiQoMHD/Z2eS3i\nqi3+tu9Lrtvib/u+5Lotkn/t+x07dlRkZKTKysr05JNP6qmnnnJuu559n8BvpcjISJWXlzuXHQ6H\n84O2e/du2Ww2Pf7441q9erV27dql7du3+6pUt5pqS3R0tLp166YePXqoQ4cOSklJaXDW3J401ZZT\np07pk08+UXZ2tvbt26dvv/1WH374oa9KbZXvtrO8vLzeQcDfOBwOvfrqqzpw4ICsVmu7Pvtqir/t\n+03xt330VIUVAAAH1UlEQVS/Kf647xcUFGj69OkaN26cxowZ41x/Pfs+gd9K/fv31/79+yVJx48f\nV69evZzbpk+fru3bt2vDhg16/PHHNXr0aE2cONFXpbrVVFu6du2q8vJyZ+e3I0eOqGfPnj6pszma\nasuNN96o8PBwhYWFKTg4WDfddJNKS0t9VWqr9OjRQ+fOnVNJSYlqamp05MgR9evXz9dlXbf58+er\nurpaK1eudF7a90f+tu83xd/2/ab4275fXFysGTNm6Nlnn9WkSZPqbbuefb/xax5othEjRujAgQOa\nOnWqDMPQK6+8oqysLFVUVPjNvbs67try8ssva86cOTIMQ/369dPQoUN9XbJL7tqSkZGhadOmqUOH\nDkpMTNSECRN8XXKLXNuWF154QY899pgMw1B6erq6dOni6/JapK4tSUlJ2rp1qwYMGKBHHnlE0tXg\nHDFihI8rbD5/3fcb46/7fmP8dd9/6623VFpaqpUrV2rlypWSpMmTJ6uysvK69n0mzwEAwAS4pA8A\ngAkQ+AAAmACBDwCACRD4AACYAIEPAIAJEPhAO5Ofn6+kpCSNGzdO48aNU1pamp588kkVFxe7/d3l\ny5crNTVV69ata5NasrOz9cYbb7TqNb7bnjFjxmj48OFavny529+9dvKTcePGtaoOwOx4LA9oZ/Lz\n8zV9+nTt27dP0tUxtH/3u9/p6NGjbmf3Sk1N1e9//3vdeuut3ii1Wb7bHkm6ePGi0tLStG3bNvXo\n0cPl795+++06ffq0N8oEAh4D7wDtnMVi0ezZszV48GCdOnVKd9xxh1avXq0PP/xQtbW1GjJkiJ59\n9lm99NJLunjxon7+85/rtddeU1FRkZYvXy673a6EhAT99re/VUxMjIYPH66xY8fqs88+U2VlpV59\n9VUlJSVp3bp1ev/99xUUFKQf/OAH+s1vfqPt27fr0KFDGjFihLZs2aJVq1ZJkt555x198803+tWv\nfqUlS5bo0KFDqq2t1cSJE/VP//RPbttUVFQkwzDUsWNH2e12LViwQF999ZWKi4t16623asWKFc4p\nZSdPnqz33nvPGf5Wq1UXL17UuXPndP78eU2ePFk/+9nPdOXKFb300ks6evSounTpIovFon/5l3/R\noEGDPPnnAfwGl/QBPxAaGqpu3brpzJkz2r9/v/Ly8rR161bt2LFDFy9e1M6dO/Wb3/xGnTt31urV\nq9WlSxe99tpr+sMf/qAdO3ZoyJAh9eZkj46O1tatWzV16lStWrVKdrtdq1at0rZt27R9+3ZZLBZd\nvHjR+fM/+tGPdPLkSV26dEnS1Xnrx44d65yD+/3339fWrVuVnZ2tI0eONKi/sLBQ48aN049//GMN\nGjRIr7/+ulasWKHvfe97OnbsmDp06KDNmzfrP/7jP1RdXa2//OUvmjt3riTpvffea/B6p0+f1h/+\n8Ae99957Wr16tUpLS7Vp0yZVVlZq9+7dWrRokf72t7+16d8A8Hec4QN+wmKxKDw8XAcPHtSJEyec\nY7NXVVXplltuqfezubm5zkk3pKuT0nTq1Mm5vW7q4J49e+qjjz5SSEiI+vXrp0mTJik1NVUPPfRQ\nvWE6O3TooAceeEAfffSRfvjDH6qkpEQ/+MEP9Pvf/15ffPGFcnJyJEkVFRU6ffq0BgwYUK+ezp07\n64MPPpDD4dDixYt1+vRpJScnS5L+8R//UdHR0Xr33Xd15swZffPNN6qoqGjy/8WgQYMUGhqqm2++\nWdHR0bp8+bIOHDigKVOmyGKx6Pvf/77uvffe6/nfDAQsAh/wAzU1NTp79qxuu+025eTk6JFHHtGj\njz4qSSotLa03T7Yk1dbWqn///nrrrbckSdXV1fVm1qqbZ/7a2ehWrlyp48ePa//+/frnf/7nelcE\nJGns2LF64403dOnSJY0ePdr5Ps8++6weeOABSdK3336rG264wWU7goKC9Nxzz2n8+PFau3atfvrT\nnyo7O1vLly/X9OnTNXHiRNlsNrnrWlRXf10b6uYKdzgcTf4eYGZc0gfaOYfDIavVqrvvvluJiYlK\nTk7WBx98oPLyctntdv385z/Xnj176v3O3XffrePHj+vs2bOSrob5kiVLXL7Ht99+q5EjR6pXr176\nxS9+ocGDBzfoLNe3b18VFhbqgw8+cPaYT05O1pYtW3TlyhWVl5dr2rRpys3NbbI9ISEheu655/TW\nW2+pqKhIBw8e1MiRI5Wenq7Y2FgdPnxYtbW1kqTg4GDZ7fZm/X/64Q9/qD//+c8yDEMXL17UoUOH\n/HZ6XcATOMMH2qG6e97S1cDv3bu3XnvtNUnS8OHDderUKU2ZMkW1tbVKSUlpMONXXFycXnnlFT31\n1FNyOBzq0qWLli5d6vL9brrpJk2dOlWTJk1SRESE4uPjNWHCBH300Uf1fm7kyJH67LPP1LVrV0nS\n1KlTde7cOU2YMEF2u10TJ05sVie5H/3oR+rbt69ef/11TZ8+Xc8884x2796t0NBQ9e3bV/n5+ZKu\nPnUwbty4Zs0lP2XKFJ06dUpjxoxRXFycbrnlFoWHh7v9PcAseCwPQED45JNPZBiGhg0bpsuXL2v8\n+PHatm2boqOjfV0a0C4Q+AACwn//93/rueeec3b4mzFjBoP1ANcg8AEAMAE67QEAYAIEPgAAJkDg\nAwBgAgQ+AAAmQOADAGACBD4AACbw/wBBLxa3qHx/8AAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9619f98>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.set_style('ticks')\n",
"plt.scatter(res.x[n_teams:n_teams*2], res.x[:n_teams]); plt.ylabel(\"Offensive Rating\"); plt.xlabel(\"Defensive Rating\")\n",
"plt.xlim(0.25, 2); plt.ylim(0.5, 1.7);\n",
"sns.despine()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [root]",
"language": "python",
"name": "Python [root]"
},
"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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment