Traitement des données¶

INTRODUCTION¶

In [63]:
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
In [64]:
# 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).
In [65]:
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)

Choisir le(s) joueur(s)¶

In [66]:
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())

DÉFENSE¶

1ère mi-temps¶

In [67]:
# Importer les données des séquences défensives en 1MT
def_1MT = pd.read_excel(path + "Defense_1MT.xlsx")

Tirs¶

In [68]:
# 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

Récupérations¶

In [96]:
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 ')
In [97]:
# 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

Fautes¶

In [71]:
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 ')
In [72]:
# 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

2nd mi-temps¶

In [73]:
# Importer les données des séquences défensives en 2MT
def_2MT = pd.read_excel(path + "Defense_2MT.xlsx")

Tirs¶

In [74]:
# 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()

Récupérations¶

In [75]:
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 ')
In [98]:
# 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

Fautes¶

In [77]:
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
In [78]:
# 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

ATTAQUE¶

1ère mi-temps¶

In [79]:
# Importer les données des séquences défensives en 1MT
att_1MT = pd.read_excel(path + "Attaque_1MT.xlsx")

Tirs¶

In [80]:
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
In [81]:
# 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

Passes¶

In [82]:
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
In [83]:
# 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), ")")
Nombre de passes en 1ère MT : 164 ( réussie : 151 / ratée : 13 )

Dribbles¶

In [84]:
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
In [85]:
# 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
faute_provoquee_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["dribble"] == "faute_provoquee"]
joueur_franchi_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["dribble"] == "joueur_franchi"]
perte_de_balle_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["dribble"] == "perte_de_balle"]
possession_conservee_1MT = att_1MT_joueurs.loc[att_1MT_joueurs["dribble"] == "possession_conservee"]

# 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_provoquee_1MT["FieldX"]*842, faute_provoquee_1MT["FieldY"]*596, marker = "o", s=20, color="#2ECC71", label='Fautes provoquées')
plt.scatter(joueur_franchi_1MT["FieldX"]*842, joueur_franchi_1MT["FieldY"]*596, marker = "*", s=20, color='#2ECC71', label='Joueur franchi')
plt.scatter(perte_de_balle_1MT["FieldX"]*842, perte_de_balle_1MT["FieldY"]*596, marker = "x", s=20, color='#1F2941', label='Perte de balle')
plt.scatter(possession_conservee_1MT["FieldX"]*842, possession_conservee_1MT["FieldY"]*596, marker = "^", s=20, color='#1F2941', label='Possession conservée')

plt.axis('off')
fig.patch.set_visible(False)
plt.show()

print("Nombre de dribbles en 1ère MT :", len(faute_provoquee_1MT) + len(joueur_franchi_1MT) + len(perte_de_balle_1MT) + len(possession_conservee_1MT))
Nombre de dribbles en 1ère MT : 19

2nd mi-temps¶

In [86]:
# Importer les données des séquences défensives en 2MT
att_2MT = pd.read_excel(path + "Attaque_2MT.xlsx")

Tirs¶

In [87]:
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
In [88]:
# 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_2MT_joueurs = att_2MT.loc[att_1MT["Joueurs"].isin(joueurs)]
else:
    att_2MT_joueurs = att_2MT.loc[:]

# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
att_but_2MT = att_2MT_joueurs.loc[att_2MT_joueurs["tir"] == "but"]
att_tir_cadre_2MT = att_2MT_joueurs.loc[att_2MT_joueurs["tir"] == "tir_cadre"]
att_tir_hc_2MT = att_2MT_joueurs.loc[att_2MT_joueurs["tir"] == "tir_hc"]
att_tir_contre_2MT = att_2MT_joueurs.loc[att_2MT_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_2MT["FieldX"]*842, att_but_2MT["FieldY"]*596, marker = "o", s=20, color="#2ECC71", label='Buts')
plt.scatter(att_tir_cadre_2MT["FieldX"]*842, att_tir_cadre_2MT["FieldY"]*596, marker = "o", s=20, color='#1F2941', label='Tirs cadrés')
plt.scatter(att_tir_hc_2MT["FieldX"]*842, att_tir_hc_2MT["FieldY"]*596, marker = "x", s=20, color='#1F2941', label='Tirs hors-cadre')
plt.scatter(att_tir_contre_2MT["FieldX"]*842, att_tir_contre_2MT["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

Récupérations¶

In [89]:
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
In [90]:
# 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_2MT_joueurs = att_2MT.loc[att_1MT["Joueurs"].isin(joueurs)]
else:
    att_2MT_joueurs = att_2MT.loc[:]

# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
passe_reussie_2MT = att_2MT_joueurs.loc[att_2MT_joueurs["passe"] == "passe_reussie"]
passe_ratee_2MT = att_2MT_joueurs.loc[att_2MT_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_2MT.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_2MT.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_2MT) + len(passe_ratee_2MT), "( réussie :", len(passe_reussie_2MT), "/ ratée :", len(passe_ratee_2MT), ")")
Nombre de passes en 1ère MT : 159 ( réussie : 141 / ratée : 18 )

Dribbles¶

In [91]:
create_checkboxes()
Button(description='Afficher les joueurs', style=ButtonStyle())
In [92]:
# 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_2MT_joueurs = att_2MT.loc[att_1MT["Joueurs"].isin(joueurs)]
else:
    att_2MT_joueurs = att_2MT.loc[:]

# Créer un DataFrame contenant seulement les lignes avec la colonne tir remplie
faute_provoquee_2MT = att_2MT_joueurs.loc[att_2MT_joueurs["dribble"] == "faute_provoquee"]
joueur_franchi_2MT = att_2MT_joueurs.loc[att_2MT_joueurs["dribble"] == "joueur_franchi"]
perte_de_balle_2MT = att_2MT_joueurs.loc[att_2MT_joueurs["dribble"] == "perte_de_balle"]
possession_conservee_2MT = att_2MT_joueurs.loc[att_2MT_joueurs["dribble"] == "possession_conservee"]

# 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_provoquee_2MT["FieldX"]*842, faute_provoquee_2MT["FieldY"]*596, marker = "o", s=20, color="#2ECC71", label='Fautes provoquées')
plt.scatter(joueur_franchi_2MT["FieldX"]*842, joueur_franchi_2MT["FieldY"]*596, marker = "*", s=20, color='#2ECC71', label='Joueur franchi')
plt.scatter(perte_de_balle_2MT["FieldX"]*842, perte_de_balle_2MT["FieldY"]*596, marker = "x", s=20, color='#1F2941', label='Perte de balle')
plt.scatter(possession_conservee_2MT["FieldX"]*842, possession_conservee_2MT["FieldY"]*596, marker = "^", s=20, color='#1F2941', label='Possession conservée')

plt.axis('off')
fig.patch.set_visible(False)
plt.show()

print("Nombre de dribbles en 1ère MT :", len(faute_provoquee_2MT) + len(joueur_franchi_2MT) + len(perte_de_balle_2MT) + len(possession_conservee_2MT))
Nombre de dribbles en 1ère MT : 16

GARDIEN¶

1ère mi-temps¶

Tirs¶

In [93]:
# 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

Passes et relances¶

In [93]:
 

2nde mi-temps¶

Tirs¶

In [94]:
# 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()

Passes et relances¶

In [94]: