Skip to content

Commit dd60108

Browse files
authored
Merge pull request #501 from The-Purple-Warehouse/main
[staging deploy] updated interface for 2026
2 parents 3cd069b + 8cb4207 commit dd60108

10 files changed

Lines changed: 3481 additions & 436 deletions

File tree

config/scouting/2026/graphs_2026.py

Lines changed: 448 additions & 0 deletions
Large diffs are not rendered by default.

config/scouting/2026/graphs_2026.ts

Lines changed: 784 additions & 0 deletions
Large diffs are not rendered by default.

config/scouting/2026/index.ts

Lines changed: 235 additions & 333 deletions
Large diffs are not rendered by default.

config/scouting/2026/predictions_2026.py

Lines changed: 449 additions & 0 deletions
Large diffs are not rendered by default.

config/scouting/2026/predictions_2026.ts

Lines changed: 448 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
'''
2+
python rankings_2026.py
3+
4+
--event tba/frc event key
5+
--csv filename of tpw data
6+
--baseFilePath base filesystem path
7+
8+
stores rankings in json file:
9+
10+
filename: [event]-rankings.json
11+
12+
caches parsed data to json file:
13+
14+
filename: parsed_tpw_data_[event].json
15+
'''
16+
17+
18+
import numpy as np
19+
from collections import OrderedDict
20+
import json
21+
import os
22+
import math
23+
import sys
24+
import csv
25+
import pandas as pd
26+
27+
rawArgs = sys.argv[1:]
28+
args = {}
29+
for i in range(len(rawArgs)):
30+
if rawArgs[i] == "--event" and "event" not in args:
31+
args["event"] = rawArgs[i + 1]
32+
i += 1
33+
elif rawArgs[i] == "--csv" and "csv" not in args:
34+
args["csv"] = rawArgs[i + 1]
35+
i += 1
36+
elif rawArgs[i] == "--baseFilePath" and "baseFilePath" not in args:
37+
args["baseFilePath"] = rawArgs[i + 1]
38+
i += 1
39+
40+
event = args["event"]
41+
base = args["baseFilePath"]
42+
tpw_csv = args["csv"]
43+
44+
def avg(data):
45+
if data != []:
46+
data = np.array([data])
47+
return np.mean(data)
48+
else:
49+
return 0
50+
51+
def std(data):
52+
if data != []:
53+
data = np.array([data])
54+
return np.std(data)
55+
else:
56+
return 0
57+
58+
def max(data):
59+
if data != []:
60+
data = np.array([data])
61+
return np.max(data)
62+
else:
63+
return 0
64+
65+
def min(data):
66+
if data != []:
67+
data = np.array([data])
68+
return np.min(data)
69+
else:
70+
return 0
71+
72+
tpw_path = base + tpw_csv
73+
74+
def getData():
75+
team_data = OrderedDict()
76+
data_length = 0
77+
78+
if os.path.exists(tpw_path):
79+
with open(tpw_path, "r") as file:
80+
TPW_data = csv.DictReader(file)
81+
for x in TPW_data:
82+
data_length += 1
83+
if x['team'] not in team_data:
84+
team_data[x['team']] = [x]
85+
else:
86+
team_data[x['team']].append(x)
87+
else:
88+
raise Exception("Could not find TPW file")
89+
90+
parsed_tpw_data = OrderedDict()
91+
for team, dict in team_data.items():
92+
afgps = list()
93+
tfgps = list()
94+
afgpts = {}
95+
tfgpts = {}
96+
l1climbs = list()
97+
egcpts = list() # endgame climb points
98+
defe = list()
99+
speed = list()
100+
driver = list()
101+
stab = list()
102+
inta = list()
103+
uptime = list()
104+
avg_auto_points = list()
105+
avg_tele_points = list()
106+
matches = {}
107+
108+
for x in dict:
109+
auto_fuel_pieces = x['auto fuel scoring'][1:len(x['auto fuel scoring']) - 1].split(", ")
110+
tele_fuel_pieces = x['teleop fuel scoring'][1:len(x['teleop fuel scoring']) - 1].split(", ")
111+
game_pieces = auto_fuel_pieces + tele_fuel_pieces
112+
afgps.append(auto_fuel_pieces)
113+
tfgps.append(tele_fuel_pieces)
114+
l1climbs.append(x.get('l1 climb', '').lower() == 'true' or x.get('l1 climb', '') == True)
115+
116+
c_lev = int(x['climb level'])
117+
if c_lev == 0:
118+
egcpts.append(0)
119+
elif c_lev == 1:
120+
egcpts.append(10)
121+
elif c_lev == 2:
122+
egcpts.append(20)
123+
elif c_lev >= 3:
124+
egcpts.append(30)
125+
126+
try:
127+
defe.append(int(x["defense skill"]))
128+
speed.append(int(x["speed"]))
129+
stab.append(int(x["stability"]))
130+
inta.append(int(x["intake consistency"]))
131+
driver.append(int(x["driver skill"]))
132+
uptime.append(153000 - int(x["brick time"]))
133+
except:
134+
defe.append(3)
135+
speed.append(3)
136+
stab.append(3)
137+
inta.append(3)
138+
driver.append(3)
139+
uptime.append(100)
140+
141+
try:
142+
matches[x['match']][(x[''])] = game_pieces
143+
except:
144+
matches[x['match']] = {x['']: game_pieces}
145+
146+
for i in range(len(afgps)):
147+
afgpts[i] = 0
148+
for j in range(len(afgps[i])):
149+
val = afgps[i][j]
150+
if val == "fsa":
151+
afgpts[i] = afgpts.get(i, 0) + 1
152+
else:
153+
afgpts[i] = afgpts.get(i, 0) + 0
154+
if l1climbs[i]:
155+
afgpts[i] = afgpts.get(i, 0) + 15
156+
avg_auto_points.append(afgpts[i])
157+
for i in range(len(tfgps)):
158+
tfgpts[i] = 0
159+
for j in range(len(tfgps[i])):
160+
val = tfgps[i][j]
161+
if val == "fsa":
162+
tfgpts[i] = tfgpts.get(i, 0) + 1
163+
elif val == "fp":
164+
tfgpts[i] = tfgpts.get(i, 0) + 0
165+
else:
166+
tfgpts[i] = tfgpts.get(i, 0) + 0
167+
avg_tele_points.append(tfgpts[i])
168+
169+
data_tpw = OrderedDict()
170+
data_tpw['avg-tele'] = avg(avg_tele_points)
171+
data_tpw['avg-auto'] = avg(avg_auto_points)
172+
data_tpw['avg-climb'] = avg(egcpts)
173+
data_tpw['avg-def'] = avg(defe)
174+
data_tpw['avg-driv'] = avg(driver)
175+
data_tpw['avg-speed'] = avg(speed)
176+
data_tpw['avg-stab'] = avg(stab)
177+
data_tpw['avg-inta'] = avg(inta)
178+
data_tpw['avg-upt'] = avg(uptime)
179+
data_tpw['matches'] = matches
180+
data_tpw['tpw-std'] = std(avg_auto_points) + std(avg_tele_points) + std(egcpts)
181+
data_tpw["tpw-score"] = data_tpw['avg-auto'] + data_tpw['avg-tele'] + data_tpw['avg-climb']
182+
parsed_tpw_data[team] = data_tpw
183+
184+
with open(base + 'parsed_tpw_data_'+event+'.json', 'w') as f:
185+
f.write(json.dumps({'lines': data_length, 'data': parsed_tpw_data}, default=int))
186+
f.close()
187+
return parsed_tpw_data
188+
189+
def getDataLength():
190+
data_length = 0
191+
if os.path.exists(tpw_path):
192+
with open(tpw_path, "r") as file:
193+
TPW_data = csv.DictReader(file)
194+
for x in TPW_data:
195+
data_length += 1
196+
else:
197+
raise Exception("Could not find TPW file")
198+
199+
return data_length
200+
201+
202+
if os.path.exists(base + 'parsed_tpw_data_'+event+'.json'):
203+
with open(base + 'parsed_tpw_data_'+event+'.json') as f:
204+
loaded = json.loads(f.read())
205+
if loaded['lines'] == getDataLength():
206+
parsed_tpw_data = loaded['data']
207+
f.close()
208+
else:
209+
f.close()
210+
parsed_tpw_data = getData()
211+
else:
212+
parsed_tpw_data = getData()
213+
214+
for team, dict in parsed_tpw_data.items():
215+
parsed_tpw_data[team]['r-score'] = parsed_tpw_data[team]["tpw-score"] - parsed_tpw_data[team]["tpw-std"] + parsed_tpw_data[team]["avg-driv"] + parsed_tpw_data[team]["avg-speed"] + parsed_tpw_data[team]["avg-stab"] + parsed_tpw_data[team]["avg-inta"]
216+
217+
sorted_dict = OrderedDict(sorted(parsed_tpw_data.items(), key=lambda x: x[1]["r-score"]))
218+
public_dict = OrderedDict()
219+
220+
for team, dict in sorted_dict.items():
221+
public_dict[team] = {"off-score": dict["r-score"], "def-score": dict["avg-def"]}
222+
223+
with open(base + event + "-rankings.json", "w") as f:
224+
json.dump(public_dict, f)

0 commit comments

Comments
 (0)