Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import pickle | |
import matplotlib.pyplot as plt | |
import seaborn as sns | |
import numpy as np | |
# Load model and encoder | |
def load_model_and_encoder(): | |
with open('best_rf_pipeline.pkl', 'rb') as f: | |
model = pickle.load(f) | |
with open('label_encoder.pkl', 'rb') as f: | |
encoder = pickle.load(f) | |
return model, encoder | |
# Load player dataset | |
def load_data(): | |
return pd.read_csv('Reduced_final_teams.csv') | |
# Match player name exactly (case-insensitive) | |
def get_matching_player(name_from_file, player_list): | |
name_lower = name_from_file.lower() | |
for player in player_list: | |
if player.lower() == name_lower: | |
return player | |
return None | |
# Horizontal bar chart | |
def plot_horizontal_bar(df, player1, player2): | |
st.subheader("π Stat Comparison - Horizontal Bar Chart") | |
num_cols = df.select_dtypes(include='number').columns | |
df_num = df[num_cols].T | |
df_num.columns = [player1, player2] | |
df_num = df_num.fillna(0) | |
df_num = df_num.sort_values(by=player1, ascending=False).head(15) | |
fig, ax = plt.subplots(figsize=(10, 7)) | |
df_num.plot(kind='barh', ax=ax) | |
ax.set_title(f"{player1} vs {player2} - Key Stats") | |
ax.set_xlabel("Value") | |
ax.set_ylabel("Metric") | |
ax.legend(loc="lower right") | |
st.pyplot(fig) | |
# Pie chart with NaN-safe checks | |
def plot_pie_charts(player1_data, player2_data, player1, player2): | |
st.subheader("π₯§ Batting vs Bowling Contribution") | |
col1, col2 = st.columns(2) | |
for col, player_data, player_name in zip([col1, col2], [player1_data, player2_data], [player1, player2]): | |
batting_total = sum([ | |
player_data.get('Runs_ODI', 0) or 0, | |
player_data.get('Runs_T20', 0) or 0, | |
player_data.get('Runs_Test', 0) or 0 | |
]) | |
bowling_total = sum([ | |
player_data.get('Wickets_ODI', 0) or 0, | |
player_data.get('Wickets_T20', 0) or 0, | |
player_data.get('Wickets_Test', 0) or 0 | |
]) | |
total = batting_total + bowling_total | |
if total == 0 or np.isnan(total): | |
col.warning(f"β οΈ Not enough data to plot pie chart for {player_name}") | |
continue | |
labels = ['Batting', 'Bowling'] | |
sizes = [batting_total, bowling_total] | |
fig, ax = plt.subplots() | |
ax.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, colors=['#4CAF50', '#2196F3']) | |
ax.axis('equal') | |
col.pyplot(fig) | |
col.caption(f"{player_name}'s Batting vs Bowling") | |
# Bowling metrics bar chart | |
def plot_bowling_comparison(df, player1, player2): | |
st.subheader("π― Bowling Metrics Comparison") | |
bowling_cols = [col for col in df.columns if 'Wickets' in col or 'Economy' in col or 'Bowling_Average' in col] | |
df_bowling = df[bowling_cols].T | |
df_bowling.columns = [player1, player2] | |
df_bowling = df_bowling.fillna(0).sort_values(by=player1, ascending=False) | |
if df_bowling.empty: | |
st.warning("β οΈ No bowling metrics available for comparison.") | |
return | |
fig, ax = plt.subplots(figsize=(10, 6)) | |
df_bowling.plot(kind='bar', ax=ax) | |
ax.set_title("Bowling Stats") | |
ax.set_ylabel("Value") | |
ax.set_xticklabels(df_bowling.index, rotation=45, ha='right') | |
ax.legend(loc="upper right") | |
st.pyplot(fig) | |
# Bowling stats summary per player | |
def show_bowling_summary(player_data, player_name): | |
st.subheader(f"π³ Bowling Summary: {player_name}") | |
col1, col2, col3 = st.columns(3) | |
col1.metric("Wickets (ODI)", int(player_data.get("Wickets_ODI", 0) or 0)) | |
col2.metric("Wickets (T20)", int(player_data.get("Wickets_T20", 0) or 0)) | |
col3.metric("Wickets (Test)", int(player_data.get("Wickets_Test", 0) or 0)) | |
col4, col5 = st.columns(2) | |
economy = player_data.get("Economy_ODI", 0) | |
bowling_avg = player_data.get("Bowling_Average_Test", 0) | |
col4.metric("Economy (ODI)", f"{economy:.2f}" if pd.notna(economy) else "N/A") | |
col5.metric("Avg (Test)", f"{bowling_avg:.2f}" if pd.notna(bowling_avg) else "N/A") | |
# Main app | |
def main(): | |
st.set_page_config(layout="wide") | |
st.title("Cricket Player Comparison Tool π") | |
df = load_data() | |
model, encoder = load_model_and_encoder() | |
player_list = df['Player'].tolist() | |
# Upload images | |
col1, col2 = st.columns(2) | |
with col1: | |
img1 = st.file_uploader("Upload Image for Player 1", type=['png', 'jpg', 'jpeg'], key='img1') | |
with col2: | |
img2 = st.file_uploader("Upload Image for Player 2", type=['png', 'jpg', 'jpeg'], key='img2') | |
if img1 and img2: | |
name1_raw = img1.name.rsplit('.', 1)[0] | |
name2_raw = img2.name.rsplit('.', 1)[0] | |
player1_name = get_matching_player(name1_raw, player_list) | |
player2_name = get_matching_player(name2_raw, player_list) | |
if player1_name and player2_name and player1_name != player2_name: | |
player1_data = df[df['Player'].str.lower() == player1_name.lower()].fillna(0).squeeze() | |
player2_data = df[df['Player'].str.lower() == player2_name.lower()].fillna(0).squeeze() | |
st.success(f"Comparing **{player1_name}** vs **{player2_name}**") | |
col3, col4 = st.columns(2) | |
with col3: | |
st.image(img1, caption=player1_name, use_container_width=True) | |
with col4: | |
st.image(img2, caption=player2_name, use_container_width=True) | |
# Full Stats Table | |
comparison_df = pd.DataFrame([player1_data, player2_data]) | |
comparison_df.set_index('Player', inplace=True) | |
st.subheader("π Full Stats Table") | |
st.dataframe(comparison_df.T) | |
# Stat Summaries | |
show_bowling_summary(player1_data, player1_name) | |
show_bowling_summary(player2_data, player2_name) | |
# Visualizations | |
plot_horizontal_bar(comparison_df, player1_name, player2_name) | |
plot_pie_charts(player1_data, player2_data, player1_name, player2_name) | |
plot_bowling_comparison(comparison_df, player1_name, player2_name) | |
else: | |
st.error("β Player names from image files don't match or are the same. Please check file names.") | |
else: | |
st.info("πΈ Please upload two player images to continue.") | |
if __name__ == "__main__": | |
main() | |