import streamlit as st
import requests
import time
# --- Configuration de la Page ---
# --- INJECTION DE CSS POUR PERSONNALISER LE FORMULAIRE ---
st.markdown("""
""", unsafe_allow_html=True)
st.set_page_config(
page_title="Prédiction GetAround",
page_icon="🚗",
layout="wide" # Utilise toute la largeur de la page
)
with st.sidebar:
st.title("Dashboard Menu")
st.page_link("app.py", label="Accueil", icon="🏠")
st.page_link("pages/1_EDA_GetAround.py", label="EDA GetAround", icon="📈")
st.page_link("pages/2_Simulateur_Seuil.py", label="Simulateur Seuil", icon="⏱️")
st.page_link("pages/3_Prediction_Prix.py", label="Prediction Prix", icon="💰")
st.html(
"
🚗 Estimateur de Prix de Location GetAround!
"
)
# --- Variables Globales ---
# URL de l'API que nous avons mis tant de temps à faire fonctionner !
API_URL = "https://ericjedha-getaroundapi.hf.space/predict/"
# --- Titre et Description ---
st.markdown("Estimation du prix de location journalier pour un véhicule")
st.markdown("---") # Ajoute une ligne de séparation
# --- Création des Colonnes ---
col_form, col_result = st.columns([2, 1]) # La colonne du formulaire sera 2x plus large que celle du résultat
# ==============================================================================
# --- COLONNE DE GAUCHE : Le Formulaire de Saisie ---
# ==============================================================================
with col_form:
st.header("Caractéristiques du véhicule")
# Utiliser un formulaire pour regrouper les champs et n'envoyer la requête qu'au clic du bouton
with st.form("prediction_form"):
# Diviser le formulaire en sous-colonnes pour un meilleur agencement
sub_col1, sub_col2 = st.columns(2)
with sub_col1:
# Choix prédéfinis pour éviter les erreurs de saisie
model_key = st.selectbox("Marque du véhicule", ["Citroën", "Peugeot", "PGO", "Renault", "Audi", "BMW", "Mercedes", "Opel", "Volkswagen", "Ferrari", "Nissan", "SEAT", "Subaru", "Toyota", "Maserati", "Porsche", "Ford", "KIA Motors", "Alfa Romeo", "Fiat", "Lamborghini", "Honda", "Lexus", "Mini", "Mitsubishi", "Smart"])
paint_color = st.selectbox("Couleur", ["black", "grey", "white", "red", "silver", "blue", "orange", "brown", "green"])
car_type = st.selectbox("Type de carrosserie", ["estate", "sedan", "suv", "hatchback", "subcompact", "coupe", "convertible", "van"])
fuel = st.selectbox("Carburant", ["diesel", "petrol", "hybrid_petrol", "electro"])
with sub_col2:
mileage = st.number_input("Kilométrage", min_value=0, value=100000, step=1000)
engine_power = st.number_input("Puissance du moteur (ch)", min_value=0, value=120, step=10)
st.markdown("---")
st.subheader("Équipements et options")
# Utiliser des checkbox pour les options binaires (Oui/Non)
# C'est plus intuitif pour l'utilisateur
opt_col1, opt_col2, opt_col3 = st.columns(3)
with opt_col1:
private_parking_available = st.checkbox("Parking privé disponible", value=True)
has_gps = st.checkbox("GPS intégré", value=True)
has_air_conditioning = st.checkbox("Climatisation", value=True)
with opt_col2:
automatic_car = st.checkbox("Boîte automatique", value=False)
has_getaround_connect = st.checkbox("GetAround Connect", value=True)
has_speed_regulator = st.checkbox("Régulateur de vitesse", value=True)
with opt_col3:
winter_tires = st.checkbox("Pneus hiver", value=False)
# Bouton de soumission du formulaire
submitted = st.form_submit_button("Lancer la Prédiction ✨")
# ==============================================================================
# --- COLONNE DE DROITE : Affichage du Résultat ---
# ==============================================================================
with col_result:
st.header("Résultat de la prédiction")
if submitted:
# Afficher un message d'attente pendant l'appel à l'API
with st.spinner("Analyse des données et calcul en cours..."):
# Conversion des booléens (True/False) des checkbox en entiers (1/0) pour l'API
data = {
"model_key": model_key,
"mileage": mileage,
"engine_power": engine_power,
"fuel": fuel,
"paint_color": paint_color,
"car_type": car_type,
"private_parking_available": 1 if private_parking_available else 0,
"has_gps": 1 if has_gps else 0,
"has_air_conditioning": 1 if has_air_conditioning else 0,
"automatic_car": 1 if automatic_car else 0,
"has_getaround_connect": 1 if has_getaround_connect else 0,
"has_speed_regulator": 1 if has_speed_regulator else 0,
"winter_tires": 1 if winter_tires else 0
}
try:
# Envoyer la requête POST à l'API FastAPI
response = requests.post(API_URL, json=data, timeout=30)
response.raise_for_status() # Lève une exception si le statut est une erreur (4xx ou 5xx)
# Extraire la prédiction
prediction_data = response.json()
price = prediction_data.get("prediction")
# Afficher le résultat de manière claire et visible
st.metric(
label="Prix journalier recommandé",
value=f"{price:.2f} €",
delta="Basé sur le modèle XGBoost",
delta_color="off"
)
st.success("Prédiction calculée avec succès !")
# Pour le débogage, on peut aussi afficher la réponse brute
with st.expander("Voir la réponse brute de l'API"):
st.json(prediction_data)
except requests.exceptions.HTTPError as err:
st.error(f"Erreur HTTP de l'API : {err.response.status_code}")
st.warning("Veuillez vérifier les logs de l'API sur Hugging Face pour plus de détails.")
st.json(err.response.json())
except requests.exceptions.RequestException as e:
st.error(f"Erreur de connexion à l'API : {e}")
st.warning("L'API est peut-être en cours de redémarrage. Veuillez réessayer dans un instant.")
else:
# Message par défaut quand rien n'a encore été soumis
st.info("Veuillez remplir le formulaire et cliquer sur 'Lancer la Prédiction' pour voir le résultat.")