supply-chain / app.py
febbrri's picture
Upload 2 files
1bda0b9 verified
import pandas as pd
import numpy as np
import gradio as gr
from sklearn.ensemble import RandomForestRegressor
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
# Load and prepare data
df = pd.read_csv("supply_chain_data.csv")
df = df.dropna()
# Features and targets
X = df.drop(columns=["Revenue generated", "Number of products sold", "Stock levels"])
y_revenue = df["Revenue generated"]
y_sold = df["Number of products sold"]
y_stock = df["Stock levels"]
categorical_cols = X.select_dtypes(include=["object"]).columns.tolist()
numerical_cols = X.select_dtypes(include=["number"]).columns.tolist()
# Preprocessing pipeline
preprocessor = ColumnTransformer([
("cat", OneHotEncoder(handle_unknown="ignore"), categorical_cols),
("num", StandardScaler(), numerical_cols)
])
# Train model function
def train_model(target):
pipeline = Pipeline(steps=[
("preprocessor", preprocessor),
("regressor", RandomForestRegressor(random_state=42))
])
pipeline.fit(X, target)
return pipeline
# Train all three models
model_revenue = train_model(y_revenue)
model_sold = train_model(y_sold)
model_stock = train_model(y_stock)
# Single prediction
def predict_single(product_type, price, availability, customer_demographics, lead_times, order_quantities, location, production_volumes):
input_dict = {
"Product type": [product_type],
"Price": [float(price)],
"Availability": [int(availability)],
"Customer demographics": [customer_demographics],
"Lead times": [int(lead_times)],
"Order quantities": [int(order_quantities)],
"Location": [location],
"Production volumes": [int(production_volumes)],
}
input_df = pd.DataFrame(input_dict)
pred_revenue = model_revenue.predict(input_df)[0]
pred_sold = model_sold.predict(input_df)[0]
pred_stock = model_stock.predict(input_df)[0]
return f"Revenue: {pred_revenue:.2f} | Sold: {pred_sold:.0f} | Stock: {pred_stock:.0f}"
# Batch prediction from uploaded CSV
def predict_from_csv(file):
import matplotlib.pyplot as plt
import seaborn as sns
from PIL import Image
import io
input_df = pd.read_csv(file.name)
pred_revenue = model_revenue.predict(input_df)
pred_sold = model_sold.predict(input_df)
pred_stock = model_stock.predict(input_df)
input_df["Predicted Revenue"] = pred_revenue
input_df["Predicted Products Sold"] = pred_sold
input_df["Predicted Stock Level"] = pred_stock
# Create plot
fig, axes = plt.subplots(3, 1, figsize=(10, 12))
sns.barplot(x=input_df.index, y="Predicted Revenue", data=input_df, ax=axes[0])
axes[0].set_title("Predicted Revenue")
sns.lineplot(x=input_df.index, y="Predicted Products Sold", data=input_df, ax=axes[1], marker="o")
axes[1].set_title("Predicted Products Sold")
sns.lineplot(x=input_df.index, y="Predicted Stock Level", data=input_df, ax=axes[2], marker="o", color="green")
axes[2].set_title("Predicted Stock Level")
plt.tight_layout()
# Save to buffer and return PIL image
buf = io.BytesIO()
plt.savefig(buf, format='png')
plt.close()
buf.seek(0)
image = Image.open(buf)
return input_df, image
input_df = pd.read_csv(file.name)
pred_revenue = model_revenue.predict(input_df)
pred_sold = model_sold.predict(input_df)
pred_stock = model_stock.predict(input_df)
input_df["Predicted Revenue"] = pred_revenue
input_df["Predicted Products Sold"] = pred_sold
input_df["Predicted Stock Level"] = pred_stock
return input_df
# Interface
with gr.Blocks() as demo:
gr.Markdown("# Supply Chain Prediction App")
gr.Markdown("Masukkan informasi produk atau upload file CSV untuk prediksi pendapatan, jumlah produk terjual, dan stok.")
with gr.Tab("Input Manual"):
with gr.Row():
product_type = gr.Dropdown(choices=["haircare", "skincare"], label="Product Type")
price = gr.Number(label="Price")
availability = gr.Number(label="Availability")
customer_demographics = gr.Dropdown(choices=["Male", "Female", "Non-binary", "Unknown"], label="Customer Demographics")
with gr.Row():
lead_times = gr.Number(label="Lead Time")
order_quantities = gr.Number(label="Order Quantities")
location = gr.Dropdown(choices=["Mumbai", "Kolkata", "Delhi", "Chennai"], label="Location")
production_volumes = gr.Number(label="Production Volumes")
output = gr.Textbox(label="Hasil Prediksi")
btn = gr.Button("Submit")
btn.click(fn=predict_single, inputs=[
product_type, price, availability, customer_demographics,
lead_times, order_quantities, location, production_volumes
], outputs=output)
with gr.Tab("Upload CSV"):
file_input = gr.File(label="Upload CSV")
output_table = gr.Dataframe(label="Hasil Prediksi")
file_input.change(fn=predict_from_csv, inputs=file_input, outputs=[output_table, gr.Image(label='Visualisasi Prediksi')])
demo.launch()