File size: 4,361 Bytes
663a47b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
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:
# Leer el archivo CSV
df = pd.read_csv(input_file)
# Verificar si el DataFrame está vacío
if df.empty:
raise ValueError("El archivo subido está vacío o no tiene datos válidos.")
# Retornar las primeras 5 filas como tabla HTML
# return df.head().to_html()
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):
# Gráfico de las predicciones vs valores reales en el conjunto de test del modelo con mejores parametros
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):
#prueba
#texto = 'No'
# #steps
# steps = 24
# #dfs
# train = 'files_prueba/train_filtered.csv'
# client = 'files_prueba/client_filtered.csv'
# historical_weather = 'files_prueba/historical_weather_filtered.csv'
# electricity_prices = 'files_prueba/electricity_prices_filtered.csv'
# gas_prices = 'files_prueba/gas_prices_filtered.csv'
pipeline = load_pipeline()
scaler = pipeline['scale']
#load model
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 data sets
filter_datasets(train,client,historical_weather,electricity_prices,gas_prices)
#merge data sets
df = merging_datasets()
#load pipeline
# sclaing the data
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
|