TIF_E41253368/api/app/services/forecaster.py

31 lines
1.1 KiB
Python

from typing import Any, List, Tuple
import numpy as np
def forecast_recursive(
model: Any,
scaler: Any,
window: np.ndarray,
horizon: int,
) -> Tuple[List[float], bool]:
values = np.asarray(window, dtype=float).reshape(-1, 1)
scaled_window = scaler.transform(values)
scaled_predictions = []
for _ in range(horizon):
model_input = scaled_window.reshape(1, len(scaled_window), 1)
prediction = model.predict(model_input, verbose=0)
prediction_value = float(np.asarray(prediction).reshape(-1)[0])
scaled_predictions.append(prediction_value)
scaled_window = np.vstack([scaled_window[1:], [[prediction_value]]])
predicted_values = scaler.inverse_transform(
np.asarray(scaled_predictions, dtype=float).reshape(-1, 1)
).reshape(-1)
data_min = float(np.asarray(scaler.data_min_).reshape(-1)[0])
data_max = float(np.asarray(scaler.data_max_).reshape(-1)[0])
out_of_range = bool(np.any((predicted_values < data_min) | (predicted_values > data_max)))
prices = [max(0.0, float(np.round(value, 6))) for value in predicted_values]
return prices, out_of_range