Flyingarrow-12/DEMAND_FORECASTING_FOR_SMALL
0
1import pandas as pd2import numpy as np3import torch4import gradio as gr5import matplotlib.pyplot as plt6from sklearn.preprocessing import MinMaxScaler7from transformers import AutoModelForTimeSeriesForecasting8 9# Load the model once10model_ckpt = "amazon/etsformer-etth1"11model = AutoModelForTimeSeriesForecasting.from_pretrained(model_ckpt)12model.eval()13 14def forecast_sales(file):15 try:16 # Load uploaded Excel17 df = pd.read_excel(file)18 df.columns = [col.lower().strip() for col in df.columns]19 if "date" not in df.columns or "sales" not in df.columns:20 return "Excel must have 'Date' and 'Sales' columns.", None, None21 22 df = df[["date", "sales"]].dropna()23 df["date"] = pd.to_datetime(df["date"])24 df = df.sort_values("date")25 26 # Scale sales27 scaler = MinMaxScaler()28 df["scaled"] = scaler.fit_transform(df[["sales"]])29 30 # Last 52 weeks input31 input_window = 5232 forecast_horizon = 1233 series = df["scaled"].values[-input_window:]34 input_tensor = torch.tensor(series, dtype=torch.float).unsqueeze(0).unsqueeze(-1)35 36 # Forecast37 with torch.no_grad():38 output = model.predict(input_tensor, prediction_length=forecast_horizon)39 forecast = output.squeeze().numpy()40 41 forecast_rescaled = scaler.inverse_transform(forecast.reshape(-1, 1)).flatten()42 dates_future = pd.date_range(start=df["date"].iloc[-1] + pd.Timedelta(weeks=1), periods=forecast_horizon, freq="W")43 df_forecast = pd.DataFrame({"Date": dates_future, "Forecast": forecast_rescaled})44 45 # Plot46 plt.figure(figsize=(10, 5))47 plt.plot(df["date"].tail(60), df["sales"].tail(60), label="Past Sales")48 plt.plot(df_forecast["Date"], df_forecast["Forecast"], label="Forecast", linestyle="--")49 plt.title("Retail Demand Forecast")50 plt.xlabel("Date")51 plt.ylabel("Sales")52 plt.legend()53 plt.xticks(rotation=45)54 plt.tight_layout()55 plt.grid()56 57 # Save plot and forecast58 plt.savefig("forecast_plot.png")59 plt.close()60 df_forecast.to_csv("forecast_data.csv", index=False)61 62 return "forecast_plot.png", df_forecast, "forecast_data.csv"63 64 except Exception as e:65 return f"Error: {e}", None, None66 67# Gradio UI68with gr.Blocks() as demo:69 gr.Markdown("## 🛍️ Retail Demand Forecasting App\nUpload your weekly sales Excel with 'Date' and 'Sales' columns.")70 file_input = gr.File(label="Upload Excel")71 btn = gr.Button("Forecast")72 plot_output = gr.Image(label="Forecast Plot")73 forecast_table = gr.Dataframe(label="Forecast Data")74 download_csv = gr.File(label="Download Forecast CSV")75 76 btn.click(fn=forecast_sales, inputs=[file_input], outputs=[plot_output, forecast_table, download_csv])77 78 gr.Markdown("---")79 gr.Markdown("**Chat with My Forecast (Coming Soon)** 🔮")80 81 # Placeholder for future LLM-powered Q&A82 83 gr.Markdown("Made with ❤️ by Abhinav")84 85demo.launch()86 