Analizzare un file Excel o CSV con un'IA locale
Analizzare un Excel o un CSV con un'IA locale non richiede di affidare le addizioni al modello. Questa guida suddivide il lavoro: pandas legge il file e calcola, un secondo script ricalcola per un'altra via, poi un modello servito da Ollama commenta risultati già controllati. Il codice completo è fornito per un CSV, con le modifiche da prevedere per una cartella di lavoro Excel. Una sezione indica con precisione che cosa è stato verificato sul campo e che cosa no.
#Analizzare un file Excel o CSV con un'IA locale: chi calcola, chi interpreta
Incollare una tabella in una conversazione è allettante: la risposta arriva in forma di frasi, con totali che sembrano giusti. Ma un LLM genera testo plausibile e non esegue alcun calcolo quando scrive un totale. Nella sua risposta, nulla distingue una cifra giusta da una sbagliata. E più il file è lungo, più rischia di superare il contesto del modello, a volte senza un messaggio chiaro.
La suddivisione proposta qui è semplice: tutto ciò che può essere ricalcolato in modo identico spetta a uno strumento deterministico. Lo stesso file e lo stesso script danno lo stesso risultato, e questo risultato si può verificare. Al modello resta ciò che sa fare: tradurre i risultati in parole, segnalare ciò che merita attenzione e proporre domande.
- Leggere e validare: pandas
- Colonne presenti, celle vuote, importi numerici, date nel formato previsto. Lo script si ferma invece di tirare a indovinare.
- Calcolare: pandas
- Totali e quote per categoria, scritti in un file faits.json.
- Controllare: solo Python
- Un secondo script rilegge il file sorgente senza pandas e riconta. Qualsiasi scostamento blocca il seguito.
- Interpretare: il modello locale
- Riceve solo faits.json, non le righe del file, e redige un commento senza scrivere di persona nemmeno una cifra.
- Decidere: tu
- Un totale dimostra una somma, non una causa. Il commento del modello resta una pista da esaminare.
#Differenza rispetto al tutorial text-to-SQL
Approfitta della nostra esperienza e di un percorso guidato per creare il tuo assistente locale e usare la tua IA ogni giorno.
- Spazio online a vita
- PDF + file
- Garanzia di rimborso di 30 giorni
QuelLLM propone già un tutorial text-to-SQL in locale. Le due guide impediscono all'LLM di inventare risultati, ma non gli affidano lo stesso ruolo. La scelta dipende soprattutto dalla tua esigenza: porre domande diverse o rifare un calcolo noto.
- Text-to-SQL: ruolo del modello
- Scrive la query a partire da una domanda in francese. Il database esegue poi questo codice generato, da cui la necessità di un ruolo di sola lettura e di una validazione dell'SQL.
- Questa guida: ruolo del modello
- Non scrive alcun codice e non esegue nulla. Scrivi il calcolo una volta, poi il modello ne commenta il risultato.
- Text-to-SQL: quando sceglierlo
- Dati in PostgreSQL o MySQL e domande che cambiano spesso.
- Questa guida: quando sceglierla
- Un'esportazione o una cartella di lavoro, con un calcolo ricorrente: bilancio mensile, ripartizione per categoria, monitoraggio delle spese.
- Limite di questa guida
- Una nuova domanda richiede di modificare lo script. È il prezzo di un calcolo ricontrollato e riproducibile.
#Prerequisiti e file di esempio
- Ollama
- Il servizio deve rispondere su http://localhost:11434. La guida all'installazione è elencata in fondo alla pagina.
- Python
- Un ambiente virtuale con Python 3.11 o versione più recente per pandas 3.
- Un modello
- L'esempio usa qwen3.5:9b, circa 6,6 GB in Q4, una dimensione che sta su una RTX 3060 12GB. Riprende il modello della guida sugli output strutturati; la qualità dei suoi commenti su dati tabellari non è stata valutata in questa sede.
- Un file fittizio
- Inizia con il piccolo file qui sotto. Puoi verificarne i totali a mente, così vedi se la configurazione funziona prima di darle dati reali.
Questo è il formato che si incontra spesso in un'esportazione francese: punto e virgola tra le colonne, virgola per i decimali, data in giorno/mese/anno. Controlla il tuo in un editor di testo, non in Excel, che riformatta la visualizzazione.
#Passaggio 1: calcolare con pandas
Lo script descrive esplicitamente il formato del file e preferisce fermarsi piuttosto che produrre un totale dubbio. La documentazione di pandas consultata il 03/11/2026 (versione 3.1.0) descrive i parametri usati: sep per il delimitatore, decimal per i dati europei e on_bad_lines, il cui valore predefinito « error » genera un errore su una riga malformata.
Due scelte meritano una spiegazione. Innanzitutto keep_default_na=False: l'elenco predefinito di pandas tratta in particolare NA, N/A e null come valori mancanti. Ma una categoria «NA» letta come mancante potrebbe sparire da un raggruppamento senza alcun avviso. In secondo luogo, i duplicati vengono contati ma non rimossi: due acquisti identici nello stesso giorno possono essere legittimi, e questa decisione spetta a te.
Per il file di esempio, il risultato si può calcolare a mano: A = 100 + 25 = 125, B = 50, per una somma di 175. Il tuo output deve corrispondere ai valori seguenti.
#Passaggio 2: ricontare per un'altra via
Un calcolo deterministico può essere sbagliato in modo perfettamente riproducibile: separatore errato, colonna letta male, filtro dimenticato. Per questo il secondo script non si fida di pandas: rilegge il file sorgente con i moduli standard csv e decimal, ricalcola e poi confronta. Si tratta di un controllo di lettura e di addizione. Non dice se il calcolo scelto risponde alla tua domanda.
Concatena i passaggi con &&: se uno fallisce, il successivo non parte. Il modello non vedrà quindi mai risultati respinti dal controllo.
#Passaggio 3: far interpretare i risultati dal modello
Il modello riceve il contenuto di faits.json e risponde secondo uno schema JSON, con il parametro format di Ollama spiegato nella guida sugli output strutturati. Questo schema fissa la forma della risposta, non la sua correttezza. La protezione utile è altrove: il modello vede i valori per poterli confrontare, ma deve citarli tramite la loro chiave. La funzione remplir respinge qualsiasi cifra scritta direttamente e qualsiasi chiave inventata.
Questo controllo non copre tutto. Non rileva un numero scritto in lettere («tre volte tanto»), né una conclusione falsa costruita con valori corretti, ad esempio una causa presentata come accertata. Blocca le cifre ricopiate o inventate, ma la rilettura umana resta necessaria. Se una risposta viene rifiutata, non correggerla a mano: rilancia o riformula il prompt, poi conserva una traccia del rifiuto.
Inviare solo dati aggregati riduce anche ciò che il modello può leggere: niente nomi di clienti né testo libero proveniente dalle righe. Le etichette delle categorie vengono però ancora trasmesse e possono contenere testo ostile se il file arriva dall'esterno. Qui il modello non ha strumenti e può solo produrre testo, il che limita i danni possibili senza eliminare il rischio.
#Passaggio 4: analizzare un file Excel, cosa cambia
Per una cartella di lavoro .xlsx, in calculs.py cambia solo la lettura: read_excel sostituisce read_csv, e i parametri sep, decimal, encoding e on_bad_lines scompaiono. Questo blocco non è stato eseguito su un file Excel: provalo prima su una piccola cartella di lavoro di cui conosci i totali.
- Motore
- Nella documentazione 3.1.0, openpyxl resta il motore predefinito per .xlsx, ma è annunciato che questa scelta passerà a calamine in una versione futura. Indicarlo esplicitamente evita di cambiare motore a tua insaputa durante un aggiornamento.
- Feuille
- sheet_name vale 0 per impostazione predefinita, ossia il primo foglio. Con None o una lista, read_excel restituisce un dizionario di tabelle e non una sola tabella: lo script qui sopra andrebbe quindi adattato.
- Intestazione
- Lo script presuppone che i nomi delle colonne siano nella prima riga. Se un titolo precede la tabella, usa il parametro header o, meglio ancora, ripulisci una copia della cartella di lavoro.
- Dates
- Se la colonna contiene vere date di Excel, il formato giorno/mese/anno dello script non le riguarda necessariamente. Controlla date_min e date_max in faits.json.
- Righe di totale
- Una riga «Totale» in fondo al foglio verrebbe conteggiata come una categoria e raddoppierebbe la somma. In tal caso compare come chiave in faits.json: ricontrolla questo elenco.
Il controllo del passaggio 2 legge un CSV. Per mantenerlo, esporta il foglio da Excel (Salva con nome, formato CSV UTF-8), poi avvia python controle.py export.csv. L'esportazione passa da Excel e non dal motore di lettura di pandas: è un'altra via di lettura, e le discrepanze sono proprio ciò che si cerca. Controlla il delimitatore: lo script si aspetta un punto e virgola. Un importo esportato con il suo formato di visualizzazione, come «1 250,00 €», farà fallire il controllo invece di passare inosservato: rimuovi questo formato nella copia da esportare. Anche un formato arrotondato in visualizzazione può creare una discrepanza, da trattare allo stesso modo.
#Cosa è stato verificato e cosa no
Il 30/10/2026 un CSV fittizio è stato letto e aggregato con pandas 3.0.2; il controllo ha dato A=125 e B=50. È l'unica prova sul campo di questa guida. Il file di esempio qui sopra riprende questi totali per restare leggibile, ma ciò non dimostra il funzionamento degli script pubblicati.
- Verificato
- Lettura e aggregazione di un CSV fittizio con pandas 3.0.2, totali A=125 e B=50 (30/10/2026).
- Riletto, non eseguito
- Parametri di read_csv e read_excel, nella documentazione di pandas 3.1.0 consultata il 03/11/2026. È più recente della versione usata nella prova: controlla la tua versione con pip show pandas.
- Non verificato
- Esecuzione completa di calculs.py, controle.py e interpreter.py nella forma pubblicata, e valori di faits.json in uscita: quelli indicati sono calcolati a mano.
- Non verificato
- Qualsiasi chiamata a un LLM: qualità dei commenti, rispetto del prompt, frequenza dei rifiuti. Per questo non viene presentato alcun esempio di risposta.
- Non verificato
- Qualsiasi lettura di un file Excel, formule ed esportazione CSV comprese.
Qui non compaiono durate, tassi di errore né confronti tra modelli, in mancanza di misurazioni. Considera questi script come una base da provare sul file fittizio prima di usare i tuoi dati. Il test utile consiste anche nel provocare dei fallimenti: modifica un importo in faits.json e il controllo deve rifiutare il risultato; dai da compilare un testo contenente una cifra e la risposta deve essere rifiutata.
#Risoluzione dei problemi
- «La colonna montant contiene altro oltre ai numeri»
- Rimane un simbolo di valuta, un testo o un separatore delle migliaia. Se il file usa un separatore delle migliaia, aggiungi a read_csv il parametro thousands con il carattere corretto. Nei file francesi si tratta spesso di uno spazio unificatore, invisibile a occhio nudo. Il controllo dovrà poi rimuovere questo stesso carattere prima di Decimal.
- Una sola colonna letta, o colonne mancanti
- Il delimitatore non è quello giusto. Apri il file in un editor di testo e adatta sep in calculs.py e delimiter in controle.py.
- UnicodeDecodeError
- Il file non è in UTF-8. Una vecchia esportazione Windows è spesso in cp1252: cambia encoding in entrambi gli script, poi controlla gli accenti nei nomi delle categorie.
- Errore sul formato della data
- Una data non rispetta il formato giorno/mese/anno. Correggi il dato o adatta format. Evita una conversione permissiva, che può nascondere un'inversione tra giorno e mese.
- Quote incoerenti
- Con rimborsi o importi negativi, una quota percentuale può superare 100 o perdere di significato. Lo script non lo segnala: in questo caso rimuovi queste quote da faits.json.
- Risposta rifiutata a ogni tentativo
- Il modello ricopia i valori nonostante l'istruzione. Riformulala o prova un altro modello, senza rimuovere la protezione.
- «Connection refused» lato Ollama
- Il servizio non è avviato. Verifica con ollama list e l'indirizzo http://localhost:11434.
#Per approfondire
Queste guide approfondiscono la configurazione: il text-to-SQL se i tuoi dati sono in un database, gli output strutturati per il parametro format e i rischi legati alle istruzioni nascoste nei file provenienti dall'esterno.
Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.