Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import joblib | |
| import matplotlib.pyplot as plt | |
| import seaborn as sns | |
| from PIL import Image | |
| import io | |
| # Load model | |
| model_revenue = joblib.load("model_revenue.pkl") | |
| model_sold = joblib.load("model_sold.pkl") | |
| model_stock = joblib.load("model_stock.pkl") | |
| # Preprocessing input | |
| def preprocess_input(product_type, price, availability, customer, lead, order, location, production): | |
| product_dict = {"haircare": 0, "skincare": 1, "fragrance": 2} | |
| gender_dict = {"Male": 0, "Female": 1} | |
| location_dict = {"Chennai": 0, "Mumbai": 1, "Delhi": 2} | |
| return pd.DataFrame([{ | |
| "Product_Type": product_dict.get(product_type, 0), | |
| "Price": price, | |
| "Availability": availability, | |
| "Customer_Demographics": gender_dict.get(customer, 0), | |
| "Lead_Time": lead, | |
| "Order_Quantities": order, | |
| "Location": location_dict.get(location, 0), | |
| "Production_Volumes": production | |
| }]) | |
| # Manual prediction | |
| def predict_manual(product_type, price, availability, customer, lead, order, location, production): | |
| df = preprocess_input(product_type, price, availability, customer, lead, order, location, production) | |
| revenue = model_revenue.predict(df)[0] | |
| sold = model_sold.predict(df)[0] | |
| stock = model_stock.predict(df)[0] | |
| return f"Revenue: {revenue:.2f}, Sold: {sold:.0f}, Stock: {stock:.0f}" | |
| # CSV prediction | |
| def predict_from_csv(file): | |
| df = pd.read_csv(file.name) | |
| # Rename columns | |
| df = df.rename(columns={ | |
| "Product type": "Product_Type", | |
| "Price": "Price", | |
| "Availability": "Availability", | |
| "Customer demographics": "Customer_Demographics", | |
| "Lead time": "Lead_Time", | |
| "Order quantities": "Order_Quantities", | |
| "Location": "Location", | |
| "Production volumes": "Production_Volumes" | |
| }) | |
| df['Product_Type'] = df['Product_Type'].astype('category').cat.codes | |
| df['Customer_Demographics'] = df['Customer_Demographics'].astype('category').cat.codes | |
| df['Location'] = df['Location'].astype('category').cat.codes | |
| X = df[["Product_Type", "Price", "Availability", "Customer_Demographics", | |
| "Lead_Time", "Order_Quantities", "Location", "Production_Volumes"]] | |
| df["Predicted Revenue"] = model_revenue.predict(X) | |
| df["Predicted Products Sold"] = model_sold.predict(X) | |
| df["Predicted Stock Level"] = model_stock.predict(X) | |
| # Plot | |
| fig, axes = plt.subplots(3, 1, figsize=(10, 12)) | |
| sns.barplot(x=df.index, y="Predicted Revenue", data=df, ax=axes[0]) | |
| axes[0].set_title("Predicted Revenue") | |
| sns.lineplot(x=df.index, y="Predicted Products Sold", data=df, ax=axes[1], marker="o") | |
| axes[1].set_title("Predicted Products Sold") | |
| sns.lineplot(x=df.index, y="Predicted Stock Level", data=df, ax=axes[2], marker="o", color="green") | |
| axes[2].set_title("Predicted Stock Level") | |
| plt.tight_layout() | |
| buf = io.BytesIO() | |
| plt.savefig(buf, format="png") | |
| plt.close() | |
| buf.seek(0) | |
| img = Image.open(buf) | |
| return df, img | |
| # Gradio interface | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## Supply Chain Prediction App") | |
| gr.Markdown("Masukkan data manual atau upload file CSV untuk prediksi pendapatan, produk terjual, dan stok.") | |
| with gr.Tab("Input Manual"): | |
| with gr.Row(): | |
| product_type = gr.Dropdown(["haircare", "skincare", "fragrance"], label="Product Type") | |
| price = gr.Number(label="Price") | |
| availability = gr.Number(label="Availability") | |
| customer = gr.Dropdown(["Male", "Female"], label="Customer Demographics") | |
| with gr.Row(): | |
| lead = gr.Number(label="Lead Time") | |
| order = gr.Number(label="Order Quantities") | |
| location = gr.Dropdown(["Chennai", "Mumbai", "Delhi"], label="Location") | |
| production = gr.Number(label="Production Volumes") | |
| output_manual = gr.Textbox(label="Hasil Prediksi") | |
| btn = gr.Button("Submit") | |
| btn.click(predict_manual, inputs=[product_type, price, availability, customer, lead, order, location, production], outputs=output_manual) | |
| with gr.Tab("Upload CSV"): | |
| file_input = gr.File(label="Upload CSV File") | |
| output_table = gr.Dataframe() | |
| output_plot = gr.Image(label="Visualisasi Prediksi") | |
| file_input.change(fn=predict_from_csv, inputs=file_input, outputs=[output_table, output_plot]) | |
| demo.launch() | |