PI2 / pipelineFinal.py
josegoji's picture
Update pipelineFinal.py
663a47b verified
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