etuncer's picture
Update src/app.py
6739bdd verified
Raw
History Blame Contribute Delete
2.47 kB
import streamlit as st
import pandas as pd
import joblib
# Load the pre-trained model
model = joblib.load('src/model/retail_price_model.pkl')
# Load the encoder
encoder = joblib.load('src/model/encoder.pkl')
# Load the scaler
scaler = joblib.load('src/model/scaler.pkl')
st.title("Retail Price Optimization - Regression")
st.write("Predict optimal retail prices based on various features.")
# Input features
qty = st.number_input("Quantity", min_value=0, value=1)
lag_price = st.number_input("Lag Price", min_value=0.0, format="%.2f")
unit_price = st.number_input("Unit Price", min_value=0.0, format="%.2f")
customers = st.number_input("Customers", min_value=0, value=1)
comp1_price_diff = st.number_input("Competitor 1 Price Difference", format="%.2f")
comp3_price_diff = st.number_input("Competitor 3 Price Difference", format="%.2f")
comp2_price_diff = st.number_input("Competitor 2 Price Difference", format="%.2f")
s = st.number_input("S", format="%.2f")
product_category_name = st.selectbox(
"Product Category Name",
options=encoder.categories_[0].tolist()
)
# Predict and display output
if st.button("Predict Total Price", type="primary"):
try:
# Create a DataFrame for the input
input_data = pd.DataFrame({
'qty': [qty],
'lag_price': [lag_price],
'unit_price': [unit_price],
'customers': [customers],
'comp1_price_diff': [comp1_price_diff],
'comp2_price_diff': [comp2_price_diff],
'comp3_price_diff': [comp3_price_diff],
's': [s],
'product_category_name': [product_category_name]
})
# One-hot encode the categorical variable
input_encoded = pd.DataFrame(
encoder.transform(input_data[['product_category_name']]),
columns=encoder.get_feature_names_out(['product_category_name'])
)
input_encoded.index = input_data.index
input_data = pd.concat([input_data.drop('product_category_name', axis=1), input_encoded], axis=1)
# Scale the input data
input_scaled = scaler.transform(input_data)
# Predict using the pre-trained model
prediction = model.predict(input_scaled)
if prediction < 0:
st.warning("Predicted price is negative, please check the input values.")
st.success(f"Predicted Total Price: ${prediction[0]:.2f}")
except Exception as e:
st.error(f"Prediction failed: {e}")