import pandas as pd from typing import List, Dict, Any from langchain.tools import BaseTool class SpreadsheetParserTool(BaseTool): name = "spreadsheet_parser" description = "Analyse un fichier Excel et extrait des informations spécifiques" def _run(self, file_path: str, query: str) -> str: """Analyse un fichier Excel et répond à une requête spécifique""" try: # Lire le fichier Excel df = pd.read_excel(file_path) # Analyser la requête pour déterminer l'action à effectuer if "somme" in query.lower() or "total" in query.lower(): # Trouver les colonnes numériques numeric_cols = df.select_dtypes(include=['number']).columns if len(numeric_cols) > 0: return f"Somme des colonnes numériques:\n{df[numeric_cols].sum().to_string()}" else: return "Aucune colonne numérique trouvée dans le fichier" elif "moyenne" in query.lower() or "average" in query.lower(): numeric_cols = df.select_dtypes(include=['number']).columns if len(numeric_cols) > 0: return f"Moyenne des colonnes numériques:\n{df[numeric_cols].mean().to_string()}" else: return "Aucune colonne numérique trouvée dans le fichier" elif "premières lignes" in query.lower() or "first rows" in query.lower(): return f"Premières lignes du fichier:\n{df.head().to_string()}" else: # Par défaut, retourner un résumé du fichier return f"Résumé du fichier:\nNombre de lignes: {len(df)}\nColonnes: {', '.join(df.columns)}\nTypes de données:\n{df.dtypes.to_string()}" except Exception as e: return f"Erreur lors de l'analyse du fichier Excel: {str(e)}" async def _arun(self, file_path: str, query: str) -> str: """Version asynchrone de l'outil""" return self._run(file_path, query)