File size: 4,076 Bytes
1b9a2bc
10caf6a
 
 
376f47b
 
10caf6a
376f47b
 
 
 
10caf6a
376f47b
 
4d2a56e
376f47b
10caf6a
376f47b
1b9a2bc
10caf6a
376f47b
9f65c7c
10caf6a
376f47b
b0b5df0
 
376f47b
ddde3e7
376f47b
 
b0b5df0
 
376f47b
 
 
 
 
b0b5df0
376f47b
b0b5df0
 
0ead373
 
b0b5df0
10caf6a
 
 
376f47b
 
b0b5df0
376f47b
10caf6a
376f47b
 
 
10caf6a
376f47b
 
558f9a2
376f47b
 
558f9a2
376f47b
558f9a2
 
 
 
 
 
 
376f47b
558f9a2
 
 
 
376f47b
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
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
from datetime import datetime

# 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 principal para la carga de archivo y la predicción
def upload_and_forecast(uploaded_file, period):
    if uploaded_file is None:
        return "⚠️ Please upload a file to proceed."

    df = pd.read_csv(uploaded_file)
    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():
        gr.Markdown("### 📂 Upload your sales data (CSV)")
        uploaded_file = gr.File(label="Choose your file", elem_id="file-uploader")
        gr.Markdown("### ⏳ Forecast Period (Days)")
        period = gr.Slider(minimum=30, maximum=90, step=1, label="Forecast period (in days)")
        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