series_time.ipynb

#2
by ec98 - opened
Files changed (1) hide show
  1. series_time.ipynb +154 -0
series_time.ipynb ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import streamlit as st\n",
10
+ "import pandas as pd\n",
11
+ "import numpy as np\n",
12
+ "import torch\n",
13
+ "import torch.nn as nn\n",
14
+ "import matplotlib.pyplot as plt\n",
15
+ "from sklearn.preprocessing import MinMaxScaler\n",
16
+ "\n",
17
+ "# Cargar los datos de los dos CSV\n",
18
+ "file1 = 'PARCIAL-AGUA-_2_.csv'\n",
19
+ "file2 = 'PARCIAL-AGUA-_3_.csv'\n",
20
+ "\n",
21
+ "data1 = pd.read_csv(file1)\n",
22
+ "data2 = pd.read_csv(file2)\n",
23
+ "\n",
24
+ "# Convertir la columna 'FECHA' a objetos datetime y filtrar por años\n",
25
+ "data1['FECHA'] = pd.to_datetime(data1['FECHA'])\n",
26
+ "data2['FECHA'] = pd.to_datetime(data2['FECHA'])\n",
27
+ "\n",
28
+ "filtered_data1 = data1[data1['FECHA'].dt.year >= 2007]\n",
29
+ "filtered_data2 = data2[data2['FECHA'].dt.year >= 2007]\n",
30
+ "\n",
31
+ "# Combinar los valores de ambos conjuntos de datos\n",
32
+ "combined_values = np.concatenate([filtered_data1['VALOR-LS-CF-N'].values, filtered_data2['VALOR-LS-CF-N'].values]).reshape(-1, 1)\n",
33
+ "\n",
34
+ "# Seleccionar la variable objetivo y escalar los valores\n",
35
+ "scaler = MinMaxScaler()\n",
36
+ "scaled_values = scaler.fit_transform(combined_values)\n",
37
+ "\n",
38
+ "# Dividir los datos escalados en los conjuntos de datos originales\n",
39
+ "scaled_values1 = scaled_values[:len(filtered_data1)]\n",
40
+ "scaled_values2 = scaled_values[len(filtered_data1):]\n",
41
+ "\n",
42
+ "# Función para crear ventanas deslizantes\n",
43
+ "def sliding_windows(data, seq_length):\n",
44
+ " x, y = [], []\n",
45
+ " for i in range(len(data) - seq_length):\n",
46
+ " x.append(data[i:i + seq_length])\n",
47
+ " y.append(data[i + seq_length])\n",
48
+ " return np.array(x), np.array(y)\n",
49
+ "\n",
50
+ "# Preparar las ventanas deslizantes para cada conjunto de datos\n",
51
+ "seq_length = 4\n",
52
+ "x_train, y_train = sliding_windows(scaled_values1, seq_length)\n",
53
+ "x_test, y_test = sliding_windows(scaled_values2, seq_length)\n",
54
+ "\n",
55
+ "# Convertir a tensores de PyTorch\n",
56
+ "trainX = torch.Tensor(x_train)\n",
57
+ "trainY = torch.Tensor(y_train)\n",
58
+ "testX = torch.Tensor(x_test)\n",
59
+ "testY = torch.Tensor(y_test)\n",
60
+ "\n",
61
+ "# Definir el modelo LSTM\n",
62
+ "class LSTM(nn.Module):\n",
63
+ " def __init__(self, input_size, hidden_size, num_layers, output_size):\n",
64
+ " super(LSTM, self).__init__()\n",
65
+ " self.hidden_size = hidden_size\n",
66
+ " self.num_layers = num_layers\n",
67
+ " self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)\n",
68
+ " self.fc = nn.Linear(hidden_size, output_size)\n",
69
+ "\n",
70
+ " def forward(self, x):\n",
71
+ " h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)\n",
72
+ " c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)\n",
73
+ " out, _ = self.lstm(x, (h0, c0))\n",
74
+ " out = self.fc(out[:, -1, :])\n",
75
+ " return out\n",
76
+ "\n",
77
+ "# Aquí puedes definir otros modelos si lo deseas\n",
78
+ "# ...\n",
79
+ "\n",
80
+ "# Interfaz de Streamlit\n",
81
+ "st.title('Predicción de Series de Tiempo')\n",
82
+ "st.sidebar.title('Parámetros del Modelo')\n",
83
+ "\n",
84
+ "model_type = st.sidebar.selectbox('Selecciona el modelo', ('LSTM', 'Otro Modelo'))\n",
85
+ "num_epochs = st.sidebar.slider('Número de épocas', 100, 500, 200)\n",
86
+ "learning_rate = st.sidebar.number_input('Tasa de aprendizaje', 0.001, 0.1, 0.01, 0.001)\n",
87
+ "\n",
88
+ "if model_type == 'LSTM':\n",
89
+ " input_size = 1\n",
90
+ " hidden_size = 50\n",
91
+ " num_layers = 2\n",
92
+ " output_size = 1\n",
93
+ "\n",
94
+ " model = LSTM(input_size, hidden_size, num_layers, output_size)\n",
95
+ "\n",
96
+ " criterion = nn.MSELoss()\n",
97
+ " optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\n",
98
+ "\n",
99
+ " if st.sidebar.button('Entrenar y Predecir'):\n",
100
+ " for epoch in range(num_epochs):\n",
101
+ " model.train()\n",
102
+ " outputs = model(trainX)\n",
103
+ " optimizer.zero_grad()\n",
104
+ " loss = criterion(outputs, trainY)\n",
105
+ " loss.backward()\n",
106
+ " optimizer.step()\n",
107
+ " if (epoch+1) % 100 == 0:\n",
108
+ " st.write(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')\n",
109
+ "\n",
110
+ " model.eval()\n",
111
+ " train_predict = model(trainX)\n",
112
+ " test_predict = model(testX)\n",
113
+ "\n",
114
+ " train_predict = scaler.inverse_transform(train_predict.detach().numpy().reshape(-1, 1))\n",
115
+ " trainY_plot = scaler.inverse_transform(trainY.numpy().reshape(-1, 1))\n",
116
+ " test_predict = scaler.inverse_transform(test_predict.detach().numpy().reshape(-1, 1))\n",
117
+ " testY_plot = scaler.inverse_transform(testY.numpy().reshape(-1, 1))\n",
118
+ "\n",
119
+ " fig, ax = plt.subplots(figsize=(12, 6))\n",
120
+ " ax.plot(filtered_data1['FECHA'].values[seq_length:seq_length+len(trainY)], trainY_plot, label='Datos de entrenamiento')\n",
121
+ " ax.plot(filtered_data1['FECHA'].values[seq_length:seq_length+len(trainY)], train_predict, label='Predicciones de entrenamiento')\n",
122
+ " ax.plot(filtered_data2['FECHA'].values[seq_length:seq_length+len(testY)], testY_plot, label='Datos de prueba')\n",
123
+ " ax.plot(filtered_data2['FECHA'].values[seq_length:seq_length+len(testY)], test_predict, label='Predicciones de prueba')\n",
124
+ " ax.set_xlabel('Fecha')\n",
125
+ " ax.set_ylabel('VALOR-LS-CF-N')\n",
126
+ " ax.set_title('Predicciones con LSTM')\n",
127
+ " ax.legend()\n",
128
+ " ax.grid(True)\n",
129
+ " st.pyplot(fig)"
130
+ ]
131
+ }
132
+ ],
133
+ "metadata": {
134
+ "kernelspec": {
135
+ "display_name": "Python 3",
136
+ "language": "python",
137
+ "name": "python3"
138
+ },
139
+ "language_info": {
140
+ "codemirror_mode": {
141
+ "name": "ipython",
142
+ "version": 3
143
+ },
144
+ "file_extension": ".py",
145
+ "mimetype": "text/x-python",
146
+ "name": "python",
147
+ "nbconvert_exporter": "python",
148
+ "pygments_lexer": "ipython3",
149
+ "version": "3.12.4"
150
+ }
151
+ },
152
+ "nbformat": 4,
153
+ "nbformat_minor": 2
154
+ }