marrtinagg commited on
Commit
35d2f50
·
1 Parent(s): 2612724

Inicializar backend FastAPI con Dockerfile

Browse files
Files changed (1) hide show
  1. app.py +111 -0
app.py CHANGED
@@ -167,3 +167,114 @@ def predict(banco: str, req: PredictRequest):
167
  # === Otro banco no válido ===
168
  else:
169
  return {"error": "Banco no reconocido. Usa 'bbva' o 'santander'."}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  # === Otro banco no válido ===
168
  else:
169
  return {"error": "Banco no reconocido. Usa 'bbva' o 'santander'."}
170
+
171
+ # ============================================================
172
+ # 8️⃣ Nuevo endpoint de simulación — Variar "Open"
173
+ # ============================================================
174
+
175
+ class SimulateRequest(BaseModel):
176
+ factor_open: float = 1.0 # por defecto, sin cambio
177
+ n_future: int = 3 # número de días de predicción
178
+
179
+
180
+ @app.post("/simulate/{banco}")
181
+ def simulate(banco: str, req: SimulateRequest):
182
+ banco = banco.lower()
183
+ n_future = req.n_future
184
+ factor_open = req.factor_open
185
+
186
+ # === BBVA ===
187
+ if banco == "bbva":
188
+ path = "data/bbva_pred.csv"
189
+ df = pd.read_csv(path)
190
+ df["Date"] = pd.to_datetime(df["Date"])
191
+ df = df.set_index("Date")
192
+ df = df.loc["2021-01-01":"2025-10-31"]
193
+
194
+ cols_to_scale = [
195
+ 'Open','High','Low','Close','Adj Close',
196
+ 'ma_5','close_lag1','close_lag2','close_lag3',
197
+ 'Volume','ibex_momentum_5d'
198
+ ]
199
+ features = ['Open','High','Low','return_1d','return_3d']
200
+
201
+ # Escalar los datos
202
+ df_scaled = df.copy()
203
+ df_scaled[cols_to_scale] = bbva_scaler_features.transform(df[cols_to_scale])
204
+
205
+ # Tomar la última ventana y modificar solo "Open"
206
+ last_window = df_scaled[features].iloc[-3:].values
207
+ modified_window = last_window.copy()
208
+ modified_window[:, 0] *= factor_open # multiplicar solo el "Open"
209
+
210
+ preds_scaled = []
211
+ window = modified_window.copy()
212
+ for _ in range(n_future):
213
+ X_input = torch.tensor(window, dtype=torch.float32).unsqueeze(0)
214
+ with torch.no_grad():
215
+ pred_scaled = bbva_model(X_input).cpu().numpy().flatten()[0]
216
+ preds_scaled.append(pred_scaled)
217
+ next_day = window[-1].copy()
218
+ window = np.vstack([window[1:], next_day])
219
+
220
+ preds_real = bbva_scaler_target.inverse_transform(np.array(preds_scaled).reshape(-1, 1)).flatten().tolist()
221
+
222
+ last_date = df.index[-1]
223
+ future_dates = pd.date_range(last_date + pd.Timedelta(days=1), periods=n_future, freq="B")
224
+ fechas = [str(d.date()) for d in future_dates]
225
+
226
+ return {
227
+ "banco": "BBVA",
228
+ "factor_open": factor_open,
229
+ "fechas": fechas,
230
+ "predicciones": preds_real
231
+ }
232
+
233
+ # === SANTANDER ===
234
+ elif banco == "santander":
235
+ path = "data/santander_pred.csv"
236
+ df = pd.read_csv(path)
237
+ df["Date"] = pd.to_datetime(df["Date"])
238
+ df = df.set_index("Date")
239
+ df = df.loc["2021-01-01":"2025-10-31"]
240
+
241
+ cols_to_scale = [
242
+ 'Open','High','Low','Close','Adj Close',
243
+ 'ma_5','close_lag1','close_lag2','close_lag3',
244
+ 'Volume','ibex_momentum_5d'
245
+ ]
246
+ features = ['Open','High','Low','close_lag1','close_lag2']
247
+
248
+ df_scaled = df.copy()
249
+ df_scaled[cols_to_scale] = santander_scaler_features.transform(df[cols_to_scale])
250
+
251
+ last_window = df_scaled[features].iloc[-3:].values
252
+ modified_window = last_window.copy()
253
+ modified_window[:, 0] *= factor_open
254
+
255
+ preds_scaled = []
256
+ window = modified_window.copy()
257
+ for _ in range(n_future):
258
+ X_input = torch.tensor(window, dtype=torch.float32).unsqueeze(0)
259
+ with torch.no_grad():
260
+ pred_scaled = santander_model(X_input).cpu().numpy().flatten()[0]
261
+ preds_scaled.append(pred_scaled)
262
+ next_day = window[-1].copy()
263
+ window = np.vstack([window[1:], next_day])
264
+
265
+ preds_real = santander_scaler_target.inverse_transform(np.array(preds_scaled).reshape(-1, 1)).flatten().tolist()
266
+
267
+ last_date = df.index[-1]
268
+ future_dates = pd.date_range(last_date + pd.Timedelta(days=1), periods=n_future, freq="B")
269
+ fechas = [str(d.date()) for d in future_dates]
270
+
271
+ return {
272
+ "banco": "Santander",
273
+ "factor_open": factor_open,
274
+ "fechas": fechas,
275
+ "predicciones": preds_real
276
+ }
277
+
278
+ # === Error ===
279
+ else:
280
+ return {"error": "Banco no reconocido. Usa 'bbva' o 'santander'."}