|
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: |
|
|
|
df = pd.read_excel(file_path) |
|
|
|
|
|
if "somme" in query.lower() or "total" in query.lower(): |
|
|
|
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: |
|
|
|
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) |