From 599a4ce2522a188d4b8400ec8fa6e167037375a8 Mon Sep 17 00:00:00 2001 From: LukaszChrostowski Date: Fri, 5 Jan 2024 22:00:31 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Praca=20nad=20integracj=C4=85=20backendu=20?= =?UTF-8?q?z=20frontendem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes app/package.json | 2 +- app/src/components/Hero.jsx | 18 ++++++----- .../modele/__pycache__/modele.cpython-39.pyc | Bin 817 -> 959 bytes app/src/flask-server/modele/modele.py | 5 +++ app/src/flask-server/server.py | 29 ++++++++++-------- 6 files changed, 32 insertions(+), 22 deletions(-) diff --git a/.DS_Store b/.DS_Store index fe13f732f99701c649b4849676d8df95bcbb8a9e..471757c8538ea6662d7215966888395f09d64d9a 100644 GIT binary patch delta 23 ecmZp1XmQwZLxj!PKu5vIeDXy>hs|=L&$s|!mIuxN delta 16 XcmZp1XmQwZLuB$^0k_R^qR+ShJPQV) 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 1912757..52997f7 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 @@ -107,10 +107,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'); @@ -201,13 +201,11 @@ const Hero = () => { }) } - - - // Wyłanie zapytania do serwera + // // Wyłanie zapytania do serwera function sentQuestion() { var ball = document.querySelector('.football'); if (ball) { - fetch("http://localhost:5173/LRegresion" + shooterX + "&" + shooterY).then( + fetch("http://127.0.0.1:5000/get_model").then( res=> res.json() ).then( data => { @@ -222,6 +220,10 @@ const Hero = () => { } } + + + + /* Funkcja dodająca listener do boiska*/ function boiskoListener(ev){ ev.preventDefault() @@ -408,7 +410,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 42df94f8582bf1b6c508a74a981fe67ab445913e..70e987484f0594367d788ce8fa68e684d78bdb7c 100644 GIT binary patch delta 333 zcmdnUwx69hk(ZZ?0SNqaXQVEg$ScceGErMcm@S39g&~SPg(;Xplj9{we&xobct$oB zAghRZ@^MBRHZ~BGeKH@DtTZ2p$pIv8vF7Hdq~=7iM#Sf(mak+e5})kIG`U_9D3uJv zaKH#;F#)kN5Et_Ri4uks#%9J^h7<;%g-m``d==?Q`T4~qdRh5NIhjdCAjO)DMPfjz zNE}W`09m(0p-STmic(WDlS_bfeo~?!P^uWDi-D;qMG8o1azwE~4Pyp!qu2@(^HLIv yi$Dr*vE(L}WE6ot2Xbo>NCT2RU>m`fao7MoSelb+2l7EN$jdy89E?279NYk1i9!kh delta 190 zcmdnbzLAYLk(ZZ?0SHRx^`wSP2*s}7Iax#;O zm_RDo3KH{D5{rujfSg+_xrrqiMPS20YKufs2{Diw4jZ7^r8%i~j6hy7$YLHw4n`hk E0Q_SnEC2ui diff --git a/app/src/flask-server/modele/modele.py b/app/src/flask-server/modele/modele.py index 65fad96..60891f6 100644 --- a/app/src/flask-server/modele/modele.py +++ b/app/src/flask-server/modele/modele.py @@ -13,3 +13,8 @@ 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(): + + model = load('xgboost.joblib') + diff --git a/app/src/flask-server/server.py b/app/src/flask-server/server.py index a19df12..c3336e2 100644 --- a/app/src/flask-server/server.py +++ b/app/src/flask-server/server.py @@ -5,32 +5,35 @@ from modele.modele import LogisticRegression_predict_proba app = Flask(__name__) CORS(app) +app.config['CORS_HEADERS'] = 'Content-Type' # model Api -@app.route("/members") -def members(): - return{"members":["Member1","Member2","Member3"]} +# @app.route("/members") +# def members(): +# return{"members":["Member1","Member2","Member3"]} # zapytanie o regresje logistyczną na podstawie pozycji piłki -@app.route("/LRegresion&") -def LRegresion(x,y): +# @app.route("/LRegresion&") +@app.route("/get_model") +def get_model(): - x = int(x[0:2]) - y = int(y[0:2]) + #x = int(x[0:2]) + #y = int(y[0:2]) - response = LogisticRegression_predict_proba(position_x=x, - position_y=y, + response = LogisticRegression_predict_proba(position_x=5, + position_y=5, angle = 13.67, 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} # uruchomienie serwera if __name__ == "__main__": From 6cb9ffc781ae67f8cedd31850dda36d37edff3d0 Mon Sep 17 00:00:00 2001 From: LukaszChrostowski Date: Sat, 6 Jan 2024 11:27:58 +0100 Subject: [PATCH 2/3] =?UTF-8?q?Dalsza=20praca=20nad=20integracj=C4=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/components/Hero.jsx | 39 ++++++++++++++++++++++------------ app/src/flask-server/server.py | 22 +++++++++++++------ 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/app/src/components/Hero.jsx b/app/src/components/Hero.jsx index 52997f7..278bf7d 100644 --- a/app/src/components/Hero.jsx +++ b/app/src/components/Hero.jsx @@ -190,6 +190,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 @@ -204,20 +206,29 @@ const Hero = () => { // // Wyłanie zapytania do serwera function sentQuestion() { var ball = document.querySelector('.football'); - if (ball) { - fetch("http://127.0.0.1:5000/get_model").then( - res=> res.json() - ).then( - data => { - setData(data) - console.log(data) - } - ) - eX = data.response - document.getElementById("ex").innerHTML = "Współczynnik xG: "+ eX - } else { - alert('Piłka nie jest obecnie na boisku.'); - } + + 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.'); + } } diff --git a/app/src/flask-server/server.py b/app/src/flask-server/server.py index c3336e2..c8beb7c 100644 --- a/app/src/flask-server/server.py +++ b/app/src/flask-server/server.py @@ -1,4 +1,4 @@ -from flask import Flask +from flask import Flask, request, jsonify from flask_cors import CORS from modele.modele import LogisticRegression_predict_proba @@ -15,14 +15,21 @@ app.config['CORS_HEADERS'] = 'Content-Type' # zapytanie o regresje logistyczną na podstawie pozycji piłki # @app.route("/LRegresion&") -@app.route("/get_model") +@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 - response = LogisticRegression_predict_proba(position_x=5, - position_y=5, + 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, match_minute=13, Number_Intervening_Opponents=3, @@ -33,7 +40,8 @@ def get_model(): #print(y) #print(response) res = str(response) - return {"response":res} + #return {"response":res} + return jsonify({"response":res}) # uruchomienie serwera if __name__ == "__main__": From 0b5e2681184a215a830217fb15fc4be882e06e8c Mon Sep 17 00:00:00 2001 From: LukaszChrostowski Date: Sat, 6 Jan 2024 14:52:25 +0100 Subject: [PATCH 3/3] =?UTF-8?q?Dlasza=20praca=20nad=20logik=C4=85=20oblicz?= =?UTF-8?q?eniow=C4=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes .../modele/__pycache__/modele.cpython-39.pyc | Bin 959 -> 2823 bytes app/src/flask-server/modele/modele.py | 78 +++++++++++++++++- app/src/flask-server/server.py | 67 ++++++++++++++- notebooks/dataCleaning.R | 4 +- 5 files changed, 142 insertions(+), 7 deletions(-) diff --git a/.DS_Store b/.DS_Store index 471757c8538ea6662d7215966888395f09d64d9a..fe13f732f99701c649b4849676d8df95bcbb8a9e 100644 GIT binary patch delta 16 XcmZp1XmQwZLuB$^0k_R^qR+ShJPQV) delta 23 ecmZp1XmQwZLxj!PKu5vIeDXy>hs|=L&$s|!mIuxN 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 70e987484f0594367d788ce8fa68e684d78bdb7c..1b53ba2fb8bf524983480e9574d766f190000aaf 100644 GIT binary patch literal 2823 zcmZveS$ES$6vrj+Sqxz(B$TjYmYA@GB`gV)rG?P4wAAf6I%8?a_azwrV0(pW%PUS>@5^54gN=5SSKrJ?-j+OGXHFp6eysZL zn~=?~i)P?AYh!vm60xs*5jq>Gd|z+#uq_K+?kM531q&YOA`9CA*OOhQ+%>1`hdssh z>}s#uOMMBt?_yq7=Q*t4+uP zc9um#iBKj~2;_fB!60ch9TvZF*QAJ* zcpZ2A`W+s3l!)pr7AiJyFGq(3yw0Mi9!t003Rv7ZgWX?oSx*M%!(=|{>$!)?viR* z3v7ic*aq8S2keAhup9QkUYLe`Faxu&AHISEFb4iVG@OBX zsKZ%UfOBvjF2F^&1dDJPuE15e21{@qZoo~r)n0~`By?AXp}UNsyOJHcTQ=HFfsWpc z)@5B9MqSlJZAgKzBVH5AX$r6JL`*6tB`WT&h5pMPABbC$mZ~2O%UhFj%a^fol#fFV z1PosX*8!8Ez_|2T;Jg;09t`2}R={1wyaj1OWz!<4M2S#9dQOR0>at z-E?kaLFf7ldL|rfAJKB6fb}uN9AS1(My1-^JV_Ai%H}TBvm3(!On>Jd?%EFL5tn+$ zXzk@JaUn}QmnEK0iJL|_ncXj>T5itGxtJwhN{MF7%&%Y3J4a`avh?$lyW|^OMv+15T--u}bEXHpV1=))@T8pEPia6m>5#2Z{q8E(#*^ZQG)(c%@ zS{e~uGb*BMjA+Kp{5pEUv@~PVB4()RIhj#2%}-luTBa>EVy30Ii01RAW!lX~Oq*{+ zG(Tgnr3W=LT}bb$C_Lr(BUTU5WXhdCEO$2Cp;j0L->~Pkno7GN_b58 zj_^H!Zd>vx;ThpM;RnKxgcpRL2o1u|ggu141iB6kun%*3*YJ$`^2{dJ$24PWFP_=> zmhe}x3rR}(!LN{^`My^Dcv?Z0A)TJR!X|)~cc6DJO z%?Z?qbY_-x=fI2#VP=KQYzA|i@$~1jiUV0e96j~=2?sQ+ z6g-FPC|pawpmuJm&{A*|)Ytfq!mdJ2A+KN~GNTu>Flrb#&3^d2B)pWK(bw^M9rS?O zum>l=E9eaHZjWlJ#=F3qsImfgf*T-=;Ow+M%)hi-ah!&") @app.route("/get_model", methods = ['GET']) +# 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 = 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]) @@ -25,12 +84,16 @@ def get_model(): ## 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, 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 ##############################