Continua l'esplorazione della previsione di serie tempo stavolta con ConvLSTM (il codice e' stato riadattato partendo da Gemini AI)
Il dataset e' sempre multivariato con Est come variabile che vuole essere prevista
Data,Est,Temp,Rain
2023-10-01,-55.7,18.7,0
2023-10-02,-55.6,19,0
2023-10-03,-55.6,19.2,0
2023-10-04,-55.5,19.5,0.2
2023-10-05,-55.9,18.8,0.2
2023-10-06,-55.7,18.1,0
import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
# 1. Caricamento e preparazione dei dati
def load_and_prepare_data(filepath):
df = pd.read_csv(filepath, parse_dates=['Data'], index_col='Data')
df = df.fillna(method='ffill') # Gestione dei valori mancanti
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df)
return scaled_data, scaler, df.columns.get_loc('Est')
# 2. Creazione delle sequenze per il training
def create_sequences(data, target_index, seq_length):
xs, ys = [], []
for i in range(len(data) - seq_length):
x = data[i:i + seq_length]
y = data[i + seq_length, target_index]
xs.append(x)
ys.append(y)
return np.array(xs), np.array(ys)
# 3. Costruzione del modello LSTM
def build_model(input_shape):
model = tf.keras.Sequential([
tf.keras.layers.LSTM(50, return_sequences=True, input_shape=input_shape),
tf.keras.layers.LSTM(50),
tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
return model
# 4. Addestramento e valutazione del modello
def train_and_evaluate_model(model, X_train, y_train, X_test, y_test):
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.1, verbose=1)
loss = model.evaluate(X_test, y_test)
print(f'Test Loss: {loss}')
return model
# 5. Previsioni e inversione della scala
def make_predictions(model, X_test, scaler, target_index):
predictions = model.predict(X_test)
dummy = np.zeros((len(predictions), X_test.shape[2]))
dummy[:, target_index] = predictions[:, 0]
predictions_original = scaler.inverse_transform(dummy)[:, target_index]
return predictions_original
def plot_predictions(predictions, y_test, scaler, target_index):
# Inverti la scala dei dati reali
dummy_real = np.zeros((len(y_test), X_test.shape[2]))
dummy_real[:, target_index] = y_test
y_test_original = scaler.inverse_transform(dummy_real)[:, target_index]
plt.figure(figsize=(12, 6))
plt.plot(y_test_original, label='Dati reali')
plt.plot(predictions, label='Previsioni')
plt.legend()
plt.title('Previsioni vs. Dati reali')
plt.xlabel('Tempo')
plt.ylabel('Valore di est')
plt.show()
def make_single_prediction(model, scaler, seq_length, temp, rain, target_index):
# Crea una sequenza di input fittizia
dummy_data = np.zeros((seq_length, 3))
dummy_data[:, 1] = temp # temp nella seconda colonna
dummy_data[:, 2] = rain # rain nella terza colonna
# Scala la sequenza di input
scaled_dummy_data = scaler.transform(dummy_data)
# Rimodella la sequenza per l'input del modello
input_data = np.reshape(scaled_dummy_data, (1, seq_length, 3))
# Effettua la previsione
prediction = model.predict(input_data)
# Inverti la scala della previsione
dummy_prediction = np.zeros((1, 3))
dummy_prediction[0, target_index] = prediction[0, 0]
prediction_original = scaler.inverse_transform(dummy_prediction)[0, target_index]
return prediction_original
# Main
filepath = 'prima.csv'
seq_length = 20 # Lunghezza della sequenza per il modello LSTM
prediction_steps = 20 # dati futuri previsti
scaled_data, scaler, target_index = load_and_prepare_data(filepath)
X, y = create_sequences(scaled_data, target_index, seq_length)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
model = build_model(X_train.shape[1:])
trained_model = train_and_evaluate_model(model, X_train, y_train, X_test, y_test)
predictions = make_predictions(trained_model, X_test, scaler, target_index)
print(predictions)
plot_predictions(predictions, y_test, scaler, target_index)
# Esempio di singola previsione
temp_input = 25.0
rain_input = 10.0
single_prediction = make_single_prediction(trained_model, scaler, seq_length, temp_input, rain_input, target_index)
print(f"Previsione per temp={temp_input} e rain={rain_input}: {single_prediction}")