import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# ---------------------------------------------------------
# 1. CREIAMO I DATI
# ---------------------------------------------------------
# Simuliamo, ad esempio, i mq di un locale (X) e il suo prezzo di affitto
# mensile in euro (y). Aggiungiamo un po' di "rumore" casuale, perché
# nella realtà i dati non stanno mai perfettamente su una linea retta.

np.random.seed(42)  # fissiamo il seed per risultati riproducibili

n_campioni = 30
X = np.array([[i] for i in range(20, 20 + n_campioni)])  # mq da 20 a 49
rumore = np.random.normal(loc=0, scale=15, size=n_campioni)
y = 25 * X.flatten() + 100 + rumore  # relazione lineare + rumore

# ---------------------------------------------------------
# 2. DIVIDIAMO I DATI IN TRAINING E TEST
# ---------------------------------------------------------
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# ---------------------------------------------------------
# 3. ADDESTRIAMO IL MODELLO
# ---------------------------------------------------------
modello = LinearRegression()
modello.fit(X_train, y_train)

print(f"Relazione trovata: prezzo = {modello.coef_[0]:.2f} * mq "
      f"+ {modello.intercept_:.2f}")

# ---------------------------------------------------------
# 4. FACCIAMO PREVISIONI E VALUTIAMO L'ERRORE
# ---------------------------------------------------------
previsioni = modello.predict(X_test)
mse = mean_squared_error(y_test, previsioni)
print(f"Mean Squared Error: {mse:.2f}")

# ---------------------------------------------------------
# 5. USIAMO IL MODELLO SU UN DATO NUOVO
# ---------------------------------------------------------
nuovo_mq = [[35]]
prezzo_stimato = modello.predict(nuovo_mq)
print(f"Stima per un locale di 35 mq: {prezzo_stimato[0]:.2f} euro/mese")