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