AIMSRICHackatonDay1 / src /streamlit_app.py
KB-Infinity-Tech's picture
Update src/streamlit_app.py
cd71796 verified
import streamlit as st
import pandas as pd
import numpy as np
import joblib
from pricer import (
Product,
suggest_price,
freshness_factor,
format_sms,
simulate_7_days
)
# -----------------------------
# LOAD TRAINED ML MODEL
# -----------------------------
# ml_model = joblib.load("demand_model.pkl")
import joblib
from huggingface_hub import hf_hub_download
model_path = hf_hub_download(
repo_id="KB-Infinity-Tech/AIMSRICHackatonday1XGboostTrainedmodel",
filename="demand_model.pkl"
)
ml_model = joblib.load(model_path)
def ml_predict(price, age_hours, comp_avg, product_encoded):
X = pd.DataFrame([[
price,
age_hours,
comp_avg,
product_encoded
]], columns=["price", "age_hours", "comp_avg_price", "product_encoded"])
return ml_model.predict(X)[0]
# -----------------------------
# PAGE CONFIG
# -----------------------------
st.set_page_config(page_title="AI Hybrid Pricing Engine", layout="wide")
st.title("🧠 AI Hybrid Retail Pricing System")
st.markdown("Rule-based + Machine Learning Dynamic Pricing Engine")
# -----------------------------
# SIDEBAR INPUTS
# -----------------------------
st.sidebar.header("πŸ“¦ Product Configuration")
sku = st.sidebar.text_input("Product SKU", "TOMATO-A")
cost = st.sidebar.number_input("Cost (RWF)", 500, 10000, 1000)
shelf_life = st.sidebar.number_input("Shelf Life (days)", 1, 14, 7)
p_ref = st.sidebar.number_input("Reference Price", 1000, 10000, 1800)
Q0 = st.sidebar.number_input("Base Demand (Q0)", 10, 500, 50)
alpha = st.sidebar.slider("Price Sensitivity (alpha)", 0.1, 5.0, 1.5)
age = st.sidebar.slider("Product Age (days)", 0.0, float(shelf_life), 3.0)
# Competitors
comp1 = st.sidebar.number_input("Competitor 1", 1000, 10000, 1600)
comp2 = st.sidebar.number_input("Competitor 2", 1000, 10000, 1700)
comp3 = st.sidebar.number_input("Competitor 3", 1000, 10000, 1900)
competitors = [comp1, comp2, comp3]
# -----------------------------
# PRODUCT OBJECT
# -----------------------------
product = Product(
sku=sku,
cost=cost,
shelf_life_days=shelf_life,
p_ref=p_ref,
Q0=Q0,
alpha=alpha
)
# -----------------------------
# RULE-BASED RESULT
# -----------------------------
result = suggest_price(product, age, competitors)
# -----------------------------
# DISPLAY METRICS
# -----------------------------
col1, col2, col3 = st.columns(3)
with col1:
st.metric("🧊 Freshness", f"{result['freshness']:.3f}")
st.write(result["freshness_label"])
with col2:
st.metric("πŸ’° Rule Price", f"{result['suggested_price']:.0f} RWF")
with col3:
st.metric("πŸ“ˆ Margin %", f"{result['margin_pct']:.1f}%")
st.divider()
# -----------------------------
# SMS OUTPUT
# -----------------------------
st.subheader("πŸ“² SMS Output")
st.code(format_sms(result, "RWF"))
# -----------------------------
# FRESHNESS CURVE
# -----------------------------
st.subheader("πŸ“‰ Freshness Decay Curve")
days = np.linspace(0, shelf_life, 50)
values = [freshness_factor(d, shelf_life) for d in days]
df_curve = pd.DataFrame({
"Day": days,
"Freshness": values
})
st.line_chart(df_curve.set_index("Day"))
# -----------------------------
# COMPETITOR VIEW
# -----------------------------
st.subheader("πŸͺ Market Comparison")
df_comp = pd.DataFrame({
"Entity": ["Competitor 1", "Competitor 2", "Competitor 3", "YOU (Rule)"],
"Price (RWF)": [comp1, comp2, comp3, result["suggested_price"]]
})
st.dataframe(df_comp)
# -----------------------------
# ML VS RULE COMPARISON
# -----------------------------
st.subheader("βš–οΈ Rule Engine vs ML Model")
comp_avg = np.mean(competitors)
product_encoded = 0
rule_profit = result["expected_daily_profit"]
ml_demand = ml_predict(
result["suggested_price"],
age * 24,
comp_avg,
product_encoded
)
ml_profit = (result["suggested_price"] - cost) * ml_demand
col1, col2 = st.columns(2)
with col1:
st.metric("πŸ“ Rule Profit", f"{rule_profit:.2f} RWF")
with col2:
st.metric("πŸ€– ML Profit", f"{ml_profit:.2f} RWF")
# -----------------------------
# PROFIT CURVE COMPARISON
# -----------------------------
st.subheader("πŸ“Š Profit Curve Comparison")
prices = np.linspace(500, 5000, 30)
ml_profits = []
rule_profits = []
for p in prices:
ml_d = ml_predict(p, age * 24, comp_avg, product_encoded)
ml_profits.append((p - cost) * ml_d)
rule_profits.append(result["expected_daily_profit"])
df_compare = pd.DataFrame({
"Price": prices,
"ML_Profit": ml_profits,
"Rule_Profit": rule_profits
})
st.line_chart(df_compare.set_index("Price"))
# -----------------------------
# 7-DAY SIMULATION
# -----------------------------
st.subheader("πŸ“Š 7-Day Simulation")
if st.button("Run Simulation"):
sim = simulate_7_days(product, competitors)
df_sim = pd.DataFrame(sim)
if "day" in df_sim.columns:
st.line_chart(df_sim.set_index("day")[["our_price", "demand"]])
st.dataframe(df_sim)
# -----------------------------
# FOOTER
# -----------------------------
st.markdown("---")
st.markdown("⚑ Hybrid AI Pricing System β€” Rule Engine + Machine Learning | AIMS-RIC Hackathon")