{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'C': 5.0, 'B': 2.2499999999999982, 'A': 7.7500000000000009, 'D': 7.5}\n" ] } ], "source": [ "\"\"\"\n", "Define our CalcOpr function and the Match class that we use to interface with it\n", "\"\"\"\n", "\n", "from collections import namedtuple\n", "import numpy.matlib as mat\n", "import numpy as np\n", "from numpy.linalg import inv\n", "\n", "Match = namedtuple(\"Match\", [\"teams\", \"score\"])\n", "\n", "def CalcOpr(matches):\n", " \"\"\"\n", " Given a list of matches, to least squares OPR calculation\n", " \"\"\"\n", " num_matches = len(matches) # rows\n", " teams = list(set().union(*[match.teams for match in matches]))\n", " num_teams = len(teams)\n", " \n", " alliances = mat.zeros((num_matches, num_teams))\n", " scores = mat.zeros((num_matches, 1))\n", " \n", " for idx, match in enumerate(matches):\n", " scores[idx, 0] = match.score\n", " for team in match.teams:\n", " alliances[idx, teams.index(team)] = 1\n", " \n", " least_squares_approx = np.dot(\n", " inv(np.dot(np.transpose(alliances), alliances)),\n", " np.dot(np.transpose(alliances), scores))\n", " \n", " oprs = {}\n", " for idx, team in enumerate(teams):\n", " oprs[team] = least_squares_approx[idx, 0] \n", " return oprs\n", "\n", "print(CalcOpr([\n", " Match(teams=['A', 'B'], score=10),\n", " Match(teams=['A', 'C'], score=13),\n", " Match(teams=['B', 'C'], score=7),\n", " Match(teams=['A', 'D'], score=15),\n", " Match(teams=['B', 'D'], score=10),\n", " ]))" ] }, { "cell_type": "code", "execution_count": 2, "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-09 14:37:30 -0500',\n", " 'current_commit': '3dd2c80b8ec53047bdef65b60929b6293b9e98a6',\n", " 'deploy_time': 'Fri Feb 9 19:51:54 UTC 2018',\n", " 'travis_job': '339614111'}},\n", " 'max_season': 2018,\n", " 'web': {'commit_time': '2018-02-09 14:37:30 -0500',\n", " 'current_commit': '3dd2c80b8ec53047bdef65b60929b6293b9e98a6',\n", " 'deploy_time': 'Fri Feb 9 19:51:54 UTC 2018',\n", " 'travis_job': '339614111'}}\n" ] } ], "source": [ "\"\"\"\n", "Connect to the blue alliance api. Also install a cache so that every request\n", "we make is cached to a file for a day. This doesn't respect the cache headers\n", "and last-changed headers from tba's api, but since we're using old data we can\n", "be pretty sure that the data we're using is fresh.\n", "\"\"\"\n", "\n", "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", "from pprint import pprint\n", "\n", "api_key = \"6qOZ9uAEsb4CDrOBNG6ZnIdi9cWBaZ6DHnCSato97Qfo7bBeUwT9NfFt4Gi5sHFN\"\n", "\n", "tba = tbapy.TBA(api_key)\n", "pprint(tba.status())" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\"\"\"\n", "Given the matches from an event, let's calculate the OPR for each component.\n", "Current components are raw score, rotor rp, and fuel rp. \n", "\"\"\"\n", "\n", "\n", "def CalcScoreOpr(matches):\n", " \"\"\"\n", " Takes in Matches (like what tba.event_matches returns) and outputs a dictionary\n", " mapping team-name to score opr\n", " \"\"\"\n", " match_outcomes = []\n", " for match in matches:\n", " match_outcomes.append(\n", " Match(teams=match['alliances']['blue']['team_keys'],\n", " score=match['alliances']['blue']['score'])\n", " )\n", " match_outcomes.append(\n", " Match(teams=match['alliances']['red']['team_keys'],\n", " score=match['alliances']['red']['score'])\n", " )\n", " return CalcOpr(match_outcomes)\n", "\n", "\n", "def CalcRotorRpOpr(matches):\n", " \"\"\"\n", " Calculate each team's opr with respect to getting a robot bonus. Rotor bonus is\n", " pretty nonlinear so part of the experiment here is seeing how well we can predict\n", " an alliance's liklihood of getting the rotor RP\n", " \"\"\"\n", " match_outcomes = []\n", " for match in matches:\n", " if match['comp_level'] == 'qm':\n", " match_outcomes.append(\n", " Match(teams=match['alliances']['blue']['team_keys'],\n", " score=match['score_breakdown']['blue']['rotorRankingPointAchieved'])\n", " )\n", " match_outcomes.append(\n", " Match(teams=match['alliances']['red']['team_keys'],\n", " score=match['score_breakdown']['red']['rotorRankingPointAchieved'])\n", " )\n", " return CalcOpr(match_outcomes)\n", " \n", " \n", "def CalcFuelRpOpr(matches):\n", " \"\"\"\n", " Calculate each team's opr with respect to getting a fuel bonus. Fuel bonus\n", " is pretty nonlinear so part of the experiment here is seeing how well we can predict\n", " an alliance's likliood of getting the fuel RP\n", " \"\"\"\n", " match_outcomes = []\n", " for match in matches:\n", " if match['comp_level'] == 'qm':\n", " match_outcomes.append(\n", " Match(teams=match['alliances']['blue']['team_keys'],\n", " score=match['score_breakdown']['blue']['kPaRankingPointAchieved'])\n", " )\n", " match_outcomes.append(\n", " Match(teams=match['alliances']['red']['team_keys'],\n", " score=match['score_breakdown']['red']['kPaRankingPointAchieved'])\n", " )\n", " return CalcOpr(match_outcomes)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'team_fuel_rp_opr': {'frc1002': 0.0013067540141778124,\n", " 'frc1011': -0.0066918194307005853,\n", " 'frc115': -0.00027964533450865019,\n", " 'frc1339': 0.027811071747965696,\n", " 'frc1414': -0.028274925604767503,\n", " 'frc1477': 0.030186389459701257,\n", " 'frc1482': 0.0038428145423401745,\n", " 'frc1574': 0.81224332275922395,\n", " 'frc175': 0.0086009350495094769,\n", " 'frc2183': 0.0017301384649544547,\n", " 'frc2403': 0.097203821426750783,\n", " 'frc2468': -0.00038628735476970398,\n", " 'frc2478': 0.045443848842528646,\n", " 'frc2485': -0.091623608856357563,\n", " 'frc2642': 0.019303911285171331,\n", " 'frc2655': 0.025380401944398757,\n", " 'frc2881': 0.057278301432307138,\n", " 'frc2905': -0.020735668480764104,\n", " 'frc2928': 0.068849817876854208,\n", " 'frc3140': 0.018086248484490107,\n", " 'frc3158': -0.016657193255109511,\n", " 'frc3229': -0.10267830550004625,\n", " 'frc3316': 0.026762464924760927,\n", " 'frc3402': -0.039483576172447278,\n", " 'frc365': -0.027217675871119569,\n", " 'frc3653': 0.0020891973125617778,\n", " 'frc3824': 0.052404925962654503,\n", " 'frc3826': -0.01779439589178082,\n", " 'frc3834': -0.0090656566704005771,\n", " 'frc3991': 0.018102864551197959,\n", " 'frc4060': 0.0037161512777656963,\n", " 'frc418': -0.046636978182303113,\n", " 'frc4191': -0.0094456836703166215,\n", " 'frc4219': 0.0025258143483290569,\n", " 'frc4265': -0.022003758612856548,\n", " 'frc4276': -0.029813971194339921,\n", " 'frc435': 0.0023391021042055626,\n", " 'frc4371': 0.0069991652715612907,\n", " 'frc441': -0.016676661908804201,\n", " 'frc4561': -0.0027243958883945234,\n", " 'frc4590': 0.0090828977087669075,\n", " 'frc4592': -0.0482639464402152,\n", " 'frc4723': -0.0038860381201868809,\n", " 'frc488': 0.3003339988417601,\n", " 'frc5026': -0.018122832416601013,\n", " 'frc5472': 0.022413876046679729,\n", " 'frc5499': -0.0080409084539647731,\n", " 'frc5515': 0.016906886480131646,\n", " 'frc5614': 0.012611883394193463,\n", " 'frc5803': -0.0062227397318728294,\n", " 'frc5816': 0.012826786882090591,\n", " 'frc585': 0.0039384782963330653,\n", " 'frc5970': -0.0076025213662465237,\n", " 'frc6144': 0.02239943277152924,\n", " 'frc624': 0.070233039643396042,\n", " 'frc6304': 0.011332485015927651,\n", " 'frc6325': -0.0064434004094025624,\n", " 'frc6361': 0.032255668828899353,\n", " 'frc6388': -0.017603607162033671,\n", " 'frc6409': -0.0075683972926657147,\n", " 'frc6508': 0.029565915005615322,\n", " 'frc6560': -0.11277016731226069,\n", " 'frc6705': -0.075618988586681452,\n", " 'frc8': 0.013333653904305295,\n", " 'frc955': 0.0043140516565098614,\n", " 'frc973': 0.90657723761236986},\n", " 'team_rotor_rp_opr': {'frc1002': 0.43938948374230857,\n", " 'frc1011': 0.44738981279559886,\n", " 'frc115': 0.52162574155050467,\n", " 'frc1339': 0.1191828533701198,\n", " 'frc1414': 0.19608876687377752,\n", " 'frc1477': 0.25436618290144536,\n", " 'frc1482': -0.25719106222682775,\n", " 'frc1574': -0.056967800190967054,\n", " 'frc175': -0.0053751933490291783,\n", " 'frc2183': 0.13293113262902359,\n", " 'frc2403': 0.28858680203501175,\n", " 'frc2468': 0.32516347125974621,\n", " 'frc2478': 0.11516523854076559,\n", " 'frc2485': 0.18633297770871704,\n", " 'frc2642': 0.59547439554897441,\n", " 'frc2655': 0.0068842747009714165,\n", " 'frc2881': -0.069810582909481889,\n", " 'frc2905': -0.29395523350320657,\n", " 'frc2928': 0.36803150559033959,\n", " 'frc3140': 0.071272254123008791,\n", " 'frc3158': 0.065940076322421284,\n", " 'frc3229': 0.21508008727519667,\n", " 'frc3316': 0.029927150499933868,\n", " 'frc3402': 0.18384304097040824,\n", " 'frc365': 0.32070475635413581,\n", " 'frc3653': -0.017683464282050726,\n", " 'frc3824': 0.20573614251929714,\n", " 'frc3826': 0.088548088860694513,\n", " 'frc3834': -0.085934757546402493,\n", " 'frc3991': 0.14587466546015904,\n", " 'frc4060': -0.038894353678012042,\n", " 'frc418': -0.17970513216805428,\n", " 'frc4191': -0.12337825277918443,\n", " 'frc4219': -0.025709911015909311,\n", " 'frc4265': 0.34617934360673053,\n", " 'frc4276': 0.043668652706567251,\n", " 'frc435': 0.16213623103641198,\n", " 'frc4371': -0.002138922530593796,\n", " 'frc441': -0.074590184052536354,\n", " 'frc4561': 0.32038989374946925,\n", " 'frc4590': 0.067514031648745629,\n", " 'frc4592': 0.077948991301704851,\n", " 'frc4723': 0.048125839561365347,\n", " 'frc488': 0.032471330519056658,\n", " 'frc5026': -0.0098686377863714588,\n", " 'frc5472': -0.30185379610970892,\n", " 'frc5499': 0.081449917409418177,\n", " 'frc5515': -0.0036499348849120365,\n", " 'frc5614': 0.20351451221402825,\n", " 'frc5803': 0.20076833329235616,\n", " 'frc5816': 0.038132464539974202,\n", " 'frc585': -0.028430502804581287,\n", " 'frc5970': 0.37938371255542974,\n", " 'frc6144': -0.038036927451709529,\n", " 'frc624': 0.34057920836655786,\n", " 'frc6304': -0.15973436723351755,\n", " 'frc6325': 0.18836827178521143,\n", " 'frc6361': 0.066320312931662656,\n", " 'frc6388': -0.19414064890434005,\n", " 'frc6409': -0.27390216394899825,\n", " 'frc6508': 0.061115495017433907,\n", " 'frc6560': -0.021506895288071544,\n", " 'frc6705': 0.45571672783114647,\n", " 'frc8': 0.36209099727632066,\n", " 'frc955': -0.048146013229837754,\n", " 'frc973': 0.11119156889215416},\n", " 'team_score_opr': {'frc1002': 124.21225689931781,\n", " 'frc1011': 149.76450747382813,\n", " 'frc115': 157.02599133311048,\n", " 'frc1339': 125.96798422065338,\n", " 'frc1414': 127.96800663206263,\n", " 'frc1477': 114.77491503934745,\n", " 'frc1482': 69.055515009333945,\n", " 'frc1574': 129.37613398098313,\n", " 'frc175': 85.116732278878615,\n", " 'frc2183': 70.635782080362432,\n", " 'frc2403': 134.32245109158649,\n", " 'frc2468': 110.41012216879899,\n", " 'frc2478': 80.843731553943826,\n", " 'frc2485': 88.505690883901551,\n", " 'frc2642': 127.1858134658776,\n", " 'frc2655': 104.24531198243957,\n", " 'frc2881': 76.769491169266018,\n", " 'frc2905': 26.417361845177695,\n", " 'frc2928': 135.80511381914485,\n", " 'frc3140': 90.638557116564954,\n", " 'frc3158': 101.14330694999229,\n", " 'frc3229': 86.158182066996957,\n", " 'frc3316': 122.80789108240921,\n", " 'frc3402': 107.46260669487243,\n", " 'frc365': 143.49460917929272,\n", " 'frc3653': 85.284652499378467,\n", " 'frc3824': 126.96309325527581,\n", " 'frc3826': 78.08957843679552,\n", " 'frc3834': 91.570774782459452,\n", " 'frc3991': 67.737826004420711,\n", " 'frc4060': 65.914273669761172,\n", " 'frc418': 116.62106655170464,\n", " 'frc4191': 62.86527001174472,\n", " 'frc4219': 89.586753586033666,\n", " 'frc4265': 146.7643848441347,\n", " 'frc4276': 81.574812779764571,\n", " 'frc435': 96.464573727156505,\n", " 'frc4371': 67.365329372744043,\n", " 'frc441': 91.14940457061185,\n", " 'frc4561': 111.00355528639132,\n", " 'frc4590': 125.26308475200881,\n", " 'frc4592': 98.052651237205197,\n", " 'frc4723': 56.810485185257477,\n", " 'frc488': 98.055462452243859,\n", " 'frc5026': 110.04546378593915,\n", " 'frc5472': 54.510742035159957,\n", " 'frc5499': 81.076671646280147,\n", " 'frc5515': 80.505727211308511,\n", " 'frc5614': 107.61788458386523,\n", " 'frc5803': 113.73483804756786,\n", " 'frc5816': 89.708856584075534,\n", " 'frc585': 88.255615668204257,\n", " 'frc5970': 122.50535563795169,\n", " 'frc6144': 36.696388177764362,\n", " 'frc624': 134.76677882359493,\n", " 'frc6304': 85.649736210525631,\n", " 'frc6325': 119.78641397302135,\n", " 'frc6361': 70.175687192783002,\n", " 'frc6388': 66.306467100842255,\n", " 'frc6409': 8.2241314774463632,\n", " 'frc6508': 84.873574464768012,\n", " 'frc6560': 68.823962846736038,\n", " 'frc6705': 111.58307204661108,\n", " 'frc8': 114.29890025268742,\n", " 'frc955': 75.507539471727668,\n", " 'frc973': 177.56919288327256}}\n" ] } ], "source": [ "\"\"\"\n", "Get the OPR statistics about all the teams at a given event. Cache if possible. \n", "\"\"\"\n", "\n", "from collections import namedtuple\n", "\n", "EventSummary = namedtuple(\"EventSummary\", [\"team_score_opr\", \"team_rotor_rp_opr\", \"team_fuel_rp_opr\"])\n", "\n", "_event_stats = {}\n", "\n", "def get_event_stats(event):\n", " if event not in _event_stats:\n", " event_matches = tba.event_matches(event)\n", "\n", " _event_stats[event] = EventSummary(\n", " team_score_opr = CalcScoreOpr(event_matches),\n", " team_rotor_rp_opr = CalcRotorRpOpr(event_matches),\n", " team_fuel_rp_opr = CalcFuelRpOpr(event_matches),\n", " )\n", " \n", " return _event_stats[event]\n", " \n", "pprint(dict(get_event_stats(\"2017roe\")._asdict()))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "TeamSummary(last_event='cada', score_opr=120.68964289866562, rotor_rp_opr=0.0, fuel_rp_opr=0.44310225380396262)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"\n", "Get the stats for a given team at their most recent region/div-champ. This includes\n", "their OPR in various categories. Cache this information if possible. \n", "\"\"\"\n", "\n", "TeamSummary = namedtuple(\"TeamSummary\", [\"last_event\", \"score_opr\", \"rotor_rp_opr\", \"fuel_rp_opr\"])\n", "\n", "_team_stats = {}\n", "\n", "def get_team_last_event(team, year=\"2017\"):\n", " events = tba.team_events(team, year)\n", " events = [\n", " event\n", " for event\n", " in events\n", " if (event['event_type_string'] in ['Regional', 'District Championship', 'District'] and\n", " event['key'] != '2017micmp') # 2017micmp is messed up in tba so skip it here\n", " ]\n", " \n", " events = sorted(events, key=lambda x: x['end_date'])\n", " return events[-1]['event_code']\n", "\n", "def get_team_stats(team, year=\"2017\"):\n", " \"\"\"\n", " Get the component opr for the given team based on their most recent regional,\n", " district champ, or district event\n", " \"\"\"\n", " if team not in _team_stats:\n", " team_last_event = get_team_last_event(team, year)\n", " eventSummary = get_event_stats(year + team_last_event)\n", " \n", " teamSummary = TeamSummary(\n", " last_event = team_last_event,\n", " score_opr = eventSummary.team_score_opr[team],\n", " rotor_rp_opr = eventSummary.team_rotor_rp_opr[team],\n", " fuel_rp_opr = eventSummary.team_fuel_rp_opr[team],\n", " )\n", " \n", " _team_stats[team] = teamSummary\n", " \n", " return _team_stats[team]\n", "\n", "get_team_stats('frc973')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "OrderedDict([('red_alliance', ['frc973', 'frc1011', 'frc492']),\n", " ('blue_alliance', ['frc254', 'frc1678', 'frc294']),\n", " ('red_score', 314.96167046457987),\n", " ('blue_score', 464.20365658137854),\n", " ('red_match_rp', 0),\n", " ('blue_match_rp', 2),\n", " ('red_fuel_rp', 1),\n", " ('blue_fuel_rp', 1),\n", " ('red_rotor_rp', 0),\n", " ('blue_rotor_rp', 1),\n", " ('red_total_rp', 1),\n", " ('blue_total_rp', 4)])\n", "OrderedDict([('red_alliance', ['frc973', 'frc1011', 'frc492']),\n", " ('blue_alliance', ['frc254', 'frc1678', 'frc294']),\n", " ('red_score', 308.22419202894878),\n", " ('blue_score', 512.60269756742389),\n", " ('red_match_rp', 0),\n", " ('blue_match_rp', 2),\n", " ('red_fuel_rp', 0),\n", " ('blue_fuel_rp', 1),\n", " ('red_rotor_rp', 0),\n", " ('blue_rotor_rp', 0),\n", " ('red_total_rp', 0),\n", " ('blue_total_rp', 3)])\n", "OrderedDict([('red_alliance', ['frc973', 'frc1011', 'frc492']),\n", " ('blue_alliance', ['frc254', 'frc1678', 'frc294']),\n", " ('red_score', 367.22055566619531),\n", " ('blue_score', 424.35465241925493),\n", " ('red_match_rp', 0),\n", " ('blue_match_rp', 2),\n", " ('red_fuel_rp', 0),\n", " ('blue_fuel_rp', 1),\n", " ('red_rotor_rp', 0),\n", " ('blue_rotor_rp', 0),\n", " ('red_total_rp', 0),\n", " ('blue_total_rp', 3)])\n" ] } ], "source": [ "\"\"\"\n", "Simulate one match given the red and blue alliances and creating a MatchOutcome object\n", "\"\"\"\n", "\n", "\n", "import random\n", "\n", "MatchOutcome = namedtuple(\"MatchOutcome\", [\n", " \"red_alliance\", \"blue_alliance\",\n", " \"red_score\", \"blue_score\",\n", " \"red_match_rp\", \"blue_match_rp\",\n", " \"red_fuel_rp\", \"blue_fuel_rp\", \n", " \"red_rotor_rp\", \"blue_rotor_rp\",\n", " \"red_total_rp\", \"blue_total_rp\"\n", " ])\n", "\n", "def simulate_match(red_alliance, blue_alliance):\n", " red_reports = [get_team_stats(team) for team in red_alliance]\n", " blue_reports = [get_team_stats(team) for team in blue_alliance]\n", " \n", " red_score = sum([\n", " report.score_opr * random.gauss(1.0, 0.3)\n", " for report\n", " in red_reports\n", " ]) + random.gauss(0.0, 5.0)\n", " \n", " blue_score = sum([\n", " report.score_opr * random.gauss(1.0, 0.3)\n", " for report\n", " in blue_reports\n", " ]) + random.gauss(0.0, 5.0)\n", " \n", " if red_score > blue_score:\n", " red_match_rp = 2\n", " blue_match_rp = 0\n", " elif blue_score > red_score:\n", " blue_match_rp = 2\n", " red_match_rp = 0\n", " else:\n", " blue_match_rp = 1\n", " red_match_rp = 1\n", " \n", " red_rotor_rp_chance = sum([\n", " report.rotor_rp_opr for report in red_reports\n", " ])\n", " \n", " blue_rotor_rp_chance = sum([\n", " report.rotor_rp_opr for report in blue_reports\n", " ])\n", " \n", " red_rotor_rp = int(red_rotor_rp_chance > random.random())\n", " blue_rotor_rp = int(blue_rotor_rp_chance > random.random())\n", " \n", " red_fuel_rp_chance = sum([\n", " report.fuel_rp_opr for report in red_reports\n", " ])\n", " \n", " blue_fuel_rp_chance = sum([\n", " report.fuel_rp_opr for report in blue_reports\n", " ])\n", " \n", " red_fuel_rp = int(red_fuel_rp_chance > random.random())\n", " blue_fuel_rp = int(blue_fuel_rp_chance > random.random())\n", " \n", " return MatchOutcome(\n", " red_alliance = red_alliance, blue_alliance = blue_alliance,\n", " red_score = red_score, blue_score = blue_score,\n", " red_match_rp = red_match_rp, blue_match_rp = blue_match_rp,\n", " red_fuel_rp = red_fuel_rp, blue_fuel_rp = blue_fuel_rp,\n", " red_rotor_rp = red_rotor_rp, blue_rotor_rp = blue_rotor_rp,\n", " red_total_rp = red_match_rp + red_fuel_rp + red_rotor_rp,\n", " blue_total_rp = blue_match_rp + blue_fuel_rp + blue_rotor_rp,\n", " )\n", "\n", "for _ in range(3):\n", " pprint(simulate_match([\"frc973\", \"frc1011\", \"frc492\"], [\"frc254\", \"frc1678\", \"frc294\"])._asdict())" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'frc1002': 21,\n", " 'frc1011': 27,\n", " 'frc115': 6,\n", " 'frc1339': 53,\n", " 'frc1414': 31,\n", " 'frc1477': 32,\n", " 'frc1482': 41,\n", " 'frc1574': 1,\n", " 'frc175': 48,\n", " 'frc2183': 47,\n", " 'frc2403': 36,\n", " 'frc2468': 10,\n", " 'frc2478': 28,\n", " 'frc2485': 65,\n", " 'frc2642': 14,\n", " 'frc2655': 60,\n", " 'frc2881': 43,\n", " 'frc2905': 42,\n", " 'frc2928': 5,\n", " 'frc3140': 19,\n", " 'frc3158': 49,\n", " 'frc3229': 17,\n", " 'frc3316': 33,\n", " 'frc3402': 54,\n", " 'frc365': 2,\n", " 'frc3653': 25,\n", " 'frc3824': 11,\n", " 'frc3826': 22,\n", " 'frc3834': 64,\n", " 'frc3991': 50,\n", " 'frc4060': 44,\n", " 'frc418': 8,\n", " 'frc4191': 66,\n", " 'frc4219': 45,\n", " 'frc4265': 9,\n", " 'frc4276': 63,\n", " 'frc435': 13,\n", " 'frc4371': 61,\n", " 'frc441': 37,\n", " 'frc4561': 12,\n", " 'frc4590': 34,\n", " 'frc4592': 20,\n", " 'frc4723': 18,\n", " 'frc488': 59,\n", " 'frc5026': 35,\n", " 'frc5472': 30,\n", " 'frc5499': 15,\n", " 'frc5515': 39,\n", " 'frc5614': 56,\n", " 'frc5803': 29,\n", " 'frc5816': 40,\n", " 'frc585': 55,\n", " 'frc5970': 26,\n", " 'frc6144': 51,\n", " 'frc624': 3,\n", " 'frc6304': 58,\n", " 'frc6325': 46,\n", " 'frc6361': 57,\n", " 'frc6388': 52,\n", " 'frc6409': 62,\n", " 'frc6508': 24,\n", " 'frc6560': 38,\n", " 'frc6705': 16,\n", " 'frc8': 7,\n", " 'frc955': 23,\n", " 'frc973': 4}\n" ] } ], "source": [ "\"\"\"\n", "Given a list of scheduled matches, simulate the entire event keeping track of\n", "how many ranking points each team gets and returning the rankings at the end\n", "of quals. \n", "\"\"\"\n", "\n", "def get_schedule(event):\n", " \"\"\"\n", " Given an event key return the schedule (a list of (red_alliance, blue_alliance) tuples)\n", " \"\"\"\n", " schedule = []\n", " event_matches = tba.event_matches(event)\n", " for match in event_matches:\n", " schedule.append((match['alliances']['red']['team_keys'],\n", " match['alliances']['blue']['team_keys']))\n", " \n", " return schedule\n", "\n", "def simulate_schedule(schedule):\n", " \"\"\"\n", " Given a schedule, simulate the outcomes of all matches\n", " \"\"\"\n", " outcomes = []\n", " for match in schedule:\n", " outcomes.append(simulate_match(match[0], match[1]))\n", " return outcomes\n", "\n", "def get_rankings(match_outcomes):\n", " \"Based on the outcomes of each match, determine the rankings\"\n", " teams = set().union(*[match.red_alliance for match in match_outcomes])\n", " \n", " team_rps = []\n", " for team in teams:\n", " num_rps = 0\n", " for outcome in match_outcomes:\n", " if team in outcome.red_alliance:\n", " num_rps += outcome.red_total_rp\n", " if team in outcome.blue_alliance:\n", " num_rps += outcome.blue_total_rp\n", " team_rps.append((team, num_rps))\n", " team_rps.sort(key=lambda x: -x[1])\n", " \n", " rankings = {}\n", " for idx, (team, rps) in enumerate(team_rps):\n", " rankings[team] = idx + 1\n", " \n", " return rankings\n", " \n", "def simulate_event(event):\n", " return get_rankings(simulate_schedule(get_schedule(event)))\n", "\n", "pprint(simulate_event(\"2017roe\"))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Rank 2: frc1574 (25p= 1, 75p= 3) Actual Rank: 4\n", "Predicted Rank 2: frc973 (25p= 1, 75p= 4) Actual Rank: 1\n", "Predicted Rank 4: frc365 (25p= 2, 75p= 7) Actual Rank: 7\n", "Predicted Rank 6: frc2928 (25p= 4, 75p= 9) Actual Rank: 38\n", "Predicted Rank 6: frc1011 (25p= 4, 75p=10) Actual Rank: 8\n", "Predicted Rank 8: frc4561 (25p= 5, 75p=12) Actual Rank: 29\n", "Predicted Rank 10: frc418 (25p= 7, 75p=15) Actual Rank: 42\n", "Predicted Rank 10: frc2468 (25p= 6, 75p=16) Actual Rank: 37\n", "Predicted Rank 10: frc115 (25p= 6, 75p=16) Actual Rank: 2\n", "Predicted Rank 11: frc8 (25p= 7, 75p=17) Actual Rank: 36\n", "Predicted Rank 12: frc4265 (25p= 8, 75p=18) Actual Rank: 5\n", "Predicted Rank 12: frc1002 (25p= 8, 75p=19) Actual Rank: 14\n", "Predicted Rank 12: frc6705 (25p= 8, 75p=19) Actual Rank: 3\n", "Predicted Rank 13: frc624 (25p= 8, 75p=18) Actual Rank: 28\n", "Predicted Rank 14: frc4592 (25p=10, 75p=20) Actual Rank: 6\n", "Predicted Rank 15: frc3824 (25p=11, 75p=21) Actual Rank: 27\n", "Predicted Rank 19: frc1477 (25p=13, 75p=27) Actual Rank: 10\n", "Predicted Rank 21: frc5499 (25p=15, 75p=29) Actual Rank: 32\n", "Predicted Rank 22: frc2478 (25p=15, 75p=30) Actual Rank: 15\n", "Predicted Rank 23: frc1414 (25p=17, 75p=31) Actual Rank: 17\n", "Predicted Rank 25: frc3229 (25p=18, 75p=32) Actual Rank: 12\n", "Predicted Rank 25: frc5026 (25p=18, 75p=33) Actual Rank: 43\n", "Predicted Rank 25: frc488 (25p=18, 75p=34) Actual Rank: 13\n", "Predicted Rank 25: frc2642 (25p=18, 75p=34) Actual Rank: 9\n", "Predicted Rank 26: frc6508 (25p=20, 75p=33) Actual Rank: 24\n", "Predicted Rank 26: frc3653 (25p=20, 75p=34) Actual Rank: 33\n", "Predicted Rank 28: frc2905 (25p=21, 75p=35) Actual Rank: 66\n", "Predicted Rank 28: frc5803 (25p=20, 75p=37) Actual Rank: 57\n", "Predicted Rank 29: frc955 (25p=22, 75p=36) Actual Rank: 31\n", "Predicted Rank 30: frc2403 (25p=23, 75p=38) Actual Rank: 22\n", "Predicted Rank 31: frc435 (25p=23, 75p=39) Actual Rank: 41\n", "Predicted Rank 32: frc3402 (25p=24, 75p=39) Actual Rank: 56\n", "Predicted Rank 32: frc5970 (25p=24, 75p=40) Actual Rank: 18\n", "Predicted Rank 34: frc4590 (25p=26, 75p=43) Actual Rank: 23\n", "Predicted Rank 35: frc5472 (25p=27, 75p=43) Actual Rank: 52\n", "Predicted Rank 35: frc3140 (25p=27, 75p=43) Actual Rank: 50\n", "Predicted Rank 36: frc441 (25p=29, 75p=45) Actual Rank: 59\n", "Predicted Rank 37: frc5515 (25p=29, 75p=45) Actual Rank: 20\n", "Predicted Rank 37: frc1339 (25p=29, 75p=45) Actual Rank: 11\n", "Predicted Rank 38: frc2655 (25p=30, 75p=46) Actual Rank: 19\n", "Predicted Rank 39: frc3991 (25p=31, 75p=47) Actual Rank: 26\n", "Predicted Rank 39: frc3826 (25p=31, 75p=47) Actual Rank: 46\n", "Predicted Rank 40: frc5614 (25p=32, 75p=48) Actual Rank: 48\n", "Predicted Rank 42: frc4276 (25p=34, 75p=49) Actual Rank: 16\n", "Predicted Rank 46: frc6560 (25p=40, 75p=52) Actual Rank: 45\n", "Predicted Rank 47: frc4371 (25p=40, 75p=52) Actual Rank: 53\n", "Predicted Rank 47: frc5816 (25p=41, 75p=53) Actual Rank: 35\n", "Predicted Rank 48: frc585 (25p=40, 75p=55) Actual Rank: 55\n", "Predicted Rank 49: frc1482 (25p=42, 75p=56) Actual Rank: 25\n", "Predicted Rank 49: frc3316 (25p=41, 75p=56) Actual Rank: 40\n", "Predicted Rank 49: frc175 (25p=42, 75p=56) Actual Rank: 21\n", "Predicted Rank 49: frc3158 (25p=42, 75p=56) Actual Rank: 49\n", "Predicted Rank 50: frc2881 (25p=43, 75p=55) Actual Rank: 44\n", "Predicted Rank 50: frc2183 (25p=44, 75p=56) Actual Rank: 65\n", "Predicted Rank 54: frc4723 (25p=47, 75p=59) Actual Rank: 39\n", "Predicted Rank 55: frc6388 (25p=49, 75p=60) Actual Rank: 58\n", "Predicted Rank 55: frc2485 (25p=48, 75p=60) Actual Rank: 47\n", "Predicted Rank 57: frc4219 (25p=52, 75p=61) Actual Rank: 30\n", "Predicted Rank 57: frc6409 (25p=52, 75p=62) Actual Rank: 61\n", "Predicted Rank 58: frc6325 (25p=53, 75p=62) Actual Rank: 34\n", "Predicted Rank 60: frc4060 (25p=55, 75p=63) Actual Rank: 63\n", "Predicted Rank 60: frc6361 (25p=56, 75p=63) Actual Rank: 51\n", "Predicted Rank 60: frc6304 (25p=55, 75p=63) Actual Rank: 60\n", "Predicted Rank 60: frc6144 (25p=55, 75p=64) Actual Rank: 54\n", "Predicted Rank 63: frc3834 (25p=60, 75p=65) Actual Rank: 62\n", "Predicted Rank 65: frc4191 (25p=64, 75p=66) Actual Rank: 64\n" ] } ], "source": [ "\"\"\"\n", "Simulate the event many times monte carlo and keep track of each team's\n", "rankings each time.\n", "\"\"\"\n", "\n", "AggregateRanking = namedtuple(\"AggregateRanking\", [\"p0\", \"p100\", \"p50\", \"p75\", \"p25\", \"std_dev\"])\n", "\n", "def monte_carlo_event(event, iterations=10000):\n", " team_ranks = {}\n", " \n", " for _ in range(iterations):\n", " rankings = simulate_event(event)\n", " for team, rank in rankings.items():\n", " if team not in team_ranks:\n", " team_ranks[team] = []\n", " team_ranks[team].append(rank)\n", " \n", " aggregate_rankings = {}\n", " for team, rankings in team_ranks.items():\n", " aggregate_rankings[team] = AggregateRanking(\n", " p0=np.percentile(rankings, 0),\n", " p100=np.percentile(rankings, 100),\n", " p50=np.percentile(rankings, 50),\n", " p75=np.percentile(rankings, 75),\n", " p25=np.percentile(rankings, 25),\n", " std_dev=np.std(rankings),\n", " )\n", " \n", " return aggregate_rankings\n", "\n", "def get_actual_ranking(event, team):\n", " event_rankings = tba.event_rankings(event)\n", " for ranking in event_rankings['rankings']:\n", " if ranking['team_key'] == team:\n", " return ranking['rank']\n", " raise Exception(\"Team Not Found: \" + team)\n", "\n", "def display_monte_carlo_result(monte_carlo_result, event):\n", " monte_carlo_result = list(monte_carlo_result.items())\n", " monte_carlo_result.sort(key=lambda x: (x[1].p50, x[1].p75))\n", " \n", " for team, agr_rank in monte_carlo_result:\n", " print(\"Predicted Rank {0:2.0f}: {1:10s} (25p={2:2.0f}, 75p={3:2.0f}) Actual Rank: {4}\".format(\n", " agr_rank.p50, team, agr_rank.p25, agr_rank.p75, get_actual_ranking(event, team)))\n", "\n", "display_monte_carlo_result(monte_carlo_event(\"2017roe\"), \"2017roe\")" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Rank 1: frc118 (25p= 1, 75p= 1) Actual Rank: 1\n", "Predicted Rank 2: frc1678 (25p= 2, 75p= 3) Actual Rank: 3\n", "Predicted Rank 3: frc330 (25p= 2, 75p= 4) Actual Rank: 2\n", "Predicted Rank 4: frc4188 (25p= 3, 75p= 4) Actual Rank: 18\n", "Predicted Rank 5: frc180 (25p= 4, 75p= 6) Actual Rank: 7\n", "Predicted Rank 6: frc3663 (25p= 6, 75p= 7) Actual Rank: 29\n", "Predicted Rank 9: frc3008 (25p= 7, 75p=13) Actual Rank: 4\n", "Predicted Rank 10: frc4486 (25p= 8, 75p=13) Actual Rank: 5\n", "Predicted Rank 10: frc3255 (25p= 8, 75p=14) Actual Rank: 12\n", "Predicted Rank 11: frc3647 (25p= 9, 75p=15) Actual Rank: 8\n", "Predicted Rank 11: frc3489 (25p= 8, 75p=16) Actual Rank: 31\n", "Predicted Rank 12: frc696 (25p= 8, 75p=16) Actual Rank: 59\n", "Predicted Rank 12: frc3473 (25p= 9, 75p=17) Actual Rank: 9\n", "Predicted Rank 15: frc2073 (25p=11, 75p=20) Actual Rank: 6\n", "Predicted Rank 16: frc997 (25p=12, 75p=22) Actual Rank: 17\n", "Predicted Rank 18: frc4469 (25p=14, 75p=23) Actual Rank: 21\n", "Predicted Rank 19: frc900 (25p=14, 75p=25) Actual Rank: 45\n", "Predicted Rank 19: frc5842 (25p=13, 75p=27) Actual Rank: 13\n", "Predicted Rank 21: frc3616 (25p=16, 75p=29) Actual Rank: 34\n", "Predicted Rank 23: frc5635 (25p=17, 75p=31) Actual Rank: 15\n", "Predicted Rank 24: frc1533 (25p=18, 75p=30) Actual Rank: 32\n", "Predicted Rank 24: frc704 (25p=18, 75p=31) Actual Rank: 14\n", "Predicted Rank 25: frc3735 (25p=19, 75p=32) Actual Rank: 43\n", "Predicted Rank 25: frc2839 (25p=20, 75p=32) Actual Rank: 40\n", "Predicted Rank 27: frc4662 (25p=21, 75p=35) Actual Rank: 28\n", "Predicted Rank 27: frc2096 (25p=21, 75p=35) Actual Rank: 19\n", "Predicted Rank 27: frc5295 (25p=21, 75p=35) Actual Rank: 16\n", "Predicted Rank 29: frc4320 (25p=22, 75p=36) Actual Rank: 38\n", "Predicted Rank 30: frc79 (25p=22, 75p=38) Actual Rank: 25\n", "Predicted Rank 31: frc1156 (25p=24, 75p=39) Actual Rank: 35\n", "Predicted Rank 32: frc5839 (25p=25, 75p=40) Actual Rank: 30\n", "Predicted Rank 34: frc3335 (25p=27, 75p=42) Actual Rank: 41\n", "Predicted Rank 35: frc6418 (25p=28, 75p=42) Actual Rank: 24\n", "Predicted Rank 35: frc60 (25p=27, 75p=43) Actual Rank: 33\n", "Predicted Rank 35: frc1255 (25p=27, 75p=43) Actual Rank: 37\n", "Predicted Rank 36: frc4189 (25p=28, 75p=43) Actual Rank: 11\n", "Predicted Rank 37: frc1294 (25p=28, 75p=46) Actual Rank: 26\n", "Predicted Rank 38: frc4918 (25p=31, 75p=46) Actual Rank: 39\n", "Predicted Rank 38: frc5892 (25p=31, 75p=46) Actual Rank: 47\n", "Predicted Rank 39: frc1745 (25p=32, 75p=47) Actual Rank: 42\n", "Predicted Rank 39: frc744 (25p=30, 75p=48) Actual Rank: 10\n", "Predicted Rank 40: frc159 (25p=31, 75p=48) Actual Rank: 22\n", "Predicted Rank 43: frc5869 (25p=37, 75p=50) Actual Rank: 54\n", "Predicted Rank 43: frc6321 (25p=35, 75p=51) Actual Rank: 56\n", "Predicted Rank 43: frc6546 (25p=35, 75p=51) Actual Rank: 23\n", "Predicted Rank 44: frc5012 (25p=35, 75p=51) Actual Rank: 20\n", "Predicted Rank 44: frc6369 (25p=36, 75p=52) Actual Rank: 27\n", "Predicted Rank 47: frc6377 (25p=40, 75p=54) Actual Rank: 63\n", "Predicted Rank 47: frc120 (25p=39, 75p=54) Actual Rank: 49\n", "Predicted Rank 49: frc1622 (25p=42, 75p=56) Actual Rank: 36\n", "Predicted Rank 50: frc3847 (25p=42, 75p=56) Actual Rank: 51\n", "Predicted Rank 50: frc5930 (25p=43, 75p=56) Actual Rank: 57\n", "Predicted Rank 52: frc6666 (25p=45, 75p=58) Actual Rank: 62\n", "Predicted Rank 53: frc968 (25p=46, 75p=58) Actual Rank: 55\n", "Predicted Rank 53: frc3218 (25p=46, 75p=59) Actual Rank: 58\n", "Predicted Rank 55: frc3189 (25p=49, 75p=60) Actual Rank: 67\n", "Predicted Rank 56: frc3743 (25p=50, 75p=61) Actual Rank: 50\n", "Predicted Rank 56: frc6025 (25p=50, 75p=61) Actual Rank: 48\n", "Predicted Rank 56: frc1369 (25p=50, 75p=61) Actual Rank: 53\n", "Predicted Rank 57: frc6652 (25p=51, 75p=62) Actual Rank: 44\n", "Predicted Rank 58: frc3556 (25p=52, 75p=62) Actual Rank: 52\n", "Predicted Rank 61: frc5160 (25p=56, 75p=65) Actual Rank: 66\n", "Predicted Rank 62: frc3527 (25p=57, 75p=65) Actual Rank: 65\n", "Predicted Rank 62: frc4013 (25p=58, 75p=65) Actual Rank: 60\n", "Predicted Rank 63: frc2240 (25p=59, 75p=65) Actual Rank: 46\n", "Predicted Rank 64: frc6430 (25p=60, 75p=66) Actual Rank: 64\n", "Predicted Rank 65: frc589 (25p=62, 75p=66) Actual Rank: 61\n" ] } ], "source": [ "display_monte_carlo_result(monte_carlo_event(\"2017new\"), \"2017new\")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Rank 1: frc2056 (25p= 1, 75p= 1) Actual Rank: 1\n", "Predicted Rank 2: frc384 (25p= 2, 75p= 2) Actual Rank: 59\n", "Predicted Rank 3: frc1241 (25p= 3, 75p= 4) Actual Rank: 12\n", "Predicted Rank 6: frc2481 (25p= 4, 75p= 8) Actual Rank: 2\n", "Predicted Rank 6: frc203 (25p= 5, 75p= 9) Actual Rank: 40\n", "Predicted Rank 7: frc4917 (25p= 5, 75p=10) Actual Rank: 6\n", "Predicted Rank 9: frc6009 (25p= 7, 75p=12) Actual Rank: 3\n", "Predicted Rank 9: frc2169 (25p= 6, 75p=14) Actual Rank: 14\n", "Predicted Rank 10: frc230 (25p= 7, 75p=13) Actual Rank: 11\n", "Predicted Rank 10: frc2791 (25p= 7, 75p=14) Actual Rank: 45\n", "Predicted Rank 11: frc71 (25p= 8, 75p=16) Actual Rank: 8\n", "Predicted Rank 12: frc4946 (25p= 8, 75p=18) Actual Rank: 9\n", "Predicted Rank 15: frc234 (25p=10, 75p=20) Actual Rank: 44\n", "Predicted Rank 16: frc4039 (25p=12, 75p=22) Actual Rank: 46\n", "Predicted Rank 17: frc4143 (25p=12, 75p=23) Actual Rank: 16\n", "Predicted Rank 18: frc1720 (25p=13, 75p=23) Actual Rank: 26\n", "Predicted Rank 19: frc1807 (25p=15, 75p=24) Actual Rank: 29\n", "Predicted Rank 19: frc494 (25p=13, 75p=25) Actual Rank: 7\n", "Predicted Rank 21: frc4500 (25p=15, 75p=29) Actual Rank: 4\n", "Predicted Rank 22: frc4272 (25p=16, 75p=30) Actual Rank: 21\n", "Predicted Rank 22: frc1918 (25p=15, 75p=30) Actual Rank: 34\n", "Predicted Rank 23: frc2609 (25p=17, 75p=29) Actual Rank: 58\n", "Predicted Rank 23: frc2410 (25p=18, 75p=30) Actual Rank: 28\n", "Predicted Rank 23: frc5205 (25p=17, 75p=30) Actual Rank: 17\n", "Predicted Rank 25: frc5155 (25p=18, 75p=33) Actual Rank: 5\n", "Predicted Rank 26: frc226 (25p=20, 75p=34) Actual Rank: 15\n", "Predicted Rank 28: frc3098 (25p=21, 75p=36) Actual Rank: 54\n", "Predicted Rank 29: frc470 (25p=23, 75p=36) Actual Rank: 42\n", "Predicted Rank 29: frc2252 (25p=22, 75p=38) Actual Rank: 18\n", "Predicted Rank 31: frc3929 (25p=25, 75p=40) Actual Rank: 43\n", "Predicted Rank 33: frc1675 (25p=25, 75p=42) Actual Rank: 23\n", "Predicted Rank 34: frc1598 (25p=26, 75p=42) Actual Rank: 47\n", "Predicted Rank 35: frc2500 (25p=28, 75p=44) Actual Rank: 52\n", "Predicted Rank 37: frc4750 (25p=29, 75p=45) Actual Rank: 31\n", "Predicted Rank 37: frc3142 (25p=30, 75p=45) Actual Rank: 53\n", "Predicted Rank 37: frc5885 (25p=29, 75p=45) Actual Rank: 10\n", "Predicted Rank 37: frc2077 (25p=29, 75p=46) Actual Rank: 61\n", "Predicted Rank 38: frc6424 (25p=30, 75p=47) Actual Rank: 20\n", "Predicted Rank 38: frc935 (25p=30, 75p=47) Actual Rank: 50\n", "Predicted Rank 39: frc1714 (25p=31, 75p=47) Actual Rank: 55\n", "Predicted Rank 39: frc5801 (25p=31, 75p=48) Actual Rank: 13\n", "Predicted Rank 41: frc1511 (25p=32, 75p=49) Actual Rank: 51\n", "Predicted Rank 43: frc6381 (25p=35, 75p=51) Actual Rank: 24\n", "Predicted Rank 46: frc3293 (25p=37, 75p=54) Actual Rank: 27\n", "Predicted Rank 46: frc449 (25p=36, 75p=55) Actual Rank: 37\n", "Predicted Rank 47: frc747 (25p=38, 75p=55) Actual Rank: 57\n", "Predicted Rank 49: frc2457 (25p=41, 75p=56) Actual Rank: 39\n", "Predicted Rank 50: frc3386 (25p=42, 75p=58) Actual Rank: 41\n", "Predicted Rank 50: frc4207 (25p=41, 75p=58) Actual Rank: 63\n", "Predicted Rank 51: frc6075 (25p=42, 75p=58) Actual Rank: 35\n", "Predicted Rank 52: frc3260 (25p=44, 75p=59) Actual Rank: 36\n", "Predicted Rank 52: frc3875 (25p=42, 75p=59) Actual Rank: 49\n", "Predicted Rank 52: frc5553 (25p=43, 75p=60) Actual Rank: 25\n", "Predicted Rank 53: frc5086 (25p=45, 75p=60) Actual Rank: 30\n", "Predicted Rank 53: frc101 (25p=44, 75p=60) Actual Rank: 65\n", "Predicted Rank 54: frc2534 (25p=46, 75p=61) Actual Rank: 32\n", "Predicted Rank 56: frc354 (25p=48, 75p=62) Actual Rank: 68\n", "Predicted Rank 56: frc5980 (25p=47, 75p=62) Actual Rank: 56\n", "Predicted Rank 56: frc6613 (25p=48, 75p=62) Actual Rank: 19\n", "Predicted Rank 56: frc329 (25p=48, 75p=62) Actual Rank: 38\n", "Predicted Rank 57: frc1086 (25p=49, 75p=63) Actual Rank: 67\n", "Predicted Rank 57: frc6630 (25p=50, 75p=63) Actual Rank: 22\n", "Predicted Rank 58: frc6753 (25p=50, 75p=63) Actual Rank: 60\n", "Predicted Rank 58: frc1625 (25p=50, 75p=64) Actual Rank: 62\n", "Predicted Rank 59: frc5222 (25p=51, 75p=64) Actual Rank: 33\n", "Predicted Rank 61: frc4522 (25p=53, 75p=65) Actual Rank: 66\n", "Predicted Rank 64: frc6758 (25p=59, 75p=67) Actual Rank: 64\n", "Predicted Rank 65: frc2781 (25p=61, 75p=67) Actual Rank: 48\n" ] } ], "source": [ "display_monte_carlo_result(monte_carlo_event(\"2017cur\"), \"2017cur\")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Rank 2: frc1538 (25p= 1, 75p= 3) Actual Rank: 2\n", "Predicted Rank 2: frc5654 (25p= 1, 75p= 4) Actual Rank: 7\n", "Predicted Rank 3: frc492 (25p= 2, 75p= 5) Actual Rank: 1\n", "Predicted Rank 4: frc2630 (25p= 2, 75p= 6) Actual Rank: 46\n", "Predicted Rank 6: frc2576 (25p= 4, 75p= 9) Actual Rank: 53\n", "Predicted Rank 7: frc3478 (25p= 5, 75p=10) Actual Rank: 14\n", "Predicted Rank 8: frc3211 (25p= 6, 75p=11) Actual Rank: 33\n", "Predicted Rank 9: frc2415 (25p= 6, 75p=13) Actual Rank: 18\n", "Predicted Rank 10: frc498 (25p= 7, 75p=14) Actual Rank: 3\n", "Predicted Rank 11: frc3635 (25p= 8, 75p=15) Actual Rank: 32\n", "Predicted Rank 11: frc5074 (25p= 8, 75p=17) Actual Rank: 17\n", "Predicted Rank 14: frc2231 (25p=10, 75p=21) Actual Rank: 6\n", "Predicted Rank 15: frc3005 (25p=11, 75p=21) Actual Rank: 11\n", "Predicted Rank 16: frc587 (25p=12, 75p=21) Actual Rank: 23\n", "Predicted Rank 19: frc701 (25p=14, 75p=26) Actual Rank: 13\n", "Predicted Rank 20: frc6579 (25p=15, 75p=27) Actual Rank: 26\n", "Predicted Rank 20: frc2333 (25p=14, 75p=28) Actual Rank: 9\n", "Predicted Rank 20: frc368 (25p=14, 75p=29) Actual Rank: 31\n", "Predicted Rank 20: frc4499 (25p=14, 75p=29) Actual Rank: 12\n", "Predicted Rank 22: frc6445 (25p=16, 75p=30) Actual Rank: 4\n", "Predicted Rank 22: frc86 (25p=16, 75p=30) Actual Rank: 28\n", "Predicted Rank 22: frc192 (25p=15, 75p=31) Actual Rank: 15\n", "Predicted Rank 23: frc386 (25p=17, 75p=32) Actual Rank: 10\n", "Predicted Rank 24: frc6547 (25p=19, 75p=31) Actual Rank: 27\n", "Predicted Rank 24: frc2486 (25p=17, 75p=34) Actual Rank: 16\n", "Predicted Rank 24: frc4516 (25p=17, 75p=34) Actual Rank: 5\n", "Predicted Rank 28: frc4537 (25p=21, 75p=38) Actual Rank: 8\n", "Predicted Rank 29: frc4355 (25p=22, 75p=38) Actual Rank: 20\n", "Predicted Rank 32: frc4010 (25p=24, 75p=41) Actual Rank: 37\n", "Predicted Rank 32: frc3959 (25p=23, 75p=41) Actual Rank: 47\n", "Predicted Rank 32: frc3507 (25p=24, 75p=41) Actual Rank: 42\n", "Predicted Rank 33: frc4112 (25p=25, 75p=42) Actual Rank: 22\n", "Predicted Rank 34: frc4080 (25p=26, 75p=44) Actual Rank: 21\n", "Predicted Rank 36: frc6061 (25p=29, 75p=43) Actual Rank: 43\n", "Predicted Rank 37: frc4904 (25p=29, 75p=46) Actual Rank: 36\n", "Predicted Rank 37: frc4388 (25p=28, 75p=46) Actual Rank: 25\n", "Predicted Rank 38: frc5109 (25p=30, 75p=46) Actual Rank: 39\n", "Predicted Rank 40: frc2152 (25p=32, 75p=48) Actual Rank: 30\n", "Predicted Rank 41: frc5437 (25p=32, 75p=50) Actual Rank: 19\n", "Predicted Rank 41: frc3045 (25p=32, 75p=50) Actual Rank: 24\n", "Predicted Rank 42: frc3303 (25p=33, 75p=51) Actual Rank: 38\n", "Predicted Rank 42: frc4201 (25p=33, 75p=51) Actual Rank: 65\n", "Predicted Rank 43: frc5190 (25p=33, 75p=52) Actual Rank: 55\n", "Predicted Rank 43: frc5414 (25p=34, 75p=52) Actual Rank: 44\n", "Predicted Rank 43: frc662 (25p=33, 75p=52) Actual Rank: 48\n", "Predicted Rank 44: frc5572 (25p=35, 75p=52) Actual Rank: 58\n", "Predicted Rank 45: frc1817 (25p=35, 75p=53) Actual Rank: 64\n", "Predicted Rank 45: frc6357 (25p=37, 75p=53) Actual Rank: 34\n", "Predicted Rank 46: frc4335 (25p=37, 75p=54) Actual Rank: 29\n", "Predicted Rank 47: frc3966 (25p=38, 75p=54) Actual Rank: 50\n", "Predicted Rank 48: frc2135 (25p=39, 75p=56) Actual Rank: 54\n", "Predicted Rank 50: frc4534 (25p=41, 75p=57) Actual Rank: 63\n", "Predicted Rank 51: frc199 (25p=42, 75p=57) Actual Rank: 40\n", "Predicted Rank 51: frc6404 (25p=41, 75p=58) Actual Rank: 45\n", "Predicted Rank 51: frc6171 (25p=43, 75p=58) Actual Rank: 62\n", "Predicted Rank 53: frc3512 (25p=45, 75p=59) Actual Rank: 59\n", "Predicted Rank 54: frc4841 (25p=46, 75p=60) Actual Rank: 56\n", "Predicted Rank 54: frc6411 (25p=46, 75p=60) Actual Rank: 52\n", "Predicted Rank 55: frc4364 (25p=47, 75p=61) Actual Rank: 41\n", "Predicted Rank 57: frc3574 (25p=50, 75p=62) Actual Rank: 35\n", "Predicted Rank 59: frc6739 (25p=53, 75p=64) Actual Rank: 49\n", "Predicted Rank 60: frc6474 (25p=54, 75p=64) Actual Rank: 66\n", "Predicted Rank 61: frc6191 (25p=55, 75p=65) Actual Rank: 51\n", "Predicted Rank 62: frc5696 (25p=57, 75p=65) Actual Rank: 61\n", "Predicted Rank 62: frc5411 (25p=57, 75p=65) Actual Rank: 57\n", "Predicted Rank 63: frc6658 (25p=59, 75p=66) Actual Rank: 67\n", "Predicted Rank 65: frc6464 (25p=61, 75p=67) Actual Rank: 60\n" ] } ], "source": [ "display_monte_carlo_result(monte_carlo_event(\"2017gal\"), \"2017gal\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Rank 1: frc195 (25p= 1, 75p= 2) Actual Rank: 5\n", "Predicted Rank 3: frc125 (25p= 2, 75p= 4) Actual Rank: 3\n", "Predicted Rank 3: frc5687 (25p= 2, 75p= 4) Actual Rank: 6\n", "Predicted Rank 4: frc1080 (25p= 3, 75p= 5) Actual Rank: 26\n", "Predicted Rank 5: frc1796 (25p= 4, 75p= 6) Actual Rank: 15\n", "Predicted Rank 6: frc33 (25p= 5, 75p= 8) Actual Rank: 2\n", "Predicted Rank 9: frc1073 (25p= 7, 75p=13) Actual Rank: 24\n", "Predicted Rank 10: frc5024 (25p= 8, 75p=15) Actual Rank: 7\n", "Predicted Rank 10: frc2451 (25p= 8, 75p=15) Actual Rank: 21\n", "Predicted Rank 11: frc177 (25p= 8, 75p=16) Actual Rank: 27\n", "Predicted Rank 13: frc303 (25p= 9, 75p=18) Actual Rank: 1\n", "Predicted Rank 13: frc135 (25p=10, 75p=19) Actual Rank: 4\n", "Predicted Rank 15: frc1018 (25p=11, 75p=22) Actual Rank: 13\n", "Predicted Rank 15: frc6329 (25p=11, 75p=22) Actual Rank: 37\n", "Predicted Rank 20: frc876 (25p=15, 75p=28) Actual Rank: 30\n", "Predicted Rank 20: frc2052 (25p=14, 75p=29) Actual Rank: 33\n", "Predicted Rank 20: frc2832 (25p=13, 75p=29) Actual Rank: 31\n", "Predicted Rank 21: frc1684 (25p=15, 75p=28) Actual Rank: 38\n", "Predicted Rank 21: frc4253 (25p=15, 75p=29) Actual Rank: 16\n", "Predicted Rank 22: frc20 (25p=16, 75p=31) Actual Rank: 44\n", "Predicted Rank 22: frc2194 (25p=15, 75p=32) Actual Rank: 43\n", "Predicted Rank 24: frc68 (25p=17, 75p=32) Actual Rank: 50\n", "Predicted Rank 24: frc5401 (25p=17, 75p=34) Actual Rank: 23\n", "Predicted Rank 25: frc1732 (25p=18, 75p=33) Actual Rank: 22\n", "Predicted Rank 25: frc3941 (25p=19, 75p=33) Actual Rank: 39\n", "Predicted Rank 26: frc3381 (25p=19, 75p=34) Actual Rank: 52\n", "Predicted Rank 27: frc4237 (25p=19, 75p=36) Actual Rank: 8\n", "Predicted Rank 28: frc4456 (25p=20, 75p=37) Actual Rank: 45\n", "Predicted Rank 29: frc1153 (25p=22, 75p=38) Actual Rank: 17\n", "Predicted Rank 29: frc3538 (25p=21, 75p=38) Actual Rank: 57\n", "Predicted Rank 32: frc4003 (25p=24, 75p=41) Actual Rank: 10\n", "Predicted Rank 32: frc1710 (25p=24, 75p=42) Actual Rank: 20\n", "Predicted Rank 32: frc5114 (25p=23, 75p=43) Actual Rank: 9\n", "Predicted Rank 34: frc5813 (25p=26, 75p=44) Actual Rank: 12\n", "Predicted Rank 36: frc2399 (25p=27, 75p=46) Actual Rank: 32\n", "Predicted Rank 36: frc5150 (25p=27, 75p=46) Actual Rank: 42\n", "Predicted Rank 39: frc5618 (25p=30, 75p=48) Actual Rank: 47\n", "Predicted Rank 39: frc126 (25p=30, 75p=49) Actual Rank: 35\n", "Predicted Rank 40: frc6336 (25p=30, 75p=49) Actual Rank: 60\n", "Predicted Rank 41: frc4176 (25p=32, 75p=50) Actual Rank: 41\n", "Predicted Rank 41: frc1288 (25p=32, 75p=50) Actual Rank: 64\n", "Predicted Rank 44: frc4905 (25p=35, 75p=53) Actual Rank: 63\n", "Predicted Rank 44: frc5462 (25p=35, 75p=54) Actual Rank: 65\n", "Predicted Rank 46: frc1731 (25p=37, 75p=54) Actual Rank: 51\n", "Predicted Rank 46: frc4198 (25p=37, 75p=54) Actual Rank: 36\n", "Predicted Rank 46: frc503 (25p=36, 75p=55) Actual Rank: 48\n", "Predicted Rank 47: frc6569 (25p=38, 75p=55) Actual Rank: 49\n", "Predicted Rank 47: frc2491 (25p=38, 75p=56) Actual Rank: 53\n", "Predicted Rank 49: frc1816 (25p=41, 75p=56) Actual Rank: 28\n", "Predicted Rank 49: frc25 (25p=40, 75p=57) Actual Rank: 25\n", "Predicted Rank 49: frc6324 (25p=40, 75p=57) Actual Rank: 14\n", "Predicted Rank 51: frc5053 (25p=41, 75p=58) Actual Rank: 19\n", "Predicted Rank 51: frc4961 (25p=43, 75p=59) Actual Rank: 18\n", "Predicted Rank 52: frc263 (25p=43, 75p=60) Actual Rank: 61\n", "Predicted Rank 53: frc639 (25p=44, 75p=60) Actual Rank: 29\n", "Predicted Rank 53: frc597 (25p=44, 75p=60) Actual Rank: 56\n", "Predicted Rank 54: frc6420 (25p=45, 75p=61) Actual Rank: 62\n", "Predicted Rank 55: frc2601 (25p=46, 75p=62) Actual Rank: 59\n", "Predicted Rank 56: frc4539 (25p=47, 75p=62) Actual Rank: 67\n", "Predicted Rank 56: frc4405 (25p=48, 75p=62) Actual Rank: 58\n", "Predicted Rank 57: frc3494 (25p=48, 75p=63) Actual Rank: 11\n", "Predicted Rank 57: frc1991 (25p=49, 75p=63) Actual Rank: 46\n", "Predicted Rank 57: frc4959 (25p=50, 75p=63) Actual Rank: 40\n", "Predicted Rank 58: frc341 (25p=50, 75p=63) Actual Rank: 54\n", "Predicted Rank 58: frc2377 (25p=50, 75p=64) Actual Rank: 34\n", "Predicted Rank 61: frc6066 (25p=55, 75p=65) Actual Rank: 55\n", "Predicted Rank 64: frc3172 (25p=59, 75p=66) Actual Rank: 68\n", "Predicted Rank 68: frc6391 (25p=67, 75p=68) Actual Rank: 66\n" ] } ], "source": [ "display_monte_carlo_result(monte_carlo_event(\"2017cars\"), \"2017cars\")" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Rank 2: frc2122 (25p= 1, 75p= 3) Actual Rank: 3\n", "Predicted Rank 2: frc971 (25p= 1, 75p= 3) Actual Rank: 2\n", "Predicted Rank 3: frc987 (25p= 2, 75p= 4) Actual Rank: 5\n", "Predicted Rank 4: frc1690 (25p= 3, 75p= 4) Actual Rank: 1\n", "Predicted Rank 5: frc3238 (25p= 5, 75p= 6) Actual Rank: 6\n", "Predicted Rank 6: frc4910 (25p= 5, 75p= 8) Actual Rank: 33\n", "Predicted Rank 7: frc2974 (25p= 6, 75p= 8) Actual Rank: 46\n", "Predicted Rank 8: frc2992 (25p= 7, 75p= 9) Actual Rank: 21\n", "Predicted Rank 10: frc1700 (25p= 9, 75p=12) Actual Rank: 30\n", "Predicted Rank 11: frc2471 (25p= 9, 75p=13) Actual Rank: 26\n", "Predicted Rank 12: frc179 (25p=10, 75p=14) Actual Rank: 14\n", "Predicted Rank 12: frc1937 (25p=10, 75p=14) Actual Rank: 29\n", "Predicted Rank 12: frc3339 (25p=10, 75p=14) Actual Rank: 9\n", "Predicted Rank 14: frc3674 (25p=11, 75p=17) Actual Rank: 23\n", "Predicted Rank 21: frc4334 (25p=16, 75p=29) Actual Rank: 4\n", "Predicted Rank 21: frc2930 (25p=15, 75p=32) Actual Rank: 8\n", "Predicted Rank 22: frc5293 (25p=17, 75p=31) Actual Rank: 19\n", "Predicted Rank 24: frc5468 (25p=18, 75p=33) Actual Rank: 12\n", "Predicted Rank 24: frc6502 (25p=18, 75p=34) Actual Rank: 34\n", "Predicted Rank 25: frc231 (25p=19, 75p=35) Actual Rank: 11\n", "Predicted Rank 26: frc5511 (25p=19, 75p=34) Actual Rank: 31\n", "Predicted Rank 27: frc4501 (25p=20, 75p=36) Actual Rank: 37\n", "Predicted Rank 27: frc4911 (25p=20, 75p=38) Actual Rank: 18\n", "Predicted Rank 28: frc2637 (25p=20, 75p=38) Actual Rank: 38\n", "Predicted Rank 30: frc6530 (25p=23, 75p=40) Actual Rank: 25\n", "Predicted Rank 31: frc599 (25p=22, 75p=41) Actual Rank: 39\n", "Predicted Rank 31: frc4063 (25p=22, 75p=41) Actual Rank: 10\n", "Predicted Rank 31: frc1577 (25p=22, 75p=43) Actual Rank: 41\n", "Predicted Rank 32: frc2359 (25p=23, 75p=42) Actual Rank: 15\n", "Predicted Rank 33: frc4125 (25p=24, 75p=43) Actual Rank: 52\n", "Predicted Rank 33: frc3196 (25p=24, 75p=44) Actual Rank: 48\n", "Predicted Rank 34: frc1648 (25p=25, 75p=44) Actual Rank: 28\n", "Predicted Rank 34: frc1425 (25p=24, 75p=45) Actual Rank: 16\n", "Predicted Rank 35: frc4990 (25p=26, 75p=46) Actual Rank: 40\n", "Predicted Rank 36: frc6133 (25p=28, 75p=45) Actual Rank: 56\n", "Predicted Rank 37: frc1671 (25p=27, 75p=47) Actual Rank: 7\n", "Predicted Rank 37: frc3925 (25p=28, 75p=47) Actual Rank: 13\n", "Predicted Rank 37: frc3490 (25p=27, 75p=48) Actual Rank: 44\n", "Predicted Rank 38: frc6314 (25p=27, 75p=49) Actual Rank: 54\n", "Predicted Rank 39: frc2059 (25p=29, 75p=49) Actual Rank: 20\n", "Predicted Rank 41: frc3802 (25p=31, 75p=51) Actual Rank: 24\n", "Predicted Rank 41: frc1746 (25p=29, 75p=52) Actual Rank: 17\n", "Predicted Rank 42: frc6704 (25p=34, 75p=50) Actual Rank: 63\n", "Predicted Rank 42: frc3024 (25p=31, 75p=52) Actual Rank: 36\n", "Predicted Rank 42: frc3646 (25p=32, 75p=52) Actual Rank: 61\n", "Predicted Rank 42: frc932 (25p=32, 75p=52) Actual Rank: 22\n", "Predicted Rank 43: frc1266 (25p=33, 75p=53) Actual Rank: 42\n", "Predicted Rank 46: frc5526 (25p=35, 75p=56) Actual Rank: 57\n", "Predicted Rank 47: frc3256 (25p=36, 75p=56) Actual Rank: 51\n", "Predicted Rank 48: frc2556 (25p=37, 75p=57) Actual Rank: 35\n", "Predicted Rank 49: frc2557 (25p=39, 75p=57) Actual Rank: 27\n", "Predicted Rank 49: frc1311 (25p=39, 75p=58) Actual Rank: 66\n", "Predicted Rank 50: frc6348 (25p=40, 75p=58) Actual Rank: 47\n", "Predicted Rank 50: frc4091 (25p=40, 75p=58) Actual Rank: 62\n", "Predicted Rank 52: frc5006 (25p=43, 75p=59) Actual Rank: 67\n", "Predicted Rank 52: frc1902 (25p=41, 75p=59) Actual Rank: 64\n", "Predicted Rank 53: frc3035 (25p=43, 75p=60) Actual Rank: 59\n", "Predicted Rank 54: frc5627 (25p=45, 75p=61) Actual Rank: 50\n", "Predicted Rank 55: frc3648 (25p=45, 75p=62) Actual Rank: 45\n", "Predicted Rank 55: frc3128 (25p=45, 75p=62) Actual Rank: 58\n", "Predicted Rank 57: frc6396 (25p=49, 75p=63) Actual Rank: 60\n", "Predicted Rank 57: frc5985 (25p=47, 75p=63) Actual Rank: 49\n", "Predicted Rank 59: frc5607 (25p=51, 75p=63) Actual Rank: 53\n", "Predicted Rank 60: frc6443 (25p=53, 75p=64) Actual Rank: 43\n", "Predicted Rank 60: frc6414 (25p=54, 75p=65) Actual Rank: 65\n", "Predicted Rank 63: frc6695 (25p=58, 75p=66) Actual Rank: 55\n", "Predicted Rank 63: frc3721 (25p=57, 75p=66) Actual Rank: 32\n" ] } ], "source": [ "display_monte_carlo_result(monte_carlo_event(\"2017carv\"), \"2017carv\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Rank 1: frc604 (25p= 1, 75p= 2) Actual Rank: 4\n", "Predicted Rank 2: frc2848 (25p= 2, 75p= 3) Actual Rank: 8\n", "Predicted Rank 3: frc1619 (25p= 3, 75p= 4) Actual Rank: 1\n", "Predicted Rank 4: frc1778 (25p= 3, 75p= 6) Actual Rank: 9\n", "Predicted Rank 7: frc4613 (25p= 5, 75p=10) Actual Rank: 6\n", "Predicted Rank 7: frc3309 (25p= 5, 75p=10) Actual Rank: 2\n", "Predicted Rank 8: frc3835 (25p= 6, 75p=12) Actual Rank: 11\n", "Predicted Rank 9: frc4941 (25p= 7, 75p=12) Actual Rank: 12\n", "Predicted Rank 11: frc4488 (25p= 8, 75p=14) Actual Rank: 7\n", "Predicted Rank 11: frc2682 (25p= 8, 75p=15) Actual Rank: 16\n", "Predicted Rank 11: frc2903 (25p= 8, 75p=16) Actual Rank: 15\n", "Predicted Rank 12: frc5818 (25p= 9, 75p=15) Actual Rank: 13\n", "Predicted Rank 13: frc1868 (25p=10, 75p=17) Actual Rank: 30\n", "Predicted Rank 14: frc5458 (25p=10, 75p=19) Actual Rank: 10\n", "Predicted Rank 14: frc3314 (25p=10, 75p=19) Actual Rank: 3\n", "Predicted Rank 15: frc2910 (25p=12, 75p=19) Actual Rank: 20\n", "Predicted Rank 18: frc3132 (25p=13, 75p=23) Actual Rank: 21\n", "Predicted Rank 18: frc6340 (25p=15, 75p=23) Actual Rank: 14\n", "Predicted Rank 19: frc832 (25p=15, 75p=24) Actual Rank: 5\n", "Predicted Rank 21: frc5429 (25p=16, 75p=28) Actual Rank: 24\n", "Predicted Rank 24: frc5431 (25p=19, 75p=31) Actual Rank: 22\n", "Predicted Rank 26: frc2383 (25p=21, 75p=33) Actual Rank: 29\n", "Predicted Rank 26: frc4965 (25p=20, 75p=34) Actual Rank: 18\n", "Predicted Rank 26: frc4513 (25p=21, 75p=34) Actual Rank: 32\n", "Predicted Rank 27: frc281 (25p=21, 75p=35) Actual Rank: 41\n", "Predicted Rank 28: frc5663 (25p=22, 75p=36) Actual Rank: 40\n", "Predicted Rank 30: frc4005 (25p=24, 75p=38) Actual Rank: 26\n", "Predicted Rank 30: frc1319 (25p=23, 75p=38) Actual Rank: 51\n", "Predicted Rank 33: frc5588 (25p=25, 75p=43) Actual Rank: 19\n", "Predicted Rank 35: frc4915 (25p=27, 75p=44) Actual Rank: 42\n", "Predicted Rank 35: frc2230 (25p=27, 75p=44) Actual Rank: 23\n", "Predicted Rank 36: frc4944 (25p=29, 75p=44) Actual Rank: 17\n", "Predicted Rank 36: frc1410 (25p=28, 75p=46) Actual Rank: 27\n", "Predicted Rank 36: frc2587 (25p=27, 75p=46) Actual Rank: 28\n", "Predicted Rank 37: frc4401 (25p=29, 75p=45) Actual Rank: 48\n", "Predicted Rank 37: frc2996 (25p=30, 75p=46) Actual Rank: 39\n", "Predicted Rank 38: frc6517 (25p=30, 75p=47) Actual Rank: 56\n", "Predicted Rank 38: frc6055 (25p=30, 75p=48) Actual Rank: 36\n", "Predicted Rank 39: frc1744 (25p=31, 75p=47) Actual Rank: 47\n", "Predicted Rank 40: frc3931 (25p=31, 75p=49) Actual Rank: 55\n", "Predicted Rank 41: frc6366 (25p=33, 75p=50) Actual Rank: 31\n", "Predicted Rank 42: frc1836 (25p=34, 75p=50) Actual Rank: 35\n", "Predicted Rank 42: frc4635 (25p=33, 75p=51) Actual Rank: 33\n", "Predicted Rank 44: frc1912 (25p=35, 75p=53) Actual Rank: 54\n", "Predicted Rank 45: frc2583 (25p=36, 75p=53) Actual Rank: 34\n", "Predicted Rank 45: frc2444 (25p=36, 75p=53) Actual Rank: 50\n", "Predicted Rank 45: frc6023 (25p=35, 75p=54) Actual Rank: 38\n", "Predicted Rank 45: frc5002 (25p=35, 75p=54) Actual Rank: 66\n", "Predicted Rank 46: frc3039 (25p=36, 75p=54) Actual Rank: 49\n", "Predicted Rank 47: frc2543 (25p=38, 75p=55) Actual Rank: 53\n", "Predicted Rank 48: frc4400 (25p=38, 75p=56) Actual Rank: 25\n", "Predicted Rank 49: frc5887 (25p=40, 75p=57) Actual Rank: 61\n", "Predicted Rank 51: frc4403 (25p=44, 75p=57) Actual Rank: 52\n", "Predicted Rank 51: frc5516 (25p=42, 75p=58) Actual Rank: 45\n", "Predicted Rank 51: frc5496 (25p=42, 75p=58) Actual Rank: 43\n", "Predicted Rank 52: frc6434 (25p=44, 75p=58) Actual Rank: 44\n", "Predicted Rank 52: frc114 (25p=43, 75p=59) Actual Rank: 37\n", "Predicted Rank 55: frc6305 (25p=47, 75p=61) Actual Rank: 59\n", "Predicted Rank 58: frc2950 (25p=51, 75p=62) Actual Rank: 62\n", "Predicted Rank 58: frc5737 (25p=52, 75p=63) Actual Rank: 60\n", "Predicted Rank 59: frc2896 (25p=51, 75p=64) Actual Rank: 57\n", "Predicted Rank 59: frc3562 (25p=51, 75p=64) Actual Rank: 46\n", "Predicted Rank 61: frc5705 (25p=56, 75p=65) Actual Rank: 67\n", "Predicted Rank 61: frc5454 (25p=55, 75p=65) Actual Rank: 63\n", "Predicted Rank 62: frc6442 (25p=56, 75p=65) Actual Rank: 65\n", "Predicted Rank 63: frc6429 (25p=59, 75p=66) Actual Rank: 58\n", "Predicted Rank 64: frc6754 (25p=59, 75p=66) Actual Rank: 64\n" ] } ], "source": [ "display_monte_carlo_result(monte_carlo_event(\"2017hop\"), \"2017hop\")" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Rank 1: frc148 (25p= 1, 75p= 2) Actual Rank: 4\n", "Predicted Rank 3: frc2168 (25p= 2, 75p= 5) Actual Rank: 3\n", "Predicted Rank 4: frc3464 (25p= 3, 75p= 7) Actual Rank: 19\n", "Predicted Rank 7: frc469 (25p= 4, 75p=10) Actual Rank: 1\n", "Predicted Rank 7: frc95 (25p= 4, 75p=11) Actual Rank: 25\n", "Predicted Rank 8: frc3130 (25p= 4, 75p=12) Actual Rank: 10\n", "Predicted Rank 9: frc6538 (25p= 6, 75p=13) Actual Rank: 8\n", "Predicted Rank 9: frc2607 (25p= 6, 75p=13) Actual Rank: 26\n", "Predicted Rank 9: frc3452 (25p= 6, 75p=13) Actual Rank: 5\n", "Predicted Rank 10: frc2084 (25p= 6, 75p=14) Actual Rank: 17\n", "Predicted Rank 10: frc3015 (25p= 7, 75p=14) Actual Rank: 11\n", "Predicted Rank 11: frc2619 (25p= 7, 75p=15) Actual Rank: 7\n", "Predicted Rank 11: frc3683 (25p= 7, 75p=16) Actual Rank: 12\n", "Predicted Rank 14: frc829 (25p=11, 75p=18) Actual Rank: 2\n", "Predicted Rank 15: frc193 (25p=10, 75p=19) Actual Rank: 34\n", "Predicted Rank 15: frc1519 (25p=11, 75p=19) Actual Rank: 9\n", "Predicted Rank 15: frc3546 (25p=11, 75p=19) Actual Rank: 50\n", "Predicted Rank 18: frc1706 (25p=13, 75p=22) Actual Rank: 40\n", "Predicted Rank 20: frc3974 (25p=17, 75p=24) Actual Rank: 24\n", "Predicted Rank 21: frc3419 (25p=17, 75p=26) Actual Rank: 6\n", "Predicted Rank 22: frc190 (25p=18, 75p=26) Actual Rank: 13\n", "Predicted Rank 22: frc2386 (25p=18, 75p=27) Actual Rank: 14\n", "Predicted Rank 23: frc834 (25p=19, 75p=29) Actual Rank: 15\n", "Predicted Rank 25: frc292 (25p=21, 75p=31) Actual Rank: 58\n", "Predicted Rank 27: frc4485 (25p=22, 75p=33) Actual Rank: 20\n", "Predicted Rank 27: frc51 (25p=22, 75p=33) Actual Rank: 44\n", "Predicted Rank 29: frc2537 (25p=24, 75p=36) Actual Rank: 27\n", "Predicted Rank 30: frc272 (25p=25, 75p=37) Actual Rank: 52\n", "Predicted Rank 31: frc191 (25p=25, 75p=39) Actual Rank: 41\n", "Predicted Rank 32: frc4508 (25p=26, 75p=40) Actual Rank: 33\n", "Predicted Rank 33: frc4481 (25p=26, 75p=41) Actual Rank: 30\n", "Predicted Rank 33: frc11 (25p=27, 75p=41) Actual Rank: 46\n", "Predicted Rank 34: frc3359 (25p=28, 75p=42) Actual Rank: 23\n", "Predicted Rank 37: frc1781 (25p=30, 75p=45) Actual Rank: 42\n", "Predicted Rank 37: frc4991 (25p=30, 75p=45) Actual Rank: 62\n", "Predicted Rank 38: frc3414 (25p=31, 75p=45) Actual Rank: 60\n", "Predicted Rank 38: frc3547 (25p=31, 75p=46) Actual Rank: 32\n", "Predicted Rank 39: frc772 (25p=32, 75p=46) Actual Rank: 45\n", "Predicted Rank 41: frc5422 (25p=34, 75p=49) Actual Rank: 31\n", "Predicted Rank 44: frc4342 (25p=37, 75p=51) Actual Rank: 53\n", "Predicted Rank 44: frc1391 (25p=37, 75p=52) Actual Rank: 35\n", "Predicted Rank 44: frc1023 (25p=36, 75p=53) Actual Rank: 16\n", "Predicted Rank 45: frc714 (25p=37, 75p=52) Actual Rank: 61\n", "Predicted Rank 45: frc3284 (25p=37, 75p=52) Actual Rank: 28\n", "Predicted Rank 46: frc1792 (25p=38, 75p=53) Actual Rank: 51\n", "Predicted Rank 46: frc4506 (25p=39, 75p=53) Actual Rank: 37\n", "Predicted Rank 46: frc2177 (25p=38, 75p=54) Actual Rank: 48\n", "Predicted Rank 46: frc6419 (25p=38, 75p=54) Actual Rank: 65\n", "Predicted Rank 47: frc111 (25p=39, 75p=55) Actual Rank: 21\n", "Predicted Rank 47: frc1939 (25p=39, 75p=55) Actual Rank: 47\n", "Predicted Rank 48: frc2039 (25p=39, 75p=56) Actual Rank: 22\n", "Predicted Rank 49: frc5528 (25p=40, 75p=56) Actual Rank: 49\n", "Predicted Rank 49: frc5016 (25p=41, 75p=56) Actual Rank: 29\n", "Predicted Rank 51: frc6582 (25p=43, 75p=58) Actual Rank: 18\n", "Predicted Rank 53: frc4356 (25p=45, 75p=59) Actual Rank: 55\n", "Predicted Rank 53: frc3201 (25p=44, 75p=59) Actual Rank: 39\n", "Predicted Rank 54: frc6622 (25p=47, 75p=60) Actual Rank: 59\n", "Predicted Rank 55: frc2783 (25p=47, 75p=61) Actual Rank: 54\n", "Predicted Rank 56: frc5952 (25p=49, 75p=62) Actual Rank: 56\n", "Predicted Rank 58: frc6637 (25p=51, 75p=62) Actual Rank: 43\n", "Predicted Rank 59: frc3954 (25p=52, 75p=63) Actual Rank: 38\n", "Predicted Rank 59: frc271 (25p=54, 75p=63) Actual Rank: 57\n", "Predicted Rank 59: frc2851 (25p=52, 75p=64) Actual Rank: 36\n", "Predicted Rank 60: frc4241 (25p=54, 75p=64) Actual Rank: 68\n", "Predicted Rank 64: frc1985 (25p=60, 75p=66) Actual Rank: 64\n", "Predicted Rank 65: frc3525 (25p=61, 75p=67) Actual Rank: 67\n", "Predicted Rank 66: frc4607 (25p=63, 75p=67) Actual Rank: 63\n", "Predicted Rank 66: frc2068 (25p=63, 75p=67) Actual Rank: 66\n" ] } ], "source": [ "display_monte_carlo_result(monte_carlo_event(\"2017tes\"), \"2017tes\")" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "12.875\n" ] } ], "source": [ "\"\"\"\n", "Determine how accurate our predictions were. (in progress)\n", "\"\"\"\n", "\n", "import math \n", "\n", "def norm_pdf(x, mean, sd):\n", " \"\"\"\n", " Probability distribution function for a normal curve\n", " \"\"\"\n", " var = float(sd) ** 2\n", " denom = (2 * math.pi * var) ** 0.5\n", " num = math.exp(-(float(x) - float(mean)) ** 2 / (2 * var))\n", " return num / denom\n", "\n", "def score_monte_carlo_prediction(monte_carlo_result, event):\n", " \"\"\"\n", " Assuming the model we generated using monte carlo metrics, calculate how\n", " likely the actual rankings were (do sum of log of probabilities because\n", " of floating point error... closer to zero is higher probability and more\n", " negative is lesser probability)\n", " \n", " Only look at the first 16 or so teams because everything after that will\n", " be a shitshow regardless.\n", " \"\"\"\n", " monte_carlo_result = list(monte_carlo_result.items())\n", " monte_carlo_result = sorted(monte_carlo_result, key=lambda x: (x[1].p50, x[1].p75))[:16]\n", " \n", " team_probabilities = {}\n", " for team, prediction in monte_carlo_result:\n", " mean = prediction.p50\n", " sd = prediction.std_dev\n", " #team_probabilities[team] = math.log(norm_pdf(get_actual_ranking(event, team), mean, sd))\n", " team_probabilities[team] = abs(mean - get_actual_ranking(event, team))\n", " \n", " return sum(team_probabilities.values()) / len(team_probabilities)\n", "\n", "pprint(score_monte_carlo_prediction(monte_carlo_event(\"2017roe\"), \"2017roe\"))" ] } ], "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 }