diff --git a/back/back.py b/back/back.py index aa51bbc2..1481e882 100644 --- a/back/back.py +++ b/back/back.py @@ -34,6 +34,7 @@ async def handle_command(message): global cursor global log argument = "" + logtxt = str(message) if type == "connect": log = open("../log.txt", 'a', encoding='utf-8') argument = type @@ -176,6 +177,7 @@ async def handle_command(message): results = fetch_seasonResults(message["year"]) results.insert(0, fetch_events_from(message["year"])) results.insert(0, "Results fetched") + results.append(fetch_teamsStadings(message["year"])) data_json_results = json.dumps(results) #argument = json.dumps(message) await send_message_to_client(data_json_results) @@ -262,7 +264,7 @@ async def handle_command(message): info_json = json.dumps(info) await send_message_to_client(info_json) - log.write("[" + str(datetime.now()) + "] INFO: Command executed: " + argument + "\n") + log.write("[" + str(datetime.now()) + "] INFO: Command executed: " + logtxt + "\n") log.flush() @@ -313,6 +315,10 @@ def fetch_driverNumebrs(): numList.append(num[0]) return numList +def fetch_teamsStadings(year): + res = cursor.execute("SELECT TeamID, Position FROM Races_TeamStandings WHERE SeasonID = " + str(year) + " AND RaceFormula = 1").fetchall() + return res + def fetch_driverRetirement(driverID): day_season = cursor.execute("SELECT Day, CurrentSeason FROM Player_State").fetchone() retirement_age = cursor.execute("SELECT RetirementAge FROM Staff_GameData WHERE StaffID = " + str(driverID)).fetchone() @@ -359,8 +365,7 @@ def fetch_driverContract(id): return details def fetch_staff(): - staff = cursor.execute("SELECT DISTINCT bas.FirstName, bas.LastName, bas.StaffID, con.TeamID, gam.StaffType FROM Staff_GameData gam JOIN Staff_BasicData bas ON gam.StaffID = bas.StaffID LEFT JOIN Staff_Contracts con ON bas.StaffiD = con.StaffID WHERE gam.StaffType != 0 AND (con.ContractType = 0 OR con.ContractType IS NULL OR con.ContractType = 3) GROUP BY bas.StaffID").fetchall() - + staff = cursor.execute("SELECT DISTINCT bas.FirstName, bas.LastName, bas.StaffID, con.TeamID, gam.StaffType FROM Staff_GameData gam JOIN Staff_BasicData bas ON gam.StaffID = bas.StaffID LEFT JOIN Staff_Contracts con ON bas.StaffiD = con.StaffID WHERE gam.StaffType != 0 AND (con.ContractType = 0 OR con.ContractType IS NULL OR con.ContractType = 3) GROUP BY bas.StaffID ORDER BY CASE WHEN con.TeamID IS NULL THEN 1 ELSE 0 END, con.TeamID").fetchall() formatted_tuples = [] for tupla in staff: @@ -480,7 +485,7 @@ def format_seasonResults(results, driverName, teamID, driverID, year, sprints): return formatred_results def fetch_drivers_per_year(year): - drivers = cursor.execute('SELECT bas.FirstName, bas.LastName, res.DriverID, res.TeamID FROM Staff_BasicData bas JOIN Races_Results res ON bas.StaffID = res.DriverID WHERE Season = ' + str(year) + " GROUP BY bas.FirstName, bas.LastName, bas.StaffID, res.TeamID").fetchall() + drivers = cursor.execute('SELECT bas.FirstName, bas.LastName, res.DriverID, res.TeamID FROM Staff_BasicData bas JOIN Races_Results res ON bas.StaffID = res.DriverID WHERE Season = ' + str(year) + " GROUP BY bas.FirstName, bas.LastName, bas.StaffID, res.TeamID ORDER BY res.TeamID").fetchall() formatted_tuples = [] for tupla in drivers: result = format_names_simple(tupla) @@ -489,7 +494,7 @@ def fetch_drivers_per_year(year): def fetch_info(): - drivers = cursor.execute('SELECT DISTINCT bas.FirstName, bas.LastName, bas.StaffID, con.TeamID, con.PosInTeam, MIN(con.ContractType) AS MinContractType, gam.Retired FROM Staff_BasicData bas JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID LEFT JOIN Staff_Contracts con ON dri.StaffID = con.StaffID LEFT JOIN Staff_GameData gam ON dri.StaffID = gam.StaffID GROUP BY bas.StaffID;').fetchall() + drivers = cursor.execute('SELECT DISTINCT bas.FirstName, bas.LastName, bas.StaffID, con.TeamID, con.PosInTeam, MIN(con.ContractType) AS MinContractType, gam.Retired FROM Staff_BasicData bas JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID LEFT JOIN Staff_Contracts con ON dri.StaffID = con.StaffID LEFT JOIN Staff_GameData gam ON dri.StaffID = gam.StaffID GROUP BY bas.StaffID ORDER BY CASE WHEN con.TeamID IS NULL THEN 1 ELSE 0 END, con.TeamID;').fetchall() formatted_tuples = [] for tupla in drivers: result = format_names_get_stats(tupla, "driver") diff --git a/back/scripts/head2head_23.py b/back/scripts/head2head_23.py index c37a7065..f2569446 100644 --- a/back/scripts/head2head_23.py +++ b/back/scripts/head2head_23.py @@ -1,4 +1,5 @@ import sqlite3 +import numpy as np def fetch_Head2Head(driver1ID, driver2ID, year): conn = sqlite3.connect("../result/main.db") cursor = conn.cursor() @@ -20,6 +21,14 @@ def fetch_Head2Head(driver1ID, driver2ID, year): d2_BestRace = 21 d1_BestQauli = 21 d2_BestQauli = 21 + d1_avgPace = [] + d2_avgPace = [] + d1_avgQPace = [] + d2_avgQPace = [] + d1_RPositions = [] + d2_RPositions = [] + d1_QPositions = [] + d2_QPositions = [] for race in tuple_races: d1_QStage = cursor.execute("SELECT MAX(QualifyingStage) FROM Races_QualifyingResults WHERE RaceFormula = 1 AND RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID = " + str(driver1ID[0])).fetchone() d2_QStage = cursor.execute("SELECT MAX(QualifyingStage) FROM Races_QualifyingResults WHERE RaceFormula = 1 AND RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID = " + str(driver2ID[0])).fetchone() @@ -34,6 +43,14 @@ def fetch_Head2Head(driver1ID, driver2ID, year): qualiH2H[0]+= 1 elif(d1_QRes[0] > d2_QRes[0]): qualiH2H[1]+= 1 + d1_QPositions.append(d1_QRes[0]) + d2_QPositions.append(d2_QRes[0]) + minQ = d1_QStage[0] if d1_QStage[0] <= d2_QStage[0] else d2_QStage[0] + d1_qLap = cursor.execute("SELECT FastestLap FROM Races_QualifyingResults WHERE RaceFormula = 1 AND RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID = " + str(driver1ID[0]) + " AND QualifyingStage = " + str(minQ)).fetchone() + d2_qLap = cursor.execute("SELECT FastestLap FROM Races_QualifyingResults WHERE RaceFormula = 1 AND RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID = " + str(driver2ID[0]) + " AND QualifyingStage = " + str(minQ)).fetchone() + if(d1_qLap[0] != 0) and (d2_qLap[0] != 0): + d1_avgQPace.append(d1_qLap[0]) + d2_avgQPace.append(d2_qLap[0]) if(d1_QStage[0] == 3 and d1_QRes[0] == 1): polesH2H[0] += 1 if(d2_QStage[0] == 3 and d2_QRes[0] == 1): @@ -60,12 +77,21 @@ def fetch_Head2Head(driver1ID, driver2ID, year): d1_BestRace = d1_RRes[0] if(d2_RRes[0] < d2_BestRace): d2_BestRace = d2_RRes[0] + d1_RPositions.append(d1_RRes[0]) + d2_RPositions.append(d2_RRes[0]) d1_RDNF = cursor.execute("SELECT DNF FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID = " + str(driver1ID[0])).fetchone() d2_RDNF = cursor.execute("SELECT DNF FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID = " + str(driver2ID[0])).fetchone() if(d1_RDNF[0] == 1): dnfH2H[0] += 1 if(d2_RDNF[0] == 1): dnfH2H[1] += 1 + if (d1_RDNF[0] != 1) and (d2_RDNF[0] != 1): + d1_raceTotal = cursor.execute("SELECT Time FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID = " + str(driver1ID[0])).fetchone() + d2_raceTotal = cursor.execute("SELECT Time FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID = " + str(driver2ID[0])).fetchone() + d1_raceLaps = cursor.execute("SELECT Laps FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID = " + str(driver1ID[0])).fetchone() + d2_raceLaps = cursor.execute("SELECT Laps FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID = " + str(driver2ID[0])).fetchone() + d1_avgPace.append(round(d1_raceTotal[0] / d1_raceLaps[0], 3)) + d2_avgPace.append(round(d2_raceTotal[0] / d2_raceLaps[0], 3)) d1_SRes = cursor.execute("SELECT FinishingPos FROM Races_Sprintresults WHERE RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID = " + str(driver1ID[0])).fetchone() d2_SRes = cursor.execute("SELECT FinishingPos FROM Races_Sprintresults WHERE RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID = " + str(driver2ID[0])).fetchone() if(d1_SRes != None): @@ -74,7 +100,6 @@ def fetch_Head2Head(driver1ID, driver2ID, year): if(d2_SRes != None): if(d2_SRes[0] == 1): sprintWinsH2H[1] += 1 - d1_Pts = cursor.execute("SELECT Points FROM Races_DriverStandings WHERE RaceFormula = 1 AND SeasonID = " + str(year[0]) + " AND DriverID = " + str(driver1ID[0])).fetchone() d2_Pts = cursor.execute("SELECT Points FROM Races_DriverStandings WHERE RaceFormula = 1 AND SeasonID = " + str(year[0]) + " AND DriverID = " + str(driver2ID[0])).fetchone() pointsH2H[0] = d1_Pts[0] @@ -82,8 +107,20 @@ def fetch_Head2Head(driver1ID, driver2ID, year): bestRace[0] = d1_BestRace bestRace[1] = d2_BestRace bestQuali[0] = d1_BestQauli - bestQuali[1] = d2_BestQauli - resultList = [tuple(raceH2H),tuple(qualiH2H),tuple(pointsH2H),tuple(podiumsH2H),tuple(bestRace),tuple(bestQuali),tuple(dnfH2H), tuple(winsH2H), tuple(polesH2H), tuple(sprintWinsH2H)] + bestQuali[1] = d2_BestQauli + rDifferences = [d2 - d1 for d1, d2 in zip(d1_avgPace, d2_avgPace)] + qDifferences = [d2 - d1 for d1, d2 in zip(d1_avgQPace, d2_avgQPace)] + avg_racediff = round(np.mean(rDifferences), 3) + avg_qualidiff = round(np.mean(qDifferences), 3) + meanRd1 = round(np.mean(d1_RPositions), 1) + meanRd2 = round(np.mean(d2_RPositions), 1) + medianRd1 = np.median(d1_RPositions) + medianRd2 = np.median(d2_RPositions) + meanQd1 = round(np.mean(d1_QPositions), 1) + meanQd2 = round(np.mean(d2_QPositions), 1) + medianQd1 = np.median(d1_QPositions) + medianQd2 = np.median(d2_QPositions) + resultList = [tuple(raceH2H),tuple(qualiH2H),tuple(pointsH2H),tuple(podiumsH2H),tuple(bestRace),tuple(bestQuali),tuple(dnfH2H), tuple(winsH2H), tuple(polesH2H), tuple(sprintWinsH2H), (-avg_racediff, avg_racediff), (-avg_qualidiff, avg_qualidiff), (meanRd1, meanRd2), (medianRd1, medianRd2), (meanQd1, meanQd2), (medianQd1, medianQd2)] conn.commit() conn.close() @@ -109,6 +146,10 @@ def fetch_Head2Head_team(teamID1, teamID2, year): d2_BestRace = 21 d1_BestQauli = 21 d2_BestQauli = 21 + d1_avgPace = [] + d2_avgPace = [] + d1_avgQPace = [] + d2_avgQPace = [] for gp in races: race = gp[0] drivers1 = cursor.execute("SELECT DISTINCT DriverID FROM Races_QualifyingResults WHERE RaceFormula = 1 AND RaceID = " + str(race) + " AND TeamID = " + str(teamID1[0])).fetchall() @@ -128,6 +169,12 @@ def fetch_Head2Head_team(teamID1, teamID2, year): qualiH2H[0]+= 1 elif(d1_QRes[0] > d2_QRes[0]): qualiH2H[1]+= 1 + minQ = d1_QStage[0] if d1_QStage[0] <= d2_QStage[0] else d2_QStage[0] + d1_qLap = cursor.execute("SELECT FastestLap FROM Races_QualifyingResults WHERE RaceFormula = 1 AND RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID IN " + str(drivers1) + " AND QualifyingStage = " + str(minQ)).fetchone() + d2_qLap = cursor.execute("SELECT FastestLap FROM Races_QualifyingResults WHERE RaceFormula = 1 AND RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID IN " + str(drivers2) + " AND QualifyingStage = " + str(minQ)).fetchone() + if(d1_qLap[0] != 0) and (d2_qLap[0] != 0): + d1_avgQPace.append(d1_qLap[0]) + d2_avgQPace.append(d2_qLap[0]) if(d1_QStage[0] == 3 and d1_QRes[0] == 1): polesH2H[0] += 1 if(d2_QStage[0] == 3 and d2_QRes[0] == 1): @@ -160,6 +207,13 @@ def fetch_Head2Head_team(teamID1, teamID2, year): dnfH2H[0] += d1_RDNF[0] if(d2_RDNF[0] > 0): dnfH2H[1] += d2_RDNF[0] + if (d1_RDNF[0] == 0) and (d2_RDNF[0] == 0): + d1_raceTotal = cursor.execute("SELECT AVG(Time) FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID IN " + str(drivers1)).fetchone() + d2_raceTotal = cursor.execute("SELECT AVG(Time) FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID IN " + str(drivers2)).fetchone() + d1_raceLaps = cursor.execute("SELECT AVG(Laps) FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID IN " + str(drivers1)).fetchone() + d2_raceLaps = cursor.execute("SELECT AVG(Laps) FROM Races_Results WHERE RaceID =" + str(race) + " AND Season = " + str(year[0]) + " AND DriverID IN " + str(drivers2)).fetchone() + d1_avgPace.append(round(d1_raceTotal[0] / d1_raceLaps[0], 3)) + d2_avgPace.append(round(d2_raceTotal[0] / d2_raceLaps[0], 3)) d1_SRes = cursor.execute("SELECT MIN(FinishingPos) FROM Races_Sprintresults WHERE RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID IN " + str(drivers1)).fetchone() d2_SRes = cursor.execute("SELECT MIN(FinishingPos) FROM Races_Sprintresults WHERE RaceID =" + str(race) + " AND SeasonID = " + str(year[0]) + " AND DriverID IN " + str(drivers2)).fetchone() if(d1_SRes != None): @@ -177,7 +231,13 @@ def fetch_Head2Head_team(teamID1, teamID2, year): bestRace[1] = d2_BestRace bestQuali[0] = d1_BestQauli bestQuali[1] = d2_BestQauli - resultList = [tuple(raceH2H),tuple(qualiH2H),tuple(pointsH2H),tuple(podiumsH2H),tuple(bestRace),tuple(bestQuali),tuple(dnfH2H), tuple(winsH2H), tuple(polesH2H), tuple(sprintWinsH2H)] + + rDifferences = [d2 - d1 for d1, d2 in zip(d1_avgPace, d2_avgPace)] + qDifferences = [d2 - d1 for d1, d2 in zip(d1_avgQPace, d2_avgQPace)] + avg_racediff = round(np.mean(rDifferences), 3) + avg_qualidiff = round(np.mean(qDifferences), 3) + + resultList = [tuple(raceH2H),tuple(qualiH2H),tuple(pointsH2H),tuple(podiumsH2H),tuple(bestRace),tuple(bestQuali),tuple(dnfH2H), tuple(winsH2H), tuple(polesH2H), tuple(sprintWinsH2H), (-avg_racediff, avg_racediff), (-avg_qualidiff, avg_qualidiff)] conn.commit() conn.close() diff --git a/front/index.html b/front/index.html index 9cc27483..74158610 100644 --- a/front/index.html +++ b/front/index.html @@ -179,10 +179,10 @@