Rugby / app /utils /data_processing.py
2nzi's picture
app
1900d51 verified
raw
history blame
2.73 kB
import pandas as pd
import streamlit as st
from config.config import EXCEL_PATH
def clean_dataframe(df):
# Récupérer les catégories principales (ligne 0)
categories = df.iloc[0]
# Récupérer les sous-catégories (ligne 2)
sub_categories = df.iloc[2]
# Créer un dictionnaire pour stocker les nouvelles colonnes
new_columns = {}
current_category = None
# Parcourir toutes les colonnes pour créer les nouveaux noms
for i, (cat, subcat) in enumerate(zip(categories, sub_categories)):
if pd.notna(cat):
current_category = cat
if pd.notna(subcat) and current_category is not None:
new_name = f"{current_category}_{subcat}"
new_columns[df.columns[i]] = new_name
# Garder la colonne 'name' telle quelle
new_columns[df.columns[0]] = 'name'
# Renommer les colonnes
df = df.rename(columns=new_columns)
# Supprimer les trois premières lignes et réinitialiser l'index
df = df.iloc[3:].reset_index(drop=True)
# Supprimer les lignes où le nom est vide ou NaN
df = df.dropna(subset=['name']).reset_index(drop=True)
# Extraire le numéro et nettoyer le nom AVANT d'ajouter la colonne Ville
df['numero'] = df['name'].str.extract(r'^(\d+)').fillna('')
df['name'] = df['name'].str.replace(r'^\d+\s*-\s*', '', regex=True).str.strip()
# Ne garder que les colonnes nécessaires
columns_to_keep = ['numero', 'name'] + [col for col in df.columns if '_' in str(col)]
df = df[columns_to_keep]
return df
@st.cache_data
def load_data():
"""Charge et prépare les données depuis le fichier Excel"""
try:
if not EXCEL_PATH.exists():
st.error(f"Le fichier Excel n'a pas été trouvé à l'emplacement : {EXCEL_PATH}")
st.info("Veuillez placer votre fichier stats.xlsx dans le dossier 'data'")
return None
all_sheets = pd.read_excel(EXCEL_PATH, sheet_name=None)
clean_data = []
for ville, df in all_sheets.items():
if ville != "Promedio partidos":
clean_df = clean_dataframe(df)
if not clean_df.empty:
clean_df['Ville'] = ville
clean_data.append(clean_df)
# st.write(clean_data)
if not clean_data:
st.warning("Aucune donnée trouvée")
return None
return pd.concat(clean_data, ignore_index=True)
except Exception as e:
st.error(f"Erreur lors du chargement des données: {str(e)}")
return None