Drop files here
or click to upload
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import re
st.set_page_config(page_title="Analyse des Évaluations", layout="wide")
url = "https://docs.google.com/spreadsheets/d/1HEmNfPYfEP6oiYqSHkxSGzbyfsLQinUuTuwrkH86VGQ/export?format=csv"
try:
df = pd.read_csv(url)
# Nettoyer les espaces dans les noms de colonnes
df.columns = df.columns.str.strip()
st.success("✅ Données chargées avec succès !")
except Exception as e:
st.error("❌ Erreur lors du chargement du fichier Google Sheets.")
st.stop()
# Affichage des colonnes pour vérification
st.subheader("🧾 Colonnes détectées dans le fichier :")
st.write(df.columns.tolist())
# Critères après nettoyage des colonnes
criteres = [
"Propreté du restaurant",
"Accueil et réception",
"Goût des plats",
"Qualité du service (serveurs, rapidité, amabilité)",
"Rapport qualité / prix"
]
# Vérification des colonnes manquantes
missing_cols = [col for col in criteres if col not in df.columns]
if missing_cols:
st.error(f"❌ Les colonnes suivantes sont manquantes dans la feuille : {missing_cols}")
st.stop()
# Conversion du timestamp
if 'Timestamp' in df.columns:
df['Timestamp'] = pd.to_datetime(df['Timestamp'], errors='coerce')
df['Date'] = df['Timestamp'].dt.date
else:
df['Date'] = pd.to_datetime("today").date()
# Moyenne globale par client
df['Moyenne client'] = df[criteres].mean(axis=1)
# Titre principal
st.title("📊 Analyse des Évaluations Clients")
# Moyenne par critère
st.subheader("⭐ Moyenne pour chaque critère")
moyennes = df[criteres].mean().round(2)
st.dataframe(moyennes)
# Statistiques sur les notes
st.subheader("🔢 Répartition des notes par critère")
# Dictionnaire pour stocker les résultats
repartition_par_critere = {}
for critere in criteres:
repartition = {}
for note in [5, 4, 3, 2, 1]:
repartition[note] = int((df[critere] == note).sum())
repartition_par_critere[critere] = repartition
# Transformer en DataFrame pour un affichage clair
repartition_df = pd.DataFrame(repartition_par_critere).T # Transpose pour avoir critères en ligne, notes en colonnes
repartition_df = repartition_df[[5, 4, 3, 2, 1]] # Ordre des colonnes
st.dataframe(repartition_df)
# Moyenne par jour (bar chart)
st.subheader("📅 Moyenne globale par jour (Barres)")
daily_means = df.groupby("Date")["Moyenne client"].mean().reset_index()
fig1, ax1 = plt.subplots()
ax1.bar(daily_means["Date"].astype(str), daily_means["Moyenne client"], color='skyblue')
ax1.set_xlabel("Date")
ax1.set_ylabel("Moyenne")
plt.xticks(rotation=45)
st.pyplot(fig1)
# Évolution temporelle (courbe)
st.subheader("📈 Évolution de la moyenne globale (Courbe)")
fig2, ax2 = plt.subplots()
ax2.plot(daily_means["Date"], daily_means["Moyenne client"], marker='o', linestyle='-', color='green')
ax2.set_xlabel("Date")
ax2.set_ylabel("Moyenne globale")
plt.xticks(rotation=45)
st.pyplot(fig2)
# Nettoyage nom et numéro de téléphone
df['Nom'] = df['Nom'].str.strip()
# Nettoyer et formater les numéros de téléphone :
# - garder que les chiffres
# - afficher au format international si possible (ex: +212 XXXXXXXX)
def format_phone(num):
if pd.isna(num):
return ""
digits = re.sub(r'\D', '', str(num))
# Exemple pour Maroc (code +212), adapte selon besoin
if digits.startswith('0') and len(digits) == 10:
return '+212 ' + digits[1:4] + ' ' + digits[4:7] + ' ' + digits[7:]
else:
return digits
df['Téléphone'] = df['Numéro de téléphone'].apply(format_phone)
# Préparer DataFrame simplifié
df_affiche = df[['Nom', 'Téléphone', 'Moyenne client']]
# Affichage final
st.subheader("📄 Données clients simplifiées")
st.dataframe(df_affiche)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?