{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'android': {'latest_app_version': 4020399, 'min_app_version': 4000299},\n", " 'contbuild_enabled': True,\n", " 'current_season': 2018,\n", " 'down_events': [],\n", " 'ios': {'latest_app_version': -1, 'min_app_version': -1},\n", " 'is_datafeed_down': False,\n", " 'json': {'android': {'latest_app_version': 4020399,\n", " 'min_app_version': 4000299},\n", " 'contbuild_enabled': True,\n", " 'current_season': 2018,\n", " 'down_events': [],\n", " 'ios': {'latest_app_version': -1, 'min_app_version': -1},\n", " 'is_datafeed_down': False,\n", " 'max_season': 2018,\n", " 'web': {'commit_time': '2018-02-19 00:43:42 -0500',\n", " 'current_commit': '908eaae107ae0cd08d462eb65246cc5aa5b43136',\n", " 'deploy_time': 'Mon Feb 19 06:02:12 UTC 2018',\n", " 'travis_job': '343226350'}},\n", " 'max_season': 2018,\n", " 'web': {'commit_time': '2018-02-19 00:43:42 -0500',\n", " 'current_commit': '908eaae107ae0cd08d462eb65246cc5aa5b43136',\n", " 'deploy_time': 'Mon Feb 19 06:02:12 UTC 2018',\n", " 'travis_job': '343226350'}}\n" ] } ], "source": [ "import requests\n", "import requests_cache\n", "\n", "# Cache all api requests in a file called tba_cache.sqlite for a day\n", "# (monkeypatch the requests module that tbapy uses)\n", "requests_cache.install_cache(cache_name=\"tba_cache\", expire_after=60 * 60 * 24)\n", "\n", "import tbapy\n", "import pprint\n", "pp = pprint.PrettyPrinter()\n", "\n", "api_key = \"6qOZ9uAEsb4CDrOBNG6ZnIdi9cWBaZ6DHnCSato97Qfo7bBeUwT9NfFt4Gi5sHFN\"\n", "\n", "tba = tbapy.TBA(api_key)\n", "pp.pprint(tba.status())" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['2017cabl',\n", " '2017cacc',\n", " '2017cada',\n", " '2017cama',\n", " '2017cc',\n", " '2017cmptx',\n", " '2017mttd',\n", " '2017nhfoc',\n", " '2017onsc',\n", " '2017roe']\n" ] } ], "source": [ "\"Memoize my favorite functions\"\n", "\n", "from functools import lru_cache\n", "\n", "team_events = lru_cache(maxsize=512)(tba.team_events)\n", "event_alliances = lru_cache(maxsize=512)(tba.event_alliances)\n", "event_rankings = lru_cache(maxsize=512)(tba.event_rankings)\n", "event_oprs = lru_cache(maxsize=512)(tba.event_oprs)\n", "team_years = lru_cache(maxsize=512)(tba.team_years)\n", "\n", "@lru_cache(maxsize=128)\n", "def event_teams(team):\n", " return [x['key'] for x in tba.event_teams(team)]\n", "\n", "def scrape_event_codes(events, year):\n", " return [str(year) + event['event_code'] for event in events]\n", "\n", "pp.pprint(scrape_event_codes(team_events('frc973', 2017), 2017))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No finals report for 2015nvlv\n", "No finals report for 2018caav\n", "No ranking port for 2018caav\n", "No finals report for 2018casd\n", "No ranking port for 2018casd\n", "No finals report for 2018nvlv\n", "No ranking port for 2018nvlv\n", "[(2014,\n", " [{'event_code': 'casb',\n", " 'event_date': '2014-02-28',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': 'sf', 'seat': 2, 'seed': 20}},\n", " {'event_code': 'gal',\n", " 'event_date': '2014-04-24',\n", " 'event_type': 3,\n", " 'event_type_string': 'Championship Division',\n", " 'team_report': {'level': None, 'seat': None, 'seed': 41}},\n", " {'event_code': 'nvlv',\n", " 'event_date': '2014-04-03',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': None, 'seat': None, 'seed': 42}}]),\n", " (2015,\n", " [{'event_code': 'carm',\n", " 'event_date': '2015-02-26',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': 'qf', 'seat': 1, 'seed': 23}},\n", " {'event_code': 'new',\n", " 'event_date': '2015-04-22',\n", " 'event_type': 3,\n", " 'event_type_string': 'Championship Division',\n", " 'team_report': {'level': 'w', 'seat': 3, 'seed': 57}},\n", " {'event_code': 'nvlv',\n", " 'event_date': '2015-03-25',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': None, 'seat': None, 'seed': 41}}]),\n", " (2016,\n", " [{'event_code': 'calb',\n", " 'event_date': '2016-03-09',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': 'w', 'seat': 2, 'seed': 25}},\n", " {'event_code': 'gal',\n", " 'event_date': '2016-04-27',\n", " 'event_type': 3,\n", " 'event_type_string': 'Championship Division',\n", " 'team_report': {'level': None, 'seat': None, 'seed': 65}},\n", " {'event_code': 'nvlv',\n", " 'event_date': '2016-03-30',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': 'sf', 'seat': 'AC', 'seed': 4}}]),\n", " (2017,\n", " [{'event_code': 'cada',\n", " 'event_date': '2017-03-22',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': 'sf', 'seat': 2, 'seed': 24}},\n", " {'event_code': 'casd',\n", " 'event_date': '2017-03-08',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': None, 'seat': None, 'seed': 60}},\n", " {'event_code': 'new',\n", " 'event_date': '2017-04-19',\n", " 'event_type': 3,\n", " 'event_type_string': 'Championship Division',\n", " 'team_report': {'level': 'qf', 'seat': 3, 'seed': 20}},\n", " {'event_code': 'nvlv',\n", " 'event_date': '2017-04-05',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': 'qf', 'seat': 1, 'seed': 32}}]),\n", " (2018,\n", " [{'event_code': 'caav',\n", " 'event_date': '2018-04-04',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': None, 'seat': None, 'seed': None}},\n", " {'event_code': 'casd',\n", " 'event_date': '2018-03-07',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': None, 'seat': None, 'seed': None}},\n", " {'event_code': 'nvlv',\n", " 'event_date': '2018-03-21',\n", " 'event_type': 0,\n", " 'event_type_string': 'Regional',\n", " 'team_report': {'level': None, 'seat': None, 'seed': None}}])]\n" ] } ], "source": [ "def team_event_report(team, event):\n", " level = None\n", " seat = None\n", " seed = None\n", " \n", " try:\n", " finals_report = event_alliances(event)\n", " \n", " for alliance in finals_report:\n", " if team in alliance['picks'] and alliance['status'] != 'unknown':\n", " #pp.pprint(alliance)\n", " level = 'w' if alliance['status']['status'] == 'won' else alliance['status']['level']\n", " seat = alliance['picks'].index(team)\n", " if seat == 0:\n", " seat = 'AC'\n", " except TypeError:\n", " print(\"No finals report for {:s}\".format(event))\n", " \n", " try:\n", " quals_seeds = event_rankings(event)\n", " \n", " for alliance in quals_seeds['rankings']:\n", " if alliance['team_key'] == team:\n", " if alliance['dq']:\n", " seed = 'DQ'\n", " else:\n", " seed = alliance['rank']\n", " except TypeError:\n", " print(\"No ranking port for {:s}\".format(event))\n", " \n", " return {\n", " 'level': level,\n", " 'seat': seat,\n", " 'seed': seed,\n", " }\n", "\n", "def team_year_report(team, year):\n", " events = [event\n", " for event\n", " in team_events(team, year)\n", " if event['event_type'] <= 3]\n", " \n", " event_reports = []\n", " for event in events:\n", " event_code = str(year) + event['event_code']\n", " event_reports.append({\n", " 'event_code': event['event_code'],\n", " 'event_type': event['event_type'],\n", " 'event_type_string': event['event_type_string'],\n", " 'event_date': event['start_date'],\n", " 'team_report': team_event_report(team, event_code),\n", " })\n", " \n", " return event_reports\n", "\n", "def team_history(team):\n", " years = sorted(team_years(team))\n", " \n", " year_reports = []\n", " for year in years:\n", " year_reports.append((year, team_year_report(team, year)))\n", " \n", " return year_reports\n", "\n", "griffengear = team_history('frc5012')\n", "pp.pprint(griffengear)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class TableBuilder:\n", " def __init__(self, **kwargs):\n", " self.row_var = kwargs['row']\n", " self.rows = []\n", " self.accept_new_rows = True\n", " self.col_var = kwargs['col']\n", " self.cols = []\n", " self.accept_new_cols = True\n", " self.upper_left = ''\n", " \n", " self.cells = {}\n", " \n", " def default_generator(**kwargs):\n", " return \"\"\n", " self.generator = default_generator\n", " \n", " def set_generator(self, gen):\n", " self.generator = gen\n", " \n", " def set_rows(self, rows):\n", " self.rows = rows\n", " self.accept_new_rows = False\n", " \n", " def set_cols(self, cols):\n", " self.cols = cols\n", " self.accept_new_cols = False\n", " \n", " def set_cell(self, value, **kwargs):\n", " row = kwargs[self.row_var]\n", " col = kwargs[self.col_var]\n", " \n", " if row not in self.rows:\n", " if self.accept_new_rows:\n", " self.rows.append(row)\n", " else:\n", " raise Exception(\"Row does not exist and table configured to not accept new rows\")\n", " \n", " if col not in self.cols:\n", " if self.accept_new_cols:\n", " self.cols.append(col)\n", " else:\n", " raise Exception(\"Col does not exist and table configured to not accept new cols\")\n", " \n", " if row not in self.cells:\n", " self.cells[row] = {}\n", " \n", " self.cells[row][col] = {\n", " 'value': value,\n", " 'color': kwargs.get('color', None),\n", " }\n", " \n", " def get_cell(self, **kwargs):\n", " row = kwargs[self.row_var]\n", " col = kwargs[self.col_var]\n", " if row not in self.cells:\n", " self.cells[row] = {}\n", " if col not in self.cells[row]:\n", " self.cells[row][col] = self.generator(row=row, col=col)\n", " return self.cells[row][col]\n", " \n", " def _get_cell(self, row, col):\n", " if row not in self.cells:\n", " self.cells[row] = {}\n", " if col not in self.cells[row]:\n", " self.cells[row][col] = {\n", " 'value': self.generator(row=row, col=col),\n", " 'color': None,\n", " }\n", " return self.cells[row][col]\n", " \n", " def get_html(self):\n", " table_rows = []\n", " \n", " header_cells = [self.upper_left] + self.cols\n", " header = ''.join('{:s}'.format(str(cell)) for cell in header_cells)\n", " table_rows.append(header)\n", " \n", " for row in self.rows:\n", " row_cells = [self._get_cell(row, col) for col in self.cols]\n", " row = ['{:s}'.format(row)]\n", " for cell in row_cells:\n", " if cell['color']:\n", " row.append('{:s}'.format(\n", " str(cell['color']),\n", " str(cell['value'])))\n", " else:\n", " row.append('{:s}'.format(\n", " str(cell['value'])))\n", " row = ''.join(row)\n", " table_rows.append(row)\n", " \n", " contents = ''.join('{:s}'.format(row) for row in table_rows)\n", " return \"{:s}
\".format(contents)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "

Report for 5012

Elims results

20142015201620172018
Regional 1sfqfwsfN/A
Regional 2N/AN/AsfN/AN/A
Regional 3qfN/A
Champs DivN/AwN/Aqf

Elims alliance seat

20142015201620172018
Regional 12122N/A
Regional 2N/AN/AACN/AN/A
Regional 31N/A
Champs DivN/A3N/A3

Quals seed

20142015201620172018
Regional 120232524N/A
Regional 24241460N/A
Regional 332N/A
Champs Div41576520
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import HTML, display\n", "\n", "def format_subreport(history, team, attribute, color_codes=None):\n", " table = TableBuilder(row='event', col='year')\n", " \n", " years = [report[0] for report in history]\n", " table.set_cols(years)\n", " table.set_rows([\"Regional 1\", \"Regional 2\", \"Regional 3\", \"Champs Div\"])\n", " \n", " for report in history:\n", " year = report[0]\n", " regional_events = [event for event in report[1] if event['event_type'] < 3]\n", " champs_events = [event for event in report[1] if event['event_type'] == 3]\n", " \n", " for i, row in enumerate(['Regional 1', 'Regional 2', 'Regional 3']):\n", " if len(regional_events) > i:\n", " if regional_events[i]['team_report'] is None:\n", " table.set_cell(\"?\", event=row, year=year)\n", " elif regional_events[i]['team_report'][attribute] is None:\n", " table.set_cell(\"N/A\", \n", " color='#e6e6e6',\n", " event=row, year=year)\n", " else:\n", " table.set_cell(regional_events[i]['team_report'][attribute],\n", " color=color_codes[regional_events[i]['team_report'][attribute]],\n", " event=row, year=year)\n", " \n", " if champs_events:\n", " if champs_events[0]['team_report'] is None:\n", " table.set_cell(\"?\", event='Champs Div', year=year)\n", " elif champs_events[0]['team_report'][attribute] is None:\n", " table.set_cell(\"N/A\",\n", " color='#e6e6e6',\n", " event='Champs Div', year=year)\n", " else:\n", " table.set_cell(champs_events[0]['team_report'][attribute],\n", " color=color_codes[champs_events[0]['team_report'][attribute]],\n", " event='Champs Div', year=year)\n", " return table.get_html()\n", "\n", "def rank_to_color(rank):\n", " rank = min(rank, 60)\n", " r = 60 + 1 * rank\n", " g = 255 - 1 * rank\n", " b = 135 + 2 * rank\n", " return \"#{:02x}{:02x}{:02x}\".format(r, g, b)\n", "\n", "def format_report(history, teamno):\n", " source = (\n", " \"

Report for {:s}

\".format(str(teamno)) +\n", " \"

Elims results

\" +\n", " format_subreport(history, teamno, 'level', {\n", " 'w': '#66ff33',\n", " 'f': '#66ff99',\n", " 'sf': '#66ffff',\n", " 'qf': '#66ccff',\n", " 'N/A': '#e6e6e6',\n", " }) +\n", " \"
\" +\n", " \"

Elims alliance seat

\" +\n", " format_subreport(history, teamno, 'seat', {\n", " 'AC': '#66ff33',\n", " 1: '#66ff99',\n", " 2: '#66ffff',\n", " 3: '#66ccff',\n", " }) +\n", " \"
\" +\n", " \"

Quals seed

\" +\n", " format_subreport(history, teamno, 'seed', {\n", " rank: rank_to_color(rank)\n", " for rank\n", " in range(100)\n", " })\n", " )\n", " display(HTML(source))\n", "\n", "format_report(griffengear, 5012)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No finals report for 2002sj\n", "No ranking port for 2002sj\n", "No finals report for 2003ca\n", "No ranking port for 2003ca\n", "No finals report for 2003sj\n", "No ranking port for 2003sj\n", "No finals report for 2004az\n", "No ranking port for 2004az\n", "No finals report for 2004sj\n", "No ranking port for 2004sj\n", "No finals report for 2005sac\n", "No ranking port for 2005sac\n", "No finals report for 2006arc\n", "No ranking port for 2006arc\n", "No finals report for 2006sj\n", "No ranking port for 2006sj\n", "No finals report for 2007sac\n", "No finals report for 2007sj\n", "No finals report for 2008nv\n", "No finals report for 2008sj\n", "No finals report for 2009ca\n", "No finals report for 2009gal\n", "No finals report for 2009nv\n", "No finals report for 2018casf\n", "No ranking port for 2018casf\n", "No finals report for 2018casj\n", "No ranking port for 2018casj\n" ] }, { "data": { "text/html": [ "

Report for 973

Elims results

20022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AfsffwfwsfwN/A
Regional 2N/AN/AN/AN/AN/AqfqfsfsfwqfwsfN/A
Regional 3f
Champs DivN/AN/Awqfqfwqfsfw

Elims alliance seat

20022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/A11111111N/A
Regional 2N/AN/AN/AN/AN/A1AC1AC1AC1ACN/A
Regional 31
Champs DivN/AN/A21211ACAC

Quals seed

20022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/A331410868710253N/A
Regional 2N/AN/A1423810721343424N/A
Regional 314
Champs DivN/A1125102631711
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "format_report(team_history('frc973'), 973)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No finals report for 1999ca\n", "No ranking port for 1999ca\n", "No finals report for 2000ca\n", "No ranking port for 2000ca\n", "No finals report for 2000tx\n", "No ranking port for 2000tx\n", "No finals report for 2001arc\n", "No ranking port for 2001arc\n", "No finals report for 2001ca1\n", "No ranking port for 2001ca1\n", "No finals report for 2001ca2\n", "No ranking port for 2001ca2\n", "No finals report for 2002oh\n", "No ranking port for 2002oh\n", "No finals report for 2002sj\n", "No ranking port for 2002sj\n", "No finals report for 2003new\n", "No ranking port for 2003new\n", "No finals report for 2003sac\n", "No ranking port for 2003sac\n", "No finals report for 2003sj\n", "No ranking port for 2003sj\n", "No finals report for 2004new\n", "No ranking port for 2004new\n", "No finals report for 2004sac\n", "No ranking port for 2004sac\n", "No finals report for 2004sj\n", "No ranking port for 2004sj\n", "No finals report for 2005gal\n", "No ranking port for 2005gal\n", "No finals report for 2005sac\n", "No ranking port for 2005sac\n", "No finals report for 2005sj\n", "No ranking port for 2005sj\n", "No finals report for 2006new\n", "No ranking port for 2006new\n", "No finals report for 2006or\n", "No ranking port for 2006or\n", "No finals report for 2006sj\n", "No ranking port for 2006sj\n", "No finals report for 2006wa\n", "No ranking port for 2006wa\n", "No finals report for 2007arc\n", "No finals report for 2007ca\n", "No finals report for 2007nv\n", "No finals report for 2007sj\n", "No finals report for 2008gal\n", "No finals report for 2008hi\n", "No finals report for 2008sj\n", "No finals report for 2009cur\n", "No finals report for 2009nv\n", "No finals report for 2009sj\n", "No finals report for 2018azfl\n", "No ranking port for 2018azfl\n", "No finals report for 2018casj\n", "No ranking port for 2018casj\n" ] }, { "data": { "text/html": [ "

Report for 254

Elims results

19992000200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AwwfwwwwwN/A
Regional 2N/AN/AN/AN/AN/AN/AN/AN/AN/AN/AwwN/AwwwwwN/A
Regional 3N/AN/Aww
Champs DivN/AN/AN/AN/AN/AN/AN/AN/Awwfsfwqffw

Elims alliance seat

19992000200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/A1AC11AC11ACN/A
Regional 2N/AN/AN/AN/AN/AN/AN/AN/AN/AN/A1ACN/AAC1AC1ACN/A
Regional 3N/AN/A1AC
Champs DivN/AN/AN/AN/AN/AN/AN/AN/AACAC11ACAC11

Quals seed

19992000200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/A2312127181221N/A
Regional 2N/AN/AN/AN/AN/AN/AN/A224921N/A13121N/A
Regional 3N/A2132
Champs DivN/AN/AN/AN/AN/A1214341253231122
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "No finals report for 2005sac\n", "No ranking port for 2005sac\n", "No finals report for 2006sac\n", "No ranking port for 2006sac\n", "No finals report for 2007sac\n", "No finals report for 2008sac\n", "No finals report for 2009sac\n", "No finals report for 2011sac\n", "No finals report for 2018cada\n", "No ranking port for 2018cada\n", "No finals report for 2018cafr\n", "No ranking port for 2018cafr\n", "No finals report for 2018utwv\n", "No ranking port for 2018utwv\n" ] }, { "data": { "text/html": [ "

Report for 1678

Elims results

20052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AqfN/AqfwwwwwN/A
Regional 2wqfwwwwN/A
Regional 3fwwwN/A
Champs Divqfqfwwwww

Elims alliance seat

20052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AACN/A1AC1AC1ACN/A
Regional 2AC1AC1ACACN/A
Regional 3AC1ACACN/A
Champs Div11ACAC111

Quals seed

20052006200720082009201020112012201320142015201620172018
Regional 1N/AN/A108301121272141N/A
Regional 2181312N/A
Regional 32212N/A
Champs Div201411233
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "No finals report for 2002sj\n", "No ranking port for 2002sj\n", "No finals report for 2003cur\n", "No ranking port for 2003cur\n", "No finals report for 2003sac\n", "No ranking port for 2003sac\n", "No finals report for 2003sj\n", "No ranking port for 2003sj\n", "No finals report for 2004gal\n", "No ranking port for 2004gal\n", "No finals report for 2004sj\n", "No ranking port for 2004sj\n", "No finals report for 2005sj\n", "No ranking port for 2005sj\n", "No finals report for 2006gal\n", "No ranking port for 2006gal\n", "No finals report for 2006sj\n", "No ranking port for 2006sj\n", "No finals report for 2007sj\n", "No finals report for 2008sj\n", "No finals report for 2009gal\n", "No finals report for 2009sj\n", "No finals report for 2010new\n", "No finals report for 2018casf\n", "No ranking port for 2018casf\n", "No finals report for 2018casj\n", "No ranking port for 2018casj\n" ] }, { "data": { "text/html": [ "

Report for 971

Elims results

20022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AwsfwsfwsfwwN/A
Regional 2N/AwqfwffqfN/A
Regional 3
Champs DivN/AN/AN/AN/AN/Aqffsfff

Elims alliance seat

20022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AACAC1ACAC1AC1N/A
Regional 2N/AACACAC1ACACN/A
Regional 3
Champs DivN/AN/AN/AN/AN/A1ACACAC1

Quals seed

20022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/A44121173211112N/A
Regional 2N/A131432N/A
Regional 3
Champs DivN/AN/AN/A6619759142
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "No finals report for 2001ca2\n", "No ranking port for 2001ca2\n", "No finals report for 2002ca\n", "No ranking port for 2002ca\n", "No finals report for 2002wa\n", "No ranking port for 2002wa\n", "No finals report for 2003sj\n", "No ranking port for 2003sj\n", "No finals report for 2003wa\n", "No ranking port for 2003wa\n", "No finals report for 2004gal\n", "No ranking port for 2004gal\n", "No finals report for 2004or\n", "No ranking port for 2004or\n", "No finals report for 2005gal\n", "No ranking port for 2005gal\n", "No finals report for 2005or\n", "No ranking port for 2005or\n", "No finals report for 2006new\n", "No ranking port for 2006new\n", "No finals report for 2006or\n", "No ranking port for 2006or\n", "No finals report for 2006wa\n", "No ranking port for 2006wa\n", "No finals report for 2007or\n", "No finals report for 2008or\n", "No finals report for 2008wa\n", "No finals report for 2009arc\n", "No finals report for 2009wa\n", "No finals report for 2013wase\n", "No finals report for 2018waamv\n", "No ranking port for 2018waamv\n", "No finals report for 2018wasno\n", "No ranking port for 2018wasno\n" ] }, { "data": { "text/html": [ "

Report for 492

Elims results

200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AN/AsfN/AwN/AqfqfqfsfN/A
Regional 2N/AN/AN/AN/AqfsfN/AsfN/A
Regional 3fww
Champs DivN/AN/AN/AN/AqfN/Awf

Elims alliance seat

200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AN/A2N/A2N/AAC111N/A
Regional 2N/AN/AN/AN/AACACN/A1N/A
Regional 311AC
Champs DivN/AN/AN/AN/AACN/A2AC

Quals seed

200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/A51759423741269152920N/A
Regional 2N/AN/AN/A1183266N/A
Regional 3476
Champs DivN/AN/AN/A23271271
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "format_report(team_history('frc254'), 254)\n", "format_report(team_history('frc1678'), 1678)\n", "format_report(team_history('frc971'), 971)\n", "format_report(team_history('frc492'), 492)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No finals report for 2000ca\n", "No ranking port for 2000ca\n", "No finals report for 2001ca1\n", "No ranking port for 2001ca1\n", "No finals report for 2002ca\n", "No ranking port for 2002ca\n", "No finals report for 2002new\n", "No ranking port for 2002new\n", "No finals report for 2003ca\n", "No ranking port for 2003ca\n", "No finals report for 2003gal\n", "No ranking port for 2003gal\n", "No finals report for 2004arc\n", "No ranking port for 2004arc\n", "No finals report for 2004ca\n", "No ranking port for 2004ca\n", "No finals report for 2005gal\n", "No ranking port for 2005gal\n", "No finals report for 2005nv\n", "No ranking port for 2005nv\n", "No finals report for 2006gal\n", "No ranking port for 2006gal\n", "No finals report for 2006md\n", "No ranking port for 2006md\n", "No finals report for 2006nv\n", "No ranking port for 2006nv\n", "No finals report for 2007ca\n", "No finals report for 2007new\n", "No finals report for 2007pa\n", "No finals report for 2008ca\n", "No finals report for 2008gal\n", "No finals report for 2008sdc\n", "No finals report for 2009ca\n", "No finals report for 2009co\n", "No finals report for 2009cur\n", "No finals report for 2010az\n", "No finals report for 2010co\n", "No finals report for 2010new\n", "No finals report for 2011ut\n", "No finals report for 2013casb\n", "No finals report for 2018caav\n", "No ranking port for 2018caav\n", "No finals report for 2018nvlv\n", "No ranking port for 2018nvlv\n", "No finals report for 2018utwv\n", "No ranking port for 2018utwv\n" ] }, { "data": { "text/html": [ "

Report for 399

Elims results

2000200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AsfwfwqfsfsfN/A
Regional 2N/AN/AN/AN/AN/AffN/AsfwqffN/A
Regional 3N/AqfsfsfsfqffN/A
Champs DivN/AN/AN/AN/AN/AN/AN/AN/AN/AsfN/AN/Aqfqfqf

Elims alliance seat

2000200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/A11AC11ACACN/A
Regional 2N/AN/AN/AN/AN/A11N/A1AC11N/A
Regional 3N/AACAC1AC1ACN/A
Champs DivN/AN/AN/AN/AN/AN/AN/AN/AN/AACN/AN/AAC21

Quals seed

2000200120022003200420052006200720082009201020112012201320142015201620172018
Regional 1N/AN/AN/AN/AN/AN/AN/A3203181121121185N/A
Regional 2N/A1424151210943125N/A
Regional 321226144N/A
Champs DivN/AN/AN/AN/AN/A71784203802014113
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "format_report(team_history('frc399'), 399)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [], "source": [ "def opr_percentile_at_event(team, event):\n", " try:\n", " percentiles = event_oprs(event)['oprs']\n", " percentiles = [(opr, team) for team, opr in percentiles.items()]\n", " percentiles = sorted(percentiles)\n", " percentiles = [team for opr, team in percentiles]\n", " position = percentiles.index(team)\n", " return float(position + 1) / len(percentiles)\n", " except TypeError:\n", " return None\n", " except ValueError:\n", " return None\n", "\n", "def opr_percentile_at_all_events(team, year):\n", " events = [\n", " str(year) + event['event_code']\n", " for event\n", " in team_events(team, year)\n", " if event['event_type'] <= 3\n", " ]\n", " \n", " return [\n", " (event, opr_percentile_at_event(team, event))\n", " for event\n", " in events\n", " ]\n", "\n", "def avg(lst):\n", " return sum(lst) / len(lst)\n", "\n", "def stddev(lst):\n", " mean = avg(lst)\n", " diffs = [(mean - x) ** 2 for x in lst]\n", " return avg(diffs) ** 0.5\n", "\n", "def team_opr_strength(team):\n", " percentiles = []\n", " for year in [2017, 2016, 2015]:\n", " for event, percentile in opr_percentile_at_all_events(team, year):\n", " if percentile:\n", " percentiles.append(percentile)\n", " if percentiles:\n", " return {\n", " 'average': avg(percentiles),\n", " 'stddev': stddev(percentiles),\n", " }\n", " else:\n", " return {\n", " 'average': None,\n", " 'stddev': None,\n", " }" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/html": [ "

Event: 2018caav

Color determined by OPR Percentile. Saturation determined by OPR Percentile Standard Deviation
OPR POPR P SD
frc3300.96683495637933980.03124240715745202
frc33090.88965062779497770.17524072628393625
frc2940.86703415072635990.08578868905965303
frc3990.79233722366746560.18007240955607115
frc34760.76791266413527160.1945517142696203
frc26370.76265781296720840.19091289503213651
frc51240.7007866985047890.2534131125461936
frc36470.69730057443058830.2705987113412613
frc11600.67467601842601840.13288523957876713
frc58050.67392773892773890.2608072969136756
frc24930.66165178763676280.16752217254007193
frc5970.61293835538699030.22726963354463614
frc5990.55670061039555030.22339978864973783
frc42760.55286418032507450.2617935293863765
frc60600.5367274569402230.15374873353596757
frc34530.52270430718706570.11647869071268564
frc43220.50994994979957390.2668290005490725
frc36690.5097813134577840.22625828438483161
frc9810.495909124606581760.28243723847674146
frc42550.48317689011028080.2248142739472036
frc50120.463252681354274660.3063389827860559
frc40140.439724834552420730.30464946639412893
frc24290.40776258609307760.26815090582062534
frc9800.378195489735262960.17616357367295957
frc23390.37586010863997670.23310220918988184
frc26580.35485755925864820.20451825638664417
frc44700.34859049415804470.23858613451612737
frc33900.33123323217662840.1284591836770719
frc58690.283483094730429430.17241636357091683
frc60720.25034188034188030.22471940117157627
frc41910.240512092074592070.10454807214723644
frc54740.232967607105538130.22542252445860633
frc56250.19470957799905170.1413860081882514
frc5850.148252862514580640.16001677743384174
frc63820.0151515151515151520.0
frc6973NoneNone
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

Event: 2017calb

Color determined by OPR Percentile. Saturation determined by OPR Percentile Standard Deviation
OPR POPR P SD
frc3300.96683495637933980.03124240715745202
frc33090.88965062779497770.17524072628393625
frc2940.86703415072635990.08578868905965303
frc26370.76265781296720840.19091289503213651
frc24860.74259038283294730.2261404054148349
frc39700.73800112260783910.11741855503386818
frc2070.73485386778390630.19085093733964464
frc35120.72811565681586570.26803389057037996
frc6960.72569756763942630.19381212099709935
frc42010.70279596097047710.22824708551895712
frc51240.7007866985047890.2534131125461936
frc11970.67206100942101540.2135221040836021
frc24930.66165178763676280.16752217254007193
frc40.65880670819695210.2524119592313741
frc46190.63611679648265010.1774674827399883
frc5970.61293835538699030.22726963354463614
frc26590.60833333333333340.10833333333333334
frc41230.60595238095238090.15595238095238093
frc49130.58024669566022950.2431237008103306
frc44150.57535208796606970.2467803154110071
frc33030.56246669330754570.20102041936072546
frc50890.55128663052016870.27580488056483904
frc16440.54718234981392880.23546704272079402
frc45010.54447920264010590.2836526821220404
frc6870.51761470545665080.19948176906782633
frc14520.5060606060606060.23546839006136255
frc47630.49336913086913080.3415245368687236
frc27610.475443374028114760.25749712248753803
frc8480.4550505050505050.16712669905611774
frc49990.44662837162837160.20405268985491395
frc57650.442200328407224950.1703864437550854
frc38800.4347742667479510.2879234055528694
frc45780.40833333333333330.09166666666666667
frc15150.40620361710194310.15726621640345398
frc59660.40151515151515150.26515151515151514
frc7020.39437885119400010.32401868562349223
frc5800.394047619047619040.2584265796162504
frc52850.39367715617715620.11835663977004443
frc56690.38636363636363640.266841655166021
frc64990.383333333333333360.0
frc9800.378195489735262960.17616357367295957
frc55120.37575757575757580.2271447451100264
frc44700.34859049415804470.23858613451612737
frc51020.34343434343434340.2827380808541092
frc55100.33568181818181820.2863837074094914
frc49640.32834353992890580.27989094862189895
frc66920.316666666666666650.0
frc6910.303772728007484560.1629388960558805
frc51070.28026315789473680.06973684210526315
frc34080.276342371079213170.15309239959721654
frc60000.26969696969696970.16969696969696968
frc6060.25909090909090910.1602674150350219
frc24040.25324675324675330.09971990908908608
frc31200.205529284884685580.16804259361227233
frc40190.196464646464646450.13398790961298296
frc8670.179292929292929280.06614040835206463
frc54320.170057720057720050.11437727722482734
frc39520.1601184256356670.0795017001602817
frc17590.121347622567134760.13851078238786466
frc66580.0491293532338308440.034203980099502485
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

Event: 2017cc

Color determined by OPR Percentile. Saturation determined by OPR Percentile Standard Deviation
OPR POPR P SD
frc2540.99205943624062110.011328505154128693
frc16780.98117611045147630.013529528173670268
frc9730.96247409341874220.022835540855692893
frc9710.95988666478005340.040414210035810784
frc15380.93405063070739760.06776754903068292
frc33090.88965062779497770.17524072628393625
frc7010.8344769123817490.1344336751129024
frc3990.79233722366746560.18007240955607115
frc16710.7847921492418490.20567955048851894
frc8460.76972981331533970.0649797992662614
frc34760.76791266413527160.1945517142696203
frc20730.76524437842591970.19042099560937797
frc58180.7287898171480260.1973931995567787
frc6960.72569756763942630.19381212099709935
frc6490.72380424234163340.12074796283331235
frc10110.69952359803715240.22550011415871618
frc36470.69730057443058830.2705987113412613
frc32560.67757190141292870.225441644888219
frc1150.61784283218229970.2750569061500388
frc21350.59889192864134680.10588784301428036
frc38590.58286332714904140.19955674334035975
frc58290.58217984707791770.12922843143298415
frc13230.57840053405616980.3218552448663397
frc18680.57343377082883980.26478484813345
frc1140.55132957873215690.2913199856867942
frc49040.52932473124848060.29087941151579333
frc6040.52577377451362670.27342093941257356
frc80.52011827966832670.26954193704011414
frc64180.51543906483840960.3175033927451955
frc1990.5144628420398010.21387558414097788
frc51040.49120599897843130.28526994205405015
frc54990.48123801290184150.25925141820375475
frc6680.47965538152476530.3105443875467901
frc39250.46660033151621380.12833282895385847
frc17000.466202512653421440.28455404079592755
frc50120.463252681354274660.3063389827860559
frc50260.418297475951519560.2877900112077281
frc9680.39441244269281220.28167278145173413
frc8410.368874395321627360.20601089446240536
frc49900.31325587165953320.22033531400481876
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

Event: 2018casj

Color determined by OPR Percentile. Saturation determined by OPR Percentile Standard Deviation
OPR POPR P SD
frc2540.99205943624062110.011328505154128693
frc9730.96247409341874220.022835540855692893
frc9710.95988666478005340.040414210035810784
frc1920.82408692143260990.194304787827679
frc31320.82088884950941090.17862155250399414
frc8460.76972981331533970.0649797992662614
frc3830.70567089001023840.11515359715788703
frc21440.69466669757937440.2168524343422375
frc59240.65912296747967480.22472013801571875
frc60360.65223577235772360.22157473504379885
frc21350.59889192864134680.10588784301428036
frc13510.58969633906194060.17927347972993438
frc20350.57516812055082270.21106370485079293
frc18680.57343377082883980.26478484813345
frc60390.54166666666666660.20833333333333334
frc49040.52932473124848060.29087941151579333
frc6040.52577377451362670.27342093941257356
frc80.52011827966832670.26954193704011414
frc64180.51543906483840960.3175033927451955
frc8520.5147979656588280.2553046489133242
frc5810.50699448879894270.26835645668522995
frc19670.50666547320682650.17505277656402282
frc46690.50483383486432280.23869614501923417
frc34820.49571501070475260.24021985387392086
frc42550.48317689011028080.2248142739472036
frc54990.48123801290184150.25925141820375475
frc6680.47965538152476530.3105443875467901
frc10720.476244019138755970.34552746818472024
frc17000.466202512653421440.28455404079592755
frc7510.45006554506834460.3442474226357632
frc6700.44167997678194620.3106145347976756
frc41860.435720474967907560.19807996754116913
frc41590.42869561306258990.17018193927302247
frc26430.400217856917784940.3089879981122203
frc24890.38973605889724310.27743633878846286
frc24730.385224081092600370.30743014887998993
frc8410.368874395321627360.20601089446240536
frc40910.34680291723202170.206316888028452
frc57370.319832041653095260.23862913411955297
frc49900.31325587165953320.22033531400481876
frc49730.31001387694767490.16743621939261347
frc66650.308333333333333350.19166666666666665
frc41710.3073905746509130.15531219246593103
frc23670.30558523731441060.18178875580740408
frc28130.297471761810712830.23132889217631447
frc2560.228333948711063380.1489104250686248
frc51710.20347222222222220.09884069518518855
frc2530.176893939393939380.0819250844821126
frc66880.166666666666666660.0
frc50270.141557017543859630.1373253160927785
frc66190.121276595744680860.07872340425531915
frc67180.048780487804878050.0
frc64100.0166666666666666660.0
frc7317NoneNone
frc7308NoneNone
frc7245NoneNone
frc6884NoneNone
frc6883NoneNone
frc6303NoneNone
frc6238NoneNone
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

Event: 2018casf

Color determined by OPR Percentile. Saturation determined by OPR Percentile Standard Deviation
OPR POPR P SD
frc9730.96247409341874220.022835540855692893
frc9710.95988666478005340.040414210035810784
frc66620.87804878048780490.0
frc23830.74670372943085150.16928033445260593
frc6490.72380424234163340.12074796283331235
frc59240.65912296747967480.22472013801571875
frc60360.65223577235772360.22157473504379885
frc57000.60164607402652980.02768653993935086
frc54190.53658536585365860.0
frc49040.52932473124848060.29087941151579333
frc6040.52577377451362670.27342093941257356
frc59400.51733485772357720.28492451576122413
frc64180.51543906483840960.3175033927451955
frc1990.5144628420398010.21387558414097788
frc1000.5139395770269830.23237323168899596
frc5810.50699448879894270.26835645668522995
frc46690.50483383486432280.23869614501923417
frc51040.49120599897843130.28526994205405015
frc54990.48123801290184150.25925141820375475
frc64150.45833333333333330.0
frc14580.452872097207587530.22102214198537365
frc59930.4503546099290780.21631205673758863
frc9720.44938225955275730.14749601048782265
frc25510.448448773448773430.2604132445131618
frc55070.4472633565621370.05366200246972575
frc41860.435720474967907560.19807996754116913
frc38800.4347742667479510.2879234055528694
frc41590.42869561306258990.17018193927302247
frc50260.418297475951519560.2877900112077281
frc7660.41176916793091370.16755990173555588
frc24890.38973605889724310.27743633878846286
frc47650.31317973541577520.17558232777413613
frc49730.31001387694767490.16743621939261347
frc66650.308333333333333350.19166666666666665
frc28540.2698347908643560.10977810282920974
frc54300.203368654004969370.24649134178789786
frc2530.176893939393939380.0819250844821126
frc67180.048780487804878050.0
frc7317NoneNone
frc7137NoneNone
frc6981NoneNone
frc6962NoneNone
frc6814NoneNone
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def prescout_event(event):\n", " teams = event_teams(event)\n", " opr_strengths = [(team, team_opr_strength(team)) for team in teams]\n", " return opr_strengths\n", "\n", "def stats_to_color(stats):\n", " if stats['average'] is None:\n", " return '#ffffff'\n", " color = int(stats['average'] * 100)\n", " lightness = 50 + int(stats['stddev'] * 150)\n", " return \"hsl({:d},{:d}%,{:d}%)\".format(color, 100, lightness)\n", " \n", "\n", "def format_event_report(report):\n", " report = sorted(report, key=lambda x: x[1]['average'] if x[1]['average'] else 0)[::-1]\n", " table = TableBuilder(row='team', col='stat')\n", " \n", " table.set_cols([\"OPR P\", \"OPR P SD\"])\n", " \n", " for team, stats in report:\n", " table.set_cell(stats['average'], color=stats_to_color(stats), team=team, stat='OPR P')\n", " table.set_cell(stats['stddev'], color=stats_to_color(stats), team=team, stat='OPR P SD')\n", " \n", " return table.get_html()\n", "\n", "for event in ['2018caav', '2017calb', '2017cc', '2018casj', '2018casf']:\n", " display(HTML(\n", " \"

Event: {:s}

\".format(event) +\n", " \"Color determined by OPR Percentile. Saturation determined by OPR Percentile Standard Deviation\" +\n", " format_event_report(prescout_event(event))\n", " ))" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "py35native", "language": "python", "name": "py35native" }, "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.5.2" } }, "nbformat": 4, "nbformat_minor": 1 }