Vediamo un esempio pratico che mostra come Python ed Excel possano lavorare insieme per automatizzare un’attività comune per un manager: l’analisi e il consolidamento dei report di vendita da diversi negozi.
Articoli di approfondimento
👉 Excel + Python: un’accoppiata vincente
👉 Excel e Python per l’analisi dati: guida completa
👉 Excel e Python: perché l’integrazione è il futuro della data analysis
👉 Cos’è il Risolutore di Excel?
👉 Power BI & Python: analisi dati avanzata e machine learning
👉 Ottimizza vendite & marketing: probabilità e break-even con Excel + Python
SCENARIO INIZIALE: LA SFIDA DEL MANAGER
Immaginiamo un Retail Manager che supervisiona una catena di negozi in diverse città italiane. Ogni giorno, si ricevono report Excel separati da ciascun punto vendita contenenti dati cruciali:
- Vendi giornaliere
- Numero di clienti
- Investimenti in marketing
- Data delle transazioni
Il gestore deve:
- Consolidare questi dati per avere una visione d’insieme
- Calcolare i KPI significativi per valutare le prestazioni
- Identificare trend e prendere decisioni strategiche
- Preparare un report per il senior management
IL PROCESSO TRADIZIONALE
Senza automazione, il manager dovrebbe:
- Aprire manualmente ogni file Excel
- Copiare e incollare i dati in un foglio di consolidamento
- Creare e aggiornare formule per i calcoli
- Formattare il report finale
- Ripetere questo processo ogni volta che arrivano nuovi dati
Questo approccio presenta diverse criticità:
- Richiede ore di lavoro manuale
- È soggetto a errori umani dovuti copia-incolla
- Limita il tempo disponibile per l’analisi strategica
- Crea frustrazione e stress nel rispettare le cadenze
LA SOLUZIONE PYTHON-EXCEL
La nostra soluzione automatizzata trasforma radicalmente questo processo:
- Automazione Completa:
- Il manager deve solo mettere i file nella cartella designata ed eseguire lo script
- In pochi secondi ottieni un report completo e professionale
- Analisi Avanzata Automatica:
- Calcolo immediato di KPI critici (ROI marketing, valore medio cliente)
- Identificazione automatica dei trend di performance
- Confronto sistematico tra i diversi punti vendita
- Report Professionali:
- Formattazione coerente e professionale
- Dati organizzati in modo logico e facilmente consultabile
- Due viste separate: dettagliata e sintetica
IMPATTO SUL BUSINESS
L’implementazione di questa soluzione porta benefici tangibili:
- Finanziari:
- Riduzione dei costi del personale dedicato al reporting
- Migliore allocazione delle risorse umane
- ROI positivo sull’investimento in automazione
- Operativi:
- Maggiore velocità nel processo decisionale
- Riduzione degli errori nei report
- Standardizzazione dei processi
- Strategici:
- Decisioni basate su dati più accurati e aggiornati
- Maggiore tempo per analisi strategiche
- Migliore comprensione delle performance dei negozi
Il codice Python
import pandas as pd
import numpy as np # Aggiungiamo l'importazione di NumPy
from pathlib import Path
from datetime import datetime
import openpyxl
from openpyxl.styles import PatternFill, Font
import warnings
warnings.filterwarnings('ignore')
def analizza_vendite_negozi():
"""
Automatizza l'analisi dei report di vendita giornalieri da più negozi.
Flusso di lavoro:
1. Genera dati di esempio per tre negozi (in un caso reale, questi sarebbero file Excel esistenti)
2. Salva i dati in file Excel separati
3. Legge e consolida tutti i report
4. Calcola KPI importanti
5. Genera un report Excel formattato
Returns:
tuple: (nome_file_report, dataframe_risultati)
"""
# Crea la cartella per i report se non esiste
Path('report_negozi').mkdir(exist_ok=True)
# Definiamo i parametri per i dati di esempio
negozi = ['Milano', 'Roma', 'Napoli']
date_range = pd.date_range('2024-01-01', '2024-01-31')
# Dizionario per memorizzare i DataFrame di ogni negozio
dati_esempio = {}
# Genera dati realistici per ogni negozio con valori diversi
for negozio in negozi:
# Usiamo seed diversi per ogni negozio per avere dati realisticamente differenti
np.random.seed({'Milano': 42, 'Roma': 43, 'Napoli': 44}[negozio])
# Genera dati con valori appropriati per ogni città
if negozio == 'Milano':
vendite = np.random.randint(1000, 5000, len(date_range))
clienti = np.random.randint(50, 200, len(date_range))
marketing = np.random.randint(100, 500, len(date_range))
elif negozio == 'Roma':
vendite = np.random.randint(800, 4000, len(date_range))
clienti = np.random.randint(40, 180, len(date_range))
marketing = np.random.randint(80, 400, len(date_range))
else: # Napoli
vendite = np.random.randint(600, 3000, len(date_range))
clienti = np.random.randint(30, 150, len(date_range))
marketing = np.random.randint(60, 300, len(date_range))
# Crea il DataFrame per il negozio
dati_esempio[f'Negozio_{negozio}'] = pd.DataFrame({
'Data': date_range,
'Vendite': vendite,
'Clienti': clienti,
'Spesa_Marketing': marketing
})
# Salva i dati di esempio in file Excel separati
for negozio, df in dati_esempio.items():
df.to_excel(f'report_negozi/{negozio}.xlsx', index=False)
# Legge e consolida tutti i report
cartella_report = Path('report_negozi')
dati_consolidati = pd.DataFrame()
for file_excel in cartella_report.glob('*.xlsx'):
df_temp = pd.read_excel(file_excel)
df_temp['Negozio'] = file_excel.stem
dati_consolidati = pd.concat([dati_consolidati, df_temp])
# Calcola KPI importanti
analisi = dati_consolidati.groupby('Negozio').agg({
'Vendite': ['sum', 'mean'],
'Clienti': ['sum', 'mean'],
'Spesa_Marketing': 'sum'
}).round(2)
analisi.columns = ['Vendite_Totali', 'Vendite_Medie',
'Clienti_Totali', 'Clienti_Medi',
'Spesa_Marketing_Totale']
# Calcola ROI del marketing
analisi['ROI_Marketing'] = ((analisi['Vendite_Totali'] -
analisi['Spesa_Marketing_Totale']) /
analisi['Spesa_Marketing_Totale'] * 100).round(2)
# Calcola valore medio per cliente
analisi['Valore_Medio_Cliente'] = (analisi['Vendite_Totali'] /
analisi['Clienti_Totali']).round(2)
# Crea un report Excel formattato
nome_report = f'Report_Consolidato_{datetime.now().strftime("%Y%m%d")}.xlsx'
with pd.ExcelWriter(nome_report, engine='openpyxl') as writer:
# Foglio con dati consolidati
dati_consolidati.to_excel(writer, sheet_name='Dati_Dettagliati', index=False)
# Foglio con analisi
analisi.to_excel(writer, sheet_name='Analisi')
# Accedi al workbook per la formattazione
wb = writer.book
ws_analisi = wb['Analisi']
# Applica formattazione
header_fill = PatternFill(start_color='366092',
end_color='366092',
fill_type='solid')
# Formatta intestazioni
for cell in ws_analisi[1]:
cell.fill = header_fill
cell.font = Font(color='FFFFFF', bold=True)
# Aggiusta larghezza colonne
for column in ws_analisi.columns:
max_length = 0
column = [cell for cell in column]
for cell in column:
try:
if len(str(cell.value)) > max_length:
max_length = len(cell.value)
except:
pass
adjusted_width = (max_length + 2)
ws_analisi.column_dimensions[column[0].column_letter].width = adjusted_width
return nome_report, analisi
# Esegui l'analisi e mostra i risultati
nome_file, risultati = analizza_vendite_negozi()
print(f"\nReport salvato come: {nome_file}")
print("\nRiepilogo dei risultati principali:")
print(risultati)
Ti guiderò attraverso una spiegazione dettagliata del codice e dei dati, partendo dalle basi e costruendo gradualmente la comprensione del sistema completo.
Prima di tutto, esaminiamo le librerie che utilizziamo:
import pandas as pd # Per la manipolazione dei dati from pathlib import Path # Per gestire i percorsi dei file from datetime import datetime # Per lavorare con le date import openpyxl # Per la formattazione avanzata di Excel from openpyxl.styles import PatternFill, Font # Per lo stile del report
Per quanto riguarda i dati in input, il codice simula una situazione aziendale realistica dove abbiamo tre negozi (Milano, Roma e Napoli) che producono report giornalieri. Ogni rapporto contiene:
- Data: il giorno del report
- Vendite: l’importo delle vendite giornaliere
- Clienti: il numero di clienti del giorno
- Spesa_Marketing: quanto è stato speso in marketing quel giorno
Analizziamo ora il codice passo per passo:
Creazione dei dati di esempio:
dati_esempio = {
'Negozio_Milano': pd.DataFrame({
'Data': pd.date_range('2024-01-01', '2024-01-31'), # Genera date per gennaio 2024
'Vendite': np.random.randint(1000, 5000, 31), # Vendite casuali tra 1000 e 5000€
'Clienti': np.random.randint(50, 200, 31), # Clienti casuali tra 50 e 200
'Spesa_Marketing': np.random.randint(100, 500, 31) # Spese marketing tra 100 e 500€
})
# [struttura simile per Roma e Napoli]
}
Questo codice simula un mese di dati per ogni negozio. In un caso reale, questi dati verrebbero invece dai veri report dei negozi.
Salvataggio dei dati in file Excel separati:
for negozio, df in dati_esempio.items():
df.to_excel(f'report_negozi/{negozio}.xlsx', index=False)
Questo passaggio simula la situazione in cui ogni negozio invia il proprio report Excel. I file vengono salvati in una cartella chiamata ‘report_negozi’.
Consolidamento dei dati:
cartella_report = Path('report_negozi')
dati_consolidati = pd.DataFrame()
for file_excel in cartella_report.glob('*.xlsx'):
df_temp = pd.read_excel(file_excel)
df_temp['Negozio'] = file_excel.stem # Aggiunge il nome del negozio
dati_consolidati = pd.concat([dati_consolidati, df_temp])
Questo codice legge tutti i file Excel nella cartella, aggiunge una colonna per identificare il negozio, e combina tutti i dati in un unico DataFrame.
4.Calcolo dei KPI (Key Performance Indicators):
analisi = dati_consolidati.groupby('Negozio').agg({
'Vendite': ['sum', 'mean'],
'Clienti': ['sum', 'mean'],
'Spesa_Marketing': 'sum'
})
Questo passaggio calcola, per ogni negozio:
- Vendite totali e medie
- Numero totale e medio di clienti
- Spesa totale in marketing
Calcolo degli indicatori avanzati:
# ROI (Return on Investment) del marketing
analisi['ROI_Marketing'] = ((analisi['Vendite_Totali'] -
analisi['Spesa_Marketing_Totale']) /
analisi['Spesa_Marketing_Totale'] * 100)
# Valore medio per cliente
analisi['Valore_Medio_Cliente'] = (analisi['Vendite_Totali'] /
analisi['Clienti_Totali'])
Creazione del report Excel formattato:
nome_report = f'Report_Consolidato_{datetime.now().strftime("%Y%m%d")}.xlsx'
Il rapporto finale contiene due fogli:
- “Dati_Dettagliati”: tutti i dati grezzi consolidati
- “Analisi”: i KPI calcolati con formattazione professionale
La formattazione include:
- Intestazioni in blu scuro con testo bianco in grassetto
- Larghezza delle colonne adattata automaticamente al contenuto
- Numeri arrotondati a due decimali
Il report finale avrà un nome che include la data di generazione, per esempio: “Report_Consolidato_20240331.xlsx”
In un contesto reale, un manager dovrebbe solo:
- Assicurarsi che tutti i report dei negozi siano nella cartella ‘report_negozi’
- Eseguire lo script
- Aprire il report consolidato generato automaticamente



