import gradio as gr import joblib import pandas as pd import numpy as np # Charger le modèle en spécifiant le chemin absolu model_path = "./linear_regression_model.joblib" try: lr = joblib.load(model_path) except FileNotFoundError: raise FileNotFoundError(f"Le fichier modèle '{model_path}' est introuvable. Vérifiez le chemin.") # Fonction de prédiction unique def predict_price(kms_driven, present_price, fuel_type, seller_type, transmission, age): # Encodage des variables catégoriques fuel_type_mapping = {"Petrol": 0, "Diesel": 1, "CNG": 2} seller_type_mapping = {"Dealer": 0, "Individual": 1} transmission_mapping = {"Manual": 0, "Automatic": 1} try: # Conversion des types et gestion des encodages fuel_type = fuel_type_mapping.get(fuel_type, -1) seller_type = seller_type_mapping.get(seller_type, -1) transmission = transmission_mapping.get(transmission, -1) if fuel_type == -1 or seller_type == -1 or transmission == -1: return "Erreur : Valeurs non reconnues pour les types de carburant, vendeur ou transmission." # Création de l'entrée pour le modèle features = np.array([kms_driven, present_price, fuel_type, seller_type, transmission, age]).reshape(1, -1) # Prédiction prediction = lr.predict(features)[0] return max(round(prediction, 2), 0) # S'assurer que le prix prédit n'est pas négatif except Exception as e: return f"Erreur lors de la prédiction : {str(e)}" # Fonction de prédiction multiple à partir d'un fichier CSV def predict_from_csv(file): # Encodage des variables catégoriques fuel_type_mapping = {"Petrol": 0, "Diesel": 1, "CNG": 2} seller_type_mapping = {"Dealer": 0, "Individual": 1} transmission_mapping = {"Manual": 0, "Automatic": 1} try: # Charger le fichier CSV data = pd.read_csv(file) # Vérifier si les colonnes nécessaires sont présentes required_columns = ["Kms_Driven", "Present_Price", "Fuel_Type", "Seller_Type", "Transmission", "Age"] missing_columns = [col for col in required_columns if col not in data.columns] if missing_columns: return f"Erreur : Colonnes manquantes dans le fichier CSV : {', '.join(missing_columns)}" # Remplacer les valeurs catégoriques par leur encodage data["Fuel_Type"] = data["Fuel_Type"].map(fuel_type_mapping) data["Seller_Type"] = data["Seller_Type"].map(seller_type_mapping) data["Transmission"] = data["Transmission"].map(transmission_mapping) # Vérifier si des valeurs non reconnues sont présentes if data[["Fuel_Type", "Seller_Type", "Transmission"]].isnull().any().any(): return "Erreur : Valeurs non reconnues pour Fuel_Type, Seller_Type ou Transmission dans le fichier." # Extraire les caractéristiques et effectuer les prédictions features = data[required_columns].values predictions = lr.predict(features) # Ajouter les prédictions au DataFrame data["Predicted_Price"] = [max(pred, 0) for pred in predictions] # S'assurer que les prix prédits ne sont pas négatifs return data except Exception as e: return f"Erreur lors de la prédiction : {str(e)}" # Interface Gradio pour la prédiction unique simple_input_labels = [ gr.Number(label="Kms_Driven"), gr.Number(label="Present_Price"), gr.Dropdown(choices=["Petrol", "Diesel", "CNG"], label="Fuel_Type"), gr.Dropdown(choices=["Dealer", "Individual"], label="Seller_Type"), gr.Dropdown(choices=["Manual", "Automatic"], label="Transmission"), gr.Number(label="Age"), ] simple_output = gr.Number(label="Predicted Price") # Interface Gradio pour la prédiction multiple via un fichier CSV csv_input = gr.File(label="Déposez votre fichier CSV") csv_output = gr.Dataframe(label="Prédictions avec fichier CSV") # Interface combinée interface = gr.TabbedInterface( [ gr.Interface( fn=predict_price, inputs=simple_input_labels, outputs=simple_output, title="Car Price Prediction (Unique)", description="Prédisez le prix d'une voiture en entrant une seule série de caractéristiques.", ), gr.Interface( fn=predict_from_csv, inputs=csv_input, outputs=csv_output, title="Car Price Prediction (Multiple)", description="Téléversez un fichier CSV contenant les données des voitures pour obtenir les prédictions de prix.", ), ], tab_names=["Prédiction Unique", "Prédiction Multiple"] ) # Lancer l'application if __name__ == "__main__": interface.launch()