Compare commits

...

14 Commits

26 changed files with 320144 additions and 38667 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
.RData Normal file

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
# Analiza piłkarska z aplikacją `CoachStats`
# Aplikacja `CoachStats`
## Wstęp
@ -9,21 +9,18 @@ CoachStats to innowacyjne narzędzie służące do analizowania statystyk Expect
- **Analiza XG:** Analiza XG dla danej sytuacji meczowej.
- **Personalizowana makieta:** Możliwość tworzenia własnej makiety odpowiadającej sytuacji meczowej.
## Technologie
## Uruchomienie
## Instalacja i Uruchomienie
Aby uruchomić aktualną wersję aplikacji, wykonaj następujące kroki:
Aby uruchomić beta wersję aplikacji, wykonaj następujące kroki:
1. **Uruchomienie serwera:** Aby uruchomić serwer należy wejść w [link](https://sg-server-ne4h.onrender.com/) oraz zaczekać do pojawienia się komunikatu o błędzie 404. Aplikacja korzysta z darmowej wersji obsługi serwera, stąd sposób jego uruchomienia nie jest standardowy.
1. **Uruchomienie Klienta:**
Otwórz terminal w folderze `app` i uruchom następującą komendę:\
`npm run dev`
2. **Uruchomienie Serwera Flask:**
W innym terminalu, przejdź do folderu `app/src/flask-server` i uruchom serwer Flask przy użyciu poniższej komendy:\
`python server.py`
2. **Uruchomienie aplikacji webowej** Po wykonaiu kroku 1 można wejść na właściwą stronę [aplikacji](https://statgoals.onrender.com/).
## Dane
- <https://statsbomb.com/what-we-do/soccer-data/>
## Szczegóły
Działanie aplikacji zostało opisane w podręczniku użytkownika znajdującym się w drzewie plików na repozytorium. Poza tym odsyłam do [repozytorium](https://git.wmi.amu.edu.pl/s478993/fantastyczne_gole) uniwersytetu na którym powstała aplikacja. Zawiera ono kod źródłowy aplikacji.

View File

@ -5,11 +5,49 @@ import { Link } from "react-router-dom";
const Hero = () => {
const [isOpen, setIsOpen] = useState(false);
const [gameMinute, setGameMinute] = useState('');
const toggleDropdown = () => setIsOpen(!isOpen);
const handleMinuteChange = (e) => setGameMinute(e.target.value);
const [firstShot, setfirstShot] = useState(0);
const [oneOnOne, SetoneOnOne] = useState(0);
const [afterAirDuel, SetafterAirDuele] = useState(0);
const [openGoal, SetOpenGoal] = useState(0);
const [afterDribbling, SetafterDribbling] = useState(0);
const [redirect, SetRedirect] = useState(0);
const handleMinuteChange = (e) => { setGameMinute(e.target.value);
//sentQuestion();
}
const handleFirstShotChange = (event) => {
setfirstShot(event.target.checked);
//sentQuestion();
};
const handleOneOnOneChange = (event) => {
SetoneOnOne(event.target.checked);
//sentQuestion();
};
const handleAfterAirDuelChange = (event) => {
SetafterAirDuele(event.target.checked);
//sentQuestion();
};
const handleOpenGoalChange = (event) => {
SetOpenGoal(event.target.checked);
//sentQuestion();
};
const handleAfterDribblingChange = (event) => {
SetafterDribbling(event.target.checked);
//sentQuestion();
};
const handleRedirectChange = (event) => {
SetRedirect(event.target.checked);
//sentQuestion();
};
const [data, setData] = useState("");
//zmienne globalne
@ -17,10 +55,24 @@ 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";
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);
const [number_of_defenders, setNumberOfDevenders] = useState(()=>{
return 0;
});
const [number_of_strikers, setNumberOfStrikers] = useState(() => {
return 0;
})
const [number_of_goalkeepers, setNumberOfGoalkeppers] = useState(()=>{
return 0;
});
const [number_of_shooters,setNumberOfShooters] = useState(() => {
return 0}
);
const number_of_shooters_rev = React.useRef(number_of_shooters)
const number_of_strikers_rev = React.useRef(number_of_strikers)
const number_of_goalkeepers_rev = React.useRef(number_of_goalkeepers)
const number_of_defenders_rev = React.useRef(number_of_defenders)
// zmienne globalne bedace danymi wejsciowymi do modelu
@ -57,7 +109,6 @@ const Hero = () => {
// Reset Boiska
function resetField() {
var footballField = document.getElementById('footballField');
var footballs = document.querySelectorAll('.football');
var list = document.getElementById('list')
@ -69,13 +120,20 @@ const Hero = () => {
players.forEach(function(element) {
list.removeChild(element);
})
setNumberOfDevenders(0);
setNumberOfStrikers(0)
setNumberOfGoalkeppers(0)
setNumberOfShooters(0)
setGameMinute('')
number_of_shooters_rev.current = 0;
number_of_goalkeepers_rev.current = 0;
number_of_defenders_rev.current = 0;
number_of_strikers_rev.current = 0;
document.getElementById("ex").innerHTML = 0;
}
//funkcja dodaje zawodnika do listy zawodnikow. zmienne x oraz y to wspolrzedne a position
// to pozycja zawodnika 0 - strzelec, 1 - bramkarz, 2 - broniacy, 3 napastnik
// ball - to odnosnik do punktu na boisku
@ -86,14 +144,15 @@ const Hero = () => {
list.removeChild(player)
bojo.removeChild(ball)
if(possition == 1){
setNumberOfGoalkeppers(0)
setNumberOfGoalkeppers(number_of_goalkeepers_rev.current -= 1);
}else if(possition == 2){
setNumberOfDevenders(number_of_defenders-1) ;
setNumberOfDevenders(number_of_defenders_rev.current -= 1) ;
}else if (possition == 3){
setNumberOfStrikers(number_of_strikers-1) ;
}else if(possition == 0){
setNumberOfShooters(0)
setNumberOfStrikers(number_of_strikers_rev.current -= 1);
}else if(possition == 0){
setNumberOfShooters(number_of_shooters_rev.current -= 1);
}
//sentQuestion()
}
// funkcja zsczytuje pozycje zawodnikow przed wyslaniem zapytania do serwera
@ -127,19 +186,22 @@ const Hero = () => {
var pName = "Strzelec"
//kolor kropki
// kolor tła kafelka
var pColor = "#fc0303"
if(possition == 1){
var pName = "Bramkarz"
var pColor = "#03e7fc"
setNumberOfGoalkeppers(number_of_goalkeepers_rev.current += 1);
}else if(possition == 2){
var pName = "Obrońca"
var pColor = "#0324fc"
setNumberOfDevenders(number_of_defenders_rev.current += 1);
}else if (possition ==3){
var pName = "Napastnik"
var pColor = "#fc6703"
setNumberOfStrikers(number_of_strikers_rev.current += 1);
}else{
setNumberOfShooters(number_of_shooters_rev.current += 1);
}
var player = document.createElement('div');
player.className = 'player';
player.style.width = "inherit"
@ -154,7 +216,7 @@ const Hero = () => {
// div z pozycja gracza
var posytion = document.createElement('div')
posytion.style.fontSize = "12px"
posytion.innerHTML = "Lokalizacja: " + konwerturX(ball.style.left) + " m, " + konwetujY(ball.style.top) + " m";
posytion.innerHTML = konwerturX(ball.style.left) + " m, " + konwetujY(ball.style.top) + " m";
player.setAttribute('possition',[konwerturX(ball.style.left),konwetujY(ball.style.top)])
//div z przyciskiem usuwającym
var btnDelete = document.createElement('button')
@ -209,8 +271,8 @@ const Hero = () => {
tekst.style.color = "white"
posytion.style.color = "white"
x = parseFloat(x) -2
y = parseFloat(y) -2
x = parseFloat(x) -3
y = parseFloat(y) -3
if(bojo.parentNode.querySelector(":hover")){
ball.style.left = x + "%"
@ -219,32 +281,29 @@ const Hero = () => {
//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";
//player.setAttribute('possition',[konwerturX(ball.style.left),konwetujY(ball.style.top)]);
bojo.addEventListener("mouseup", function(){
player.setAttribute('possition',[konwerturX(ball.style.left),konwetujY(ball.style.top)]);
bojo.addEventListener("mouseup", function afterUp(){
ball.style.background = pColor
bojo.removeEventListener("mousemove", whileMove)
bojo.removeEventListener("mouseup", afterUp)
})
})
})
bojo.addEventListener("mouseup", function reload(){
//sentQuestion();
bojo.removeEventListener("mouseup",reload)
})
})
//sentQuestion();
}
function updateXGMeter(xgValue) {
var xgMeter = document.querySelector('.xg-meter');
var greenIntensity = xgValue * 100; // Zakładając, że xgValue jest między 0 a 1
//xgMeter.style.background = `linear-gradient(to top, #006400 ${greenIntensity}%, #90EE90)`;
}
// // Wyłanie zapytania do serwera
function sentQuestion() {
///Dziwny Blad
loadPlayers()
if (number_of_shooters == 1) {
console.log('Wysyłanie wartości: ', bodyPart, technique);
if (number_of_shooters_rev.current == 1) {
//console.log('Wysyłanie wartości: ', bodyPart, technique, actionType, shooterPossition, gameMinute, firstShot);
// 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=${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}&gameMinute=${gameMinute}&shot_first_time=${firstShot}&shot_one_on_one=${oneOnOne}&shot_aerial_won=${afterAirDuel}&shot_open_goal=${openGoal}&shot_follows_dribble=${afterDribbling}&shot_redirect=${redirect}`).then(
res => res.json()
).then(
data => {
@ -253,7 +312,7 @@ const Hero = () => {
// Przenieś tę linię do środka bloku .then(), aby uniknąć błędów
let eX = data.response;
document.getElementById("ex").innerHTML = eX;
updateXGMeter(eX);
//updateXGMeter(eX);
}
).catch(error => {
console.error('Błąd:', error);
@ -261,10 +320,9 @@ const Hero = () => {
} else {
alert('Piłka nie jest obecnie na boisku.');
}
}
/* Funkcja dodająca listener do boiska*/
@ -285,36 +343,30 @@ 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(number_of_shooters < 1 ){
if(number_of_shooters_rev.current < 1 ){
addPlayer(0,ball)
bojo.appendChild(ball)
ball.style.background = "#fc0303"
setNumberOfShooters(number_of_shooters+1)
}else{alert("mozesz dodac tylko jednego strzelca")}
}else if(active_bbt == "bbt2"){
if ( number_of_goalkeepers < 1){
if ( number_of_goalkeepers_rev.current < 1){
addPlayer(1,ball)
bojo.appendChild(ball)
ball.style.background = "#03e7fc"
setNumberOfGoalkeppers(number_of_goalkeepers+1)
ball.style.background = "#03e7fc"
}else{alert("mozesz dodac tylko jednego bramkarza")}
}else if(active_bbt == "bbt3"){
if(number_of_defenders <= 10){
if(number_of_defenders_rev.current < 10){
addPlayer(2,ball);
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){
if(number_of_strikers_rev.current < 10){
addPlayer(3,ball);
setNumberOfStrikers(number_of_strikers+1);
bojo.appendChild(ball)
ball.style.background = "#fc6703"
}else{alert("maksymalna liczba napastnikow")}
}
}
// funkcja działą po utworzeniu komponentów, dodaje listenry do elementów
@ -343,11 +395,13 @@ const Hero = () => {
<div className="container">
{/* Listy zwijane */}
<div className="top-bar">
<div className="top-bar" id = "top-bar">
<form className="dropdown" id = "bodyPartList">
<select className="dropbtn"
onChange={event => setBodyPart(event.target.value)}
onChange={event => {setBodyPart(event.target.value);
//sentQuestion()
}}
defaultValue={bodyPart}>
<option value = "Right Foot">Noga Prawa</option>
<option value = "Left Foot">Noga Lewa</option>
@ -360,7 +414,9 @@ const Hero = () => {
<form className="dropdown" id = "shootTypeList">
<select className="dropbtn" onChange={event => setTechnique(event.target.value)}
<select className="dropbtn" onChange={event => {setTechnique(event.target.value);
//sentQuestion()
}}
defaultValue = {technique}>
<option value="Normal"> Zwykły </option>
<option value = "Volley"> Wolej </option>
@ -372,7 +428,9 @@ const Hero = () => {
</select>
</form>
<form className="dropdown" id = "actionTypeList" onChange={event => setActionType(event.target.value)}
<form className="dropdown" id = "actionTypeList" onChange={event => {setActionType(event.target.value);
//sentQuestion()
}}
defaultValue={technique}>
<select className="dropbtn">
<option value = "Open Play"> Atak Pozycyjny </option>
@ -382,7 +440,9 @@ const Hero = () => {
</select>
</form>
<form className="dropdown" id = "possitionList"
onChange={event => setPossition(event.target.value)}
onChange={event => {setPossition(event.target.value);
//sentQuestion()
}}
defaultValue={shooterPossition}>
<select className="dropbtn">
<option value="Right Center Forward">Prawy Środkowy Napastnik</option>
@ -435,55 +495,40 @@ const Hero = () => {
<div className="field-pic"></div>
</div>
<div className="rightMenu">
<div className="xg-meter">
<b id="ex" className="xg-value">0</b>
</div>
<div className="additional-parameters">
<h3>Parametry strzału</h3>
<label>
<input type="checkbox" id="firstShot" />
<input type="checkbox" id="firstShot" onChange={handleFirstShotChange} />
Pierwszy w meczu
</label>
<label>
<input type="checkbox" id="oneOnOne" />
<input type="checkbox" id="oneOnOne" onChange={handleOneOnOneChange} />
Akcja sam na sam
</label>
<label>
<input type="checkbox" id="afterAirDuel" />
<input type="checkbox" id="afterAirDuel" onChange={handleAfterAirDuelChange} />
Po pojedynku powietrznym
</label>
<label>
<input type="checkbox" id="openGoal" />
<input type="checkbox" id="openGoal" onChange={handleOpenGoalChange} />
Na pustą bramkę
</label>
<label>
<input type="checkbox" id="afterDribbling" />
<input type="checkbox" id="afterDribbling" onChange={handleAfterDribblingChange} />
Poprzedzony dryblingiem
</label>
<label>
<input type="checkbox" id="ricochet" />
<input type="checkbox" id="redirect" onChange={handleRedirectChange} />
Rykoszet
</label>
</div>
{/* <div className="ChoosingPlayer">
<button className="cho-one_on_one" id = "bbt8">Sam na sam</button>
</div>
<div className="ChoosingPlayer">
<button className="cho-first_time" id = "bbt12">Pierwszy w meczu</button>
</div>
<div className="ChoosingPlayer">
<button className="cho-aerial_won" id = "bbt13">Pojedynek powietrzny</button>
</div>
<div className="ChoosingPlayer">
<button className="cho-follows_dribble" id = "bbt14">Drybling</button>
</div>
<div className="ChoosingPlayer">
<button className="cho-redirect" id = "bbt15">Rykoszet</button>
</div> */}
</div>
</div>
<div className="bottom-bar">
<button className="cho-shooter" id = "bbt1">Strzelec</button>
@ -493,9 +538,6 @@ const Hero = () => {
<button className="reset-button" onClick={resetField}>Reset</button>
<button className="info-button" onClick={sentQuestion}>xG</button>
</div>
<div class="xg-meter">
<b id="ex" class="xg-value"></b>
</div>
</div>
</div>
);

Binary file not shown.

View File

@ -3,6 +3,8 @@ import pandas as pd
from math import sqrt
import math
import numpy as np
import xgboost
from sklearn.preprocessing import OrdinalEncoder
# 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):
@ -15,7 +17,7 @@ def LogisticRegression_predict_proba(position_x, position_y, distance_to_goalM,
#xgBoost
def xgboost_predict_proba(minute=0, position_name='Center Forward', shot_body_part_name='Right Foot',
shot_technique_name='Normal', shot_type_name='Open Play', shot_first_time=False,
shot_one_on_one=False, shot_aerial_won=False, shot_deflected=False,
shot_one_on_one=False, shot_aerial_won=False,
shot_open_goal=False, shot_follows_dribble=False, shot_redirect=False, x1=0.0, y1=0.0,
number_of_players_opponents=0, number_of_players_teammates=0,
angle=0.0, distance=0.0, x_player_opponent_Goalkeeper=np.nan,
@ -34,13 +36,17 @@ def xgboost_predict_proba(minute=0, position_name='Center Forward', shot_body_pa
y_player_teammate_4=np.nan, y_player_teammate_5=np.nan, y_player_teammate_6=np.nan,
y_player_teammate_7=np.nan, y_player_teammate_8=np.nan, y_player_teammate_9=np.nan,
y_player_teammate_10=np.nan, x_player_opponent_7=np.nan, y_player_opponent_7=np.nan,
x_player_teammate_Goalkeeper=np.nan, y_player_teammate_Goalkeeper=np.nan, shot_kick_off=False):
model = load('xgboost.joblib')
x_player_teammate_Goalkeeper=np.nan, y_player_teammate_Goalkeeper=np.nan):
model = xgboost.XGBClassifier()
model.load_model('xgboost.json')
enc = OrdinalEncoder()
enc = load('labelEncoder.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_aerial_won', 'shot_open_goal',
'shot_follows_dribble', 'shot_redirect', 'x1', 'y1',
'number_of_players_opponents', 'number_of_players_teammates',
'angle', 'distance', 'x_player_opponent_Goalkeeper',
@ -59,12 +65,11 @@ def xgboost_predict_proba(minute=0, position_name='Center Forward', shot_body_pa
'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_player_teammate_Goalkeeper', 'y_player_teammate_Goalkeeper'])
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_aerial_won, shot_open_goal,
shot_follows_dribble, shot_redirect, x1, y1,
number_of_players_opponents, number_of_players_teammates,
angle, distance, x_player_opponent_Goalkeeper,
@ -83,50 +88,67 @@ def xgboost_predict_proba(minute=0, position_name='Center Forward', shot_body_pa
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_player_teammate_Goalkeeper, y_player_teammate_Goalkeeper]
X_new[['position_name',
'shot_technique_name',
'shot_type_name',
'shot_body_part_name']] = enc.transform(X_new[['position_name', 'shot_technique_name', 'shot_type_name', 'shot_body_part_name']], )
X_new[['minute',
'position_name',
'shot_technique_name',
'shot_type_name',
'number_of_players_opponents',
'number_of_players_teammates',
'shot_body_part_name']] = X_new[['position_name',
'shot_body_part_name']] = X_new[['minute',
'position_name',
'shot_technique_name',
'shot_type_name',
'number_of_players_opponents',
'number_of_players_teammates',
'shot_body_part_name']].astype('category')
X_new['minute'] = X_new['minute'].astype(int)
'shot_body_part_name']].astype(int)
# X_new[['minute',
# 'position_name',
# 'shot_technique_name',
# 'shot_type_name',
# 'number_of_players_opponents',
# 'number_of_players_teammates',
# 'shot_body_part_name']] = X_new[['minute',
# 'position_name',
# 'shot_technique_name',
# 'shot_type_name',
# 'number_of_players_opponents',
# 'number_of_players_teammates',
# 'shot_body_part_name']].astype('category')
X_new[['shot_first_time',
'shot_one_on_one',
'shot_aerial_won',
'shot_deflected',
'shot_open_goal',
'shot_follows_dribble',
'shot_redirect',
'shot_kick_off']] = X_new[['shot_first_time',
'shot_redirect']] = X_new[['shot_first_time',
'shot_one_on_one',
'shot_aerial_won',
'shot_deflected',
'shot_open_goal',
'shot_follows_dribble',
'shot_redirect',
'shot_kick_off']].astype(bool)
'shot_redirect']].astype(int)
print(X_new)
print(X_new.dtypes)
return model.predict_proba(X_new)[0][1].round(3)
#XgBoost_2
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):
shot_technique_name,shot_type_name,shot_first_time,shot_aerial_won,shot_open_goal,
shot_follows_dribble,shot_redirect):
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_one_on_one','shot_aerial_won',
'shot_open_goal','shot_follows_dribble', 'shot_redirect',
'x1', 'y1','number_of_players_opponents',
'number_of_players_teammates','angle', 'distance',
@ -146,8 +168,7 @@ def xgboost_predict_proba_v2(shooter,goalkeeper,teamMatesList,opponentsList, min
'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_player_teammate_Goalkeeper', 'y_player_teammate_Goalkeeper'])
shooter = konwertujDoListy(shooter)
@ -183,7 +204,7 @@ def xgboost_predict_proba_v2(shooter,goalkeeper,teamMatesList,opponentsList, min
#Reszta Zawodnikow
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_one_on_one,shot_aerial_won,
shot_open_goal,shot_follows_dribble, shot_redirect,
shooter[0], shooter[1],number_of_players_opponents,
number_of_players_teammates,angle, distance,
@ -204,8 +225,7 @@ def xgboost_predict_proba_v2(shooter,goalkeeper,teamMatesList,opponentsList, min
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]
x_player_teammate_Goalkeeper, y_player_teammate_Goalkeeper]
categorical_columns = ['position_name', 'shot_technique_name', 'shot_type_name', 'number_of_players_opponents', 'number_of_players_teammates', 'shot_body_part_name'] # list all your object columns here
# X_new = pd.get_dummies(X_new, columns=categorical_columns)

View File

@ -31,6 +31,15 @@ def get_model():
acionType = request.args.get('actionType')
minute = request.args.get('gameMinute')
position_name = request.args.get('shooterPossition')
gameMinute = request.args.get('gameMinute')
shot_first_time = request.args.get('shot_first_time')
shot_one_on_one = request.args.get('shot_one_on_one')
shot_aerial_won = request.args.get('shot_aerial_won')
shot_open_goal = request.args.get('shot_open_goal')
shot_follows_dribble = request.args.get('shot_follows_dribble')
shot_redirect = request.args.get('shot_redirect')
shooter_x, shooter_y = shooter.split(',')
@ -81,6 +90,9 @@ def get_model():
atakujacy_lista = konwertujDoListy(atakujacy)
atakujacy_macierz = zmienWMaciez(atakujacy_lista)
if gameMinute == "":
gameMinute = 1.0 # to change
print("wspolrzedne obroncow: ", obroncy)
print("wspolrzedne atakujacych: ", atakujacy)
@ -112,9 +124,15 @@ def get_model():
posortowani_atakujacy = sort_coordinates_by_distance(atakujacy_macierz, [shooter_x, shooter_y])
print("Posortowani obroncy: ", posortowani_obroncy)
print("Posortowani atakujacy: ", posortowani_atakujacy)
number_of_players_opponents = float(np.sum(~np.isnan(posortowani_obroncy).all(axis=1)))
number_of_players_teammates = float(np.sum(~np.isnan(posortowani_atakujacy).all(axis=1)))
print("Liczba obroncow:", number_of_players_opponents)
print("Liczba atakujacych:", number_of_players_teammates)
## add angle, match minutes and number of players
def loc2angle(x, y):
@ -141,23 +159,55 @@ def get_model():
print("bramkarz:", goalkepper_x, goalkepper_y)
if shot_first_time == 'true':
shot_first_time = True
else:
shot_first_time = False
if shot_one_on_one == 'true':
shot_one_on_one = True
else:
shot_one_on_one = False
if shot_aerial_won == 'true':
shot_aerial_won = True
else:
shot_aerial_won = False
if shot_open_goal == 'true':
shot_open_goal = True
else:
shot_open_goal = False
if shot_follows_dribble == 'true':
shot_follows_dribble = True
else:
shot_follows_dribble = False
if shot_redirect == 'true':
shot_redirect = True
else:
shot_redirect = False
#### CHECKLIST
print('CHECKLISTA')
print('shot_first_time', shot_first_time)
print('shot_one_on_one', shot_one_on_one)
print('shot_aerial_won', shot_aerial_won)
print('shot_open_goal', shot_open_goal)
print('shot_follows_dribble', shot_follows_dribble)
print('shot_redirect', shot_redirect)
# MODEL XGBOOST
response = xgboost_predict_proba(minute=1,
response = xgboost_predict_proba(minute=int(gameMinute), #minute=0,
position_name=position_name,
shot_body_part_name=body_part,
shot_technique_name=technique,
shot_type_name=acionType,
shot_first_time=False,
shot_one_on_one=False,
shot_aerial_won=False,
shot_deflected=False,
shot_open_goal=False,
shot_follows_dribble=False,
shot_redirect=False,
shot_kick_off=False,
shot_first_time=shot_first_time,
shot_one_on_one=shot_one_on_one,
shot_aerial_won=shot_aerial_won,
shot_open_goal=shot_open_goal,
shot_follows_dribble=shot_follows_dribble,
shot_redirect=shot_redirect,
x1=shooter_x, y1=shooter_y,
number_of_players_opponents=0,
number_of_players_teammates=0,
number_of_players_opponents=number_of_players_opponents,
number_of_players_teammates=number_of_players_teammates,
angle=angle, distance=dist,
x_player_opponent_Goalkeeper=goalkepper_x, y_player_opponent_Goalkeeper=goalkepper_y,
x_player_opponent_1=posortowani_obroncy[0][0], y_player_opponent_1=posortowani_obroncy[0][1],

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -277,7 +277,7 @@
}
.additional-parameters {
position: fixed; /* Or absolute, depending on layout */
position: relative; /* Or absolute, depending on layout */
right: 0;
top: 30%; /* Adjusted to a higher position */
width: 250px; /* Increased width */

BIN
data/.DS_Store vendored

Binary file not shown.

File diff suppressed because it is too large Load Diff

82822
data/final_data_new.csv Normal file

File diff suppressed because it is too large Load Diff

38343
data/final_data_old.csv Normal file

File diff suppressed because it is too large Load Diff

BIN
notebooks/.DS_Store vendored

Binary file not shown.

38343
notebooks/final_data.csv Normal file

File diff suppressed because it is too large Load Diff

82822
notebooks/final_data_new.csv Normal file

File diff suppressed because it is too large Load Diff

38343
notebooks/final_data_old.csv Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long