| Event Key | Mean | Median | Max | Min | |
|---|---|---|---|---|---|
| 2016abca | 27.0 | 27.0 | 30 | 24 | |
| 2016alhu | 29.372549019607842 | 30 | 30 | 27 | |
| 2016arlr | 31.591836734693878 | 32 | 34 | 28 | |
| 2016ausy | 28.27906976744186 | 28 | 30 | 26 | |
| 2016azfl | 29.653846153846153 | 30.0 | 32 | 28 | |
| 2016azpx | 31.72093023255814 | 32 | 36 | 28 | |
| 2016cada | 24.0 | 24.0 | 24 | 24 | |
| 2016calb | 24.0 | 24.0 | 24 | 24 | |
| 2016cama | 29.306122448979593 | 29 | 32 | 27 | |
| 2016capl | 30.904761904761905 | 31.0 | 34 | 28 | |
| 2016casd | 27.0 | 27.0 | 27 | 27 | |
| 2016casj | 24.09375 | 24.0 | 26 | 23 | |
| 2016cave | 30.80952380952381 | 31.0 | 35 | 28 | |
| 2016chcmp | 34.93103448275862 | 35.0 | 36 | 33 | |
| 2016code | 31.0 | 31.0 | 33 | 28 | |
| 2016cthar | 29.85 | 30.0 | 34 | 27 | |
| 2016ctwat | 29.210526315789473 | 29.0 | 32 | 26 | |
| 2016flor | 27.11111111111111 | 27 | 30 | 27 | |
| 2016flwp | 26.966666666666665 | 27.0 | 27 | 26 | |
| 2016gaalb | 20.56 | 21 | 22 | 18 | |
| 2016gacmp | 30.48780487804878 | 30 | 33 | 28 | |
| 2016gacol | 29.2 | 29.0 | 33 | 26 | |
| 2016gadal | 22.444444444444443 | 22 | 26 | 20 | |
| 2016gaken | 27.428571428571427 | 28 | 30 | 24 | |
| 2016hiho | 28.473684210526315 | 28.0 | 32 | 25 | |
| 2016iacf | 29.58490566037736 | 30 | 32 | 27 | |
| 2016idbo | 22.933333333333334 | 23.0 | 26 | 19 | |
| 2016ilch | 29.615384615384617 | 30.0 | 31 | 28 | |
| 2016ilpe | 27.7 | 28.0 | 29 | 25 | |
| 2016incmp | 23.548387096774192 | 24 | 26 | 19 | |
| 2016inpmh | 25.393939393939394 | 25 | 29 | 23 | |
| 2016inwch | 26.61111111111111 | 27.0 | 29 | 22 | |
| 2016inwla | 28.736842105263158 | 29.0 | 32 | 26 | |
| 2016ista | 27.11111111111111 | 27 | 30 | 27 | |
| 2016lake | 29.857142857142858 | 30.0 | 31 | 29 | |
| 2016mabos | 30.05 | 30.0 | 32 | 27 | |
| 2016manda | 25.75 | 26.0 | 29 | 23 | |
| 2016marea | 29.28205128205128 | 29 | 34 | 26 | |
| 2016mawor | 29.85 | 30.0 | 34 | 26 | |
| 2016mdbet | 29.641025641025642 | 30 | 32 | 27 | |
| 2016mdblr | 26.529411764705884 | 26.0 | 31 | 22 | |
| 2016mdedg | 29.794871794871796 | 30 | 34 | 27 | |
| 2016melew | 29.25 | 29.0 | 33 | 26 | |
| 2016miann | 30.05 | 30.0 | 33 | 26 | |
| 2016mibro | 30.1 | 30.0 | 34 | 27 | |
| 2016micen | 30.3 | 30.0 | 35 | 26 | |
| 2016micmp | 36.0 | 36.0 | 36 | 36 | |
| 2016miesc | 29.6 | 30.0 | 32 | 26 | |
| 2016mihow | 29.55 | 30.0 | 33 | 27 | |
| 2016mike2 | 30.634146341463413 | 30 | 34 | 27 | |
| 2016miken | 30.3 | 30.0 | 33 | 28 | |
| 2016miket | 30.2 | 30.0 | 33 | 27 | |
| 2016milak | 30.5 | 31.0 | 33 | 28 | |
| 2016milan | 30.2 | 30.0 | 33 | 28 | |
| 2016miliv | 29.7 | 30.0 | 33 | 26 | |
| 2016milsu | 30.78048780487805 | 31 | 34 | 28 | |
| 2016mimar | 30.1 | 30.0 | 33 | 26 | |
| 2016mimid | 30.15 | 30.0 | 32 | 27 | |
| 2016misjo | 30.0 | 30 | 33 | 26 | |
| 2016misou | 29.333333333333332 | 29 | 32 | 25 | |
| 2016mista | 30.15 | 30.0 | 33 | 26 | |
| 2016mitry | 29.487179487179485 | 30 | 31 | 27 | |
| 2016mitvc | 30.3 | 30.0 | 33 | 27 | |
| 2016miwat | 29.692307692307693 | 30 | 32 | 26 | |
| 2016miwmi | 30.585365853658537 | 31 | 33 | 27 | |
| 2016mndu | 24.0 | 24 | 24 | 24 | |
| 2016mndu2 | 24.0 | 24.0 | 24 | 24 | |
| 2016mnmi | 24.0 | 24 | 24 | 24 | |
| 2016mnmi2 | 24.0 | 24.0 | 24 | 24 | |
| 2016mokc | 29.89830508474576 | 30 | 32 | 29 | |
| 2016mosl | 29.551020408163264 | 30 | 31 | 28 | |
| 2016mrcmp | 35.3 | 35.0 | 36 | 32 | |
| 2016mxmc | 29.58490566037736 | 30 | 32 | 28 | |
| 2016ncash | 20.083333333333332 | 20.0 | 22 | 18 | |
| 2016ncbui | 25.3125 | 25.0 | 28 | 23 | |
| 2016nccmp | 24.875 | 25.0 | 27 | 22 | |
| 2016ncmcl | 23.0 | 23.0 | 26 | 19 | |
| 2016ncral | 25.3125 | 25.0 | 28 | 22 | |
| 2016necmp | 35.714285714285715 | 36 | 36 | 34 | |
| 2016nhdur | 30.0 | 30.0 | 32 | 28 | |
| 2016nhgrs | 24.0 | 24.0 | 27 | 21 | |
| 2016njbri | 28.43243243243243 | 29 | 31 | 26 | |
| 2016njfla | 29.692307692307693 | 30 | 34 | 27 | |
| 2016njski | 29.263157894736842 | 29.0 | 33 | 26 | |
| 2016njtab | 28.526315789473685 | 29.0 | 32 | 25 | |
| 2016nvlv | 30.93877551020408 | 31 | 33 | 28 | |
| 2016nyli | 29.607843137254903 | 30 | 30 | 28 | |
| 2016nyny | 24.0 | 24.0 | 24 | 24 | |
| 2016nyro | 29.142857142857142 | 29 | 32 | 27 | |
| 2016nytr | 27.38888888888889 | 27.5 | 30 | 25 | |
| 2016ohci | 29.428571428571427 | 30.0 | 31 | 28 | |
| 2016ohcl | 26.96551724137931 | 27.0 | 27 | 26 | |
| 2016okok | 27.049180327868854 | 27 | 29 | 26 | |
| 2016onnb | 23.75 | 24.0 | 27 | 20 | |
| 2016onto | 29.306122448979593 | 29 | 31 | 27 | |
| 2016onto2 | 27.5609756097561 | 28 | 30 | 25 | |
| 2016onwa | 23.666666666666668 | 24.0 | 26 | 21 | |
| 2016onwi | 26.807692307692307 | 27.0 | 27 | 25 | |
| 2016orore | 25.25 | 25.0 | 28 | 22 | |
| 2016orphi | 23.6 | 24.0 | 26 | 18 | |
| 2016orwil | 27.38888888888889 | 27.0 | 30 | 24 | |
| 2016paca | 29.615384615384617 | 30.0 | 32 | 29 | |
| 2016pahat | 28.216216216216218 | 28 | 32 | 26 | |
| 2016paphi | 23.419354838709676 | 24 | 26 | 20 | |
| 2016pawch | 27.83783783783784 | 28 | 31 | 25 | |
| 2016pncmp | 35.65625 | 36.0 | 36 | 34 | |
| 2016qcmo | 26.92 | 27.0 | 27 | 26 | |
| 2016ripro | 27.333333333333332 | 28.0 | 30 | 24 | |
| 2016scmb | 24.125 | 24.0 | 26 | 24 | |
| 2016tnkn | 28.979591836734695 | 29 | 31 | 26 | |
| 2016txda | 30.41860465116279 | 30 | 33 | 28 | |
| 2016txho | 24.0 | 24.0 | 24 | 24 | |
| 2016txlu | 28.95 | 29.0 | 32 | 25 | |
| 2016txsa | 24.0 | 24.0 | 24 | 24 | |
| 2016utwv | 27.38888888888889 | 28.0 | 30 | 24 | |
| 2016vabla | 26.941176470588236 | 27.0 | 30 | 24 | |
| 2016vados | 29.210526315789473 | 29.0 | 32 | 26 | |
| 2016vahay | 29.17948717948718 | 29 | 32 | 26 | |
| 2016vapor | 27.257142857142856 | 27 | 30 | 24 | |
| 2016waahs | 27.944444444444443 | 28.0 | 31 | 25 | |
| 2016waamv | 29.487179487179485 | 30 | 32 | 25 | |
| 2016waell | 28.82051282051282 | 28 | 32 | 26 | |
| 2016wamou | 27.485714285714284 | 27 | 31 | 25 | |
| 2016wasno | 29.210526315789473 | 29.0 | 33 | 25 | |
| 2016waspo | 26.352941176470587 | 26.0 | 30 | 23 | |
| 2016wimi | 29.660377358490567 | 30 | 32 | 28 |
| Event Key | Mean | Median | Max | Min | |
|---|---|---|---|---|---|
| 2016abca | 22.0 | 22.0 | 22 | 22 | |
| 2016alhu | 20.0 | 20 | 20 | 20 | |
| 2016arlr | 22.040816326530614 | 22 | 24 | 22 | |
| 2016ausy | 20.093023255813954 | 20 | 22 | 20 | |
| 2016azfl | 20.076923076923077 | 20.0 | 22 | 20 | |
| 2016azpx | 24.0 | 24 | 24 | 24 | |
| 2016cada | 16.0 | 16.0 | 16 | 16 | |
| 2016calb | 16.0 | 16.0 | 16 | 16 | |
| 2016cama | 20.081632653061224 | 20 | 22 | 20 | |
| 2016capl | 24.0 | 24.0 | 24 | 24 | |
| 2016casd | 18.0 | 18.0 | 18 | 18 | |
| 2016casj | 16.125 | 16.0 | 18 | 16 | |
| 2016cave | 24.0 | 24.0 | 24 | 24 | |
| 2016chcmp | 24.0 | 24.0 | 24 | 24 | |
| 2016code | 22.0 | 22.0 | 22 | 22 | |
| 2016cthar | 24.0 | 24.0 | 24 | 24 | |
| 2016ctwat | 24.0 | 24.0 | 24 | 24 | |
| 2016flor | 18.095238095238095 | 18 | 20 | 18 | |
| 2016flwp | 18.0 | 18.0 | 18 | 18 | |
| 2016gaalb | 21.2 | 21 | 23 | 20 | |
| 2016gacmp | 24.0 | 24 | 24 | 24 | |
| 2016gacol | 24.0 | 24.0 | 24 | 24 | |
| 2016gadal | 21.555555555555557 | 22 | 24 | 20 | |
| 2016gaken | 24.0 | 24 | 24 | 24 | |
| 2016hiho | 24.0 | 24.0 | 24 | 24 | |
| 2016iacf | 20.150943396226417 | 20 | 22 | 20 | |
| 2016idbo | 22.066666666666666 | 22.0 | 24 | 20 | |
| 2016ilch | 20.076923076923077 | 20.0 | 22 | 20 | |
| 2016ilpe | 20.1 | 20.0 | 22 | 20 | |
| 2016incmp | 22.838709677419356 | 23 | 24 | 21 | |
| 2016inpmh | 24.0 | 24 | 24 | 24 | |
| 2016inwch | 24.0 | 24.0 | 24 | 24 | |
| 2016inwla | 24.0 | 24.0 | 24 | 24 | |
| 2016ista | 18.095238095238095 | 18 | 20 | 18 | |
| 2016lake | 20.142857142857142 | 20.0 | 22 | 20 | |
| 2016mabos | 24.0 | 24.0 | 24 | 24 | |
| 2016manda | 24.0 | 24.0 | 24 | 24 | |
| 2016marea | 24.0 | 24 | 24 | 24 | |
| 2016mawor | 24.0 | 24.0 | 24 | 24 | |
| 2016mdbet | 24.0 | 24 | 24 | 24 | |
| 2016mdblr | 23.941176470588236 | 24.0 | 24 | 23 | |
| 2016mdedg | 24.0 | 24 | 24 | 24 | |
| 2016melew | 24.0 | 24.0 | 24 | 24 | |
| 2016miann | 24.0 | 24.0 | 24 | 24 | |
| 2016mibro | 24.0 | 24.0 | 24 | 24 | |
| 2016micen | 24.0 | 24.0 | 24 | 24 | |
| 2016micmp | 24.0 | 24.0 | 24 | 24 | |
| 2016miesc | 24.0 | 24.0 | 24 | 24 | |
| 2016mihow | 24.0 | 24.0 | 24 | 24 | |
| 2016mike2 | 24.0 | 24 | 24 | 24 | |
| 2016miken | 24.0 | 24.0 | 24 | 24 | |
| 2016miket | 24.0 | 24.0 | 24 | 24 | |
| 2016milak | 24.0 | 24.0 | 24 | 24 | |
| 2016milan | 24.0 | 24.0 | 24 | 24 | |
| 2016miliv | 24.0 | 24.0 | 24 | 24 | |
| 2016milsu | 24.0 | 24 | 24 | 24 | |
| 2016mimar | 24.0 | 24.0 | 24 | 24 | |
| 2016mimid | 24.0 | 24.0 | 24 | 24 | |
| 2016misjo | 24.0 | 24 | 24 | 24 | |
| 2016misou | 24.0 | 24 | 24 | 24 | |
| 2016mista | 24.0 | 24.0 | 24 | 24 | |
| 2016mitry | 24.0 | 24 | 24 | 24 | |
| 2016mitvc | 24.0 | 24.0 | 24 | 24 | |
| 2016miwat | 24.0 | 24 | 24 | 24 | |
| 2016miwmi | 24.0 | 24 | 24 | 24 | |
| 2016mndu | 16.0 | 16 | 16 | 16 | |
| 2016mndu2 | 16.0 | 16.0 | 16 | 16 | |
| 2016mnmi | 16.0 | 16 | 16 | 16 | |
| 2016mnmi2 | 16.0 | 16.0 | 16 | 16 | |
| 2016mokc | 20.135593220338983 | 20 | 22 | 20 | |
| 2016mosl | 20.081632653061224 | 20 | 22 | 20 | |
| 2016mrcmp | 24.0 | 24.0 | 24 | 24 | |
| 2016mxmc | 20.150943396226417 | 20 | 22 | 20 | |
| 2016ncash | 20.916666666666668 | 21.0 | 22 | 19 | |
| 2016ncbui | 23.875 | 24.0 | 24 | 22 | |
| 2016nccmp | 23.8125 | 24.0 | 24 | 23 | |
| 2016ncmcl | 22.4 | 22.5 | 24 | 20 | |
| 2016ncral | 23.8125 | 24.0 | 24 | 23 | |
| 2016necmp | 24.0 | 24 | 24 | 24 | |
| 2016nhdur | 24.0 | 24.0 | 24 | 24 | |
| 2016nhgrs | 22.5 | 22.5 | 24 | 20 | |
| 2016njbri | 24.0 | 24 | 24 | 24 | |
| 2016njfla | 24.0 | 24 | 24 | 24 | |
| 2016njski | 24.0 | 24.0 | 24 | 24 | |
| 2016njtab | 24.0 | 24.0 | 24 | 24 | |
| 2016nvlv | 22.040816326530614 | 22 | 24 | 22 | |
| 2016nyli | 20.0 | 20 | 20 | 20 | |
| 2016nyny | 16.0 | 16.0 | 16 | 16 | |
| 2016nyro | 20.081632653061224 | 20 | 22 | 20 | |
| 2016nytr | 24.0 | 24.0 | 24 | 24 | |
| 2016ohci | 20.142857142857142 | 20.0 | 22 | 20 | |
| 2016ohcl | 18.0 | 18.0 | 18 | 18 | |
| 2016okok | 18.098360655737704 | 18 | 20 | 18 | |
| 2016onnb | 22.5625 | 23.0 | 24 | 20 | |
| 2016onto | 20.081632653061224 | 20 | 22 | 20 | |
| 2016onto2 | 20.195121951219512 | 20 | 22 | 20 | |
| 2016onwa | 23.533333333333335 | 24.0 | 25 | 20 | |
| 2016onwi | 18.0 | 18.0 | 18 | 18 | |
| 2016orore | 24.0 | 24.0 | 24 | 24 | |
| 2016orphi | 22.133333333333333 | 22.0 | 24 | 20 | |
| 2016orwil | 24.0 | 24.0 | 24 | 24 | |
| 2016paca | 20.076923076923077 | 20.0 | 22 | 20 | |
| 2016pahat | 24.0 | 24 | 24 | 24 | |
| 2016paphi | 22.322580645161292 | 22 | 24 | 20 | |
| 2016pawch | 24.0 | 24 | 24 | 24 | |
| 2016pncmp | 24.0 | 24.0 | 24 | 24 | |
| 2016qcmo | 18.0 | 18.0 | 18 | 18 | |
| 2016ripro | 24.0 | 24.0 | 24 | 24 | |
| 2016scmb | 16.125 | 16.0 | 18 | 16 | |
| 2016tnkn | 20.081632653061224 | 20 | 22 | 20 | |
| 2016txda | 22.046511627906977 | 22 | 24 | 22 | |
| 2016txho | 16.0 | 16.0 | 16 | 16 | |
| 2016txlu | 22.2 | 22.0 | 24 | 22 | |
| 2016txsa | 16.0 | 16.0 | 16 | 16 | |
| 2016utwv | 24.0 | 24.0 | 24 | 24 | |
| 2016vabla | 23.941176470588236 | 24.0 | 24 | 23 | |
| 2016vados | 24.0 | 24.0 | 24 | 24 | |
| 2016vahay | 24.0 | 24 | 24 | 24 | |
| 2016vapor | 24.0 | 24 | 24 | 24 | |
| 2016waahs | 23.944444444444443 | 24.0 | 24 | 23 | |
| 2016waamv | 24.0 | 24 | 24 | 24 | |
| 2016waell | 24.0 | 24 | 24 | 24 | |
| 2016wamou | 24.0 | 24 | 24 | 24 | |
| 2016wasno | 24.0 | 24.0 | 24 | 24 | |
| 2016waspo | 24.0 | 24.0 | 24 | 24 | |
| 2016wimi | 20.150943396226417 | 20 | 22 | 20 |
| #! /usr/bin/python3 | |
| import argparse | |
| import json | |
| import urllib.request | |
| import statistics | |
| import csv | |
| from collections import defaultdict | |
| """ | |
| A script to calculate distributions of unique partners and opponents for 2016 FRC events | |
| """ | |
| BASE_URL = 'https://www.thebluealliance.com/api/v2/{}' | |
| APP_HEADER = 'X-TBA-App-Id' | |
| APP_ID = 'plnyyanks:schedstats:v0.1' | |
| # See https://github.com/the-blue-alliance/the-blue-alliance/blob/master/consts/event_type.py | |
| VALID_EVENT_TYPES = [0, 1, 2, 3] | |
| def fetch_endpoint(endpoint): | |
| full_url = BASE_URL.format(endpoint) | |
| url = urllib.request.Request(full_url, headers={APP_HEADER: APP_ID, 'User-agent': 'Mozilla/5.0'}) | |
| response = urllib.request.urlopen(url) | |
| return json.loads(response.read().decode('utf-8')) | |
| def fetch_event_keys_in_year(year): | |
| api_events = fetch_endpoint("events/{}".format(year)) | |
| return [event["key"] for event in api_events if event["event_type"] in VALID_EVENT_TYPES] | |
| def fetch_event_matches(event_key): | |
| matches = fetch_endpoint("event/{}/matches".format(event_key)) | |
| return [match for match in matches if match["comp_level"] == "qm"] | |
| def fetch_event_team_keys(event_key): | |
| teams = fetch_endpoint("event/{}/teams".format(event_key)) | |
| return [team["key"] for team in teams] | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("--year", help="Competition season to test", type=int, default=2016) | |
| args = parser.parse_args() | |
| # Build list of all relevent event keys | |
| print("Fetching events in {}".format(args.year)) | |
| event_keys = [] | |
| event_keys.extend(fetch_event_keys_in_year(args.year)) | |
| # Build dict of each event's matches | |
| matches = {} | |
| teams = {} | |
| for event_key in event_keys: | |
| print("Fetching qual matches for {}".format(event_key)) | |
| matches[event_key] = fetch_event_matches(event_key) | |
| teams[event_key] = fetch_event_team_keys(event_key) | |
| # Calculate stats for schedule | |
| # {# with, # against} x {mean, median, max, min} | |
| teams_with = defaultdict(lambda: defaultdict(set)) | |
| teams_against = defaultdict(lambda: defaultdict(set)) | |
| count_with = defaultdict(lambda: defaultdict(int)) | |
| count_against = defaultdict(lambda: defaultdict(int)) | |
| for event_key in event_keys: | |
| if len(matches[event_key]) == 0: | |
| continue | |
| for match in matches[event_key]: | |
| for team in match["alliances"]["blue"]["teams"]: | |
| for other in match["alliances"]["blue"]["teams"]: | |
| if team != other: | |
| teams_with[event_key][team].add(other) | |
| for other in match["alliances"]["red"]["teams"]: | |
| teams_against[event_key][team].add(other) | |
| for team in match["alliances"]["red"]["teams"]: | |
| for other in match["alliances"]["red"]["teams"]: | |
| if team != other: | |
| teams_with[event_key][team].add(other) | |
| for other in match["alliances"]["blue"]["teams"]: | |
| teams_against[event_key][team].add(other) | |
| for team in teams[event_key]: | |
| count_with[event_key][team] = len(teams_with[event_key][team]) | |
| count_against[event_key][team] = len(teams_against[event_key][team]) | |
| with_res = [["Event Key", "Mean", "Median", "Max", "Min"]] | |
| against_res = [["Event Key", "Mean", "Median", "Max", "Min"]] | |
| for event_key in event_keys: | |
| if len(matches[event_key]) == 0: | |
| continue | |
| withs = [count for team, count in count_with[event_key].items() if count != 0] | |
| ags = [count for team, count in count_against[event_key].items() if count != 0] | |
| with_res.append([event_key, statistics.mean(withs), statistics.median(withs), max(withs), min(withs)]) | |
| against_res.append([event_key, statistics.mean(ags), statistics.median(ags), max(ags), min(ags)]) | |
| with open('2016-with.csv', 'w') as f: | |
| writer = csv.writer(f) | |
| writer.writerows(with_res) | |
| with open('2016-against.csv', 'w') as f: | |
| writer = csv.writer(f) | |
| writer.writerows(against_res) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment