IvanStudent's picture
Guardar mis cambios locales
376f47b
raw
history blame
4.08 kB
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