Fifa19_webapp / app.py
dcrey7's picture
fifa19_streamlit
286093e
raw
history blame
9.07 kB
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
@st.cache_resource
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'))