# app.py import gradio as gr import pandas as pd import os import io from transformers import pipeline from evidently.report.report import Report from evidently.metric_preset import DataQualityPrese # Charger le modèle LLM open-source depuis Hugging Face llm = pipeline( "text-generation", model="Qwen/Qwen2.5-1.5B-Instruct", trust_remote_code=True, device_map="auto" ) def load_file(file): if file is None: return None, "Aucun fichier" fname = file.name ext = os.path.splitext(fname)[1].lower() file.seek(0) try: if ext in [".csv"]: df = pd.read_csv(file) elif ext in [".xlsx", ".xls"]: df = pd.read_excel(file) elif ext in [".json"]: df = pd.read_json(file) elif ext in [".parquet"]: df = pd.read_parquet(file) else: return None, "Format non pris en charge" return df, f"✅ {fname} chargé avec {len(df)} lignes et {len(df.columns)} colonnes." except Exception as e: return None, f"Erreur de chargement : {e}" def profile_dataset(df): report = Report(metrics=[DataQualityPreset()]) report.run(reference_data=df, current_data=df) html = report.as_html() return html def generate_insights(df): # Générer une description textuelle du DataFrame desc = df.describe(include='all').to_string() schema = str(df.dtypes.to_dict()) prompt = f""" Tu es un assistant expert en data cleaning et data analysis. Voici le résumé d'un jeu de données : --- Types de colonnes : {schema} Statistiques : {desc} --- Tâches : 1. Identifie les problèmes de qualité potentiels. 2. Propose des actions de nettoyage. 3. Suggère des idées clés d'analyse ou des indicateurs intéressants. 4. Donne des insights potentiels ou des relations à explorer. Réponds de manière structurée et claire. """ output = llm(prompt, max_new_tokens=512)[0]['generated_text'] return output def process_file(file): df, msg = load_file(file) if df is None: return msg, "", "" report_html = profile_dataset(df) suggestions = generate_insights(df) return msg, report_html, suggestions with gr.Blocks(title="DataCleaner Copilot") as app: gr.Markdown("# 🧠 DataCleaner Copilot (Open Source Edition)") gr.Markdown("Chargez vos données et laissez l’IA vous aider à nettoyer, analyser et trouver des insights.") with gr.Row(): file_input = gr.File(label="Uploader un fichier (CSV, Excel, JSON, Parquet)") process_btn = gr.Button("Analyser les données") info_box = gr.Textbox(label="📄 Informations sur le fichier") report_box = gr.HTML(label="📊 Rapport Evidently") insight_box = gr.Textbox(label="💡 Suggestions et insights de l'IA", lines=15) process_btn.click(process_file, inputs=[file_input], outputs=[info_box, report_box, insight_box]) app.launch()