import requests
import requests_cache
# Cache all api requests in a file called tba_cache.sqlite for a day
# (monkeypatch the requests module that tbapy uses)
requests_cache.install_cache(cache_name="tba_cache", expire_after=60 * 60 * 24)
import tbapy
import pprint
pp = pprint.PrettyPrinter()
api_key = "6qOZ9uAEsb4CDrOBNG6ZnIdi9cWBaZ6DHnCSato97Qfo7bBeUwT9NfFt4Gi5sHFN"
tba = tbapy.TBA(api_key)
pp.pprint(tba.status())
{'android': {'latest_app_version': 4020399, 'min_app_version': 4000299}, 'contbuild_enabled': True, 'current_season': 2018, 'down_events': [], 'ios': {'latest_app_version': -1, 'min_app_version': -1}, 'is_datafeed_down': False, 'json': {'android': {'latest_app_version': 4020399, 'min_app_version': 4000299}, 'contbuild_enabled': True, 'current_season': 2018, 'down_events': [], 'ios': {'latest_app_version': -1, 'min_app_version': -1}, 'is_datafeed_down': False, 'max_season': 2018, 'web': {'commit_time': '2018-02-19 00:43:42 -0500', 'current_commit': '908eaae107ae0cd08d462eb65246cc5aa5b43136', 'deploy_time': 'Mon Feb 19 06:02:12 UTC 2018', 'travis_job': '343226350'}}, 'max_season': 2018, 'web': {'commit_time': '2018-02-19 00:43:42 -0500', 'current_commit': '908eaae107ae0cd08d462eb65246cc5aa5b43136', 'deploy_time': 'Mon Feb 19 06:02:12 UTC 2018', 'travis_job': '343226350'}}
"Memoize my favorite functions"
from functools import lru_cache
team_events = lru_cache(maxsize=512)(tba.team_events)
event_alliances = lru_cache(maxsize=512)(tba.event_alliances)
event_rankings = lru_cache(maxsize=512)(tba.event_rankings)
event_oprs = lru_cache(maxsize=512)(tba.event_oprs)
team_years = lru_cache(maxsize=512)(tba.team_years)
@lru_cache(maxsize=128)
def event_teams(team):
return [x['key'] for x in tba.event_teams(team)]
def scrape_event_codes(events, year):
return [str(year) + event['event_code'] for event in events]
pp.pprint(scrape_event_codes(team_events('frc973', 2017), 2017))
['2017cabl', '2017cacc', '2017cada', '2017cama', '2017cc', '2017cmptx', '2017mttd', '2017nhfoc', '2017onsc', '2017roe']
def team_event_report(team, event):
level = None
seat = None
seed = None
try:
finals_report = event_alliances(event)
for alliance in finals_report:
if team in alliance['picks'] and alliance['status'] != 'unknown':
#pp.pprint(alliance)
level = 'w' if alliance['status']['status'] == 'won' else alliance['status']['level']
seat = alliance['picks'].index(team)
if seat == 0:
seat = 'AC'
except TypeError:
print("No finals report for {:s}".format(event))
try:
quals_seeds = event_rankings(event)
for alliance in quals_seeds['rankings']:
if alliance['team_key'] == team:
if alliance['dq']:
seed = 'DQ'
else:
seed = alliance['rank']
except TypeError:
print("No ranking port for {:s}".format(event))
return {
'level': level,
'seat': seat,
'seed': seed,
}
def team_year_report(team, year):
events = [event
for event
in team_events(team, year)
if event['event_type'] <= 3]
event_reports = []
for event in events:
event_code = str(year) + event['event_code']
event_reports.append({
'event_code': event['event_code'],
'event_type': event['event_type'],
'event_type_string': event['event_type_string'],
'event_date': event['start_date'],
'team_report': team_event_report(team, event_code),
})
return event_reports
def team_history(team):
years = sorted(team_years(team))
year_reports = []
for year in years:
year_reports.append((year, team_year_report(team, year)))
return year_reports
griffengear = team_history('frc5012')
pp.pprint(griffengear)
No finals report for 2015nvlv No finals report for 2018caav No ranking port for 2018caav No finals report for 2018casd No ranking port for 2018casd No finals report for 2018nvlv No ranking port for 2018nvlv [(2014, [{'event_code': 'casb', 'event_date': '2014-02-28', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': 'sf', 'seat': 2, 'seed': 20}}, {'event_code': 'gal', 'event_date': '2014-04-24', 'event_type': 3, 'event_type_string': 'Championship Division', 'team_report': {'level': None, 'seat': None, 'seed': 41}}, {'event_code': 'nvlv', 'event_date': '2014-04-03', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': None, 'seat': None, 'seed': 42}}]), (2015, [{'event_code': 'carm', 'event_date': '2015-02-26', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': 'qf', 'seat': 1, 'seed': 23}}, {'event_code': 'new', 'event_date': '2015-04-22', 'event_type': 3, 'event_type_string': 'Championship Division', 'team_report': {'level': 'w', 'seat': 3, 'seed': 57}}, {'event_code': 'nvlv', 'event_date': '2015-03-25', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': None, 'seat': None, 'seed': 41}}]), (2016, [{'event_code': 'calb', 'event_date': '2016-03-09', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': 'w', 'seat': 2, 'seed': 25}}, {'event_code': 'gal', 'event_date': '2016-04-27', 'event_type': 3, 'event_type_string': 'Championship Division', 'team_report': {'level': None, 'seat': None, 'seed': 65}}, {'event_code': 'nvlv', 'event_date': '2016-03-30', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': 'sf', 'seat': 'AC', 'seed': 4}}]), (2017, [{'event_code': 'cada', 'event_date': '2017-03-22', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': 'sf', 'seat': 2, 'seed': 24}}, {'event_code': 'casd', 'event_date': '2017-03-08', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': None, 'seat': None, 'seed': 60}}, {'event_code': 'new', 'event_date': '2017-04-19', 'event_type': 3, 'event_type_string': 'Championship Division', 'team_report': {'level': 'qf', 'seat': 3, 'seed': 20}}, {'event_code': 'nvlv', 'event_date': '2017-04-05', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': 'qf', 'seat': 1, 'seed': 32}}]), (2018, [{'event_code': 'caav', 'event_date': '2018-04-04', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': None, 'seat': None, 'seed': None}}, {'event_code': 'casd', 'event_date': '2018-03-07', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': None, 'seat': None, 'seed': None}}, {'event_code': 'nvlv', 'event_date': '2018-03-21', 'event_type': 0, 'event_type_string': 'Regional', 'team_report': {'level': None, 'seat': None, 'seed': None}}])]
class TableBuilder:
def __init__(self, **kwargs):
self.row_var = kwargs['row']
self.rows = []
self.accept_new_rows = True
self.col_var = kwargs['col']
self.cols = []
self.accept_new_cols = True
self.upper_left = ''
self.cells = {}
def default_generator(**kwargs):
return ""
self.generator = default_generator
def set_generator(self, gen):
self.generator = gen
def set_rows(self, rows):
self.rows = rows
self.accept_new_rows = False
def set_cols(self, cols):
self.cols = cols
self.accept_new_cols = False
def set_cell(self, value, **kwargs):
row = kwargs[self.row_var]
col = kwargs[self.col_var]
if row not in self.rows:
if self.accept_new_rows:
self.rows.append(row)
else:
raise Exception("Row does not exist and table configured to not accept new rows")
if col not in self.cols:
if self.accept_new_cols:
self.cols.append(col)
else:
raise Exception("Col does not exist and table configured to not accept new cols")
if row not in self.cells:
self.cells[row] = {}
self.cells[row][col] = {
'value': value,
'color': kwargs.get('color', None),
}
def get_cell(self, **kwargs):
row = kwargs[self.row_var]
col = kwargs[self.col_var]
if row not in self.cells:
self.cells[row] = {}
if col not in self.cells[row]:
self.cells[row][col] = self.generator(row=row, col=col)
return self.cells[row][col]
def _get_cell(self, row, col):
if row not in self.cells:
self.cells[row] = {}
if col not in self.cells[row]:
self.cells[row][col] = {
'value': self.generator(row=row, col=col),
'color': None,
}
return self.cells[row][col]
def get_html(self):
table_rows = []
header_cells = [self.upper_left] + self.cols
header = ''.join('<td>{:s}</td>'.format(str(cell)) for cell in header_cells)
table_rows.append(header)
for row in self.rows:
row_cells = [self._get_cell(row, col) for col in self.cols]
row = ['<td>{:s}</td>'.format(row)]
for cell in row_cells:
if cell['color']:
row.append('<td style="background-color:{:s}">{:s}</td>'.format(
str(cell['color']),
str(cell['value'])))
else:
row.append('<td>{:s}</td>'.format(
str(cell['value'])))
row = ''.join(row)
table_rows.append(row)
contents = ''.join('<tr>{:s}</tr>'.format(row) for row in table_rows)
return "<table>{:s}</table>".format(contents)
from IPython.display import HTML, display
def format_subreport(history, team, attribute, color_codes=None):
table = TableBuilder(row='event', col='year')
years = [report[0] for report in history]
table.set_cols(years)
table.set_rows(["Regional 1", "Regional 2", "Regional 3", "Champs Div"])
for report in history:
year = report[0]
regional_events = [event for event in report[1] if event['event_type'] < 3]
champs_events = [event for event in report[1] if event['event_type'] == 3]
for i, row in enumerate(['Regional 1', 'Regional 2', 'Regional 3']):
if len(regional_events) > i:
if regional_events[i]['team_report'] is None:
table.set_cell("?", event=row, year=year)
elif regional_events[i]['team_report'][attribute] is None:
table.set_cell("N/A",
color='#e6e6e6',
event=row, year=year)
else:
table.set_cell(regional_events[i]['team_report'][attribute],
color=color_codes[regional_events[i]['team_report'][attribute]],
event=row, year=year)
if champs_events:
if champs_events[0]['team_report'] is None:
table.set_cell("?", event='Champs Div', year=year)
elif champs_events[0]['team_report'][attribute] is None:
table.set_cell("N/A",
color='#e6e6e6',
event='Champs Div', year=year)
else:
table.set_cell(champs_events[0]['team_report'][attribute],
color=color_codes[champs_events[0]['team_report'][attribute]],
event='Champs Div', year=year)
return table.get_html()
def rank_to_color(rank):
rank = min(rank, 60)
r = 60 + 1 * rank
g = 255 - 1 * rank
b = 135 + 2 * rank
return "#{:02x}{:02x}{:02x}".format(r, g, b)
def format_report(history, teamno):
source = (
"<h1>Report for {:s}</h1>".format(str(teamno)) +
"<h3>Elims results</h3>" +
format_subreport(history, teamno, 'level', {
'w': '#66ff33',
'f': '#66ff99',
'sf': '#66ffff',
'qf': '#66ccff',
'N/A': '#e6e6e6',
}) +
"<br />" +
"<h3>Elims alliance seat</h3>" +
format_subreport(history, teamno, 'seat', {
'AC': '#66ff33',
1: '#66ff99',
2: '#66ffff',
3: '#66ccff',
}) +
"<br />" +
"<h3>Quals seed</h3>" +
format_subreport(history, teamno, 'seed', {
rank: rank_to_color(rank)
for rank
in range(100)
})
)
display(HTML(source))
format_report(griffengear, 5012)
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 |
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 |
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 |
format_report(team_history('frc973'), 973)
No finals report for 2002sj No ranking port for 2002sj No finals report for 2003ca No ranking port for 2003ca No finals report for 2003sj No ranking port for 2003sj No finals report for 2004az No ranking port for 2004az No finals report for 2004sj No ranking port for 2004sj No finals report for 2005sac No ranking port for 2005sac No finals report for 2006arc No ranking port for 2006arc No finals report for 2006sj No ranking port for 2006sj No finals report for 2007sac No finals report for 2007sj No finals report for 2008nv No finals report for 2008sj No finals report for 2009ca No finals report for 2009gal No finals report for 2009nv No finals report for 2018casf No ranking port for 2018casf No finals report for 2018casj No ranking port for 2018casj
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 |
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 |
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 |
format_report(team_history('frc254'), 254)
format_report(team_history('frc1678'), 1678)
format_report(team_history('frc971'), 971)
format_report(team_history('frc492'), 492)
No finals report for 1999ca No ranking port for 1999ca No finals report for 2000ca No ranking port for 2000ca No finals report for 2000tx No ranking port for 2000tx No finals report for 2001arc No ranking port for 2001arc No finals report for 2001ca1 No ranking port for 2001ca1 No finals report for 2001ca2 No ranking port for 2001ca2 No finals report for 2002oh No ranking port for 2002oh No finals report for 2002sj No ranking port for 2002sj No finals report for 2003new No ranking port for 2003new No finals report for 2003sac No ranking port for 2003sac No finals report for 2003sj No ranking port for 2003sj No finals report for 2004new No ranking port for 2004new No finals report for 2004sac No ranking port for 2004sac No finals report for 2004sj No ranking port for 2004sj No finals report for 2005gal No ranking port for 2005gal No finals report for 2005sac No ranking port for 2005sac No finals report for 2005sj No ranking port for 2005sj No finals report for 2006new No ranking port for 2006new No finals report for 2006or No ranking port for 2006or No finals report for 2006sj No ranking port for 2006sj No finals report for 2006wa No ranking port for 2006wa No finals report for 2007arc No finals report for 2007ca No finals report for 2007nv No finals report for 2007sj No finals report for 2008gal No finals report for 2008hi No finals report for 2008sj No finals report for 2009cur No finals report for 2009nv No finals report for 2009sj No finals report for 2018azfl No ranking port for 2018azfl No finals report for 2018casj No ranking port for 2018casj
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 |
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 |
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 |
No finals report for 2005sac No ranking port for 2005sac No finals report for 2006sac No ranking port for 2006sac No finals report for 2007sac No finals report for 2008sac No finals report for 2009sac No finals report for 2011sac No finals report for 2018cada No ranking port for 2018cada No finals report for 2018cafr No ranking port for 2018cafr No finals report for 2018utwv No ranking port for 2018utwv
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 |
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 |
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 |
No finals report for 2002sj No ranking port for 2002sj No finals report for 2003cur No ranking port for 2003cur No finals report for 2003sac No ranking port for 2003sac No finals report for 2003sj No ranking port for 2003sj No finals report for 2004gal No ranking port for 2004gal No finals report for 2004sj No ranking port for 2004sj No finals report for 2005sj No ranking port for 2005sj No finals report for 2006gal No ranking port for 2006gal No finals report for 2006sj No ranking port for 2006sj No finals report for 2007sj No finals report for 2008sj No finals report for 2009gal No finals report for 2009sj No finals report for 2010new No finals report for 2018casf No ranking port for 2018casf No finals report for 2018casj No ranking port for 2018casj
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 |
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 |
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 |
No finals report for 2001ca2 No ranking port for 2001ca2 No finals report for 2002ca No ranking port for 2002ca No finals report for 2002wa No ranking port for 2002wa No finals report for 2003sj No ranking port for 2003sj No finals report for 2003wa No ranking port for 2003wa No finals report for 2004gal No ranking port for 2004gal No finals report for 2004or No ranking port for 2004or No finals report for 2005gal No ranking port for 2005gal No finals report for 2005or No ranking port for 2005or No finals report for 2006new No ranking port for 2006new No finals report for 2006or No ranking port for 2006or No finals report for 2006wa No ranking port for 2006wa No finals report for 2007or No finals report for 2008or No finals report for 2008wa No finals report for 2009arc No finals report for 2009wa No finals report for 2013wase No finals report for 2018waamv No ranking port for 2018waamv No finals report for 2018wasno No ranking port for 2018wasno
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 |
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 |
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 |
format_report(team_history('frc399'), 399)
No finals report for 2000ca No ranking port for 2000ca No finals report for 2001ca1 No ranking port for 2001ca1 No finals report for 2002ca No ranking port for 2002ca No finals report for 2002new No ranking port for 2002new No finals report for 2003ca No ranking port for 2003ca No finals report for 2003gal No ranking port for 2003gal No finals report for 2004arc No ranking port for 2004arc No finals report for 2004ca No ranking port for 2004ca No finals report for 2005gal No ranking port for 2005gal No finals report for 2005nv No ranking port for 2005nv No finals report for 2006gal No ranking port for 2006gal No finals report for 2006md No ranking port for 2006md No finals report for 2006nv No ranking port for 2006nv No finals report for 2007ca No finals report for 2007new No finals report for 2007pa No finals report for 2008ca No finals report for 2008gal No finals report for 2008sdc No finals report for 2009ca No finals report for 2009co No finals report for 2009cur No finals report for 2010az No finals report for 2010co No finals report for 2010new No finals report for 2011ut No finals report for 2013casb No finals report for 2018caav No ranking port for 2018caav No finals report for 2018nvlv No ranking port for 2018nvlv No finals report for 2018utwv No ranking port for 2018utwv
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 |
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 |
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 |
def opr_percentile_at_event(team, event):
try:
percentiles = event_oprs(event)['oprs']
percentiles = [(opr, team) for team, opr in percentiles.items()]
percentiles = sorted(percentiles)
percentiles = [team for opr, team in percentiles]
position = percentiles.index(team)
return float(position + 1) / len(percentiles)
except TypeError:
return None
except ValueError:
return None
def opr_percentile_at_all_events(team, year):
events = [
str(year) + event['event_code']
for event
in team_events(team, year)
if event['event_type'] <= 3
]
return [
(event, opr_percentile_at_event(team, event))
for event
in events
]
def avg(lst):
return sum(lst) / len(lst)
def stddev(lst):
mean = avg(lst)
diffs = [(mean - x) ** 2 for x in lst]
return avg(diffs) ** 0.5
def team_opr_strength(team):
percentiles = []
for year in [2017, 2016, 2015]:
for event, percentile in opr_percentile_at_all_events(team, year):
if percentile:
percentiles.append(percentile)
if percentiles:
return {
'average': avg(percentiles),
'stddev': stddev(percentiles),
}
else:
return {
'average': None,
'stddev': None,
}
def prescout_event(event):
teams = event_teams(event)
opr_strengths = [(team, team_opr_strength(team)) for team in teams]
return opr_strengths
def stats_to_color(stats):
if stats['average'] is None:
return '#ffffff'
color = int(stats['average'] * 100)
lightness = 50 + int(stats['stddev'] * 150)
return "hsl({:d},{:d}%,{:d}%)".format(color, 100, lightness)
def format_event_report(report):
report = sorted(report, key=lambda x: x[1]['average'] if x[1]['average'] else 0)[::-1]
table = TableBuilder(row='team', col='stat')
table.set_cols(["OPR P", "OPR P SD"])
for team, stats in report:
table.set_cell(stats['average'], color=stats_to_color(stats), team=team, stat='OPR P')
table.set_cell(stats['stddev'], color=stats_to_color(stats), team=team, stat='OPR P SD')
return table.get_html()
for event in ['2018caav', '2017calb', '2017cc', '2018casj', '2018casf']:
display(HTML(
"<h1>Event: {:s}</h1>".format(event) +
"Color determined by OPR Percentile. Saturation determined by OPR Percentile Standard Deviation" +
format_event_report(prescout_event(event))
))
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 |
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 |
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 |
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 |
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 |