Spaces:
Running
Running
import numpy as np | |
import pandas as pd | |
import streamlit as st | |
from sklearn.preprocessing import StandardScaler | |
from sklearn.neighbors import NearestNeighbors | |
import pickle | |
# Set page config | |
st.set_page_config( | |
page_title="FIFA 19 Player Recommender", | |
page_icon="⚽", | |
layout="wide" | |
) | |
# Load all pickle files | |
def load_data(): | |
try: | |
with open('newdf3.pkl', 'rb') as f: | |
df3 = pickle.load(f) | |
with open('predictorsscale.pkl', 'rb') as f: | |
predictors_scaled = pickle.load(f) | |
with open('newpredictors.pkl', 'rb') as f: | |
predictors_df = pickle.load(f) | |
with open('train_predictors_val.pkl', 'rb') as f: | |
train_predictors_val = pickle.load(f) | |
with open('newfifa.pkl', 'rb') as f: | |
fifa = pickle.load(f) | |
with open('df3scaled.pkl', 'rb') as f: | |
df3scaled = pickle.load(f) | |
with open('finalxbrmodel.pkl', 'rb') as f: | |
xbr = pickle.load(f) | |
return df3, predictors_scaled, predictors_df, train_predictors_val, fifa, df3scaled, xbr | |
except Exception as e: | |
st.error(f"Error loading data: {str(e)}") | |
raise e | |
# Load data | |
df3, predictors_scaled, predictors_df, train_predictors_val, fifa, df3scaled, xbr = load_data() | |
predscale_target = predictors_scaled.columns.tolist() | |
def player_sim_team(team, position, NUM_RECOM, AGE_upper_bound): | |
try: | |
# part 1(recommendation) | |
target_cols = predscale_target | |
# team stats | |
team_stats = df3scaled.query('position_group == @position and Club == @team').head(3)[target_cols].mean(axis=0) | |
team_stats_np = team_stats.values | |
# player stats by each position | |
ply_stats = df3scaled.query('position_group == @position and Club != @team and Age1 <= @AGE_upper_bound')[ | |
['ID'] + target_cols] | |
ply_stats_np = ply_stats[target_cols].values | |
X = np.vstack((team_stats_np, ply_stats_np)) | |
## KNN | |
nbrs = NearestNeighbors(n_neighbors=NUM_RECOM + 1, algorithm='auto').fit(X) | |
dist, rank = nbrs.kneighbors(X) | |
indice = ply_stats.iloc[rank[0, 1:]].index.tolist() | |
predicted_players_name=df3['Name'].loc[indice,].tolist() | |
predicted_players_value=fifa['Value'].loc[indice,].tolist() | |
display_df1 = predictors_scaled.loc[indice,] | |
playrpredictorss = predictors_df.loc[indice,] | |
display_df2 = df3.loc[indice,] | |
display_df = fifa.loc[indice,] | |
try: | |
#part 2(prediction) | |
predictors_anomaly_processed=playrpredictorss[playrpredictorss.index.isin(list(display_df2['ID']))].copy() | |
predictors_anomaly_processed['Forward_Skill'] = predictors_anomaly_processed.loc[:,['LS','ST','RS','LW','LF','CF','RF','RW']].mean(axis=1) | |
predictors_anomaly_processed['Midfield_Skill'] = predictors_anomaly_processed.loc[:,['LAM','CAM','RAM','LM','LCM','CM','RCM','RM','LDM','CDM','RDM']].mean(axis=1) | |
predictors_anomaly_processed['Defence_Skill'] = predictors_anomaly_processed.loc[:,['LWB','RWB','LB','LCB','CB','RCB','RB']].mean(axis=1) | |
predictors_anomaly_processed = predictors_anomaly_processed.drop(['LS','ST','RS','LW','LF','CF','RF','RW', | |
'LAM','CAM','RAM','LM','LCM','CM','RCM','RM','LDM','CDM','RDM', | |
'LWB','RWB','LB','LCB','CB','RCB','RB'], axis=1) | |
predictors_anomaly_processed=predictors_anomaly_processed.drop(predictors_anomaly_processed.iloc[:,predictors_anomaly_processed.columns.get_loc('Position_CAM'):predictors_anomaly_processed.columns.get_loc('Position_ST')+1], axis=1) | |
predictors_anomaly_processed=predictors_anomaly_processed[train_predictors_val.columns] | |
predictors_anomaly_processed[['International Reputation','Real Face']]=predictors_anomaly_processed[['International Reputation','Real Face']].astype('category') | |
scaler = StandardScaler() | |
predictors_anomaly_processed[predictors_anomaly_processed.select_dtypes(include=['float64','float32','int64','int32'], exclude=['category']).columns] = scaler.fit_transform(predictors_anomaly_processed.select_dtypes(include=['float64','float32','int64','int32'], exclude=['category'])) | |
predictors_anomaly_processed[predictors_anomaly_processed.select_dtypes(include='category').columns]=predictors_anomaly_processed[predictors_anomaly_processed.select_dtypes(include='category').columns].astype('int') | |
try: | |
predictions = abs(xbr.predict(predictors_anomaly_processed)) | |
predictions = predictions.astype('int64') | |
except AttributeError: | |
st.warning("Using fallback prediction method due to model version mismatch") | |
# Fallback to using value directly if prediction fails | |
predictions = predicted_players_value | |
except Exception as e: | |
st.error(f"Error in prediction part: {str(e)}") | |
# Fallback to using original values if prediction fails | |
predictions = predicted_players_value | |
result = final_pred(NUM_RECOM, predictions, predicted_players_value, predicted_players_name) | |
return result | |
except Exception as e: | |
st.error(f"Error in recommendation part: {str(e)}") | |
return [] | |
def final_pred(num_of_players,b=[],c=[],d=[]): | |
z=[] | |
for m in range(0,num_of_players): | |
c[m]=((c[m]+b[m])/2) | |
z.append({"starting_bid":c[m],"player_name":d[m]}) | |
return z | |
def main(): | |
st.title("FIFA 19 Player Recommender 🎮⚽") | |
# Create two columns - one for instructions and one for results | |
left_col, right_col = st.columns([1, 1]) | |
with left_col: | |
# Add business context and description | |
st.markdown(""" | |
### About this App | |
This FIFA 19 Player Recommender helps football clubs and managers identify similar players and predict their market value. | |
It's particularly useful for: | |
- Scouting potential replacements for current players | |
- Finding undervalued talents in the market | |
- Discovering players that match your team's playing style | |
- Making informed decisions about player acquisitions | |
### How it Works | |
1. The app uses advanced machine learning to analyze player attributes and find similar players | |
2. It considers over 70 different player statistics and characteristics | |
3. Provides market value predictions to help with transfer budget planning | |
### How to Use | |
1. **Select Your Team** from the sidebar - this helps find players that would fit your team's style | |
2. **Choose Position** you're looking to fill | |
3. **Adjust Number of Recommendations** (1-10 players) | |
4. **Set Maximum Age** to focus on your preferred age range | |
5. Click "Get Recommendations" to see your matches! | |
""") | |
# Sidebar inputs | |
st.sidebar.header("Search Parameters") | |
# Get unique teams and positions | |
teams = sorted(df3['Club'].unique()) | |
positions = sorted(df3['position_group'].unique()) | |
team_chosen = st.sidebar.selectbox("Select Team", teams) | |
postion_chosen = st.sidebar.selectbox("Select Position", positions) | |
num_of_players = st.sidebar.slider("Number of Players to Recommend", 1, 10, 5) | |
age_up = st.sidebar.slider("Maximum Age", 16, 45, 30) | |
if st.sidebar.button("Get Recommendations"): | |
with right_col: | |
with st.spinner("Finding similar players..."): | |
recommendations = player_sim_team(team_chosen, postion_chosen, num_of_players, age_up) | |
# Display results in a nice format | |
st.subheader(f"Recommended Players for {team_chosen} - {postion_chosen}") | |
# Create a container for recommendations | |
for player in recommendations: | |
with st.container(): | |
st.markdown(f""" | |
### {player['player_name']} | |
**Estimated Value:** €{player['starting_bid']:,.2f} | |
--- | |
""") | |
if __name__ == '__main__': | |
main() | |
#print("postions=side_df,cent_df,cent_md,side_md,cent_fw,side_fw,goalkeep") | |
#print("team=any club teams in any of the countries ") | |
#print("*********************************************** \n") | |
#team_chosen = str(input("Enter the team you are looking for: \n")) | |
#postion_chosen = str(input("Enter the position you are looking for: \n")) | |
#num_of_players = input("Enter the number of similar players you are looking for: \n") | |
#age_up = input("Enter the age limit: ") | |
#print("***please have some biscuits, it will take some time***") | |
#player_sim_team(team_chosen,postion_chosen, int(num_of_players), int(age_up)) | |
#finalfunction = player_sim_team(team_chosen,postion_chosen, int(num_of_players), int(age_up)) | |
#pickle.dump(finalfunction, open('finalfunction.pkl', 'wb')) | |