File size: 3,720 Bytes
20e8082 05f3172 5a3b63d 1b9a2bc 9f65c7c 0a8f03f 4d2a56e 1b9a2bc ddde3e7 5a3b63d ddde3e7 0a8f03f 1b9a2bc 9f65c7c 0a8f03f 9f65c7c e0711c8 ddde3e7 0a8f03f ddde3e7 fd022ae 0a8f03f ddde3e7 0a8f03f ddde3e7 93a5668 fd022ae ddde3e7 9f65c7c b90f6cc fd022ae 9f65c7c ddde3e7 fd022ae e0711c8 1b9a2bc e0711c8 1b9a2bc e0711c8 1b9a2bc 0a8f03f ddde3e7 0a8f03f 1b9a2bc 9f65c7c 0a8f03f 9f65c7c 1b9a2bc 0a8f03f 1c35603 9f65c7c 93a5668 e0711c8 1c35603 1b9a2bc 0005cf0 1b9a2bc |
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 |
import pandas as pd
import matplotlib.pyplot as plt
import joblib
import gradio as gr
from dateutil.relativedelta import relativedelta
import calendar
import emoji # Importa la librería de emoji
def load_model():
try:
model = joblib.load('arima_sales_model.pkl')
return model, None
except Exception as e:
return None, emoji.emojize(f"Failed to load model :warning: {str(e)}")
def parse_date(date_str):
try:
date = pd.to_datetime(date_str, format="%B-%Y")
_, last_day = calendar.monthrange(date.year, date.month)
start_date = date.replace(day=1)
end_date = date.replace(day=last_day)
return start_date, end_date, None
except ValueError:
return None, None, emoji.emojize("Date format should be 'Month-Year', e.g., 'January-2024' :calendar:")
def forecast_sales(uploaded_file, start_date_str, end_date_str):
if uploaded_file is None:
return emoji.emojize("No file uploaded :file_folder:"), None, emoji.emojize("Please upload a file :upside_down_face:")
try:
df = pd.read_csv(uploaded_file)
if 'Date' not in df.columns or 'Sale' not in df.columns:
return None, emoji.emojize("The uploaded file must contain 'Date' and 'Sale' columns :x:"), "File does not have required columns."
except Exception as e:
return None, emoji.emojize(f"Failed to read the uploaded CSV file :disappointed: {str(e)}"), "Error reading file."
start_date, _, error = parse_date(start_date_str)
_, end_date, error_end = parse_date(end_date_str)
if error or error_end:
return None, error or error_end, "Invalid date format."
df['Date'] = pd.to_datetime(df['Date'])
df = df.rename(columns={'Date': 'ds', 'Sale': 'y'})
df_filtered = df[(df['ds'] >= start_date) & (df['ds'] <= end_date)]
arima_model, error = load_model()
if arima_model is None:
return None, error, "Failed to load ARIMA model."
try:
forecast = arima_model.get_forecast(steps=60)
forecast_index = pd.date_range(start=end_date, periods=61, freq='D')[1:]
forecast_df = pd.DataFrame({'Date': forecast_index, 'Sales Forecast': forecast.predicted_mean})
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(df_filtered['ds'], df_filtered['y'], label='Actual Sales', color='blue')
ax.plot(forecast_df['Date'], forecast_df['Sales Forecast'], label='Sales Forecast', color='red', linestyle='--')
ax.set_xlabel('Date')
ax.set_ylabel('Sales')
ax.set_title('Sales Forecasting with ARIMA')
ax.legend()
return fig, emoji.emojize("File loaded and processed successfully :check_mark:")
except Exception as e:
return None, emoji.emojize(f"Failed to generate plot :cry: {str(e)}"), "Plotting failed."
def setup_interface():
with gr.Blocks() as demo:
gr.Markdown("## MLCast v1.1 - Intelligent Sales Forecasting System")
with gr.Row():
file_input = gr.File(label=emoji.emojize("Upload your store data here :open_file_folder:"))
start_date_input = gr.Textbox(label="Start Date", placeholder="January-2024")
end_date_input = gr.Textbox(label="End Date", placeholder="December-2024")
forecast_button = gr.Button("Forecast Sales")
output_plot = gr.Plot()
output_message = gr.Textbox(label="Notifications", visible=True, lines=2)
forecast_button.click(
forecast_sales,
inputs=[file_input, start_date_input, end_date_input],
outputs=[output_plot, output_message]
)
return demo
if __name__ == "__main__":
interface = setup_interface()
interface.launch()
|