CoolFace
Apppublic

Flyingarrow-12/DEMAND_FORECASTING_FOR_SMALL

sourceHugging Facemitupdated 1y agoView on Hugging Face
0likes
app.py86 linesDownload Raw Back to root
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