|
from calendar import c |
|
from os import pipe |
|
import pandas as pd |
|
import pickle |
|
from skforecast.utils import load_forecaster |
|
from filterdf import filter_datasets |
|
from mergedf import merging_datasets |
|
import numpy as np |
|
import plotly.graph_objects as go |
|
|
|
def load_csv(input_file): |
|
try: |
|
|
|
df = pd.read_csv(input_file) |
|
|
|
|
|
if df.empty: |
|
raise ValueError("El archivo subido está vacío o no tiene datos válidos.") |
|
|
|
|
|
|
|
return df |
|
except Exception as e: |
|
raise f"Error al cargar el archivo CSV:{e}" |
|
|
|
def load_model(name): |
|
|
|
model = load_forecaster(name,verbose=True) |
|
return model |
|
|
|
def load_pipeline(): |
|
with open('pipeline.pkl', 'rb') as file: |
|
pipeline = pickle.load(file) |
|
return pipeline |
|
|
|
def unscale_data(scaler, predictions): |
|
placeholder = np.zeros((len(predictions), 11)) |
|
placeholder[:, 0] = predictions['target'] |
|
predictions_scaled = scaler.inverse_transform(placeholder)[:, 0] |
|
predictions_scaled[predictions_scaled < 0] = 0 |
|
predictions = pd.DataFrame(predictions_scaled, columns=predictions.columns, index=predictions.index) |
|
return predictions |
|
|
|
def create_plots(predictions): |
|
|
|
fig = go.Figure() |
|
trace2 = go.Scatter(x=predictions.index, y=predictions['target'], name="Estimado", mode="lines", line_color="#4EA72E") |
|
fig.add_trace(trace2) |
|
fig.update_layout( |
|
yaxis_title="Producción (kWh)", |
|
width=750, |
|
height=350, |
|
margin=dict(l=20, r=0, t=35, b=20), |
|
legend=dict( |
|
orientation="v", |
|
yanchor="top", |
|
xanchor="right", |
|
x=0.99, |
|
y=0.99 |
|
) |
|
) |
|
return fig |
|
|
|
|
|
def pipeline_final(texto,steps,train=None,client=None,historical_weather=None,electricity_prices=None,gas_prices=None): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pipeline = load_pipeline() |
|
scaler = pipeline['scale'] |
|
|
|
|
|
model = load_model('LSTM_forecaster.joblib') |
|
|
|
|
|
if texto == 'Si': |
|
pred = model.predict(steps=steps) |
|
|
|
pred = unscale_data(scaler, pred) |
|
|
|
pred_reset = pred.reset_index(drop=False) |
|
|
|
pred_reset = pred_reset.astype(str) |
|
|
|
pred_reset = pred_reset.rename(columns={'index': 'fecha'}) |
|
|
|
pred_reset = pred_reset.rename(columns={'target': 'generacion'}) |
|
|
|
pred_reset['generacion'] = pred_reset['generacion'].astype(float).round(2).astype(str) |
|
|
|
fig = create_plots(pred) |
|
|
|
return fig , pred_reset |
|
|
|
else: |
|
train = load_csv(train) |
|
client = load_csv(client) |
|
historical_weather = load_csv(historical_weather) |
|
electricity_prices = load_csv(electricity_prices) |
|
gas_prices = load_csv(gas_prices) |
|
|
|
filter_datasets(train,client,historical_weather,electricity_prices,gas_prices) |
|
|
|
df = merging_datasets() |
|
|
|
|
|
df_processed = pipeline.transform(df) |
|
|
|
df_processed = pd.DataFrame(df_processed, columns=df.columns, index=df.index) |
|
|
|
pred = model.predict(steps=steps, last_window=df_processed) |
|
|
|
pred = unscale_data(scaler, pred) |
|
|
|
pred_reset = pred.reset_index(drop=False) |
|
|
|
pred_reset = pred_reset.astype(str) |
|
|
|
pred_reset = pred_reset.rename(columns={'index': 'fecha'}) |
|
|
|
pred_reset = pred_reset.rename(columns={'target': 'generacion'}) |
|
|
|
pred_reset['generacion'] = pred_reset['generacion'].astype(float).round(2).astype(str) |
|
|
|
fig = create_plots(pred) |
|
|
|
return fig , pred_reset |
|
|
|
|
|
|
|
|