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
|