diff --git a/app/package.json b/app/package.json index 3f606a2..d9e8e00 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "react_bs_web", "private": true, - "proxy": "http://localhost:5173", + "proxy": "http://127.0.0.1:5000/", "version": "0.0.0", "type": "module", "scripts": { diff --git a/app/src/components/Hero.jsx b/app/src/components/Hero.jsx index 4f2f4cd..0a00563 100644 --- a/app/src/components/Hero.jsx +++ b/app/src/components/Hero.jsx @@ -10,7 +10,7 @@ const Hero = () => { const toggleDropdown = () => setIsOpen(!isOpen); const handleMinuteChange = (e) => setGameMinute(e.target.value); - const [data,setData] = useState([{}]) + const [data, setData] = useState(""); //zmienne globalne //zmienna mówiąca który przycisk jest aktywny, jest ona wykorzystywana //przez listener nanoszący zawodników na boisko. 1 - strzelec , 2 - bramkarz , 3 - obronca, 4 - napasnik. zmienna przez aktywacje przycskówk bb1, bb2, bb3 i bb4 @@ -108,10 +108,10 @@ const Hero = () => { var pName = "Bramkarz" var pColor = "#03e7fc" }else if(possition == 2){ - var pName = "Napastnik" + var pName = "Obrońca" var pColor = "#0324fc" }else if (possition ==3){ - var pName = "Obrońca" + var pName = "Napastnik" var pColor = "#fc6703" } var player = document.createElement('div'); @@ -189,6 +189,8 @@ const Hero = () => { ball.style.left = x + "%" ball.style.top = y + "%" } + //var shooterX = konwerturX(ball.style.left) + //var shooterY = konwetujY(ball.style.top) posytion.innerHTML = "x:" + konwerturX(ball.style.left) + "m " + "y:" + konwetujY(ball.style.top) + "m"; bojo.addEventListener("mouseup", function(){ ball.style.background = pColor @@ -200,22 +202,38 @@ const Hero = () => { }) } - - - // Wyłanie zapytania do serwera + // // Wyłanie zapytania do serwera function sentQuestion() { - if (numer_od_shooters > 0) { - fetch("http://localhost:5173/members").then - (res => res.json()).then(res => { - let token = res.token; - console.log("token: ", token); - }) - eX = data.response - } else { - alert('Piłka nie jest obecnie na boisku.'); - } + var ball = document.querySelector('.football'); + + if (ball) { + // Użyj backticksów zamiast zwykłych cudzysłowów + //console.log('Wysyłanie wartości: ', ball); + shooterX = konwerturX(ball.style.left) + shooterY = konwetujY(ball.style.top) + console.log('Wysyłanie wartości: ', shooterX, shooterY); + fetch(`http://127.0.0.1:5000/get_model?x=${shooterX}&y=${shooterY}`).then( + res => res.json() + ).then( + data => { + setData(data); + console.log(data); + // Przenieś tę linię do środka bloku .then(), aby uniknąć błędów + let eX = data.response; + document.getElementById("ex").innerHTML = "Współczynnik xG: " + eX; + } + ).catch(error => { + console.error('Błąd:', error); + }); + } else { + alert('Piłka nie jest obecnie na boisku.'); + } } + + + + /* Funkcja dodająca listener do boiska*/ function boiskoListener(ev){ ev.preventDefault() @@ -402,7 +420,7 @@ const Hero = () => {
- +
diff --git a/app/src/flask-server/modele/__pycache__/modele.cpython-39.pyc b/app/src/flask-server/modele/__pycache__/modele.cpython-39.pyc index 42df94f..1b53ba2 100644 Binary files a/app/src/flask-server/modele/__pycache__/modele.cpython-39.pyc and b/app/src/flask-server/modele/__pycache__/modele.cpython-39.pyc differ diff --git a/app/src/flask-server/modele/modele.py b/app/src/flask-server/modele/modele.py index 65fad96..2a2bd25 100644 --- a/app/src/flask-server/modele/modele.py +++ b/app/src/flask-server/modele/modele.py @@ -3,9 +3,9 @@ import pandas as pd from math import sqrt # Funkcja zwraca prawdopodobieństwo zdobycia gola -def LogisticRegression_predict_proba(position_x, position_y, angle, match_minute, Number_Intervening_Opponents, Number_Intervening_Teammates, isFoot, isHead): +def LogisticRegression_predict_proba(position_x, position_y, distance_to_goalM, angle, match_minute, Number_Intervening_Opponents, Number_Intervening_Teammates, isFoot, isHead): - distance_to_goalM = sqrt(( (position_x**2) + (position_y**2))) + # distance_to_goalM = sqrt(( (position_x**2) + (position_y**2))) model = load('regresja_logistyczna.joblib') X_new = pd.DataFrame(columns=['position_x', 'position_y', 'distance_to_goalM', 'angle','match_minute', 'Number_Intervening_Opponents','Number_Intervening_Teammates', 'isFoot', 'isHead']) @@ -13,3 +13,80 @@ def LogisticRegression_predict_proba(position_x, position_y, angle, match_minute return model.predict_proba(X_new)[0][1].round(2) #kolejne modele + +def xgboost_predict_proba(minute, position_name, shot_body_part_name, shot_technique_name, + shot_type_name, shot_first_time, shot_one_on_one, + shot_aerial_won, shot_deflected, shot_open_goal, + shot_follows_dribble, shot_redirect, x1, y1, + number_of_players_opponents, number_of_players_teammates, + angle, distance, x_player_opponent_Goalkeeper, + x_player_opponent_8, x_player_opponent_1, x_player_opponent_2, + x_player_opponent_3, x_player_teammate_1, x_player_opponent_4, + x_player_opponent_5, x_player_opponent_6, x_player_teammate_2, + x_player_opponent_9, x_player_opponent_10, x_player_opponent_11, + x_player_teammate_3, x_player_teammate_4, x_player_teammate_5, + x_player_teammate_6, x_player_teammate_7, x_player_teammate_8, + x_player_teammate_9, x_player_teammate_10, + y_player_opponent_Goalkeeper, y_player_opponent_8, + y_player_opponent_1, y_player_opponent_2, y_player_opponent_3, + y_player_teammate_1, y_player_opponent_4, y_player_opponent_5, + y_player_opponent_6, y_player_teammate_2, y_player_opponent_9, + y_player_opponent_10, y_player_opponent_11, y_player_teammate_3, + y_player_teammate_4, y_player_teammate_5, y_player_teammate_6, + y_player_teammate_7, y_player_teammate_8, y_player_teammate_9, + y_player_teammate_10, x_player_opponent_7, y_player_opponent_7, + x_player_teammate_Goalkeeper, y_player_teammate_Goalkeeper, + shot_kick_off): + + model = load('xgboost.joblib') + X_new = pd.DataFrame(columns=['minute', 'position_name', 'shot_body_part_name', 'shot_technique_name', + 'shot_type_name', 'shot_first_time', 'shot_one_on_one', + 'shot_aerial_won', 'shot_deflected', 'shot_open_goal', + 'shot_follows_dribble', 'shot_redirect', 'x1', 'y1', + 'number_of_players_opponents', 'number_of_players_teammates', + 'angle', 'distance', 'x_player_opponent_Goalkeeper', + 'x_player_opponent_8', 'x_player_opponent_1', 'x_player_opponent_2', + 'x_player_opponent_3', 'x_player_teammate_1', 'x_player_opponent_4', + 'x_player_opponent_5', 'x_player_opponent_6', 'x_player_teammate_2', + 'x_player_opponent_9', 'x_player_opponent_10', 'x_player_opponent_11', + 'x_player_teammate_3', 'x_player_teammate_4', 'x_player_teammate_5', + 'x_player_teammate_6', 'x_player_teammate_7', 'x_player_teammate_8', + 'x_player_teammate_9', 'x_player_teammate_10', + 'y_player_opponent_Goalkeeper', 'y_player_opponent_8', + 'y_player_opponent_1', 'y_player_opponent_2', 'y_player_opponent_3', + 'y_player_teammate_1', 'y_player_opponent_4', 'y_player_opponent_5', + 'y_player_opponent_6', 'y_player_teammate_2', 'y_player_opponent_9', + 'y_player_opponent_10', 'y_player_opponent_11', 'y_player_teammate_3', + 'y_player_teammate_4', 'y_player_teammate_5', 'y_player_teammate_6', + 'y_player_teammate_7', 'y_player_teammate_8', 'y_player_teammate_9', + 'y_player_teammate_10', 'x_player_opponent_7', 'y_player_opponent_7', + 'x_player_teammate_Goalkeeper', 'y_player_teammate_Goalkeeper', + 'shot_kick_off']) + + X_new.loc[len(X_new.index)] = [minute, position_name, shot_body_part_name, shot_technique_name, + shot_type_name, shot_first_time, shot_one_on_one, + shot_aerial_won, shot_deflected, shot_open_goal, + shot_follows_dribble, shot_redirect, x1, y1, + number_of_players_opponents, number_of_players_teammates, + angle, distance, x_player_opponent_Goalkeeper, + x_player_opponent_8, x_player_opponent_1, x_player_opponent_2, + x_player_opponent_3, x_player_teammate_1, x_player_opponent_4, + x_player_opponent_5, x_player_opponent_6, x_player_teammate_2, + x_player_opponent_9, x_player_opponent_10, x_player_opponent_11, + x_player_teammate_3, x_player_teammate_4, x_player_teammate_5, + x_player_teammate_6, x_player_teammate_7, x_player_teammate_8, + x_player_teammate_9, x_player_teammate_10, + y_player_opponent_Goalkeeper, y_player_opponent_8, + y_player_opponent_1, y_player_opponent_2, y_player_opponent_3, + y_player_teammate_1, y_player_opponent_4, y_player_opponent_5, + y_player_opponent_6, y_player_teammate_2, y_player_opponent_9, + y_player_opponent_10, y_player_opponent_11, y_player_teammate_3, + y_player_teammate_4, y_player_teammate_5, y_player_teammate_6, + y_player_teammate_7, y_player_teammate_8, y_player_teammate_9, + y_player_teammate_10, x_player_opponent_7, y_player_opponent_7, + x_player_teammate_Goalkeeper, y_player_teammate_Goalkeeper, + shot_kick_off] + return model.predict_proba(X_new)[0][1].round(2) + + + diff --git a/app/src/flask-server/server.py b/app/src/flask-server/server.py index 8c2f185..9f81fa5 100644 --- a/app/src/flask-server/server.py +++ b/app/src/flask-server/server.py @@ -1,36 +1,116 @@ -from flask import Flask +from flask import Flask, request, jsonify from flask_cors import CORS -from modele.modele import LogisticRegression_predict_proba +from modele.modele import LogisticRegression_predict_proba, xgboost_predict_proba +import math app = Flask(__name__) CORS(app) +app.config['CORS_HEADERS'] = 'Content-Type' + +def loc2angle(x, y): + rads = math.atan(7.32 * x / (x**2 + (y - 34)**2 - (7.32/2)**2)) + rads = math.pi + rads if rads < 0 else rads + deg = math.degrees(rads) + return deg + +def loc2distance(x, y): + return math.sqrt(x**2 + (y - 34)**2) + +def loc2locdistance(x1, y1, x2, y2): + return math.sqrt((x1 - x2)**2 + (y1 - y2)**2) + # model Api +<<<<<<< HEAD @app.route("/members") def members(): return "dnjss" +======= +# @app.route("/members") +# def members(): +# return{"members":["Member1","Member2","Member3"]} +>>>>>>> 0b5e2681184a215a830217fb15fc4be882e06e8c # zapytanie o regresje logistyczną na podstawie pozycji piłki -@app.route("/LRegresion&") -def LRegresion(x,y): +# @app.route("/LRegresion&") +@app.route("/get_model", methods = ['GET']) +# def get_model(): - x = int(x[0:2]) - y = int(y[0:2]) +# # x = int(x[0:2]) +# # y = int(y[0:2]) +# x = request.args.get('x', type=float) +# y = request.args.get('y', type=float) +# ## change model on xgboost +# ## add angle, match minutes and number of players + +# angle = loc2angle(x = x, y = y) +# dist = loc2distance(x = x, y = y) + +# if y is None and x is None: +# return jsonify({"error": "Brak wymaganych parametrów"}), 400 + +# response = xgboost_predict_proba(minute = 20, position_name, shot_body_part_name, shot_technique_name, +# shot_type_name, shot_first_time, shot_one_on_one, +# shot_aerial_won, shot_deflected, shot_open_goal, +# shot_follows_dribble, shot_redirect, x1 = x, y1 = y, +# number_of_players_opponents, number_of_players_teammates, +# angle = angle, distance = dist, x_player_opponent_Goalkeeper, +# x_player_opponent_8, x_player_opponent_1, x_player_opponent_2, +# x_player_opponent_3, x_player_teammate_1, x_player_opponent_4, +# x_player_opponent_5, x_player_opponent_6, x_player_teammate_2, +# x_player_opponent_9, x_player_opponent_10, x_player_opponent_11, +# x_player_teammate_3, x_player_teammate_4, x_player_teammate_5, +# x_player_teammate_6, x_player_teammate_7, x_player_teammate_8, +# x_player_teammate_9, x_player_teammate_10, +# y_player_opponent_Goalkeeper, y_player_opponent_8, +# y_player_opponent_1, y_player_opponent_2, y_player_opponent_3, +# y_player_teammate_1, y_player_opponent_4, y_player_opponent_5, +# y_player_opponent_6, y_player_teammate_2, y_player_opponent_9, +# y_player_opponent_10, y_player_opponent_11, y_player_teammate_3, +# y_player_teammate_4, y_player_teammate_5, y_player_teammate_6, +# y_player_teammate_7, y_player_teammate_8, y_player_teammate_9, +# y_player_teammate_10, x_player_opponent_7, y_player_opponent_7, +# x_player_teammate_Goalkeeper, y_player_teammate_Goalkeeper, +# shot_kick_off) +# #print(x) +# #print(y) +# #print(response) +# res = str(response) +# #return {"response":res} +# return jsonify({"response":res}) + +def get_model(): + + # x = int(x[0:2]) + # y = int(y[0:2]) + x = request.args.get('x', type=float) + y = request.args.get('y', type=float) + ## change model on xgboost + ## add angle, match minutes and number of players + + angle = loc2angle(x = x, y = y) + dist = loc2distance(x = x, y = y) + + if y is None and x is None: + return jsonify({"error": "Brak wymaganych parametrów"}), 400 response = LogisticRegression_predict_proba(position_x=x, position_y=y, - angle = 13.67, + distance_to_goalM = dist, + angle = angle, match_minute=13, Number_Intervening_Opponents=3, Number_Intervening_Teammates=0, isFoot=1, isHead=0) - print(x) - print(y) - print(response) - return {"response":[str(response)]} + #print(x) + #print(y) + #print(response) + res = str(response) + #return {"response":res} + return jsonify({"response":res}) # uruchomienie serwera if __name__ == "__main__": diff --git a/notebooks/dataCleaning.R b/notebooks/dataCleaning.R index 43c3888..29aa883 100644 --- a/notebooks/dataCleaning.R +++ b/notebooks/dataCleaning.R @@ -114,7 +114,7 @@ loc2angle <- function(x, y) { # distance to goal loc2distance <- function(x, y) { - sqrt(x^2 + y^2) + sqrt(x^2 + (y - 34)^2) } # distance between two points on the pitch @@ -345,5 +345,5 @@ cols <- names(data3_final)[grepl(pattern, names(data3_final))] data_final <- data3_final %>% unnest(all_of(cols)) skimr::skim(data_final) write_csv(data_final, file = "data/final_data.csv") -# df_test <- read.csv("data/final_data.csv", nrows = 100) +df_test <- read.csv("data/final_data.csv", nrows = 1000) ##################### The fourth dataset ##############################