{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### This is an experiment in using the Kotlin kernel for Jupyter \n",
    "Note: this notebook was updated July 2021 to point to newer versions of its dependencies, which had become deprecated and were not allowing the notebook to complete successfully. It was also used for a presentation of Kotlin's Jupyter kernel in March 2021, so the 2020 season data, which didn't exist at the time the initial article was written, was added."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"XXcRmx\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"library\">\n",
       "       if(!window.letsPlotCallQueue) {\n",
       "           window.letsPlotCallQueue = [];\n",
       "       }; \n",
       "       window.letsPlotCall = function(f) {\n",
       "           window.letsPlotCallQueue.push(f);\n",
       "       };\n",
       "       (function() {\n",
       "           var script = document.createElement(\"script\");\n",
       "           script.type = \"text/javascript\";\n",
       "           script.src = \"https://cdnjs.cloudflare.com/ajax/libs/lets-plot/2.0.2/lets-plot.min.js\";\n",
       "           script.onload = function() {\n",
       "               window.letsPlotCall = function(f) {f();};\n",
       "               window.letsPlotCallQueue.forEach(function(f) {f();});\n",
       "               window.letsPlotCallQueue = [];\n",
       "               \n",
       "               \n",
       "           };\n",
       "           script.onerror = function(event) {\n",
       "               window.letsPlotCall = function(f) {};\n",
       "               window.letsPlotCallQueue = [];\n",
       "               var div = document.createElement(\"div\");\n",
       "               div.style.color = 'darkred';\n",
       "               div.textContent = 'Error loading Lets-Plot JS';\n",
       "               document.getElementById(\"XXcRmx\").appendChild(div);\n",
       "           };\n",
       "           var e = document.getElementById(\"XXcRmx\");\n",
       "           e.appendChild(script);\n",
       "       })();\n",
       "   </script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "// two \"supported\" packages, we can skip the full dependency & import boilerplate\n",
    "%use lets-plot, krangl  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<html><body><table><tr><th style=\"text-align:left\">Rk</th><th style=\"text-align:left\">Year</th><th style=\"text-align:left\">Tms</th><th style=\"text-align:left\">RshTD</th><th style=\"text-align:left\">RecTD</th><th style=\"text-align:left\">PR TD</th><th style=\"text-align:left\">KR TD</th><th style=\"text-align:left\">FblTD</th><th style=\"text-align:left\">IntTD</th><th style=\"text-align:left\">OthTD</th><th style=\"text-align:left\">AllTD</th><th style=\"text-align:left\">2PM</th><th style=\"text-align:left\">2PA</th><th style=\"text-align:left\">XPM</th><th style=\"text-align:left\">XPA</th><th style=\"text-align:left\">FGM</th><th style=\"text-align:left\">FGA</th><th style=\"text-align:left\">Sfty</th><th style=\"text-align:left\">Pts</th><th style=\"text-align:left\">Pts/G</th></tr><tr><td style=\"text-align:left\" title=\"1\">1</td><td style=\"text-align:left\" title=\"2020\">2020</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"532\">532</td><td style=\"text-align:left\" title=\"871\">871</td><td style=\"text-align:left\" title=\"8\">8</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"21\">21</td><td style=\"text-align:left\" title=\"31\">31</td><td style=\"text-align:left\" title=\"3\">3</td><td style=\"text-align:left\" title=\"1473\">1473</td><td style=\"text-align:left\" title=\"63\">63</td><td style=\"text-align:left\" title=\"131\">131</td><td style=\"text-align:left\" title=\"1244\">1244</td><td style=\"text-align:left\" title=\"1338\">1338</td><td style=\"text-align:left\" title=\"812\">812</td><td style=\"text-align:left\" title=\"960\">960</td><td style=\"text-align:left\" title=\"24\">24</td><td style=\"text-align:left\" title=\"12692\">12692</td><td style=\"text-align:left\" title=\"24.8\">24.8</td></tr><tr><td style=\"text-align:left\" title=\"2\">2</td><td style=\"text-align:left\" title=\"2019\">2019</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"447\">447</td><td style=\"text-align:left\" title=\"797\">797</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"34\">34</td><td style=\"text-align:left\" title=\"35\">35</td><td style=\"text-align:left\" title=\"5\">5</td><td style=\"text-align:left\" title=\"1332\">1332</td><td style=\"text-align:left\" title=\"54\">54</td><td style=\"text-align:left\" title=\"113\">113</td><td style=\"text-align:left\" title=\"1136\">1136</td><td style=\"text-align:left\" title=\"1210\">1210</td><td style=\"text-align:left\" title=\"802\">802</td><td style=\"text-align:left\" title=\"983\">983</td><td style=\"text-align:left\" title=\"17\">17</td><td style=\"text-align:left\" title=\"11676\">11676</td><td style=\"text-align:left\" title=\"22.8\">22.8</td></tr><tr><td style=\"text-align:left\" title=\"3\">3</td><td style=\"text-align:left\" title=\"2018\">2018</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"439\">439</td><td style=\"text-align:left\" title=\"847\">847</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"5\">5</td><td style=\"text-align:left\" title=\"24\">24</td><td style=\"text-align:left\" title=\"45\">45</td><td style=\"text-align:left\" title=\"4\">4</td><td style=\"text-align:left\" title=\"1371\">1371</td><td style=\"text-align:left\" title=\"66\">66</td><td style=\"text-align:left\" title=\"129\">129</td><td style=\"text-align:left\" title=\"1164\">1164</td><td style=\"text-align:left\" title=\"1235\">1235</td><td style=\"text-align:left\" title=\"802\">802</td><td style=\"text-align:left\" title=\"947\">947</td><td style=\"text-align:left\" title=\"10\">10</td><td style=\"text-align:left\" title=\"11948\">11948</td><td style=\"text-align:left\" title=\"23.3\">23.3</td></tr><tr><td style=\"text-align:left\" title=\"4\">4</td><td style=\"text-align:left\" title=\"2017\">2017</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"380\">380</td><td style=\"text-align:left\" title=\"741\">741</td><td style=\"text-align:left\" title=\"10\">10</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"41\">41</td><td style=\"text-align:left\" title=\"42\">42</td><td style=\"text-align:left\" title=\"4\">4</td><td style=\"text-align:left\" title=\"1225\">1225</td><td style=\"text-align:left\" title=\"37\">37</td><td style=\"text-align:left\" title=\"82\">82</td><td style=\"text-align:left\" title=\"1066\">1066</td><td style=\"text-align:left\" title=\"1134\">1134</td><td style=\"text-align:left\" title=\"866\">866</td><td style=\"text-align:left\" title=\"1027\">1027</td><td style=\"text-align:left\" title=\"15\">15</td><td style=\"text-align:left\" title=\"11118\">11118</td><td style=\"text-align:left\" title=\"21.7\">21.7</td></tr><tr><td style=\"text-align:left\" title=\"5\">5</td><td style=\"text-align:left\" title=\"2016\">2016</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"443\">443</td><td style=\"text-align:left\" title=\"786\">786</td><td style=\"text-align:left\" title=\"10\">10</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"22\">22</td><td style=\"text-align:left\" title=\"34\">34</td><td style=\"text-align:left\" title=\"4\">4</td><td style=\"text-align:left\" title=\"1306\">1306</td><td style=\"text-align:left\" title=\"51\">51</td><td style=\"text-align:left\" title=\"105\">105</td><td style=\"text-align:left\" title=\"1119\">1119</td><td style=\"text-align:left\" title=\"1195\">1195</td><td style=\"text-align:left\" title=\"850\">850</td><td style=\"text-align:left\" title=\"1009\">1009</td><td style=\"text-align:left\" title=\"20\">20</td><td style=\"text-align:left\" title=\"11647\">11647</td><td style=\"text-align:left\" title=\"22.8\">22.8</td></tr><tr><td style=\"text-align:left\" title=\"6\">6</td><td style=\"text-align:left\" title=\"2015\">2015</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"365\">365</td><td style=\"text-align:left\" title=\"842\">842</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"33\">33</td><td style=\"text-align:left\" title=\"53\">53</td><td style=\"text-align:left\" title=\"5\">5</td><td style=\"text-align:left\" title=\"1318\">1318</td><td style=\"text-align:left\" title=\"45\">45</td><td style=\"text-align:left\" title=\"94\">94</td><td style=\"text-align:left\" title=\"1146\">1146</td><td style=\"text-align:left\" title=\"1217\">1217</td><td style=\"text-align:left\" title=\"834\">834</td><td style=\"text-align:left\" title=\"987\">987</td><td style=\"text-align:left\" title=\"16\">16</td><td style=\"text-align:left\" title=\"11678\">11678</td><td style=\"text-align:left\" title=\"22.8\">22.8</td></tr><tr><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"2014\">2014</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"380\">380</td><td style=\"text-align:left\" title=\"807\">807</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"6\">6</td><td style=\"text-align:left\" title=\"28\">28</td><td style=\"text-align:left\" title=\"47\">47</td><td style=\"text-align:left\" title=\"12\">12</td><td style=\"text-align:left\" title=\"1293\">1293</td><td style=\"text-align:left\" title=\"28\">28</td><td style=\"text-align:left\" title=\"58\">58</td><td style=\"text-align:left\" title=\"1222\">1222</td><td style=\"text-align:left\" title=\"1230\">1230</td><td style=\"text-align:left\" title=\"829\">829</td><td style=\"text-align:left\" title=\"987\">987</td><td style=\"text-align:left\" title=\"21\">21</td><td style=\"text-align:left\" title=\"11565\">11565</td><td style=\"text-align:left\" title=\"22.6\">22.6</td></tr><tr><td style=\"text-align:left\" title=\"8\">8</td><td style=\"text-align:left\" title=\"2013\">2013</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"410\">410</td><td style=\"text-align:left\" title=\"804\">804</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"30\">30</td><td style=\"text-align:left\" title=\"65\">65</td><td style=\"text-align:left\" title=\"9\">9</td><td style=\"text-align:left\" title=\"1338\">1338</td><td style=\"text-align:left\" title=\"34\">34</td><td style=\"text-align:left\" title=\"69\">69</td><td style=\"text-align:left\" title=\"1262\">1262</td><td style=\"text-align:left\" title=\"1267\">1267</td><td style=\"text-align:left\" title=\"863\">863</td><td style=\"text-align:left\" title=\"998\">998</td><td style=\"text-align:left\" title=\"20\">20</td><td style=\"text-align:left\" title=\"11987\">11987</td><td style=\"text-align:left\" title=\"23.4\">23.4</td></tr><tr><td style=\"text-align:left\" title=\"9\">9</td><td style=\"text-align:left\" title=\"2012\">2012</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"401\">401</td><td style=\"text-align:left\" title=\"757\">757</td><td style=\"text-align:left\" title=\"18\">18</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"26\">26</td><td style=\"text-align:left\" title=\"71\">71</td><td style=\"text-align:left\" title=\"11\">11</td><td style=\"text-align:left\" title=\"1297\">1297</td><td style=\"text-align:left\" title=\"29\">29</td><td style=\"text-align:left\" title=\"56\">56</td><td style=\"text-align:left\" title=\"1229\">1229</td><td style=\"text-align:left\" title=\"1235\">1235</td><td style=\"text-align:left\" title=\"852\">852</td><td style=\"text-align:left\" title=\"1016\">1016</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"11651\">11651</td><td style=\"text-align:left\" title=\"22.8\">22.8</td></tr><tr><td style=\"text-align:left\" title=\"10\">10</td><td style=\"text-align:left\" title=\"2011\">2011</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"400\">400</td><td style=\"text-align:left\" title=\"745\">745</td><td style=\"text-align:left\" title=\"20\">20</td><td style=\"text-align:left\" title=\"9\">9</td><td style=\"text-align:left\" title=\"31\">31</td><td style=\"text-align:left\" title=\"49\">49</td><td style=\"text-align:left\" title=\"5\">5</td><td style=\"text-align:left\" title=\"1259\">1259</td><td style=\"text-align:left\" title=\"24\">24</td><td style=\"text-align:left\" title=\"50\">50</td><td style=\"text-align:left\" title=\"1200\">1200</td><td style=\"text-align:left\" title=\"1207\">1207</td><td style=\"text-align:left\" title=\"838\">838</td><td style=\"text-align:left\" title=\"1011\">1011</td><td style=\"text-align:left\" title=\"21\">21</td><td style=\"text-align:left\" title=\"11358\">11358</td><td style=\"text-align:left\" title=\"22.2\">22.2</td></tr><tr><td style=\"text-align:left\" title=\"11\">11</td><td style=\"text-align:left\" title=\"2010\">2010</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"399\">399</td><td style=\"text-align:left\" title=\"751\">751</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"23\">23</td><td style=\"text-align:left\" title=\"22\">22</td><td style=\"text-align:left\" title=\"57\">57</td><td style=\"text-align:left\" title=\"5\">5</td><td style=\"text-align:left\" title=\"1270\">1270</td><td style=\"text-align:left\" title=\"26\">26</td><td style=\"text-align:left\" title=\"50\">50</td><td style=\"text-align:left\" title=\"1203\">1203</td><td style=\"text-align:left\" title=\"1214\">1214</td><td style=\"text-align:left\" title=\"794\">794</td><td style=\"text-align:left\" title=\"964\">964</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"11283\">11283</td><td style=\"text-align:left\" title=\"22.0\">22.0</td></tr><tr><td style=\"text-align:left\" title=\"12\">12</td><td style=\"text-align:left\" title=\"2009\">2009</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"429\">429</td><td style=\"text-align:left\" title=\"710\">710</td><td style=\"text-align:left\" title=\"10\">10</td><td style=\"text-align:left\" title=\"18\">18</td><td style=\"text-align:left\" title=\"25\">25</td><td style=\"text-align:left\" title=\"48\">48</td><td style=\"text-align:left\" title=\"7\">7</td><td style=\"text-align:left\" title=\"1247\">1247</td><td style=\"text-align:left\" title=\"24\">24</td><td style=\"text-align:left\" title=\"59\">59</td><td style=\"text-align:left\" title=\"1165\">1165</td><td style=\"text-align:left\" title=\"1185\">1185</td><td style=\"text-align:left\" title=\"756\">756</td><td style=\"text-align:left\" title=\"930\">930</td><td style=\"text-align:left\" title=\"14\">14</td><td style=\"text-align:left\" title=\"10991\">10991</td><td style=\"text-align:left\" title=\"21.5\">21.5</td></tr><tr><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"2008\">2008</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"476\">476</td><td style=\"text-align:left\" title=\"646\">646</td><td style=\"text-align:left\" title=\"16\">16</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"33\">33</td><td style=\"text-align:left\" title=\"52\">52</td><td style=\"text-align:left\" title=\"10\">10</td><td style=\"text-align:left\" title=\"1246\">1246</td><td style=\"text-align:left\" title=\"28\">28</td><td style=\"text-align:left\" title=\"64\">64</td><td style=\"text-align:left\" title=\"1170\">1170</td><td style=\"text-align:left\" title=\"1176\">1176</td><td style=\"text-align:left\" title=\"845\">845</td><td style=\"text-align:left\" title=\"1000\">1000</td><td style=\"text-align:left\" title=\"21\">21</td><td style=\"text-align:left\" title=\"11279\">11279</td><td style=\"text-align:left\" title=\"22.0\">22.0</td></tr><tr><td style=\"text-align:left\" title=\"14\">14</td><td style=\"text-align:left\" title=\"2007\">2007</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"386\">386</td><td style=\"text-align:left\" title=\"720\">720</td><td style=\"text-align:left\" title=\"17\">17</td><td style=\"text-align:left\" title=\"25\">25</td><td style=\"text-align:left\" title=\"37\">37</td><td style=\"text-align:left\" title=\"52\">52</td><td style=\"text-align:left\" title=\"6\">6</td><td style=\"text-align:left\" title=\"1243\">1243</td><td style=\"text-align:left\" title=\"30\">30</td><td style=\"text-align:left\" title=\"57\">57</td><td style=\"text-align:left\" title=\"1165\">1165</td><td style=\"text-align:left\" title=\"1177\">1177</td><td style=\"text-align:left\" title=\"795\">795</td><td style=\"text-align:left\" title=\"960\">960</td><td style=\"text-align:left\" title=\"18\">18</td><td style=\"text-align:left\" title=\"11104\">11104</td><td style=\"text-align:left\" title=\"21.7\">21.7</td></tr><tr><td style=\"text-align:left\" title=\"15\">15</td><td style=\"text-align:left\" title=\"2006\">2006</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"424\">424</td><td style=\"text-align:left\" title=\"648\">648</td><td style=\"text-align:left\" title=\"15\">15</td><td style=\"text-align:left\" title=\"9\">9</td><td style=\"text-align:left\" title=\"33\">33</td><td style=\"text-align:left\" title=\"49\">49</td><td style=\"text-align:left\" title=\"3\">3</td><td style=\"text-align:left\" title=\"1181\">1181</td><td style=\"text-align:left\" title=\"21\">21</td><td style=\"text-align:left\" title=\"35\">35</td><td style=\"text-align:left\" title=\"1124\">1124</td><td style=\"text-align:left\" title=\"1135\">1135</td><td style=\"text-align:left\" title=\"767\">767</td><td style=\"text-align:left\" title=\"942\">942</td><td style=\"text-align:left\" title=\"12\">12</td><td style=\"text-align:left\" title=\"10577\">10577</td><td style=\"text-align:left\" title=\"20.7\">20.7</td></tr><tr><td style=\"text-align:left\" title=\"16\">16</td><td style=\"text-align:left\" title=\"2005\">2005</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"431\">431</td><td style=\"text-align:left\" title=\"644\">644</td><td style=\"text-align:left\" title=\"9\">9</td><td style=\"text-align:left\" title=\"12\">12</td><td style=\"text-align:left\" title=\"23\">23</td><td style=\"text-align:left\" title=\"47\">47</td><td style=\"text-align:left\" title=\"6\">6</td><td style=\"text-align:left\" title=\"1172\">1172</td><td style=\"text-align:left\" title=\"27\">27</td><td style=\"text-align:left\" title=\"47\">47</td><td style=\"text-align:left\" title=\"1099\">1099</td><td style=\"text-align:left\" title=\"1114\">1114</td><td style=\"text-align:left\" title=\"783\">783</td><td style=\"text-align:left\" title=\"967\">967</td><td style=\"text-align:left\" title=\"11\">11</td><td style=\"text-align:left\" title=\"10556\">10556</td><td style=\"text-align:left\" title=\"20.6\">20.6</td></tr><tr><td style=\"text-align:left\" title=\"17\">17</td><td style=\"text-align:left\" title=\"2004\">2004</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"416\">416</td><td style=\"text-align:left\" title=\"732\">732</td><td style=\"text-align:left\" title=\"11\">11</td><td style=\"text-align:left\" title=\"17\">17</td><td style=\"text-align:left\" title=\"34\">34</td><td style=\"text-align:left\" title=\"53\">53</td><td style=\"text-align:left\" title=\"5\">5</td><td style=\"text-align:left\" title=\"1268\">1268</td><td style=\"text-align:left\" title=\"37\">37</td><td style=\"text-align:left\" title=\"73\">73</td><td style=\"text-align:left\" title=\"1179\">1179</td><td style=\"text-align:left\" title=\"1189\">1189</td><td style=\"text-align:left\" title=\"703\">703</td><td style=\"text-align:left\" title=\"870\">870</td><td style=\"text-align:left\" title=\"15\">15</td><td style=\"text-align:left\" title=\"11000\">11000</td><td style=\"text-align:left\" title=\"21.5\">21.5</td></tr><tr><td style=\"text-align:left\" title=\"18\">18</td><td style=\"text-align:left\" title=\"2003\">2003</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"427\">427</td><td style=\"text-align:left\" title=\"654\">654</td><td style=\"text-align:left\" title=\"18\">18</td><td style=\"text-align:left\" title=\"13\">13</td><td style=\"text-align:left\" title=\"24\">24</td><td style=\"text-align:left\" title=\"58\">58</td><td style=\"text-align:left\" title=\"4\">4</td><td style=\"text-align:left\" title=\"1198\">1198</td><td style=\"text-align:left\" title=\"29\">29</td><td style=\"text-align:left\" title=\"60\">60</td><td style=\"text-align:left\" title=\"1110\">1110</td><td style=\"text-align:left\" title=\"1128\">1128</td><td style=\"text-align:left\" title=\"756\">756</td><td style=\"text-align:left\" title=\"954\">954</td><td style=\"text-align:left\" title=\"21\">21</td><td style=\"text-align:left\" title=\"10666\">10666</td><td style=\"text-align:left\" title=\"20.8\">20.8</td></tr><tr><td style=\"text-align:left\" title=\"19\">19</td><td style=\"text-align:left\" title=\"2002\">2002</td><td style=\"text-align:left\" title=\"32\">32</td><td style=\"text-align:left\" title=\"460\">460</td><td style=\"text-align:left\" title=\"694\">694</td><td style=\"text-align:left\" title=\"22\">22</td><td style=\"text-align:left\" title=\"17\">17</td><td style=\"text-align:left\" title=\"26\">26</td><td style=\"text-align:left\" title=\"46\">46</td><td style=\"text-align:left\" title=\"5\">5</td><td style=\"text-align:left\" title=\"1270\">1270</td><td style=\"text-align:left\" title=\"47\">47</td><td style=\"text-align:left\" title=\"81\">81</td><td style=\"text-align:left\" title=\"1148\">1148</td><td style=\"text-align:left\" title=\"1165\">1165</td><td style=\"text-align:left\" title=\"737\">737</td><td style=\"text-align:left\" title=\"951\">951</td><td style=\"text-align:left\" title=\"12\">12</td><td style=\"text-align:left\" title=\"11097\">11097</td><td style=\"text-align:left\" title=\"21.7\">21.7</td></tr><tr><td style=\"text-align:left\" title=\"20\">20</td><td style=\"text-align:left\" title=\"2001\">2001</td><td style=\"text-align:left\" title=\"31\">31</td><td style=\"text-align:left\" title=\"365\">365</td><td style=\"text-align:left\" title=\"635\">635</td><td style=\"text-align:left\" title=\"12\">12</td><td style=\"text-align:left\" title=\"10\">10</td><td style=\"text-align:left\" title=\"33\">33</td><td style=\"text-align:left\" title=\"59\">59</td><td style=\"text-align:left\" title=\"6\">6</td><td style=\"text-align:left\" title=\"1120\">1120</td><td style=\"text-align:left\" title=\"40\">40</td><td style=\"text-align:left\" title=\"85\">85</td><td style=\"text-align:left\" title=\"1008\">1008</td><td style=\"text-align:left\" title=\"1027\">1027</td><td style=\"text-align:left\" title=\"732\">732</td><td style=\"text-align:left\" title=\"959\">959</td><td style=\"text-align:left\" title=\"10\">10</td><td style=\"text-align:left\" title=\"10024\">10024</td><td style=\"text-align:left\" title=\"20.2\">20.2</td></tr></table><p>... only showing top 20 rows</p></body></html>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// csv is courtesy of pro-football-reference: https://www.pro-football-reference.com/years/NFL/scoring.htm\n",
    "val dfScoring = DataFrame.readCSV(\"nfl_scoring.csv\")\n",
    "dfScoring"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "look how `filter` is a normal, native Kotlin command! Only difference is `lt` or `gt` instead of `>` or `<`\n",
    "\n",
    "compare to non-native Python required by Pandas for simple filtering: \n",
    "    `df.loc[(df['column_name'] >= A) & (df['column_name'] <= B)]`\n",
    "\n",
    "https://stackoverflow.com/questions/17071871/how-do-i-select-rows-from-a-dataframe-based-on-column-values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Rk, Year, Tms, RshTD, RecTD, PR TD, KR TD, FblTD, IntTD, OthTD, AllTD, 2PM, 2PA, XPM, XPA, FGM, FGA, Sfty, Pts, Pts/G]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// DataFrames are cool but so are native Kotlin data structures, like Maps\n",
    "val mapScoring = dfScoring.filter { (it[\"Year\"] lt 2021) AND (it[\"Year\"] gt 1990) }.toMap()\n",
    "mapScoring.keys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, 1999, 1998, 1997, 1996, 1995, 1994, 1993, 1992, 1991]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// the map's keys are strings (column titles), the values are lists, the individual lists contain the column data\n",
    "mapScoring[\"Year\"]?.map { it }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"w1u9Er\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "'ggtitle':{\n",
       "'text':\"Total Points per NFL regular season\"\n",
       "},\n",
       "'mapping':{\n",
       "'x':\"Year\",\n",
       "'y':\"Pts\"\n",
       "},\n",
       "'data':{\n",
       "'Year':[2020.0,2019.0,2018.0,2017.0,2016.0,2015.0,2014.0,2013.0,2012.0,2011.0,2010.0,2009.0,2008.0,2007.0,2006.0,2005.0,2004.0,2003.0,2002.0,2001.0,2000.0,1999.0,1998.0,1997.0,1996.0,1995.0,1994.0,1993.0,1992.0,1991.0],\n",
       "'Pts':[12692.0,11676.0,11948.0,11118.0,11647.0,11678.0,11565.0,11987.0,11651.0,11358.0,11283.0,10991.0,11279.0,11104.0,10577.0,10556.0,11000.0,10666.0,11097.0,10024.0,10254.0,10324.0,10215.0,9957.0,9805.0,10314.0,9075.0,8377.0,8391.0,8506.0]\n",
       "},\n",
       "'ggsize':{\n",
       "'width':640,\n",
       "'height':240\n",
       "},\n",
       "'kind':\"plot\",\n",
       "'scales':[],\n",
       "'layers':[{\n",
       "'mapping':{\n",
       "},\n",
       "'stat':\"identity\",\n",
       "'data':{\n",
       "},\n",
       "'position':\"stack\",\n",
       "'geom':\"bar\"\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"w1u9Er\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// boom... we can easily plot a key column, Total Points\n",
    "val p = letsPlot(mapScoring) { x = \"Year\"; y = \"Pts\" } + ggsize(640, 240)\n",
    "p + geomBar(stat=Stat.identity) +\n",
    "    ggtitle(\"Total Points per NFL regular season\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"qDickc\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "'ggtitle':{\n",
       "'text':\"Total Receiving Touchdowns per NFL regular season\"\n",
       "},\n",
       "'mapping':{\n",
       "'x':\"Year\",\n",
       "'y':\"RecTD\"\n",
       "},\n",
       "'data':{\n",
       "'RecTD':[871.0,797.0,847.0,741.0,786.0,842.0,807.0,804.0,757.0,745.0,751.0,710.0,646.0,720.0,648.0,644.0,732.0,654.0,694.0,635.0,634.0,665.0,658.0,617.0,626.0,663.0,583.0,517.0,516.0,511.0],\n",
       "'Year':[2020.0,2019.0,2018.0,2017.0,2016.0,2015.0,2014.0,2013.0,2012.0,2011.0,2010.0,2009.0,2008.0,2007.0,2006.0,2005.0,2004.0,2003.0,2002.0,2001.0,2000.0,1999.0,1998.0,1997.0,1996.0,1995.0,1994.0,1993.0,1992.0,1991.0]\n",
       "},\n",
       "'ggsize':{\n",
       "'width':640,\n",
       "'height':240\n",
       "},\n",
       "'kind':\"plot\",\n",
       "'scales':[],\n",
       "'layers':[{\n",
       "'mapping':{\n",
       "},\n",
       "'stat':\"identity\",\n",
       "'data':{\n",
       "},\n",
       "'position':\"stack\",\n",
       "'geom':\"bar\"\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"qDickc\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// and another, Receiving TDs\n",
    "val p = letsPlot(mapScoring) { x = \"Year\"; y = \"RecTD\" } + ggsize(640, 240)\n",
    "p + geomBar(stat=Stat.identity) +\n",
    "    ggtitle(\"Total Receiving Touchdowns per NFL regular season\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### The graphs will be a bit more dramatic if we group the years by 5-year buckets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "// to add new columns (for bucketing), we return to the original DataFrame and create new columns based on existing values\n",
    "// krangl's `addColumn` is not a native Kotlin method, but its syntax is just like `filter` or `map`, it accesses `it`, etc.\n",
    "val dfScoringRanges = dfScoring\n",
    "    .filter { (it[\"Year\"] lt 2021) AND (it[\"Year\"] gt 1990) }\n",
    "    .addColumn(\"YearRange\") { it[\"Year\"].map<Double>{ floor(it.minus(1).div(5.0)).times(5).plus(1).toInt() }}\n",
    "    .addColumn(\"Years\") { it[\"YearRange\"].map<Int>{ \"$it - ${it + 4}\" }}\n",
    " \n",
    "// we're creating another Map, but now we are grouping by year bucket and averaging the values within each bucket\n",
    "val mapScoringRanges = dfScoringRanges\n",
    "    .select({ listOf(\"Year\", \"Pts\", \"RecTD\", \"YearRange\", \"Years\") })\n",
    "    .groupBy(\"YearRange\", \"Years\")\n",
    "    .summarize(\n",
    "        \"mean_Pts\" to { it[\"Pts\"].mean(removeNA = true) },\n",
    "        \"mean_RecTD\" to { it[\"RecTD\"].mean(removeNA = true) }\n",
    "    ).toMap()\n",
    "\n",
    "// these xlimits are the discrete values used on the x-axis (and the labels)\n",
    "// only annoying thing is all the null handling of a data source we know is non-null\n",
    "val xlimits = mapScoringRanges[\"Years\"]?.toSet()?.reversed()?.filterNotNull()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"I7czUk\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "'ggtitle':{\n",
       "'text':\"Average total points per NFL regular season\"\n",
       "},\n",
       "'mapping':{\n",
       "'x':\"Years\",\n",
       "'y':\"mean_Pts\"\n",
       "},\n",
       "'data':{\n",
       "'mean_Pts':[11816.2,11647.8,11046.8,10668.6,10111.0,8932.6],\n",
       "'Years':[\"2016 - 2020\",\"2011 - 2015\",\"2006 - 2010\",\"2001 - 2005\",\"1996 - 2000\",\"1991 - 1995\"]\n",
       "},\n",
       "'ggsize':{\n",
       "'width':780,\n",
       "'height':240\n",
       "},\n",
       "'kind':\"plot\",\n",
       "'scales':[{\n",
       "'aesthetic':\"x\",\n",
       "'limits':[\"1991 - 1995\",\"1996 - 2000\",\"2001 - 2005\",\"2006 - 2010\",\"2011 - 2015\",\"2016 - 2020\"]\n",
       "}],\n",
       "'layers':[{\n",
       "'mapping':{\n",
       "},\n",
       "'stat':\"identity\",\n",
       "'data':{\n",
       "},\n",
       "'position':\"stack\",\n",
       "'geom':\"bar\"\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"I7czUk\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// same plot as before, but bucketed -- unlike above graph, every value is higher than previous, no ups & downs\n",
    "val p = letsPlot(mapScoringRanges) { x = \"Years\"; y = \"mean_Pts\" } + ggsize(780, 240)\n",
    "    p + geomBar(stat=Stat.identity) + scaleXDiscrete(limits = xlimits) +\n",
    "    ggtitle(\"Average total points per NFL regular season\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "// ggsave(p + geom_bar(stat=Stat.identity) + scale_x_discrete(limits = xlimits) +\n",
    "//     ggtitle(\"Average total points per NFL regular season\"), \"avg_points_binned.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "   <div id=\"TLemkZ\"></div>\n",
       "   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n",
       "       (function() {\n",
       "           var plotSpec={\n",
       "'ggtitle':{\n",
       "'text':\"Average Receiving Touchdowns per NFL regular season\"\n",
       "},\n",
       "'mapping':{\n",
       "'x':\"Years\",\n",
       "'y':\"mean_RecTD\"\n",
       "},\n",
       "'data':{\n",
       "'Years':[\"2016 - 2020\",\"2011 - 2015\",\"2006 - 2010\",\"2001 - 2005\",\"1996 - 2000\",\"1991 - 1995\"],\n",
       "'mean_RecTD':[808.4,791.0,695.0,671.8,640.0,558.0]\n",
       "},\n",
       "'ggsize':{\n",
       "'width':780,\n",
       "'height':240\n",
       "},\n",
       "'kind':\"plot\",\n",
       "'scales':[{\n",
       "'aesthetic':\"x\",\n",
       "'limits':[\"1991 - 1995\",\"1996 - 2000\",\"2001 - 2005\",\"2006 - 2010\",\"2011 - 2015\",\"2016 - 2020\"]\n",
       "}],\n",
       "'layers':[{\n",
       "'mapping':{\n",
       "},\n",
       "'stat':\"identity\",\n",
       "'data':{\n",
       "},\n",
       "'position':\"stack\",\n",
       "'geom':\"bar\"\n",
       "}]\n",
       "};\n",
       "           var plotContainer = document.getElementById(\"TLemkZ\");\n",
       "           window.letsPlotCall(function() {{\n",
       "               LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n",
       "           }});\n",
       "       })();    \n",
       "   </script>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "// again, same plot, bucketed\n",
    "val p2 = letsPlot(mapScoringRanges) { x = \"Years\"; y = \"mean_RecTD\" } + ggsize(780, 240)\n",
    "p2 + geomBar(stat=Stat.identity) + scaleXDiscrete(limits = xlimits) +\n",
    "    ggtitle(\"Average Receiving Touchdowns per NFL regular season\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "// ggsave(p2 + geom_bar(stat=Stat.identity) + scale_x_discrete(limits = xlimits) +\n",
    "//     ggtitle(\"Average Receiving Touchdowns per NFL regular season\"), \"avg_rectd_binned.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Kotlin",
   "language": "kotlin",
   "name": "kotlin"
  },
  "language_info": {
   "codemirror_mode": "text/x-kotlin",
   "file_extension": ".kt",
   "mimetype": "text/x-kotlin",
   "name": "kotlin",
   "nbconvert_exporter": "",
   "pygments_lexer": "kotlin",
   "version": "1.5.30-dev-598"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}