File size: 5,934 Bytes
1b9a2bc
10caf6a
f7442f2
 
376f47b
d26c714
10caf6a
376f47b
 
 
 
10caf6a
376f47b
 
4d2a56e
376f47b
10caf6a
376f47b
1b9a2bc
10caf6a
376f47b
9f65c7c
10caf6a
376f47b
b0b5df0
 
376f47b
ddde3e7
376f47b
 
b0b5df0
 
376f47b
 
 
 
 
b0b5df0
b887aff
7407a4e
 
 
 
b887aff
a8e9948
b887aff
 
 
a8e9948
 
b887aff
 
 
7407a4e
376f47b
b0b5df0
b887aff
7407a4e
 
 
0ead373
b887aff
7407a4e
10caf6a
 
 
376f47b
 
b0b5df0
376f47b
10caf6a
376f47b
 
 
10caf6a
376f47b
 
558f9a2
376f47b
 
558f9a2
376f47b
558f9a2
 
 
 
 
 
 
376f47b
558f9a2
 
 
 
376f47b
558f9a2
 
f7442f2
558f9a2
f7442f2
 
 
a8e9948
f7442f2
 
 
 
558f9a2
 
f7442f2
 
d26c714
 
 
 
 
 
 
 
f7442f2
558f9a2
 
376f47b
558f9a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
376f47b
558f9a2
 
376f47b
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
140
141
142
143
import gradio as gr
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import joblib  # Para cargar el modelo ARIMA guardado
import os  # Para manejar rutas de archivos

# Función para cargar el modelo ARIMA guardado
def load_arima_model():
    model = joblib.load('arima_sales_model.pkl')  # Cargar el modelo ARIMA desde un archivo guardado (.pkl)
    return model

# Cargar el modelo ARIMA al inicio
arima_model = load_arima_model()

# Funciones de preprocesamiento y cálculo de crecimiento de ventas
def drop(dataframe):
    pass  # Implementar según sea necesario

def date_format(dataframe):
    pass  # Implementar según sea necesario

def group_to_three(dataframe):
    pass  # Implementar según sea necesario

def get_forecast_period(period):
    return period  # Retornar el periodo de pronóstico

def sales_growth(df, forecasted_series):
    return forecasted_series.diff()  # Calcular el crecimiento de ventas

def merge_forecast_data(actual, predicted, future):
    return pd.DataFrame({
        "Actual Sales": actual,
        "Predicted Sales": predicted,
        "Forecasted Future Sales": future
    })

# Función para mostrar una alerta si el archivo no es CSV o si excede el tamaño
def check_file(uploaded_file):
    if uploaded_file is None:
        return gr.Error("⚠️ No file uploaded. Please upload a CSV file.")

    # Verificar si el archivo es CSV
    if not uploaded_file.endswith('.csv'):
        return gr.Error("⚠️ Invalid file format. Please upload a CSV file.")

    # Verificar el tamaño del archivo (200MB)
    file_size = uploaded_file.size  # Verificar el tamaño del archivo
    if file_size > 200 * 1024 * 1024:  # Limitar a 200MB
        return gr.Error("⚠️ File size exceeds the 200MB limit. Please upload a smaller file.")

    return None  # No hay error si el archivo es válido

# Función principal para la carga de archivo y la predicción
def upload_and_forecast(uploaded_file, period):
    # Verificar si el archivo cargado es válido
    error_message = check_file(uploaded_file)
    if error_message:
        return error_message

    # Leer y procesar el archivo CSV
    df = pd.read_csv(uploaded_file)  # Leer el archivo CSV
    df = drop(df)
    df = date_format(df)
    series = group_to_three(df)

    # Realizar la predicción con el modelo ARIMA
    forecast_period = get_forecast_period(period)
    forecasted_values, confint = arima_model.predict(n_periods=forecast_period, return_conf_int=True)
    
    # Crear serie con los valores pronosticados
    forecasted_series = pd.Series(forecasted_values)
    forecasted_series.index = pd.date_range(df['Date'].iloc[-1], periods=forecast_period, freq='3D')
    
    # Calcular el crecimiento de las ventas
    future_sales_growth = sales_growth(df, forecasted_series)
    
    # Combinar los datos para graficar
    merged_data = merge_forecast_data(df['Sales'], series, forecasted_series)
    
    # Crear gráficos
    fig_compare = go.Figure()
    fig_compare.add_trace(go.Scatter(x=merged_data[merged_data.columns[0]], y=merged_data['Actual Sales'], mode='lines', name='Actual Sales'))
    fig_compare.add_trace(go.Scatter(x=merged_data[merged_data.columns[0]], y=merged_data['Predicted Sales'], mode='lines', name='Predicted Sales', line=dict(color='#006400')))
    fig_compare.update_layout(title='📊 Historical Sales Data', xaxis_title='Date', yaxis_title='Sales')

    fig_forecast = go.Figure()
    fig_forecast.add_trace(go.Scatter(x=merged_data[merged_data.columns[0]], y=merged_data['Actual Sales'], mode='lines', name='Actual Sales'))
    fig_forecast.add_trace(go.Scatter(x=merged_data[merged_data.columns[0]], y=forecasted_series, mode='lines', name='Forecasted Sales'))
    fig_forecast.update_layout(title='🔮 Forecasted Sales Data', xaxis_title='Date', yaxis_title='Sales')

    return fig_compare, fig_forecast, future_sales_growth

# Interfaz de Gradio
def create_sidebar():
    with gr.Column():
        # Personalización del componente de carga de archivos
        gr.Markdown("### 📂 Upload your sales data (CSV)")
        uploaded_file = gr.File(
            label="Choose your file",
            elem_id="file-uploader",
            type="filepath",  # Cambiado a 'filepath' para que retorne la ruta del archivo
            file_count="single",  # Permite solo un archivo a la vez
            file_types=[".csv"],  # Limita solo a archivos CSV
            interactive=True,  # Hacer interactivo el componente para arrastrar y soltar
        )
        gr.Markdown("### ⏳ Forecast Period (Days)")
        period = gr.Slider(minimum=30, maximum=90, step=1, label="Forecast period (in days)")

        # Botón para descargar un archivo CSV de ejemplo
        sample_file_path = "sample_data.csv"  # Ruta del archivo de ejemplo
        if not os.path.exists(sample_file_path):  # Verifica si el archivo existe
            sample_data = pd.DataFrame({
                "Date": ["2023-01-01", "2023-01-02", "2023-01-03"],
                "Sales": [100, 200, 300]
            })
            sample_data.to_csv(sample_file_path, index=False)  # Crea el archivo de ejemplo si no existe
        gr.File(label="Download our sample CSV", file_path=sample_file_path)  # Muestra el botón de descarga

        return uploaded_file, period

# Crear el sidebar y la interfaz principal
uploaded_file, period = create_sidebar()

output_plots = [
    gr.Plot(label="📈 Historical vs Predicted Sales"),
    gr.Plot(label="🔮 Forecasted Sales Data"),
    gr.DataFrame(label="📊 Sales Growth")
]

iface = gr.Interface(
    fn=upload_and_forecast,
    inputs=[uploaded_file, period],
    outputs=output_plots,
    live=True,
    title="Sales Forecasting System ✨",
    description="Upload your sales data to start forecasting 🚀",
    css=open("styles.css", "r").read()  # Cargar el archivo CSS para los estilos personalizados
)

iface.launch()  # Lanzar la interfaz