π« COPIA BLOCCATA
# INSTALLAZIONE E CONNESSIONE A MYSQL CON PYTHON
print("π― CONNESSIONE A MYSQL DA PYTHON")
print("=" * 70)
# PREREQUISITI:
# 1. MySQL Server installato e running
# 2. Python package: mysql-connector-python
# Installa con: pip install mysql-connector-python
import mysql.connector
from mysql.connector import Error
import pandas as pd
import numpy as np
from datetime import datetime, date
import warnings
warnings.filterwarnings('ignore')
print("π¦ PACCHETTI IMPORTATI CORRETTAMENTE")
def create_connection(host_name, user_name, user_password, db_name=None):
"""
Crea una connessione al database MySQL
Args:
host_name: Host del database (es: 'localhost')
user_name: Username MySQL
user_password: Password MySQL
db_name: Nome database (opzionale)
Returns:
connection: Oggetto connessione MySQL
"""
connection = None
try:
connection = mysql.connector.connect(
host=host_name,
user=user_name,
passwd=user_password,
database=db_name
)
print(f"β
Connessione a MySQL riuscita{' a database ' + db_name if db_name else ''}")
except Error as e:
print(f"β Errore di connessione: '{e}'")
print("\nπ‘ RISOLUZIONE PROBLEMI:")
print("1. Verifica che MySQL sia in esecuzione")
print("2. Controlla username/password")
print("3. Assicurati di avere i permessi")
print("4. Prova con host '127.0.0.1' invece di 'localhost'")
return connection
# CONNESSIONE DI ESEMPIO (sostituisci con i tuoi dati)
print("\nπ PROVA DI CONNESSIONE:")
print("-" * 40)
# Modifica questi valori con i tuoi!
connection_config = {
'host_name': 'localhost',
'user_name': 'root', # Cambia con il tuo username
'user_password': 'password', # Cambia con la tua password
'db_name': None # Prima ci connettiamo senza database
}
# Prova connessione (commenta se non hai MySQL installato)
try:
connection = create_connection(**connection_config)
if connection and connection.is_connected():
db_info = connection.get_server_info()
print(f"π Informazioni server MySQL: {db_info}")
# Mostra database esistenti
cursor = connection.cursor()
cursor.execute("SHOW DATABASES")
databases = cursor.fetchall()
print(f"\nποΈ Database disponibili ({len(databases)}):")
for db in databases:
print(f" β’ {db[0]}")
cursor.close()
connection.close()
print("\nπ Connessione chiusa correttamente")
except Exception as e:
print(f"β οΈ Nota: {e}")
print("Continueremo con esempi dimostrativi...")
# CREAZIONE DI UN DATABASE COMPLETO PER AI
print("\n\nποΈ CREAZIONE DATABASE PER APPLICAZIONE AI")
print("=" * 70)
def create_ai_database():
"""
Crea un database di esempio per applicazioni AI
"""
print("π Creazione database 'ai_enterprise'...")
# Script SQL per creare il database
sql_script = """
-- ============================================
-- DATABASE: ai_enterprise
-- Per applicazioni AI enterprise
-- ============================================
-- Creazione database
CREATE DATABASE IF NOT EXISTS ai_enterprise;
USE ai_enterprise;
-- ============================================
-- TABELLA: clienti
-- Memorizza informazioni clienti per marketing AI
-- ============================================
CREATE TABLE IF NOT EXISTS clienti (
id INT AUTO_INCREMENT PRIMARY KEY,
codice_cliente VARCHAR(20) UNIQUE NOT NULL,
nome VARCHAR(100) NOT NULL,
cognome VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
telefono VARCHAR(20),
data_nascita DATE,
citta VARCHAR(100),
paese VARCHAR(100),
data_registrazione DATETIME DEFAULT CURRENT_TIMESTAMP,
segmento ENUM('basic', 'premium', 'vip') DEFAULT 'basic',
punteggio_fidelita INT DEFAULT 0,
data_ultimo_acquisto DATE,
totale_acquisti DECIMAL(12,2) DEFAULT 0.00,
frequenza_acquisti INT DEFAULT 0,
cluster_ai INT, -- Per clustering AI
propensione_acquisto DECIMAL(5,4), -- Per modelli predittivi
INDEX idx_email (email),
INDEX idx_citta (citta),
INDEX idx_segmento (segmento),
INDEX idx_cluster_ai (cluster_ai)
);
-- ============================================
-- TABELLA: prodotti
-- Catalogo prodotti per raccomandazioni AI
-- ============================================
CREATE TABLE IF NOT EXISTS prodotti (
id INT AUTO_INCREMENT PRIMARY KEY,
sku VARCHAR(50) UNIQUE NOT NULL,
nome VARCHAR(200) NOT NULL,
descrizione TEXT,
categoria VARCHAR(100),
sottocategoria VARCHAR(100),
prezzo DECIMAL(10,2) NOT NULL,
costo DECIMAL(10,2),
quantita_magazzino INT DEFAULT 0,
valutazione_media DECIMAL(3,2) DEFAULT 0.00,
numero_recensioni INT DEFAULT 0,
tags JSON, -- Per ricerca semantica
features_embedding JSON, -- Per similarity AI
data_inserimento DATETIME DEFAULT CURRENT_TIMESTAMP,
attivo BOOLEAN DEFAULT TRUE,
INDEX idx_categoria (categoria),
INDEX idx_prezzo (prezzo),
INDEX idx_valutazione (valutazione_media),
FULLTEXT idx_ricerca (nome, descrizione, tags) -- Per ricerca full-text
);
-- ============================================
-- TABELLA: transazioni
-- Storico transazioni per modelli predittivi
-- ============================================
CREATE TABLE IF NOT EXISTS transazioni (
id INT AUTO_INCREMENT PRIMARY KEY,
id_cliente INT NOT NULL,
id_prodotto INT NOT NULL,
data_transazione DATETIME DEFAULT CURRENT_TIMESTAMP,
quantita INT NOT NULL,
prezzo_unitario DECIMAL(10,2) NOT NULL,
totale DECIMAL(12,2) NOT NULL,
sconto DECIMAL(5,2) DEFAULT 0.00,
metodo_pagamento ENUM('carta', 'paypal', 'contanti', 'bonifico'),
canale ENUM('web', 'mobile', 'negozio', 'telefono'),
stato ENUM('completata', 'fallita', 'rimborsata', 'in_attesa'),
rating_transazione INT CHECK (rating_transazione >= 1 AND rating_transazione <= 5),
features_transazione JSON, -- Features per modelli AI
FOREIGN KEY (id_cliente) REFERENCES clienti(id) ON DELETE CASCADE,
FOREIGN KEY (id_prodotto) REFERENCES prodotti(id) ON DELETE RESTRICT,
INDEX idx_data_transazione (data_transazione),
INDEX idx_cliente_transazione (id_cliente, data_transazione),
INDEX idx_prodotto_transazione (id_prodotto),
INDEX idx_stato (stato)
);
-- ============================================
-- TABELLA: interazioni
-- Dati comportamentali per modelli di engagement
-- ============================================
CREATE TABLE IF NOT EXISTS interazioni (
id INT AUTO_INCREMENT PRIMARY KEY,
id_cliente INT NOT NULL,
tipo_interazione ENUM('pagina_visita', 'prodotto_visto', 'carrello_aggiunto',
'wishlist_aggiunto', 'ricerca', 'click_banner', 'email_aperta'),
id_prodotto INT,
url VARCHAR(500),
tempo_sessione INT, -- In secondi
data_interazione DATETIME DEFAULT CURRENT_TIMESTAMP,
dispositivo ENUM('desktop', 'mobile', 'tablet'),
browser VARCHAR(100),
ip_address VARCHAR(45),
metadati JSON,
FOREIGN KEY (id_cliente) REFERENCES clienti(id) ON DELETE CASCADE,
FOREIGN KEY (id_prodotto) REFERENCES prodotti(id) ON DELETE SET NULL,
INDEX idx_tipo_interazione (tipo_interazione),
INDEX idx_data_interazione (data_interazione),
INDEX idx_cliente_interazione (id_cliente, data_interazione)
);
-- ============================================
-- TABELLA: modelli_ai
-- Registro modelli AI addestrati
-- ============================================
CREATE TABLE IF NOT EXISTS modelli_ai (
id INT AUTO_INCREMENT PRIMARY KEY,
nome_modello VARCHAR(100) NOT NULL,
tipo_modello ENUM('classificazione', 'regressione', 'clustering', 'raccomandazione'),
algoritmo VARCHAR(100),
versione VARCHAR(20),
percorso_file VARCHAR(500),
accuracy DECIMAL(5,4),
precision DECIMAL(5,4),
recall DECIMAL(5,4),
f1_score DECIMAL(5,4),
mse DECIMAL(10,4),
data_addestramento DATETIME DEFAULT CURRENT_TIMESTAMP,
dati_addestramento_inizio DATE,
dati_addestramento_fine DATE,
hyperparametri JSON,
features_usate JSON,
stato ENUM('attivo', 'deprecato', 'testing'),
note TEXT,
INDEX idx_tipo_modello (tipo_modello),
INDEX idx_data_addestramento (data_addestramento),
INDEX idx_stato_modello (stato)
);
-- ============================================
-- TABELLA: predizioni
-- Storage predizioni dei modelli AI
-- ============================================
CREATE TABLE IF NOT EXISTS predizioni (
id INT AUTO_INCREMENT PRIMARY KEY,
id_modello INT NOT NULL,
id_cliente INT,
id_prodotto INT,
data_predizione DATETIME DEFAULT CURRENT_TIMESTAMP,
tipo_predizione ENUM('propensione_acquisto', 'churn', 'lifetime_value',
'raccomandazione', 'segmentazione'),
valore_predizione DECIMAL(10,4),
probabilita DECIMAL(5,4),
classe_predetta VARCHAR(100),
threshold_usato DECIMAL(5,4),
features_input JSON,
spiegazione_predizione JSON, -- Per AI explainable
valutazione_reale BOOLEAN, -- Se disponibile feedback reale
data_valutazione DATE,
FOREIGN KEY (id_modello) REFERENCES modelli_ai(id) ON DELETE CASCADE,
FOREIGN KEY (id_cliente) REFERENCES clienti(id) ON DELETE CASCADE,
FOREIGN KEY (id_prodotto) REFERENCES prodotti(id) ON DELETE CASCADE,
INDEX idx_data_predizione (data_predizione),
INDEX idx_tipo_predizione (tipo_predizione),
INDEX idx_modello_predizione (id_modello, data_predizione),
INDEX idx_cliente_predizione (id_cliente, tipo_predizione)
);
-- ============================================
-- VISTE UTILI PER ANALISI
-- ============================================
-- Vista: Clienti con propensione acquisto alta
CREATE OR REPLACE VIEW vw_clienti_propensi AS
SELECT
c.id,
c.nome,
c.cognome,
c.email,
c.segmento,
c.totale_acquisti,
c.frequenza_acquisti,
p.valore_predizione as propensione_acquisto,
p.data_predizione
FROM clienti c
JOIN predizioni p ON c.id = p.id_cliente
WHERE p.tipo_predizione = 'propensione_acquisto'
AND p.valore_predizione > 0.7
AND p.data_predizione >= DATE_SUB(NOW(), INTERVAL 30 DAY)
ORDER BY p.valore_predizione DESC;
-- Vista: Prodotti raccomandati per cliente
CREATE OR REPLACE VIEW vw_raccomandazioni AS
SELECT
c.id as cliente_id,
c.nome,
c.cognome,
pr.id as prodotto_id,
pr.nome as prodotto_nome,
pr.prezzo,
p.valore_predizione as score_raccomandazione,
p.probabilita,
p.data_predizione
FROM clienti c
JOIN predizioni p ON c.id = p.id_cliente
JOIN prodotti pr ON p.id_prodotto = pr.id
WHERE p.tipo_predizione = 'raccomandazione'
AND p.valore_predizione > 0.5
AND pr.attivo = TRUE
ORDER BY c.id, p.valore_predizione DESC;
-- Vista: Performance modelli AI
CREATE OR REPLACE VIEW vw_performance_modelli AS
SELECT
m.nome_modello,
m.tipo_modello,
m.algoritmo,
m.versione,
m.accuracy,
m.precision,
m.recall,
m.f1_score,
m.data_addestramento,
COUNT(p.id) as numero_predizioni,
AVG(CASE WHEN p.valutazione_reale = TRUE THEN 1 ELSE 0 END) * 100 as percentuale_corrette
FROM modelli_ai m
LEFT JOIN predizioni p ON m.id = p.id_modello
WHERE m.stato = 'attivo'
GROUP BY m.id
ORDER BY m.data_addestramento DESC;
-- ============================================
-- PROCEDURE E FUNZIONI
-- ============================================
-- Funzione: Calcola Lifetime Value di un cliente
DELIMITER $$
CREATE FUNCTION fn_calcola_ltv(
p_cliente_id INT,
p_mesi INT DEFAULT 12
) RETURNS DECIMAL(12,2)
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE totale_ltv DECIMAL(12,2);
SELECT COALESCE(SUM(totale), 0)
INTO totale_ltv
FROM transazioni
WHERE id_cliente = p_cliente_id
AND data_transazione >= DATE_SUB(NOW(), INTERVAL p_mesi MONTH)
AND stato = 'completata';
RETURN totale_ltv;
END$$
DELIMITER ;
-- Procedura: Aggiorna cluster AI per tutti i clienti
DELIMITER $$
CREATE PROCEDURE sp_aggiorna_cluster_clienti()
BEGIN
-- Qui andrebbe la logica di clustering AI
-- Per ora Γ¨ un placeholder
UPDATE clienti
SET cluster_ai = FLOOR(RAND() * 5) + 1
WHERE cluster_ai IS NULL;
END$$
DELIMITER ;
-- Trigger: Aggiorna statistiche cliente dopo transazione
DELIMITER $$
CREATE TRIGGER tr_aggiorna_statistiche_cliente
AFTER INSERT ON transazioni
FOR EACH ROW
BEGIN
UPDATE clienti
SET
totale_acquisti = totale_acquisti + NEW.totale,
frequenza_acquisti = frequenza_acquisti + 1,
data_ultimo_acquisto = DATE(NEW.data_transazione)
WHERE id = NEW.id_cliente;
END$$
DELIMITER ;
-- ============================================
-- INSERIMENTO DATI DI ESEMPIO
-- ============================================
-- Inserimento clienti di esempio
INSERT INTO clienti (codice_cliente, nome, cognome, email, citta, segmento, data_registrazione) VALUES
('CLI001', 'Mario', 'Rossi', 'mario.rossi@email.com', 'Roma', 'premium', '2023-01-15'),
('CLI002', 'Laura', 'Bianchi', 'laura.bianchi@email.com', 'Milano', 'vip', '2023-02-20'),
('CLI003', 'Giuseppe', 'Verdi', 'giuseppe.verdi@email.com', 'Napoli', 'basic', '2023-03-10'),
('CLI004', 'Anna', 'Neri', 'anna.neri@email.com', 'Torino', 'premium', '2023-04-05'),
('CLI005', 'Luca', 'Gialli', 'luca.gialli@email.com', 'Bologna', 'basic', '2023-05-12');
-- Inserimento prodotti di esempio
INSERT INTO prodotti (sku, nome, categoria, prezzo, quantita_magazzino) VALUES
('SKU001', 'Smartphone Premium', 'Elettronica', 899.99, 50),
('SKU002', 'Laptop Gaming', 'Elettronica', 1299.99, 30),
('SKU003', 'Cuffie Wireless', 'Audio', 199.99, 100),
('SKU004', 'Smartwatch', 'Elettronica', 299.99, 75),
('SKU005', 'Tablet 10"', 'Elettronica', 499.99, 40),
('SKU006', 'T-shirt Basic', 'Abbigliamento', 19.99, 200),
('SKU007', 'Jeans Slim', 'Abbigliamento', 59.99, 150),
('SKU008', 'Scarpe Running', 'Sport', 89.99, 80);
-- Inserimento transazioni di esempio
INSERT INTO transazioni (id_cliente, id_prodotto, quantita, prezzo_unitario, totale, metodo_pagamento, canale, stato) VALUES
(1, 1, 1, 899.99, 899.99, 'carta', 'web', 'completata'),
(2, 2, 1, 1299.99, 1299.99, 'paypal', 'web', 'completata'),
(3, 3, 2, 199.99, 399.98, 'carta', 'mobile', 'completata'),
(1, 4, 1, 299.99, 299.99, 'carta', 'web', 'completata'),
(4, 5, 1, 499.99, 499.99, 'bonifico', 'web', 'completata');
-- Inserimento modelli AI di esempio
INSERT INTO modelli_ai (nome_modello, tipo_modello, algoritmo, versione, accuracy, precision, recall, f1_score, stato) VALUES
('Propensione Acquisto v1', 'regressione', 'Random Forest', '1.0', 0.85, 0.82, 0.87, 0.84, 'attivo'),
('Raccomandazione Prodotti v2', 'raccomandazione', 'Collaborative Filtering', '2.1', 0.78, 0.75, 0.80, 0.77, 'attivo'),
('Segmentazione Clienti v1', 'clustering', 'K-Means', '1.0', 0.91, NULL, NULL, NULL, 'attivo');
-- Inserimento predizioni di esempio
INSERT INTO predizioni (id_modello, id_cliente, id_prodotto, tipo_predizione, valore_predizione, probabilita, classe_predetta) VALUES
(1, 1, NULL, 'propensione_acquisto', 0.87, 0.85, 'alto'),
(1, 2, NULL, 'propensione_acquisto', 0.92, 0.90, 'molto_alto'),
(2, 1, 2, 'raccomandazione', 0.78, 0.75, 'raccomandato'),
(2, 1, 3, 'raccomandazione', 0.65, 0.62, 'raccomandato'),
(3, 1, NULL, 'segmentazione', NULL, NULL, 'cluster_3');
print("β
Database 'ai_enterprise' creato con successo!")
print("β’ 5 tabelle principali")
print("β’ 3 viste analitiche")
print("β’ 1 funzione, 1 procedura, 1 trigger")
print("β’ Dati di esempio inseriti")
"""
print("π Script SQL generato. Copialo ed eseguilo in MySQL Workbench o phpMyAdmin.")
return sql_script
# Genera lo script
database_script = create_ai_database()
print("\nπ‘ COME USARE QUESTO SCRIPT:")
print("1. Apri MySQL Workbench o phpMyAdmin")
print("2. Incolla tutto lo script SQL")
print("3. Esegui lo script")
print("4. Il database 'ai_enterprise' sarΓ creato con dati di esempio")
print("\nπ― STRUTTURA CREATA:")
print("β’ clienti: Dati clienti per personalizzazione")
print("β’ prodotti: Catalogo per raccomandazioni")
print("β’ transazioni: Storico per modelli predittivi")
print("β’ interazioni: Dati comportamentali per engagement")
print("β’ modelli_ai: Catalogo modelli addestrati")
print("β’ predizioni: Storage risultati AI")
# ALTERNATIVA: CREAZIONE CON PYTHON (se connesso)
print("\n\nπ§ CREAZIONE DATABASE CON PYTHON (se connesso)")
print("=" * 70)
def create_database_with_python():
"""Crea database usando Python (richiede connessione attiva)"""
try:
# Riconnettiti (questa volta specificando il database)
config_with_db = connection_config.copy()
config_with_db['db_name'] = 'ai_enterprise_test'
connection = create_connection(**config_with_db)
if connection and connection.is_connected():
cursor = connection.cursor()
# Crea database
cursor.execute("CREATE DATABASE IF NOT EXISTS ai_enterprise_test")
print("β
Database 'ai_enterprise_test' creato")
# Usa il database
cursor.execute("USE ai_enterprise_test")
# Crea tabella clienti semplificata
create_table_sql = """
CREATE TABLE IF NOT EXISTS clienti_test (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100),
email VARCHAR(255) UNIQUE,
eta INT,
citta VARCHAR(100),
punteggio_fidelita INT DEFAULT 0,
data_creazione TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
cursor.execute(create_table_sql)
print("β
Tabella 'clienti_test' creata")
# Inserisci dati di esempio
insert_data_sql = """
INSERT INTO clienti_test (nome, email, eta, citta, punteggio_fidelita)
VALUES
(%s, %s, %s, %s, %s)
"""
clienti_di_esempio = [
('Mario Rossi', 'mario@email.com', 35, 'Roma', 150),
('Laura Bianchi', 'laura@email.com', 28, 'Milano', 200),
('Giuseppe Verdi', 'giuseppe@email.com', 42, 'Napoli', 75),
('Anna Neri', 'anna@email.com', 31, 'Torino', 300),
('Luca Gialli', 'luca@email.com', 25, 'Bologna', 50)
]
cursor.executemany(insert_data_sql, clienti_di_esempio)
connection.commit()
print(f"β
{cursor.rowcount} clienti inseriti")
# Leggi i dati inseriti
cursor.execute("SELECT * FROM clienti_test")
clienti = cursor.fetchall()
print(f"\nπ CLIENTI INSERITI ({len(clienti)}):")
print("-" * 80)
for cliente in clienti:
print(f"ID: {cliente[0]}, Nome: {cliente[1]}, Email: {cliente[2]}, "
f"EtΓ : {cliente[3]}, CittΓ : {cliente[4]}, Punteggio: {cliente[5]}")
# Operazione UPDATE
update_sql = "UPDATE clienti_test SET punteggio_fidelita = punteggio_fidelita + 10 WHERE citta = 'Milano'"
cursor.execute(update_sql)
connection.commit()
print(f"\nβ
Aggiornati {cursor.rowcount} clienti milanesi (+10 punti)")
# Operazione DELETE
delete_sql = "DELETE FROM clienti_test WHERE punteggio_fidelita < 100"
cursor.execute(delete_sql)
connection.commit()
print(f"β
Eliminati {cursor.rowcount} clienti con punteggio < 100")
# Query complessa con JOIN (se avessimo altre tabelle)
print("\nπ QUERY COMPLESSE DISPONIBILI:")
print("1. JOIN tra tabelle: clienti + transazioni")
print("2. GROUP BY per aggregazioni")
print("3. HAVING per filtrare gruppi")
print("4. SUBQUERY per query annidate")
print("5. WINDOW FUNCTIONS per analisi avanzate")
cursor.close()
connection.close()
print("\nπ Connessione chiusa")
except Error as e:
print(f"β Errore durante operazioni database: {e}")
# Esegui la creazione (scommenta se hai MySQL connesso)
# create_database_with_python()