File size: 4,799 Bytes
b33bafc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import pandas as pd
import plotly.express as px
import gradio as gr

# Load datasets
file_paths = {
    "Training Session 1": "./ZED 2005 Session 1-12-2024.csv",
    "Training Session 2": "./ZED 2005 Session 2-12-2024.csv",
    "Training Session 6": "./ZED 2005 Session 6-12-2024.csv"
}

# Load and clean datasets
def load_and_clean_data(file_path):
    df = pd.read_csv(file_path)
    
    # Converting relevant columns to numeric
    for col in ['Played Time (min)', 'Top Speed (km/h)', 'Dist. Covered (m)', 'Dribbling Count (#)', 
                'Kick Power (km/h)', 'Session Intensity', 'High Intensity Run (#)']:
        if col in df.columns:
            df[col] = pd.to_numeric(df[col], errors='coerce')

    # Dropping rows with missing values in key metrics
    df = df.dropna(subset=['Played Time (min)', 'Top Speed (km/h)', 'Dist. Covered (m)', 
                           'Session Intensity', 'High Intensity Run (#)'])
    return df

dataframes = {session: load_and_clean_data(path) for session, path in file_paths.items()}

# Generate interactive visualizations
def generate_visualizations(session, metric):
    df = dataframes[session]
    
    if metric == "Played Time Distribution":
        fig = px.histogram(df, x="Played Time (min)", nbins=20, title="Played Time Distribution", 
                           labels={"Played Time (min)": "Played Time (min)"}, color_discrete_sequence=["skyblue"])
    elif metric == "Top Speed Boxplot":
        fig = px.box(df, y="Top Speed (km/h)", title="Top Speed of Players", 
                     labels={"Top Speed (km/h)": "Top Speed (km/h)"}, color_discrete_sequence=["lightgreen"])
    elif metric == "Distance Covered vs Played Time":
        fig = px.scatter(df, x="Played Time (min)", y="Dist. Covered (m)", color="Main Possition",
                         title="Distance Covered vs Played Time", 
                         labels={"Played Time (min)": "Played Time (min)", "Dist. Covered (m)": "Distance Covered (m)"},
                         color_discrete_sequence=px.colors.qualitative.Vivid)
    elif metric == "Dribbling Contribution by Position":
        fig = px.bar(df, x="Main Possition", y="Dribbling Count (#)", title="Dribbling Contribution by Position", 
                     labels={"Main Possition": "Position", "Dribbling Count (#)": "Dribbling Count (#)"},
                     color="Main Possition", color_discrete_sequence=px.colors.qualitative.Vivid)
    elif metric == "Kick Power Distribution":
        fig = px.histogram(df, x="Kick Power (km/h)", nbins=10, title="Kick Power Distribution", 
                           labels={"Kick Power (km/h)": "Kick Power (km/h)"}, color_discrete_sequence=["orange"])
    elif metric == "Session Intensity by Position":
        fig = px.box(df, x="Main Possition", y="Session Intensity", title="Session Intensity by Position", 
                     labels={"Main Possition": "Position", "Session Intensity": "Session Intensity"},
                     color="Main Possition", color_discrete_sequence=px.colors.qualitative.Vivid)
    elif metric == "High-Intensity Runs":
        fig = px.scatter(df, x="High Intensity Run (#)", y="High Intensity Run (m)", color="Main Possition", 
                         title="High-Intensity Runs: Distance vs Frequency", 
                         labels={"High Intensity Run (#)": "High Intensity Runs (#)", 
                                 "High Intensity Run (m)": "High Intensity Distance (m)"},
                         size="Session Intensity", color_discrete_sequence=px.colors.qualitative.Vivid)
    else:
        fig = px.scatter(df, x="Max Acceleration (m/s\u00b2)", y="Max Deceleration (m/s\u00b2)", color="Main Possition", 
                         title="Max Intensity: Acceleration vs Deceleration", 
                         labels={"Max Acceleration (m/s\u00b2)": "Max Acceleration (m/s\u00b2)", 
                                 "Max Deceleration (m/s\u00b2)": "Max Deceleration (m/s\u00b2)"},
                         color_discrete_sequence=px.colors.qualitative.Vivid)
    return fig

# Gradio Interface
def visualize_data(session, metric):
    fig = generate_visualizations(session, metric)
    return fig

sessions = list(file_paths.keys())
metrics = ["Played Time Distribution", "Top Speed Boxplot", "Distance Covered vs Played Time", 
           "Dribbling Contribution by Position", "Kick Power Distribution", "Session Intensity by Position", 
           "High-Intensity Runs", "Max Intensity: Acceleration vs Deceleration"]

gr.Interface(
    fn=visualize_data,
    inputs=[gr.Dropdown(choices=sessions, label="Select Session"),
            gr.Dropdown(choices=metrics, label="Select Metric")],
    outputs=gr.Plot(label="Visualization"),
    title="Football Analytics: Interactive Visualizations"
).launch()