from google.colab import drive
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import matplotlib.image as mpimg
from flask import Flask, render_template, request
import ipywidgets as widgets
from IPython.display import clear_output, display
# Faciliter l'importation des données à partir du fichier Excel
path = "drive/MyDrive/Rapport_NMF/"
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
players = ['9-Bryan ', '16-Javi ', '7-Ouassini ', '17-Steve ',
'10-Kadinho ', '15-Renato ', '6-Topher ', '11-Anatole ',
'8-Guido ', '20-Francis ', '1-Fernando ', '3-Adam ',
'19-Gora ', '18-Jonathan ', '12-Jules ', '5-Alex ']
joueurs = ['9-Bryan ', '16-Javi ', '7-Ouassini ', '17-Steve ',
'10-Kadinho ', '15-Renato ', '6-Topher ', '11-Anatole ',
'8-Guido ', '20-Francis ', '1-Fernando ', '3-Adam ',
'19-Gora ', '18-Jonathan ', '12-Jules ', '5-Alex ']
# Créer la fonction
def create_checkboxes():
# Créer la checkbox "Tout sélectionner"
select_all = widgets.Checkbox(
description='Tout sélectionner',
layout={'width': '50%'})
# Créer les checkboxes joueurs
player_checkboxes = []
for player in players:
checkbox = widgets.Checkbox(description=player)
player_checkboxes.append(checkbox)
# Définir le gestionnaire d’événements du tout
def select_all_handler(change):
for checkbox in player_checkboxes:
checkbox.value = change.new
# Définir le gestionnaire d’événements des joueurs
def player_checkboxes_handler(change):
global joueurs
player = change.owner.description
if all([not checkbox.value for checkbox in player_checkboxes]):
joueurs = players.copy()
else:
if change.new: # Pour vérifier si change.new est égal à True (cad la case cochée), il suffit d'utiliser simplement if change.new:
if player not in joueurs:
joueurs.append(player)
if not change.new:
if player in joueurs:
joueurs.remove(player)
joueurs = [checkbox.description for checkbox in player_checkboxes if checkbox.value]
# Associer le gestionnaire à la checkbox tout
select_all.observe(select_all_handler, 'value')
# Associer le gestionnaire aux checkboxes joueurs
for checkbox in player_checkboxes:
checkbox.observe(player_checkboxes_handler, 'value')
# Créer les boutons
show_button = widgets.Button(description="Afficher les joueurs")
hide_button = widgets.Button(description="Masquer les joueurs")
# Définir leur fonction
def show_click(button):
clear_output()
display(hide_button)
display(select_all)
for checkbox in player_checkboxes:
display(checkbox)
def hide_click(button):
clear_output()
create_checkboxes()
# Associer les fonctions aux boutons
show_button.on_click(show_click)
hide_button.on_click(hide_click)
# Afficher les checkboxes et les boutons
display(show_button)
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
# Importer les données des séquences défensives en 1MT
def_1MT = pd.read_excel(path + "Defense_1MT.xlsx")
# Charger l'image du terrain
img = mpimg.imread(path + "Terrain Futsal NMF.png")
# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
def_but_1MT = def_1MT.loc[def_1MT["tir"] == "but"]
def_tir_cadre_1MT = def_1MT.loc[def_1MT["tir"] == "tir_cadre"]
def_tir_hc_1MT = def_1MT.loc[def_1MT["tir"] == "tir_hc"]
def_tir_contre_1MT = def_1MT.loc[def_1MT["tir"] == "tir_contre"]
# Afficher le terrain avec les données de tirs
fig, ax = plt.subplots()
# Afficher l'image avec les limites de 0 à 1 pour les deux axes
ax.imshow(img)
# Limite de l'axe x
ax.set_xlim([0, 842])
# Limite de l'axe y
ax.set_ylim([0, 596])
# Afficher le graphique
plt.scatter(def_but_1MT["FieldX"]*842, def_but_1MT["FieldY"]*596, marker = "o", s=20, color="#2ECC71", label='Buts')
plt.scatter(def_tir_cadre_1MT["FieldX"]*842, def_tir_cadre_1MT["FieldY"]*596, marker = "o", s=20, color='#1F2941', label='Tirs cadrés')
plt.scatter(def_tir_hc_1MT["FieldX"]*842, def_tir_hc_1MT["FieldY"]*596, marker = "x", s=20, color='#1F2941', label='Tirs hors-cadre')
plt.scatter(def_tir_contre_1MT["FieldX"]*842, def_tir_contre_1MT["FieldY"]*596, marker = ">", s=20, color='#1F2941', label='Tirs contrés')
plt.axis('off')
fig.patch.set_visible(False)
plt.show()
print("Nombre de tirs subis en 1ere MT :", len(def_but_1MT) + len(def_tir_cadre_1MT) + len(def_tir_hc_1MT) + len(def_tir_contre_1MT))
Nombre de tirs subis en 1ere MT : 2
create_checkboxes()
Button(description='Masquer les joueurs', style=ButtonStyle())
Checkbox(value=False, description='Tout sélectionner', layout=Layout(width='50%'))
Checkbox(value=False, description='9-Bryan ')
Checkbox(value=False, description='16-Javi ')
Checkbox(value=False, description='7-Ouassini ')
Checkbox(value=False, description='17-Steve ')
Checkbox(value=False, description='10-Kadinho ')
Checkbox(value=False, description='15-Renato ')
Checkbox(value=False, description='6-Topher ')
Checkbox(value=False, description='11-Anatole ')
Checkbox(value=False, description='8-Guido ')
Checkbox(value=False, description='20-Francis ')
Checkbox(value=False, description='1-Fernando ')
Checkbox(value=False, description='3-Adam ')
Checkbox(value=False, description='19-Gora ')
Checkbox(value=False, description='18-Jonathan ')
Checkbox(value=False, description='12-Jules ')
Checkbox(value=False, description='5-Alex ')
# Charger l'image du terrain
img = mpimg.imread(path + "Terrain Futsal NMF.png")
# Créer un df avec les joueurs concernés
if joueurs:
def_1MT_joueurs = def_1MT.loc[def_1MT["Joueurs"].isin(joueurs)]
else:
def_1MT_joueurs = def_1MT.loc[:]
# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
recup_duel_1MT = def_1MT_joueurs.loc[def_1MT_joueurs["recuperation"] == "recup_sur_duel"]
interception_1MT = def_1MT_joueurs.loc[def_1MT_joueurs["recuperation"] == "interception"]
perte_balle_1MT = def_1MT_joueurs.loc[def_1MT_joueurs["recuperation"] == "force_la_perte_de_balle"]
# Afficher le terrain avec les données de tirs
fig, ax = plt.subplots()
# Afficher l'image avec les limites de 0 à 1 pour les deux axes
ax.imshow(img)
# Limite de l'axe x
ax.set_xlim([0, 842])
# Limite de l'axe y
ax.set_ylim([0, 596])
# Afficher le graphique
plt.scatter(recup_duel_1MT["FieldX"]*842, recup_duel_1MT["FieldY"]*596, marker = ">", s=20, color="#1F2941", label='Récupérations')
plt.scatter(interception_1MT["FieldX"]*842, interception_1MT["FieldY"]*596, marker = "x", s=20, color='#1F2941', label='Interceptions')
plt.scatter(perte_balle_1MT["FieldX"]*842, perte_balle_1MT["FieldY"]*596, marker = "o", s=20, color='#1F2941', label='Perte de balle forcée')
plt.axis('off')
fig.patch.set_visible(False)
plt.show()
print("Nombre de récupérations en 1ere MT :", len(recup_duel_1MT) + len(interception_1MT) + len(perte_balle_1MT))
Nombre de récupérations en 1ere MT : 3
create_checkboxes()
Button(description='Masquer les joueurs', style=ButtonStyle())
Checkbox(value=False, description='Tout sélectionner', layout=Layout(width='50%'))
Checkbox(value=False, description='9-Bryan ')
Checkbox(value=False, description='16-Javi ')
Checkbox(value=False, description='7-Ouassini ')
Checkbox(value=False, description='17-Steve ')
Checkbox(value=False, description='10-Kadinho ')
Checkbox(value=False, description='15-Renato ')
Checkbox(value=False, description='6-Topher ')
Checkbox(value=False, description='11-Anatole ')
Checkbox(value=False, description='8-Guido ')
Checkbox(value=False, description='20-Francis ')
Checkbox(value=False, description='1-Fernando ')
Checkbox(value=False, description='3-Adam ')
Checkbox(value=False, description='19-Gora ')
Checkbox(value=False, description='18-Jonathan ')
Checkbox(value=False, description='12-Jules ')
Checkbox(value=False, description='5-Alex ')
# Charger l'image du terrain
img = mpimg.imread(path + "Terrain Futsal NMF.png")
# Créer un df avec les joueurs concernés
if joueurs:
def_1MT_joueurs = def_1MT.loc[def_1MT["Joueurs"].isin(joueurs)]
else:
def_1MT_joueurs = def_1MT.loc[:]
# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
faute_1MT = def_1MT_joueurs.loc[def_1MT_joueurs["faute"] == "faute"]
premier_jaune_1MT = def_1MT_joueurs.loc[def_1MT_joueurs["faute"] == "premier_jaune"]
deuxieme_jaune_1MT = def_1MT_joueurs.loc[def_1MT_joueurs["faute"] == "deuxieme_jaune"]
rouge_direct_1MT = def_1MT_joueurs.loc[def_1MT_joueurs["faute"] == "rouge_direct"]
# Afficher le terrain avec les données de tirs
fig, ax = plt.subplots()
# Afficher l'image avec les limites de 0 à 1 pour les deux axes
ax.imshow(img)
# Limite de l'axe x
ax.set_xlim([0, 842])
# Limite de l'axe y
ax.set_ylim([0, 596])
# Afficher le graphique
plt.scatter(faute_1MT["FieldX"]*842, faute_1MT["FieldY"]*596, marker = "o", s=20, color="#1F2941", label='Fautes')
plt.scatter(premier_jaune_1MT["FieldX"]*842, premier_jaune_1MT["FieldY"]*596, marker = "o", s=20, color='#F9DC5C', label='Premier jaune')
plt.scatter(deuxieme_jaune_1MT["FieldX"]*842, deuxieme_jaune_1MT["FieldY"]*596, marker = "o", s=20, color='#C62828', label='Second jaune')
plt.scatter(rouge_direct_1MT["FieldX"]*842, rouge_direct_1MT["FieldY"]*596, marker = "o", s=20, color='#1F2941', label='Rouge direct')
plt.axis('off')
fig.patch.set_visible(False)
plt.show()
print("Nombre de fautes en 1ere MT :", len(faute_1MT) + len(premier_jaune_1MT) + len(deuxieme_jaune_1MT) + len(rouge_direct_1MT))
Nombre de fautes en 1ere MT : 2
# Importer les données des séquences défensives en 2MT
def_2MT = pd.read_excel(path + "Defense_2MT.xlsx")
# Charger l'image du terrain
img = mpimg.imread(path + "Terrain Futsal NMF.png")
# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
def_but_2MT = def_2MT.loc[def_2MT["tir"] == "but"]
def_tir_cadre_2MT = def_2MT.loc[def_2MT["tir"] == "tir_cadre"]
def_tir_hc_2MT = def_2MT.loc[def_2MT["tir"] == "tir_hc"]
def_tir_contre_2MT = def_2MT.loc[def_2MT["tir"] == "tir_contre"]
# Afficher le terrain avec les données de tirs
fig, ax = plt.subplots()
# Afficher l'image avec les limites de 0 à 1 pour les deux axes
ax.imshow(img)
# Limite de l'axe x
ax.set_xlim([0, 842])
# Limite de l'axe y
ax.set_ylim([0, 596])
# Afficher le graphique
plt.scatter(def_but_2MT["FieldX"]*842, def_but_2MT["FieldY"]*596, marker = "o", s=20, color="#2ECC71", label='Buts')
plt.scatter(def_tir_cadre_2MT["FieldX"]*842, def_tir_cadre_2MT["FieldY"]*596, marker = "o", s=20, color='#1F2941', label='Tirs cadrés')
plt.scatter(def_tir_hc_2MT["FieldX"]*842, def_tir_hc_2MT["FieldY"]*596, marker = "x", s=20, color='#1F2941', label='Tirs hors-cadre')
plt.scatter(def_tir_contre_2MT["FieldX"]*842, def_tir_contre_2MT["FieldY"]*596, marker = "<", s=20, color='#1F2941', label='Tirs contrés')
plt.axis('off')
fig.patch.set_visible(False)
plt.show()
create_checkboxes()
Button(description='Masquer les joueurs', style=ButtonStyle())
Checkbox(value=False, description='Tout sélectionner', layout=Layout(width='50%'))
Checkbox(value=False, description='9-Bryan ')
Checkbox(value=False, description='16-Javi ')
Checkbox(value=False, description='7-Ouassini ')
Checkbox(value=False, description='17-Steve ')
Checkbox(value=False, description='10-Kadinho ')
Checkbox(value=False, description='15-Renato ')
Checkbox(value=False, description='6-Topher ')
Checkbox(value=False, description='11-Anatole ')
Checkbox(value=False, description='8-Guido ')
Checkbox(value=False, description='20-Francis ')
Checkbox(value=False, description='1-Fernando ')
Checkbox(value=False, description='3-Adam ')
Checkbox(value=False, description='19-Gora ')
Checkbox(value=False, description='18-Jonathan ')
Checkbox(value=False, description='12-Jules ')
Checkbox(value=False, description='5-Alex ')
# Charger l'image du terrain
img = mpimg.imread(path + "Terrain Futsal NMF.png")
# Créer un df avec les joueurs choisis
if joueurs:
def_2MT_joueurs = def_2MT.loc[def_2MT["Joueurs"].isin(joueurs)]
else:
def_2MT_joueurs = def_2MT.loc[:]
# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
recup_duel_2MT = def_2MT_joueurs.loc[def_2MT_joueurs["recuperation"] == "recup_sur_duel"]
interception_2MT = def_2MT_joueurs.loc[def_2MT_joueurs["recuperation"] == "interception"]
perte_balle_2MT = def_2MT_joueurs.loc[def_2MT_joueurs["recuperation"] == "force_la_perte_de_balle"]
# Afficher le terrain avec les données de tirs
fig, ax = plt.subplots()
# Afficher l'image avec les limites de 0 à 1 pour les deux axes
ax.imshow(img)
# Limite de l'axe x
ax.set_xlim([0, 842])
# Limite de l'axe y
ax.set_ylim([0, 596])
# Afficher le graphique
plt.scatter(recup_duel_2MT["FieldX"]*842, recup_duel_2MT["FieldY"]*596, marker = "<", s=20, color="#1F2941", label='Récupérations')
plt.scatter(interception_2MT["FieldX"]*842, interception_2MT["FieldY"]*596, marker = "x", s=20, color='#1F2941', label='Interceptions')
plt.scatter(perte_balle_2MT["FieldX"]*842, perte_balle_2MT["FieldY"]*596, marker = "o", s=20, color='#1F2941', label='Perte de balle forcée')
plt.axis('off')
fig.patch.set_visible(False)
plt.show()
print("Nombre de récupérations en 2nde MT :", len(recup_duel_2MT) + len(interception_2MT) + len(perte_balle_2MT))
Nombre de récupérations en 2nde MT : 5
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
# Charger l'image du terrain
img = mpimg.imread(path + "Terrain Futsal NMF.png")
# Créer un df avec les joueurs concernés
if joueurs:
def_2MT_joueurs = def_2MT.loc[def_2MT["Joueurs"].isin(joueurs)]
else:
def_2MT_joueurs = def_2MT.loc[:]
# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
faute_2MT = def_2MT_joueurs.loc[def_2MT_joueurs["faute"] == "faute"]
premier_jaune_2MT = def_2MT_joueurs.loc[def_2MT_joueurs["faute"] == "premier_jaune"]
deuxieme_jaune_2MT = def_2MT_joueurs.loc[def_2MT_joueurs["faute"] == "deuxieme_jaune"]
rouge_direct_2MT = def_2MT_joueurs.loc[def_2MT_joueurs["faute"] == "rouge_direct"]
# Afficher le terrain avec les données de tirs
fig, ax = plt.subplots()
# Afficher l'image avec les limites de 0 à 1 pour les deux axes
ax.imshow(img)
# Limite de l'axe x
ax.set_xlim([0, 842])
# Limite de l'axe y
ax.set_ylim([0, 596])
# Afficher le graphique
plt.scatter(faute_2MT["FieldX"]*842, faute_2MT["FieldY"]*596, marker = "o", s=20, color="#1F2941", label='Fautes')
plt.scatter(premier_jaune_2MT["FieldX"]*842, premier_jaune_2MT["FieldY"]*596, marker = "o", s=20, color='#F9DC5C', label='Premier jaune')
plt.scatter(deuxieme_jaune_2MT["FieldX"]*842, deuxieme_jaune_2MT["FieldY"]*596, marker = "d", s=20, color='#F9DC5C', label='Second jaune')
plt.scatter(rouge_direct_2MT["FieldX"]*842, rouge_direct_2MT["FieldY"]*596, marker = "o", s=20, color='#C62828', label='Rouge direct')
plt.axis('off')
fig.patch.set_visible(False)
plt.show()
print("Nombre de fautes en 2nde MT :", len(faute_2MT) + len(premier_jaune_2MT) + len(deuxieme_jaune_2MT) + len(rouge_direct_2MT))
Nombre de fautes en 2nde MT : 2
# Importer les données des séquences défensives en 1MT
att_1MT = pd.read_excel(path + "Attaque_1MT.xlsx")
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
# Charger l'image du terrain
img = mpimg.imread(path + "Terrain Futsal NMF.png")
# Créer un df avec les joueurs concernés
if joueurs:
att_1MT_joueurs = att_1MT.loc[att_1MT["Joueurs"].isin(joueurs)]
else:
att_1MT_joueurs = att_1MT.loc[:]
# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
att_but_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["tir"] == "but"]
att_tir_cadre_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["tir"] == "tir_cadre"]
att_tir_hc_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["tir"] == "tir_hc"]
att_tir_contre_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["tir"] == "tir_contre"]
# Afficher le terrain avec les données de tirs
fig, ax = plt.subplots()
# Afficher l'image avec les limites de 0 à 1 pour les deux axes
ax.imshow(img)
# Limite de l'axe x
ax.set_xlim([0, 842])
# Limite de l'axe y
ax.set_ylim([0, 596])
# Afficher le graphique
plt.scatter(att_but_1MT["FieldX"]*842, att_but_1MT["FieldY"]*596, marker = "o", s=20, color="#2ECC71", label='Buts')
plt.scatter(att_tir_cadre_1MT["FieldX"]*842, att_tir_cadre_1MT["FieldY"]*596, marker = "o", s=20, color='#1F2941', label='Tirs cadrés')
plt.scatter(att_tir_hc_1MT["FieldX"]*842, att_tir_hc_1MT["FieldY"]*596, marker = "x", s=20, color='#1F2941', label='Tirs hors-cadre')
plt.scatter(att_tir_contre_1MT["FieldX"]*842, att_tir_contre_1MT["FieldY"]*596, marker = "<", s=20, color='#1F2941', label='Tirs contrés')
plt.axis('off')
fig.patch.set_visible(False)
plt.show()
print("Nombre de tirs en 1ère MT :", len(att_but_1MT) + len(att_tir_cadre_1MT) + len(att_tir_hc_1MT) + len(att_tir_contre_1MT))
Nombre de tirs en 1ère MT : 16
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
# Charger l'image du terrain
img = mpimg.imread(path + "Terrain Futsal NMF.png")
# Créer un df avec les joueurs concernés
if joueurs:
att_1MT_joueurs = att_1MT.loc[att_1MT["Joueurs"].isin(joueurs)]
else:
att_1MT_joueurs = att_1MT.loc[:]
# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
passe_reussie_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["passe"] == "passe_reussie"]
passe_ratee_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["passe"] == "passe_ratee"]
# Afficher le terrain avec les données de tirs
fig, ax = plt.subplots()
# Afficher l'image avec les limites de 0 à 1 pour les deux axes
ax.imshow(img)
# Limite de l'axe x
ax.set_xlim([0, 842])
# Limite de l'axe y
ax.set_ylim([0, 596])
# Afficher le graphique
for i, row in passe_reussie_1MT.iterrows():
x_start, y_start = row["FieldX"]*842, row["FieldY"]*596
x_end, y_end = row["HalfFieldXfrom"]*842, row["HalfFieldYfrom"]*596
dx, dy = x_end-x_start, y_end-y_start
ax.arrow(x_start, y_start, dx, dy, head_width=10, head_length=10, fc='#1F2941', ec='#1F2941')
for i, row in passe_ratee_1MT.iterrows():
x_start, y_start = row["FieldX"]*842, row["FieldY"]*596
x_end, y_end = row["HalfFieldXfrom"]*842, row["HalfFieldYfrom"]*596
dx, dy = x_end-x_start, y_end-y_start
ax.arrow(x_start, y_start, dx, dy, head_width=10, head_length=10, fc='#C62828', ec='#C62828')
plt.axis('off')
fig.patch.set_visible(False)
plt.show()
print("Nombre de passes en 1ère MT :", len(passe_reussie_1MT) + len(passe_ratee_1MT), "( réussie :", len(passe_reussie_1MT), "/ ratée :", len(passe_ratee_1MT), ")")