31 lines
1.1 KiB
Python
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
|