{
"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 \"\".format(contents)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"Report for 5012
Elims results
| 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | sf | qf | w | sf | N/A |
Regional 2 | N/A | N/A | sf | N/A | N/A |
Regional 3 | | | | qf | N/A |
Champs Div | N/A | w | N/A | qf | |
Elims alliance seat
| 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | 2 | 1 | 2 | 2 | N/A |
Regional 2 | N/A | N/A | AC | N/A | N/A |
Regional 3 | | | | 1 | N/A |
Champs Div | N/A | 3 | N/A | 3 | |
Quals seed
| 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | 20 | 23 | 25 | 24 | N/A |
Regional 2 | 42 | 41 | 4 | 60 | N/A |
Regional 3 | | | | 32 | N/A |
Champs Div | 41 | 57 | 65 | 20 | |
"
],
"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
| 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | f | sf | f | w | f | w | sf | w | N/A |
Regional 2 | | N/A | N/A | | | N/A | N/A | N/A | qf | qf | sf | sf | w | qf | w | sf | N/A |
Regional 3 | | | | | | | | | | | | f | | | | | |
Champs Div | | | | | N/A | | | N/A | | w | qf | qf | w | qf | sf | w | |
Elims alliance seat
| 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | N/A |
Regional 2 | | N/A | N/A | | | N/A | N/A | N/A | 1 | AC | 1 | AC | 1 | AC | 1 | AC | N/A |
Regional 3 | | | | | | | | | | | | 1 | | | | | |
Champs Div | | | | | N/A | | | N/A | | 2 | 1 | 2 | 1 | 1 | AC | AC | |
Quals seed
| 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | 33 | 14 | 10 | 8 | 6 | 8 | 7 | 10 | 2 | 5 | 3 | N/A |
Regional 2 | | N/A | N/A | | | 14 | 23 | 8 | 10 | 7 | 21 | 3 | 43 | 4 | 2 | 4 | N/A |
Regional 3 | | | | | | | | | | | | 14 | | | | | |
Champs Div | | | | | N/A | | | 11 | | 25 | 10 | 26 | 31 | 7 | 1 | 1 | |
"
],
"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
| 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | w | w | f | w | w | w | w | w | N/A |
Regional 2 | | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | w | w | N/A | w | w | w | w | w | N/A |
Regional 3 | | | | | | | | N/A | N/A | | | | | w | | w | | | | |
Champs Div | | | N/A | | N/A | N/A | N/A | N/A | N/A | N/A | N/A | w | w | f | sf | w | qf | f | w | |
Elims alliance seat
| 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 1 | AC | 1 | 1 | AC | 1 | 1 | AC | N/A |
Regional 2 | | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 1 | AC | N/A | AC | 1 | AC | 1 | AC | N/A |
Regional 3 | | | | | | | | N/A | N/A | | | | | 1 | | AC | | | | |
Champs Div | | | N/A | | N/A | N/A | N/A | N/A | N/A | N/A | N/A | AC | AC | 1 | 1 | AC | AC | 1 | 1 | |
Quals seed
| 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 2 | 3 | 1 | 2 | 1 | 27 | 18 | 1 | 2 | 2 | 1 | N/A |
Regional 2 | | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 2 | 24 | 9 | 2 | 1 | N/A | 1 | 3 | 1 | 2 | 1 | N/A |
Regional 3 | | | | | | | | N/A | 21 | | | | | 3 | | 2 | | | | |
Champs Div | | | N/A | | N/A | N/A | N/A | N/A | 12 | 14 | 34 | 1 | 2 | 53 | 23 | 1 | 1 | 2 | 2 | |
"
],
"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
| 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | qf | N/A | qf | w | w | w | w | w | N/A |
Regional 2 | | | | | | | | w | qf | w | w | w | w | N/A |
Regional 3 | | | | | | | | | | f | w | w | w | N/A |
Champs Div | | | | | | | qf | qf | w | w | w | w | w | |
Elims alliance seat
| 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | AC | N/A | 1 | AC | 1 | AC | 1 | AC | N/A |
Regional 2 | | | | | | | | AC | 1 | AC | 1 | AC | AC | N/A |
Regional 3 | | | | | | | | | | AC | 1 | AC | AC | N/A |
Champs Div | | | | | | | 1 | 1 | AC | AC | 1 | 1 | 1 | |
Quals seed
| 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | 10 | 8 | 30 | 11 | 2 | 12 | 7 | 2 | 1 | 4 | 1 | N/A |
Regional 2 | | | | | | | | 1 | 8 | 1 | 3 | 1 | 2 | N/A |
Regional 3 | | | | | | | | | | 2 | 2 | 1 | 2 | N/A |
Champs Div | | | | | | | 20 | 14 | 1 | 1 | 2 | 3 | 3 | |
"
],
"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
| 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | w | sf | w | sf | w | sf | w | w | N/A |
Regional 2 | | N/A | | | | | | | | | w | qf | w | f | f | qf | N/A |
Regional 3 | | | | | | | | | | | | | | | | | |
Champs Div | | N/A | N/A | | N/A | | | N/A | N/A | | qf | | f | sf | f | f | |
Elims alliance seat
| 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | AC | AC | 1 | AC | AC | 1 | AC | 1 | N/A |
Regional 2 | | N/A | | | | | | | | | AC | AC | AC | 1 | AC | AC | N/A |
Regional 3 | | | | | | | | | | | | | | | | | |
Champs Div | | N/A | N/A | | N/A | | | N/A | N/A | | 1 | | AC | AC | AC | 1 | |
Quals seed
| 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | 44 | 12 | 1 | 1 | 7 | 3 | 2 | 1 | 11 | 1 | 2 | N/A |
Regional 2 | | N/A | | | | | | | | | 1 | 3 | 1 | 4 | 3 | 2 | N/A |
Regional 3 | | | | | | | | | | | | | | | | | |
Champs Div | | N/A | N/A | | N/A | | | 66 | 19 | | 75 | | 9 | 1 | 4 | 2 | |
"
],
"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
| 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | sf | N/A | w | N/A | qf | qf | qf | sf | N/A |
Regional 2 | | N/A | N/A | | | N/A | | N/A | | | | | | qf | sf | N/A | sf | N/A |
Regional 3 | | | | | | | | | | | | | | f | w | | w | |
Champs Div | | | | N/A | N/A | N/A | | | N/A | | | qf | N/A | | w | | f | |
Elims alliance seat
| 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 2 | N/A | 2 | N/A | AC | 1 | 1 | 1 | N/A |
Regional 2 | | N/A | N/A | | | N/A | | N/A | | | | | | AC | AC | N/A | 1 | N/A |
Regional 3 | | | | | | | | | | | | | | 1 | 1 | | AC | |
Champs Div | | | | N/A | N/A | N/A | | | N/A | | | AC | N/A | | 2 | | AC | |
Quals seed
| 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | 51 | 7 | 59 | 42 | 37 | 41 | 26 | 9 | 15 | 29 | 20 | N/A |
Regional 2 | | N/A | N/A | | | N/A | | 11 | | | | | | 8 | 3 | 26 | 6 | N/A |
Regional 3 | | | | | | | | | | | | | | 4 | 7 | | 6 | |
Champs Div | | | | N/A | N/A | N/A | | | 23 | | | 2 | 71 | | 27 | | 1 | |
"
],
"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
| 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | sf | w | f | w | qf | sf | sf | N/A |
Regional 2 | | | | | | | N/A | N/A | N/A | N/A | N/A | f | f | N/A | sf | w | qf | f | N/A |
Regional 3 | | | | | | | | | | | | N/A | qf | sf | sf | sf | qf | f | N/A |
Champs Div | | | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | sf | N/A | N/A | qf | qf | | qf | |
Elims alliance seat
| 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 1 | 1 | AC | 1 | 1 | AC | AC | N/A |
Regional 2 | | | | | | | N/A | N/A | N/A | N/A | N/A | 1 | 1 | N/A | 1 | AC | 1 | 1 | N/A |
Regional 3 | | | | | | | | | | | | N/A | AC | AC | 1 | AC | 1 | AC | N/A |
Champs Div | | | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | AC | N/A | N/A | AC | 2 | | 1 | |
Quals seed
| 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 |
Regional 1 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 3 | 20 | 3 | 18 | 11 | 2 | 11 | 2 | 11 | 8 | 5 | N/A |
Regional 2 | | | | | | | N/A | 14 | 24 | 1 | 5 | 12 | 10 | 9 | 4 | 3 | 12 | 5 | N/A |
Regional 3 | | | | | | | | | | | | 2 | 1 | 2 | 2 | 6 | 14 | 4 | N/A |
Champs Div | | | N/A | N/A | N/A | N/A | N/A | 71 | 78 | 4 | 20 | 3 | 80 | 20 | 1 | 41 | | 13 | |
"
],
"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 P | OPR P SD |
frc330 | 0.9668349563793398 | 0.03124240715745202 |
frc3309 | 0.8896506277949777 | 0.17524072628393625 |
frc294 | 0.8670341507263599 | 0.08578868905965303 |
frc399 | 0.7923372236674656 | 0.18007240955607115 |
frc3476 | 0.7679126641352716 | 0.1945517142696203 |
frc2637 | 0.7626578129672084 | 0.19091289503213651 |
frc5124 | 0.700786698504789 | 0.2534131125461936 |
frc3647 | 0.6973005744305883 | 0.2705987113412613 |
frc1160 | 0.6746760184260184 | 0.13288523957876713 |
frc5805 | 0.6739277389277389 | 0.2608072969136756 |
frc2493 | 0.6616517876367628 | 0.16752217254007193 |
frc597 | 0.6129383553869903 | 0.22726963354463614 |
frc599 | 0.5567006103955503 | 0.22339978864973783 |
frc4276 | 0.5528641803250745 | 0.2617935293863765 |
frc6060 | 0.536727456940223 | 0.15374873353596757 |
frc3453 | 0.5227043071870657 | 0.11647869071268564 |
frc4322 | 0.5099499497995739 | 0.2668290005490725 |
frc3669 | 0.509781313457784 | 0.22625828438483161 |
frc981 | 0.49590912460658176 | 0.28243723847674146 |
frc4255 | 0.4831768901102808 | 0.2248142739472036 |
frc5012 | 0.46325268135427466 | 0.3063389827860559 |
frc4014 | 0.43972483455242073 | 0.30464946639412893 |
frc2429 | 0.4077625860930776 | 0.26815090582062534 |
frc980 | 0.37819548973526296 | 0.17616357367295957 |
frc2339 | 0.3758601086399767 | 0.23310220918988184 |
frc2658 | 0.3548575592586482 | 0.20451825638664417 |
frc4470 | 0.3485904941580447 | 0.23858613451612737 |
frc3390 | 0.3312332321766284 | 0.1284591836770719 |
frc5869 | 0.28348309473042943 | 0.17241636357091683 |
frc6072 | 0.2503418803418803 | 0.22471940117157627 |
frc4191 | 0.24051209207459207 | 0.10454807214723644 |
frc5474 | 0.23296760710553813 | 0.22542252445860633 |
frc5625 | 0.1947095779990517 | 0.1413860081882514 |
frc585 | 0.14825286251458064 | 0.16001677743384174 |
frc6382 | 0.015151515151515152 | 0.0 |
frc6973 | None | None |
"
],
"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 P | OPR P SD |
frc330 | 0.9668349563793398 | 0.03124240715745202 |
frc3309 | 0.8896506277949777 | 0.17524072628393625 |
frc294 | 0.8670341507263599 | 0.08578868905965303 |
frc2637 | 0.7626578129672084 | 0.19091289503213651 |
frc2486 | 0.7425903828329473 | 0.2261404054148349 |
frc3970 | 0.7380011226078391 | 0.11741855503386818 |
frc207 | 0.7348538677839063 | 0.19085093733964464 |
frc3512 | 0.7281156568158657 | 0.26803389057037996 |
frc696 | 0.7256975676394263 | 0.19381212099709935 |
frc4201 | 0.7027959609704771 | 0.22824708551895712 |
frc5124 | 0.700786698504789 | 0.2534131125461936 |
frc1197 | 0.6720610094210154 | 0.2135221040836021 |
frc2493 | 0.6616517876367628 | 0.16752217254007193 |
frc4 | 0.6588067081969521 | 0.2524119592313741 |
frc4619 | 0.6361167964826501 | 0.1774674827399883 |
frc597 | 0.6129383553869903 | 0.22726963354463614 |
frc2659 | 0.6083333333333334 | 0.10833333333333334 |
frc4123 | 0.6059523809523809 | 0.15595238095238093 |
frc4913 | 0.5802466956602295 | 0.2431237008103306 |
frc4415 | 0.5753520879660697 | 0.2467803154110071 |
frc3303 | 0.5624666933075457 | 0.20102041936072546 |
frc5089 | 0.5512866305201687 | 0.27580488056483904 |
frc1644 | 0.5471823498139288 | 0.23546704272079402 |
frc4501 | 0.5444792026401059 | 0.2836526821220404 |
frc687 | 0.5176147054566508 | 0.19948176906782633 |
frc1452 | 0.506060606060606 | 0.23546839006136255 |
frc4763 | 0.4933691308691308 | 0.3415245368687236 |
frc2761 | 0.47544337402811476 | 0.25749712248753803 |
frc848 | 0.455050505050505 | 0.16712669905611774 |
frc4999 | 0.4466283716283716 | 0.20405268985491395 |
frc5765 | 0.44220032840722495 | 0.1703864437550854 |
frc3880 | 0.434774266747951 | 0.2879234055528694 |
frc4578 | 0.4083333333333333 | 0.09166666666666667 |
frc1515 | 0.4062036171019431 | 0.15726621640345398 |
frc5966 | 0.4015151515151515 | 0.26515151515151514 |
frc702 | 0.3943788511940001 | 0.32401868562349223 |
frc580 | 0.39404761904761904 | 0.2584265796162504 |
frc5285 | 0.3936771561771562 | 0.11835663977004443 |
frc5669 | 0.3863636363636364 | 0.266841655166021 |
frc6499 | 0.38333333333333336 | 0.0 |
frc980 | 0.37819548973526296 | 0.17616357367295957 |
frc5512 | 0.3757575757575758 | 0.2271447451100264 |
frc4470 | 0.3485904941580447 | 0.23858613451612737 |
frc5102 | 0.3434343434343434 | 0.2827380808541092 |
frc5510 | 0.3356818181818182 | 0.2863837074094914 |
frc4964 | 0.3283435399289058 | 0.27989094862189895 |
frc6692 | 0.31666666666666665 | 0.0 |
frc691 | 0.30377272800748456 | 0.1629388960558805 |
frc5107 | 0.2802631578947368 | 0.06973684210526315 |
frc3408 | 0.27634237107921317 | 0.15309239959721654 |
frc6000 | 0.2696969696969697 | 0.16969696969696968 |
frc606 | 0.2590909090909091 | 0.1602674150350219 |
frc2404 | 0.2532467532467533 | 0.09971990908908608 |
frc3120 | 0.20552928488468558 | 0.16804259361227233 |
frc4019 | 0.19646464646464645 | 0.13398790961298296 |
frc867 | 0.17929292929292928 | 0.06614040835206463 |
frc5432 | 0.17005772005772005 | 0.11437727722482734 |
frc3952 | 0.160118425635667 | 0.0795017001602817 |
frc1759 | 0.12134762256713476 | 0.13851078238786466 |
frc6658 | 0.049129353233830844 | 0.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 P | OPR P SD |
frc254 | 0.9920594362406211 | 0.011328505154128693 |
frc1678 | 0.9811761104514763 | 0.013529528173670268 |
frc973 | 0.9624740934187422 | 0.022835540855692893 |
frc971 | 0.9598866647800534 | 0.040414210035810784 |
frc1538 | 0.9340506307073976 | 0.06776754903068292 |
frc3309 | 0.8896506277949777 | 0.17524072628393625 |
frc701 | 0.834476912381749 | 0.1344336751129024 |
frc399 | 0.7923372236674656 | 0.18007240955607115 |
frc1671 | 0.784792149241849 | 0.20567955048851894 |
frc846 | 0.7697298133153397 | 0.0649797992662614 |
frc3476 | 0.7679126641352716 | 0.1945517142696203 |
frc2073 | 0.7652443784259197 | 0.19042099560937797 |
frc5818 | 0.728789817148026 | 0.1973931995567787 |
frc696 | 0.7256975676394263 | 0.19381212099709935 |
frc649 | 0.7238042423416334 | 0.12074796283331235 |
frc1011 | 0.6995235980371524 | 0.22550011415871618 |
frc3647 | 0.6973005744305883 | 0.2705987113412613 |
frc3256 | 0.6775719014129287 | 0.225441644888219 |
frc115 | 0.6178428321822997 | 0.2750569061500388 |
frc2135 | 0.5988919286413468 | 0.10588784301428036 |
frc3859 | 0.5828633271490414 | 0.19955674334035975 |
frc5829 | 0.5821798470779177 | 0.12922843143298415 |
frc1323 | 0.5784005340561698 | 0.3218552448663397 |
frc1868 | 0.5734337708288398 | 0.26478484813345 |
frc114 | 0.5513295787321569 | 0.2913199856867942 |
frc4904 | 0.5293247312484806 | 0.29087941151579333 |
frc604 | 0.5257737745136267 | 0.27342093941257356 |
frc8 | 0.5201182796683267 | 0.26954193704011414 |
frc6418 | 0.5154390648384096 | 0.3175033927451955 |
frc199 | 0.514462842039801 | 0.21387558414097788 |
frc5104 | 0.4912059989784313 | 0.28526994205405015 |
frc5499 | 0.4812380129018415 | 0.25925141820375475 |
frc668 | 0.4796553815247653 | 0.3105443875467901 |
frc3925 | 0.4666003315162138 | 0.12833282895385847 |
frc1700 | 0.46620251265342144 | 0.28455404079592755 |
frc5012 | 0.46325268135427466 | 0.3063389827860559 |
frc5026 | 0.41829747595151956 | 0.2877900112077281 |
frc968 | 0.3944124426928122 | 0.28167278145173413 |
frc841 | 0.36887439532162736 | 0.20601089446240536 |
frc4990 | 0.3132558716595332 | 0.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 P | OPR P SD |
frc254 | 0.9920594362406211 | 0.011328505154128693 |
frc973 | 0.9624740934187422 | 0.022835540855692893 |
frc971 | 0.9598866647800534 | 0.040414210035810784 |
frc192 | 0.8240869214326099 | 0.194304787827679 |
frc3132 | 0.8208888495094109 | 0.17862155250399414 |
frc846 | 0.7697298133153397 | 0.0649797992662614 |
frc383 | 0.7056708900102384 | 0.11515359715788703 |
frc2144 | 0.6946666975793744 | 0.2168524343422375 |
frc5924 | 0.6591229674796748 | 0.22472013801571875 |
frc6036 | 0.6522357723577236 | 0.22157473504379885 |
frc2135 | 0.5988919286413468 | 0.10588784301428036 |
frc1351 | 0.5896963390619406 | 0.17927347972993438 |
frc2035 | 0.5751681205508227 | 0.21106370485079293 |
frc1868 | 0.5734337708288398 | 0.26478484813345 |
frc6039 | 0.5416666666666666 | 0.20833333333333334 |
frc4904 | 0.5293247312484806 | 0.29087941151579333 |
frc604 | 0.5257737745136267 | 0.27342093941257356 |
frc8 | 0.5201182796683267 | 0.26954193704011414 |
frc6418 | 0.5154390648384096 | 0.3175033927451955 |
frc852 | 0.514797965658828 | 0.2553046489133242 |
frc581 | 0.5069944887989427 | 0.26835645668522995 |
frc1967 | 0.5066654732068265 | 0.17505277656402282 |
frc4669 | 0.5048338348643228 | 0.23869614501923417 |
frc3482 | 0.4957150107047526 | 0.24021985387392086 |
frc4255 | 0.4831768901102808 | 0.2248142739472036 |
frc5499 | 0.4812380129018415 | 0.25925141820375475 |
frc668 | 0.4796553815247653 | 0.3105443875467901 |
frc1072 | 0.47624401913875597 | 0.34552746818472024 |
frc1700 | 0.46620251265342144 | 0.28455404079592755 |
frc751 | 0.4500655450683446 | 0.3442474226357632 |
frc670 | 0.4416799767819462 | 0.3106145347976756 |
frc4186 | 0.43572047496790756 | 0.19807996754116913 |
frc4159 | 0.4286956130625899 | 0.17018193927302247 |
frc2643 | 0.40021785691778494 | 0.3089879981122203 |
frc2489 | 0.3897360588972431 | 0.27743633878846286 |
frc2473 | 0.38522408109260037 | 0.30743014887998993 |
frc841 | 0.36887439532162736 | 0.20601089446240536 |
frc4091 | 0.3468029172320217 | 0.206316888028452 |
frc5737 | 0.31983204165309526 | 0.23862913411955297 |
frc4990 | 0.3132558716595332 | 0.22033531400481876 |
frc4973 | 0.3100138769476749 | 0.16743621939261347 |
frc6665 | 0.30833333333333335 | 0.19166666666666665 |
frc4171 | 0.307390574650913 | 0.15531219246593103 |
frc2367 | 0.3055852373144106 | 0.18178875580740408 |
frc2813 | 0.29747176181071283 | 0.23132889217631447 |
frc256 | 0.22833394871106338 | 0.1489104250686248 |
frc5171 | 0.2034722222222222 | 0.09884069518518855 |
frc253 | 0.17689393939393938 | 0.0819250844821126 |
frc6688 | 0.16666666666666666 | 0.0 |
frc5027 | 0.14155701754385963 | 0.1373253160927785 |
frc6619 | 0.12127659574468086 | 0.07872340425531915 |
frc6718 | 0.04878048780487805 | 0.0 |
frc6410 | 0.016666666666666666 | 0.0 |
frc7317 | None | None |
frc7308 | None | None |
frc7245 | None | None |
frc6884 | None | None |
frc6883 | None | None |
frc6303 | None | None |
frc6238 | None | None |
"
],
"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 P | OPR P SD |
frc973 | 0.9624740934187422 | 0.022835540855692893 |
frc971 | 0.9598866647800534 | 0.040414210035810784 |
frc6662 | 0.8780487804878049 | 0.0 |
frc2383 | 0.7467037294308515 | 0.16928033445260593 |
frc649 | 0.7238042423416334 | 0.12074796283331235 |
frc5924 | 0.6591229674796748 | 0.22472013801571875 |
frc6036 | 0.6522357723577236 | 0.22157473504379885 |
frc5700 | 0.6016460740265298 | 0.02768653993935086 |
frc5419 | 0.5365853658536586 | 0.0 |
frc4904 | 0.5293247312484806 | 0.29087941151579333 |
frc604 | 0.5257737745136267 | 0.27342093941257356 |
frc5940 | 0.5173348577235772 | 0.28492451576122413 |
frc6418 | 0.5154390648384096 | 0.3175033927451955 |
frc199 | 0.514462842039801 | 0.21387558414097788 |
frc100 | 0.513939577026983 | 0.23237323168899596 |
frc581 | 0.5069944887989427 | 0.26835645668522995 |
frc4669 | 0.5048338348643228 | 0.23869614501923417 |
frc5104 | 0.4912059989784313 | 0.28526994205405015 |
frc5499 | 0.4812380129018415 | 0.25925141820375475 |
frc6415 | 0.4583333333333333 | 0.0 |
frc1458 | 0.45287209720758753 | 0.22102214198537365 |
frc5993 | 0.450354609929078 | 0.21631205673758863 |
frc972 | 0.4493822595527573 | 0.14749601048782265 |
frc2551 | 0.44844877344877343 | 0.2604132445131618 |
frc5507 | 0.447263356562137 | 0.05366200246972575 |
frc4186 | 0.43572047496790756 | 0.19807996754116913 |
frc3880 | 0.434774266747951 | 0.2879234055528694 |
frc4159 | 0.4286956130625899 | 0.17018193927302247 |
frc5026 | 0.41829747595151956 | 0.2877900112077281 |
frc766 | 0.4117691679309137 | 0.16755990173555588 |
frc2489 | 0.3897360588972431 | 0.27743633878846286 |
frc4765 | 0.3131797354157752 | 0.17558232777413613 |
frc4973 | 0.3100138769476749 | 0.16743621939261347 |
frc6665 | 0.30833333333333335 | 0.19166666666666665 |
frc2854 | 0.269834790864356 | 0.10977810282920974 |
frc5430 | 0.20336865400496937 | 0.24649134178789786 |
frc253 | 0.17689393939393938 | 0.0819250844821126 |
frc6718 | 0.04878048780487805 | 0.0 |
frc7317 | None | None |
frc7137 | None | None |
frc6981 | None | None |
frc6962 | None | None |
frc6814 | None | None |
"
],
"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
}