rozbudowa serwera, i pliku modele.py

This commit is contained in:
unknown 2024-01-07 23:55:17 +01:00
parent ebedecbd4d
commit 4cbed48308
6 changed files with 210 additions and 150 deletions

View File

@ -17,28 +17,23 @@ const Hero = () => {
//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
let active_bbt = "bbt1";
let number_of_defenders = 0;
let number_of_strikers = 0;
let number_of_goalkeepers = 0;
var numer_od_shooters = 0;
var eX = " ";
const [number_of_defenders, setNumberOfDevenders] = useState(0);
const [number_of_strikers, setNumberOfStrikers] = useState(0)
const [number_of_goalkeepers, setNumberOfGoalkeppers] = useState(0);
const [number_of_shooters,setNumberOfShooters] = useState(0);
// zmienne globalne bedace danymi wejsciowymi do modelu
var shooterX = 12;
var shooterY = 12;
var shooter = [0,0]
var goalkeeper = [0,0]
var stricers = new Array;
var defenders = new Array;
var bodyPart = "";
var technique = "";
var actionType = "";
var shooterPossition = "";
const [bodyPart,setBodyPart] = useState('prawa');
const [technique,setTechnique] = useState('zwykly');
const [actionType,setActionType] = useState('pozycyjny');
const [shooterPossition,setPossition] = useState('napastnik');
//zamiana procentowych pozycji na kartezyjskie
function konwerturX(x){
@ -59,16 +54,6 @@ const Hero = () => {
document.getElementById(a).style.background = "#00CC66";
active_bbt = a
}
function changeLeg(a){
document.getElementById("bbt5").style.background = "#99FFCC";
document.getElementById("bbt6").style.background = "#99FFCC";
document.getElementById("bbt7").style.background = "#99FFCC";
document.getElementById("bbt8").style.background = "#99FFCC";
document.getElementById(a).style.background = "#00CC66";
Leg_bbt = a
}
// Reset Boiska
function resetField() {
@ -84,10 +69,10 @@ const Hero = () => {
players.forEach(function(element) {
list.removeChild(element);
})
number_of_defenders = 0
number_of_strikers = 0
number_of_goalkeepers = 0
numer_od_shooters = 0
setNumberOfDevenders(0);
setNumberOfStrikers(0)
setNumberOfGoalkeppers(0)
setNumberOfShooters(0)
}
@ -101,13 +86,13 @@ const Hero = () => {
list.removeChild(player)
bojo.removeChild(ball)
if(possition == 1){
number_of_goalkeepers = 0
setNumberOfGoalkeppers(0)
}else if(possition == 2){
number_of_defenders = number_of_defenders -1 ;
setNumberOfDevenders(number_of_defenders-1) ;
}else if (possition == 3){
number_of_strikers = number_of_strikers -1 ;
setNumberOfStrikers(number_of_strikers-1) ;
}else if(possition == 0){
numer_od_shooters = 0
setNumberOfShooters(0)
}
}
@ -115,21 +100,6 @@ const Hero = () => {
function loadPlayers(){
var players = document.querySelectorAll('.player')
//zgranie informacji z list
var bodyPartList = document.getElementById('bodyPartList')
var actionTypeList = document.getElementById('actionTypeList')
var possitionList = document.getElementById('possitionList')
var shootTypeList = document.getElementById('shootTypeList')
bodyPart = bodyPartList.getAttribute('value')
alert(bodyPart)
actionType = actionTypeList.value
shooterPossition = possitionList.value
technique = shootTypeList.value
// wyczyszczenie list zawierajacych lokalizacje zawodnikow
defenders = []
stricers = []
@ -260,15 +230,15 @@ const Hero = () => {
})
}
// // Wyłanie zapytania do serwera
function sentQuestion() {
///Dziwny Blad
loadPlayers()
alert(bodyPart)
if (numer_od_shooters > 0) {
if (number_of_shooters == 1) {
// Użyj backticksów zamiast zwykłych cudzysłowów
fetch(`http://127.0.0.1:5000/get_model?shooter=${shooter}&goalkeeper=${goalkeeper}&defenders=${defenders}&strickers=${stricers}&bodyPart=4${bodyPart}&technique=${technique}&actionType=${actionType}&shooterPossition=${shooterPossition}`).then(
fetch(`http://127.0.0.1:5000/get_model?shooter=${shooter}&goalkeeper=${goalkeeper}&defenders=${defenders}&strickers=${stricers}&bodyPart=${bodyPart}&technique=${technique}&actionType=${actionType}&shooterPossition=${shooterPossition}`).then(
res => res.json()
).then(
data => {
@ -307,11 +277,11 @@ const Hero = () => {
//dodanie zawodnika do listy oraz punktu do mapy w zaleznosci od aktywnosci przycisku 1,2,3 lub 4
if(active_bbt=="bbt1"){
if(numer_od_shooters < 1 ){
if(number_of_shooters < 1 ){
addPlayer(0,ball)
bojo.appendChild(ball)
ball.style.background = "#fc0303"
numer_od_shooters = numer_od_shooters + 1
setNumberOfShooters(number_of_shooters+1)
}else{alert("mozesz dodac tylko jednego strzelca")}
}else if(active_bbt == "bbt2"){
@ -319,19 +289,19 @@ const Hero = () => {
addPlayer(1,ball)
bojo.appendChild(ball)
ball.style.background = "#03e7fc"
number_of_goalkeepers = number_of_goalkeepers + 1
setNumberOfGoalkeppers(number_of_goalkeepers+1)
}else{alert("mozesz dodac tylko jednego bramkarza")}
}else if(active_bbt == "bbt3"){
if(number_of_defenders <= 10){
addPlayer(2,ball);
number_of_defenders = number_of_defenders +1;
setNumberOfDevenders(number_of_defenders+1)
bojo.appendChild(ball)
ball.style.background = "#0324fc"
}else{alert("maksymalna liczba obroncow")}
}else if(active_bbt == "bbt4"){
if(number_of_strikers <= 10){
addPlayer(3,ball);
number_of_strikers = number_of_strikers + 1;
setNumberOfStrikers(number_of_strikers+1);
bojo.appendChild(ball)
ball.style.background = "#fc6703"
}else{alert("maksymalna liczba napastnikow")}
@ -369,17 +339,22 @@ const Hero = () => {
<div className="top-bar">
<form className="dropdown" id = "bodyPartList">
<select className="dropbtn">
<select className="dropbtn"
onChange={event => setBodyPart(event.target.value)}
defaultValue={bodyPart}>
<option value = "prawa">Noga Prawa</option>
<option value = "lewa">Noga Lewa</option>
<option value = "glowa">Głowa</option>
<option value = "inna" >Inna</option>
</select>
</select>
</form>
<form className="dropdown" id = "shootTypeList">
<select className="dropbtn">
<select className="dropbtn" onChange={event => setTechnique(event.target.value)}
defaultValue = {technique}>
<option value="zwykly"> Zwykły </option>
<option value = "voley"> Wolej </option>
<option value = "pol-voley"> Półwolej </option>
@ -390,8 +365,8 @@ const Hero = () => {
</select>
</form>
<form className="dropdown" id = "actionTypeList">
<form className="dropdown" id = "actionTypeList" onChange={event => setActionType(event.target.value)}
defaultValue={technique}>
<select className="dropbtn">
<option value = "pozycyjny"> Atak Pozycyjny </option>
<option value = "wolny"> Rzut Wolny </option>
@ -400,9 +375,9 @@ const Hero = () => {
<option value="rozpoczecie"> Rozpoczęcie </option>
</select>
</form>
<form className="dropdown" id = "possitionList">
<form className="dropdown" id = "possitionList"
onChange={event => setPossition(event.target.value)}
defaultValue={shooterPossition}>
<select className="dropbtn">
<option value= "napastnik" > Napastnik </option>
<option value = "bramkarz"> Bramkarz </option>

View File

@ -1,6 +1,7 @@
from joblib import load
import pandas as pd
from math import sqrt
import math
# Funkcja zwraca prawdopodobieństwo zdobycia gola
def LogisticRegression_predict_proba(position_x, position_y, distance_to_goalM, angle, match_minute, Number_Intervening_Opponents, Number_Intervening_Teammates, isFoot, isHead):
@ -89,25 +90,22 @@ def xgboost_predict_proba(minute, position_name, shot_body_part_name, shot_techn
#XgBoost_2
def xgboost_predict_proba_v2(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):
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',
def xgboost_predict_proba_v2(shooter,goalkeeper,teamMatesList,opponentsList, minute,position_name,shot_body_part_name,
shot_technique_name,shot_type_name,shot_first_time,shot_aerial_won,shot_deflected,shot_open_goal,
shot_follows_dribble,shot_redirect, 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_1', 'x_player_opponent_2','x_player_opponent_3',
'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_1',
'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',
@ -120,32 +118,100 @@ def xgboost_predict_proba_v2(minute, position_name, shot_body_part_name, shot_te
'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,
shooter = konwertujDoListy(shooter)
teamMatesList = konwertujDoListy(teamMatesList)
opponentsList = konwertujDoListy(opponentsList)
goalkeeper = konwertujDoListy(goalkeeper)
# obliczenie katu oraz odleglosci
angle = loc2angle(x = shooter[0], y = shooter[1])
print("kat: " + str(angle))
distance = loc2distance(x = shooter[0], y = shooter[1])
print("dystans: " + str(distance))
#Sortowanie list zawodnikow
teamMatesList = sortNearestToShooter(teamMatesList,shooter= shooter)
opponentsList = sortNearestToShooter(opponentsList, shooter=shooter)
# Obliczenie ilosci zawosników
teamMatesList = zmienWMaciez(teamMatesList)
opponentsList = zmienWMaciez(opponentsList)
number_of_players_opponents = len(teamMatesList)
number_of_players_teammates = len(opponentsList)
# Bramkarz
x_player_opponent_Goalkeeper = goalkeeper[0]
y_player_opponent_Goalkeeper = goalkeeper[1]
# Uproszczona funkcja trzeba rozbudowac
shot_one_on_one = True if number_of_players_opponents == 1 else False
# TeamMate goalkeppe
x_player_teammate_Goalkeeper = None
y_player_teammate_Goalkeeper = None
#Reszta Zawodnikow
print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
print(X_new.head)
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,
shooter[0], shooter[1],number_of_players_opponents,
number_of_players_teammates,angle, distance,
x_player_opponent_Goalkeeper,
opponentsList[0][0], opponentsList[1][0], opponentsList[2][0],
opponentsList[3][0], opponentsList[4][0], opponentsList[5][0],
opponentsList[6][0], opponentsList[7][0], teamMatesList[8][0],
opponentsList[9][0], opponentsList[10][0],
teamMatesList[0][0], teamMatesList[1][0], teamMatesList[2][0],
teamMatesList[3][0], teamMatesList[4][0], teamMatesList[5][0],
teamMatesList[6][0], teamMatesList[7][0],teamMatesList[8][0],
teamMatesList[9][0],
y_player_opponent_Goalkeeper,
opponentsList[0][1], opponentsList[1][1], opponentsList[2][1],
opponentsList[3][1], opponentsList[4][1],opponentsList[5][1],
opponentsList[6][1], opponentsList[7][1], opponentsList[8][1],
opponentsList[9][1], opponentsList[10][1],
teamMatesList[0][1],teamMatesList[1][1], teamMatesList[2][1],
teamMatesList[4][1],teamMatesList[5][1], teamMatesList[6][1], teamMatesList[7][1],
teamMatesList[8][1], teamMatesList[9][1],
x_player_teammate_Goalkeeper, y_player_teammate_Goalkeeper,
shot_kick_off]
return model.predict_proba(X_new)[0][1].round(2)
return model.predict_proba(X_new)[0][1].round(2)
# Pomocnicze Funkcje
def sortNearestToShooter(playerList, shooter):
return playerList
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)
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 konwertujDoListy(listaString):
listaString = listaString.split(",")
listaFloat = []
for elem in listaString:
listaFloat.append(float(elem))
return listaFloat
def zmienWMaciez(lista):
maciez = []
for i in range(0,len(lista),2):
player = [lista[i],lista[i+1]]
maciez.append(player)
if(len(maciez) < 10):
for i in range(len(maciez),11,1):
maciez.append([None,None])
return maciez

View File

@ -0,0 +1,48 @@
from modele import zmienWMaciez,xgboost_predict_proba_v2,konwertujDoListy
#zmien maciez test
'''
lista = [2,3,43,12,323,12,23,43,54,90]
print(zmienWMaciez(lista))
lista = zmienWMaciez(lista)
print(lista[3][0])
print(lista[3][1])
print(lista[0][0])
'''
'''
string = "49.27,49.73,48.49,34.75,19.95,28.44"
string = konwertujDoListy(string)
print(string)
print(string[3])
string = zmienWMaciez(string)
print(string)
'''
'''
a = ['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_1', 'x_player_opponent_2','x_player_opponent_3', '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_1'
'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(len(a))
'''

View File

@ -1,32 +1,12 @@
from flask import Flask, request, jsonify
from flask_cors import CORS
from modele.modele import LogisticRegression_predict_proba, xgboost_predict_proba, xgboost_predict_proba_v2
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)
#Konwertuje string zawierajacy liczby odzielone , i konwertuje do float
def konwertujDoListy(listaString):
listaString = listaString.split(",")
listaFloat = []
for elem in listaString:
listaFloat.append(float(elem))
return listaFloat
# zapytanie o regresje logistyczną na podstawie pozycji piłki
# @app.route("/LRegresion<x>&<y>")
@ -35,21 +15,13 @@ def get_model():
# Pozycja strzelca
shooter = request.args.get('shooter')
shooter = konwertujDoListy(shooter)
print("wprowadzone dane:")
print("x strzelca: " + str(shooter[0]))
print("y strzelca: " + str(shooter[1]))
print("strzelec: " + shooter)
if shooter[0] is None and shooter[1] is None:
return jsonify({"error": "Brak wymaganych parametrów"}), 400
# Kąt oraz dystans od bramki
angle = loc2angle(x = shooter[0], y = shooter[1])
dist = loc2distance(x = shooter[0], y = shooter[1])
print("kąt: " + str(angle))
print("dystans: " + str(dist) )
# Elementy z list: czesc ciała,rodzaj uderzenia,pozycja strzelca oraz typ akcji
position_name = request.args.get('shooter')
@ -66,28 +38,27 @@ def get_model():
teamMatesList = request.args.get('defenders')
opponentsList = request.args.get('strickers')
teamMatesList = konwertujDoListy(teamMatesList)
opponentsList = konwertujDoListy(opponentsList)
print("wspolrzedne obroncow: " + teamMatesList)
print("wspolrzedne przeciwnikow: " + opponentsList)
# Bramkarz
goalkepper = request.args.get('goalkeeper')
goalkepper = konwertujDoListy(goalkepper)
goalkepper = "2,2"
#goalkepper = request.args.get('goalkeeper')
print("bramkarz: " + str(goalkepper) )
response = xgboost_predict_proba_v2(minute = 20, position_name = position_name, shot_body_part_name = body_part, shot_technique_name = technique,
response = xgboost_predict_proba_v2(shooter = shooter,
opponentsList = opponentsList, teamMatesList = teamMatesList ,minute = 20, position_name = position_name, shot_body_part_name = body_part, shot_technique_name = technique,
shot_type_name = acionType, shot_first_time = False,
shot_aerial_won = False, shot_deflected = False, shot_open_goal = False,
shot_follows_dribble = False, shot_redirect = False, shooter = shooter,
opponentsList = opponentsList, teamMatesList = teamMatesList,
angle = angle, distance = dist)
shot_follows_dribble = False, shot_redirect = False, shot_kick_off = False, goalkeeper= goalkepper
)
#print(response)
res = str(response)
#return {"response":res}
#return {"response":res}
return jsonify({"response":res})
""""

Binary file not shown.