Ejemplo n.º 1
0
    def rankings(self):
        sessionCheck()
        self.database_exists()
        conn = sql.connect(self.datapath())
        conn.row_factory = sql.Row
        cursor = conn.cursor()
        events = conn.cursor().execute("SELECT * from Events").fetchall()
        conn.close()

        rankings = {}

        # Grab latest rankings and match data from TBA
        headers = {
            "X-TBA-Auth-Key":
            "n8QdCIF7LROZiZFI7ymlX0fshMBL15uAzEkBgtP1JgUpconm2Wf49pjYgbYMstBF"
        }
        m = requests.get(
            "http://www.thebluealliance.com/api/v3/event/{0}/matches".format(
                getEvent()),
            params=headers)
        r = requests.get(
            "http://www.thebluealliance.com/api/v3/event/{0}/rankings".format(
                getEvent()),
            params=headers)
        if 'feed' in m:
            raise cherrypy.HTTPError(
                503, "Unable to retrieve data about this event.")
        if r.text != '[]':
            r = r.json()
        else:
            raise cherrypy.HTTPError(
                503, "Unable to retrieve rankings data for this event.")
        if m.text != '[]':
            m = m.json()
        else:
            raise cherrypy.HTTPError(
                503, "Unable to retrieve match data for this event.")

        # Process current rankings into dict
        for item in r["rankings"]:
            rankings[item["team_key"][3:]] = {
                'rp':
                round(item["sort_orders"][0] * item["matches_played"], 0),
                'matchScore':
                round(item["sort_orders"][1] * item["matches_played"], 0),
                'currentRP':
                round(item["sort_orders"][0] * item["matches_played"], 0),
                'currentMatchScore':
                round(item["sort_orders"][1] * item["matches_played"], 0)
            }

        # Iterate through all matches
        for match in m:
            if match['comp_level'] == 'qm':
                # Un-played matches show a score of -1. Predict the outcome
                if match['alliances']['blue']['score'] == -1:
                    blueTeams = [
                        match['alliances']['blue']['team_keys'][0][3:],
                        match['alliances']['blue']['team_keys'][1][3:],
                        match['alliances']['blue']['team_keys'][2][3:]
                    ]
                    blueResult = game.predictScore(getEvent(), blueTeams)
                    blueRP = blueResult['RP1'] + blueResult['RP2']
                    redTeams = [
                        match['alliances']['red']['team_keys'][0][3:],
                        match['alliances']['red']['team_keys'][1][3:],
                        match['alliances']['red']['team_keys'][2][3:]
                    ]
                    redResult = game.predictScore(getEvent(), redTeams)
                    redRP = redResult['RP1'] + redResult['RP2']
                    if blueResult['score'] > redResult['score']:
                        blueRP += 2
                    elif redResult['score'] > blueResult['score']:
                        redRP += 2
                    else:
                        redRP += 1
                        blueRP += 1
                    for team in blueTeams:
                        rankings[team]['rp'] += blueRP
                        rankings[team]['matchScore'] += blueResult['score']
                    for team in redTeams:
                        rankings[team]['rp'] += redRP
                        rankings[team]['matchScore'] += redResult['score']

        # Sort rankings, then output into table
        sorted_rankings = sorted(
            rankings.items(),
            key=keyFromItem(lambda k, v: (v['rp'], v['matchScore'])),
            reverse=True)
        tmpl = loader.load('rankings.xhtml')
        page = tmpl.generate(rankings=sorted_rankings,
                             session=cherrypy.session,
                             events=events)
        return page.render('html', doctype='html')
Ejemplo n.º 2
0
    def matches(self, n=''):
        sessionCheck()

        # Get match data
        m = self.getMatches(getEvent())

        output = ''

        if 'feed' in m:
            raise cherrypy.HTTPError(
                503, "Unable to retrieve data about this event.")

        # assign weights, so we can sort the matches
        for match in m:
            match['value'] = match['match_number']
            type = match['comp_level']
            if type == 'qf':
                match['value'] += 1000
            elif type == 'sf':
                match['value'] += 2000
            elif type == 'f':
                match['value'] += 3000

        m = sorted(m, key=lambda k: k['value'])

        # For each match, generate a row in the table
        for match in m:
            level = "quals"
            if match['comp_level'] != 'qm':
                match['num'] = match['comp_level'].upper() + str(
                    match['set_number']) + '_' + str(match['match_number'])
                level = "playoffs"
            else:
                match['num'] = match['match_number']
                if match['alliances']['blue']['score'] == -1:
                    match['alliances']['blue']['score'] = ""
                if match['alliances']['red']['score'] == -1:
                    match['alliances']['red']['score'] = ""
            blueTeams = [
                match['alliances']['blue']['team_keys'][0][3:],
                match['alliances']['blue']['team_keys'][1][3:],
                match['alliances']['blue']['team_keys'][2][3:]
            ]
            match['bluePredict'] = game.predictScore(getEvent(), blueTeams,
                                                     level)
            redTeams = [
                match['alliances']['red']['team_keys'][0][3:],
                match['alliances']['red']['team_keys'][1][3:],
                match['alliances']['red']['team_keys'][2][3:]
            ]
            match['redPredict'] = game.predictScore(getEvent(), redTeams,
                                                    level)

        conn = sql.connect(self.datapath())
        conn.row_factory = sql.Row
        events = conn.cursor().execute("SELECT * from Events").fetchall()
        conn.close()
        tmpl = loader.load('matches.xhtml')
        page = tmpl.generate(session=cherrypy.session,
                             matches=m,
                             events=events)
        return page.render('html', doctype='html')
Ejemplo n.º 3
0
    def rankings(self):
        event = self.getevent()
        datapath = 'data_' + event + '.db'
        self.database_exists(event)
        conn = sql.connect(datapath)
        conn.row_factory = sql.Row
        cursor = conn.cursor()

        rankings = {}

        #Grab latest rankings and match data from TBA
        headers = {"X-TBA-App-Id": "frc2067:scouting-system:v02"}
        m = requests.get(
            "http://www.thebluealliance.com/api/v2/event/{0}/matches".format(
                event),
            params=headers)
        r = requests.get(
            "http://www.thebluealliance.com/api/v2/event/{0}/rankings".format(
                event),
            params=headers)
        if 'feed' in m:
            raise cherrypy.HTTPError(
                503, "Unable to retrieve data about this event.")
        if r.text != '[]':
            r = r.json()
        else:
            raise cherrypy.HTTPError(
                503, "Unable to retrieve rankings data for this event.")
        if m.text != '[]':
            m = m.json()
        else:
            raise cherrypy.HTTPError(
                503, "Unable to retrieve match data for this event.")

        #Process current rankings into dict
        del r[0]
        for item in r:
            rankings[str(item[1])] = {
                'rp': round(item[2] * item[9], 0),
                'matchScore': item[3],
                'currentRP': round(item[2] * item[9], 0),
                'currentMatchScore': item[3]
            }

        #Iterate through all matches
        for match in m:
            if match['comp_level'] == 'qm':
                #Un-played matches show a score of -1. Predict the outcome
                if match['alliances']['blue']['score'] == -1:
                    blueTeams = [
                        match['alliances']['blue']['teams'][0][3:],
                        match['alliances']['blue']['teams'][1][3:],
                        match['alliances']['blue']['teams'][2][3:]
                    ]
                    blueResult = game.predictScore(self.datapath(), blueTeams)
                    blueRP = blueResult['fuelRP'] + blueResult['gearRP']
                    redTeams = [
                        match['alliances']['red']['teams'][0][3:],
                        match['alliances']['red']['teams'][1][3:],
                        match['alliances']['red']['teams'][2][3:]
                    ]
                    redResult = game.predictScore(self.datapath(), redTeams)
                    redRP = redResult['fuelRP'] + redResult['gearRP']
                    if blueResult['score'] > redResult['score']:
                        blueRP += 2
                    elif redResult['score'] > blueResult['score']:
                        redRP += 2
                    else:
                        redRP += 1
                        blueRP += 1
                    for team in blueTeams:
                        rankings[team]['rp'] += blueRP
                        rankings[team]['matchScore'] += blueResult['score']
                    for team in redTeams:
                        rankings[team]['rp'] += redRP
                        rankings[team]['matchScore'] += redResult['score']

        #Sort rankings, then output into table
        output = ''
        for index, out in enumerate(
                sorted(
                    rankings.items(),
                    key=keyFromItem(lambda k, v: (v['rp'], v['matchScore'])),
                    reverse=True)):
            output += '''
            <tr role="row">
                <td>{0}</td>
                <td><a href="/team?n={1}">{1}</a></td>
                <td class="hidden-xs">{2}</td>
                <td class="hidden-xs">{3}</td>
                <td class="hidden-xs">{4}</td>
                <td class="hidden-xs">{5}</td>



                <td class="rankingColumn rankColumn1 hidden-sm hidden-md hidden-lg hidden-xs" style="display: none;">{2}</td>
                <td class="rankingColumn rankColumn2 hidden-sm hidden-md hidden-lg hidden-xs" style="display: none;">{3}</td>
                <td class="rankingColumn rankColumn3 hidden-sm hidden-md hidden-lg hidden-xs" style="display: none;">{4}</td>
                <td class="rankingColumn rankColumn4 hidden-sm hidden-md hidden-lg hidden-xs" style="display: none;">{5}</td>

            </tr>
            '''.format(index + 1, out[0], (int)(out[1]['rp']),
                       (int)(out[1]['matchScore']), (int)(out[1]['currentRP']),
                       (int)(out[1]['currentMatchScore']))
        with open('web/rankings.html', 'r') as file:
            page = file.read()
        return page.format(output)
Ejemplo n.º 4
0
    def alliances(self, b1='', b2='', b3='', r1='', r2='', r3='', level=''):
        sessionCheck()
        if level == '':
            level = 'quals'
        numsBlue = [b1, b2, b3]
        numsRed = [r1, r2, r3]
        averages = []
        conn = sql.connect(self.datapath())
        conn.row_factory = sql.Row
        cursor = conn.cursor()

        blueData = []
        redData = []
        # iterate through all six teams and grab data
        for i, n in enumerate(numsBlue):
            if not n.isdigit():
                raise cherrypy.HTTPError(400, "Enter six valid team numbers!")
            entries = cursor.execute(
                'SELECT * FROM ScoutRecords WHERE Team=? AND EventCode=? ORDER BY Match DESC',
                (n, getEvent())).fetchall()
            prevEvent = 0
            teamData = []
            teamData.append(getPitDisplayData(n))
            if len(entries) < 3:
                seasonEntries = cursor.execute(
                    'SELECT * FROM ScoutRecords WHERE Team=? ORDER BY Match DESC',
                    (n, )).fetchall()
                if (len(seasonEntries) >= 3):
                    oldAverages = getAggregateData(Team=n, Mode="Averages")
                    assert len(
                        oldAverages
                    ) < 2  # ensure there aren't two entries for one team
                    if len(oldAverages):
                        teamData.append(oldAverages[0])
                        prevEvent = 1

            if prevEvent == 0:
                average = getAggregateData(Team=n,
                                           Event=getEvent(),
                                           Mode="Averages")
                if not len(average):
                    average = dict(game.SCOUT_FIELDS)
                    average.update(game.DISPLAY_FIELDS)
                    average.update(game.HIDDEN_DISPLAY_FIELDS)
                    average['Team'] = n
                    teamData.append(average)
                else:
                    teamData.append(average[0])
            blueData.append(teamData)

        for i, n in enumerate(numsRed):
            if not n.isdigit():
                raise cherrypy.HTTPError(400, "Enter six valid team numbers!")
            entries = cursor.execute(
                'SELECT * FROM ScoutRecords WHERE Team=? AND EventCode=? ORDER BY Match DESC',
                (n, getEvent())).fetchall()
            prevEvent = 0
            teamData = []
            teamData.append(getPitDisplayData(n))
            if len(entries) < 3:
                seasonEntries = cursor.execute(
                    'SELECT * FROM ScoutRecords WHERE Team=? ORDER BY Match DESC',
                    (n, )).fetchall()
                if (len(seasonEntries) >= 3):
                    oldAverages = getAggregateData(Team=n, Mode="Averages")
                    assert len(
                        oldAverages
                    ) < 2  # ensure there aren't two entries for one team
                    if len(oldAverages):
                        teamData.append(oldAverages[0])
                        prevEvent = 1

            if prevEvent == 0:
                average = getAggregateData(Team=n,
                                           Event=getEvent(),
                                           Mode="Averages")
                if not len(average):
                    average = dict(game.SCOUT_FIELDS)
                    average.update(game.DISPLAY_FIELDS)
                    average.update(game.HIDDEN_DISPLAY_FIELDS)
                    average['Team'] = n
                    teamData.append(average)
                else:
                    teamData.append(average[0])
            redData.append(teamData)

        # Predict scores
        blue_score = game.predictScore(getEvent(), numsBlue, level)['score']
        red_score = game.predictScore(getEvent(), numsRed, level)['score']
        blue_score = int(blue_score)
        red_score = int(red_score)

        # Calculate win probability. Currently uses regression from 2016 data, this should be updated
        prob_red = 1 / (1 + math.e**(-0.08099 * (red_score - blue_score)))

        events = conn.cursor().execute("SELECT * from Events").fetchall()
        conn.close()

        tmpl = loader.load('alliances.xhtml')
        page = tmpl.generate(session=cherrypy.session,
                             red_win=round(prob_red * 100, 1),
                             red_score=red_score,
                             blue_score=blue_score,
                             red_data=redData,
                             blue_data=blueData,
                             columns=game.DISPLAY_FIELDS,
                             events=events,
                             pitColumns=game.PIT_DISPLAY_FIELDS)
        return page.render('html', doctype='html')
Ejemplo n.º 5
0
    def alliances(self,
                  b1='',
                  b2='',
                  b3='',
                  r1='',
                  r2='',
                  r3='',
                  mode='',
                  level=''):
        if mode == '':
            mode = 'averages'
        if level == '':
            level = 'quals'
        numsBlue = [b1, b2, b3]
        numsRed = [r1, r2, r3]
        averages = []
        conn = sql.connect(self.datapath())
        conn.row_factory = sql.Row
        cursor = conn.cursor()

        teamsBlue = []
        teamsRed = []

        #iterate through all six teams and grab data
        for i, n in enumerate(numsBlue):
            if not n.isdigit():
                raise cherrypy.HTTPError(
                    400, "You fool! Enter six valid team numbers!")
            if mode == 'averages':
                average = cursor.execute('SELECT * FROM averages WHERE team=?',
                                         (n, )).fetchall()
            else:
                average = cursor.execute('SELECT * FROM maxes WHERE team=?',
                                         (n, )).fetchall()
            assert len(average) < 2
            if len(average):
                entry = average[0]
            else:
                entry = [0] * len(game.AVERAGE_FIELDS)
            teamsBlue.append(n)
            teamsBlue.extend(entry[1:-1])
        for i, n in enumerate(numsRed):
            if not n.isdigit():
                raise cherrypy.HTTPError(
                    400, "You fool! Enter six valid team numbers!")
            if mode == 'averages':
                average = cursor.execute('SELECT * FROM averages WHERE team=?',
                                         (n, )).fetchall()
            else:
                average = cursor.execute('SELECT * FROM maxes WHERE team=?',
                                         (n, )).fetchall()
            assert len(average) < 2
            if len(average):
                entry = average[0]
            else:
                entry = [0] * len(game.AVERAGE_FIELDS)
            teamsRed.append(n)
            teamsRed.extend(entry[1:-1])

        #Predict scores
        blue_score = game.predictScore(self.datapath(), numsBlue,
                                       level)['score']
        red_score = game.predictScore(self.datapath(), numsRed, level)['score']
        blue_score = int(blue_score)
        red_score = int(red_score)

        #Calculate win probability. Currently uses regression from 2016 data, this should be updated
        prob_red = 1 / (1 + math.e**(-0.08099 * (red_score - blue_score)))
        conn.close()
        with open('web/alliances.html', 'r') as file:
            page = file.read()
        return page.format(round((1 - prob_red) * 100,
                                 1), blue_score, *teamsBlue,
                           round(prob_red * 100, 1), red_score, *teamsRed)