Files changed (2) hide show
  1. app.py +112 -0
  2. requirements.txt +6 -0
app.py ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import numpy as np
4
+ import torch
5
+ import torch.nn as nn
6
+ import matplotlib.pyplot as plt
7
+ from sklearn.preprocessing import MinMaxScaler
8
+
9
+ # Aquí se debe pegar el código de tu aplicación
10
+
11
+ # Cargar los datos de los dos CSV
12
+ file1 = 'PARCIAL-AGUA-_2_.csv'
13
+ file2 = 'PARCIAL-AGUA-_3_.csv'
14
+
15
+ data1 = pd.read_csv(file1)
16
+ data2 = pd.read_csv(file2)
17
+
18
+ # Convertir la columna 'FECHA' a objetos datetime y filtrar por años
19
+ data1['FECHA'] = pd.to_datetime(data1['FECHA'])
20
+ data2['FECHA'] = pd.to_datetime(data2['FECHA'])
21
+
22
+ filtered_data1 = data1[data1['FECHA'].dt.year >= 2007]
23
+ filtered_data2 = data2[data2['FECHA'].dt.year >= 2007]
24
+
25
+ combined_values = np.concatenate([filtered_data1['VALOR-LS-CF-N'].values, filtered_data2['VALOR-LS-CF-N'].values]).reshape(-1, 1)
26
+
27
+ scaler = MinMaxScaler()
28
+ scaled_values = scaler.fit_transform(combined_values)
29
+
30
+ scaled_values1 = scaled_values[:len(filtered_data1)]
31
+ scaled_values2 = scaled_values[len(filtered_data1):]
32
+
33
+ def sliding_windows(data, seq_length):
34
+ x, y = [], []
35
+ for i in range(len(data) - seq_length):
36
+ x.append(data[i:i + seq_length])
37
+ y.append(data[i + seq_length])
38
+ return np.array(x), np.array(y)
39
+
40
+ seq_length = 4
41
+ x_train, y_train = sliding_windows(scaled_values1, seq_length)
42
+ x_test, y_test = sliding_windows(scaled_values2, seq_length)
43
+
44
+ trainX = torch.Tensor(x_train)
45
+ trainY = torch.Tensor(y_train)
46
+ testX = torch.Tensor(x_test)
47
+ testY = torch.Tensor(y_test)
48
+
49
+ class LSTM(nn.Module):
50
+ def __init__(self, input_size, hidden_size, num_layers, output_size):
51
+ super(LSTM, self).__init__()
52
+ self.hidden_size = hidden_size
53
+ self.num_layers = num_layers
54
+ self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
55
+ self.fc = nn.Linear(hidden_size, output_size)
56
+
57
+ def forward(self, x):
58
+ h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)
59
+ c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)
60
+ out, _ = self.lstm(x, (h0, c0))
61
+ out = self.fc(out[:, -1, :])
62
+ return out
63
+
64
+ st.title('Predicción de Series de Tiempo')
65
+ st.sidebar.title('Parámetros del Modelo')
66
+
67
+ model_type = st.sidebar.selectbox('Selecciona el modelo', ('LSTM', 'Otro Modelo'))
68
+ num_epochs = st.sidebar.slider('Número de épocas', 100, 500, 200)
69
+ learning_rate = st.sidebar.number_input('Tasa de aprendizaje', 0.001, 0.1, 0.01, 0.001)
70
+
71
+ if model_type == 'LSTM':
72
+ input_size = 1
73
+ hidden_size = 50
74
+ num_layers = 2
75
+ output_size = 1
76
+
77
+ model = LSTM(input_size, hidden_size, num_layers, output_size)
78
+
79
+ criterion = nn.MSELoss()
80
+ optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
81
+
82
+ if st.sidebar.button('Entrenar y Predecir'):
83
+ for epoch in range(num_epochs):
84
+ model.train()
85
+ outputs = model(trainX)
86
+ optimizer.zero_grad()
87
+ loss = criterion(outputs, trainY)
88
+ loss.backward()
89
+ optimizer.step()
90
+ if (epoch+1) % 100 == 0:
91
+ st.write(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
92
+
93
+ model.eval()
94
+ train_predict = model(trainX)
95
+ test_predict = model(testX)
96
+
97
+ train_predict = scaler.inverse_transform(train_predict.detach().numpy().reshape(-1, 1))
98
+ trainY_plot = scaler.inverse_transform(trainY.numpy().reshape(-1, 1))
99
+ test_predict = scaler.inverse_transform(test_predict.detach().numpy().reshape(-1, 1))
100
+ testY_plot = scaler.inverse_transform(testY.numpy().reshape(-1, 1))
101
+
102
+ fig, ax = plt.subplots(figsize=(12, 6))
103
+ ax.plot(filtered_data1['FECHA'].values[seq_length:seq_length+len(trainY)], trainY_plot, label='Datos de entrenamiento')
104
+ ax.plot(filtered_data1['FECHA'].values[seq_length:seq_length+len(trainY)], train_predict, label='Predicciones de entrenamiento')
105
+ ax.plot(filtered_data2['FECHA'].values[seq_length:seq_length+len(testY)], testY_plot, label='Datos de prueba')
106
+ ax.plot(filtered_data2['FECHA'].values[seq_length:seq_length+len(testY)], test_predict, label='Predicciones de prueba')
107
+ ax.set_xlabel('Fecha')
108
+ ax.set_ylabel('VALOR-LS-CF-N')
109
+ ax.set_title('Predicciones con LSTM')
110
+ ax.legend()
111
+ ax.grid(True)
112
+ st.pyplot(fig)
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ pandas==1.3.4
2
+ numpy==1.21.2
3
+ torch==1.10.0
4
+ matplotlib==3.4.3
5
+ scikit-learn==0.24.2
6
+ streamlit==0.86.0