Store_Sales / app.py
basaktamer's picture
Upload 7 files
7452b23 verified
Raw History Blame Contribute Delete
2.66 kB
import streamlit as st
import pandas as pd
import numpy as np
import joblib
from datetime import datetime
# 1. Load the model and features
model = joblib.load('linear_regression_model.pkl')
features = joblib.load('model_features.pkl')
st.set_page_config(page_title="Store Sales Forecaster", layout="centered")
st.title("📈 Store Sales Forecasting")
st.markdown("""
This app predicts daily sales for a retail store in Ecuador using a **Linear Regression** model.
It accounts for promotions, oil prices, and special events like holidays and paydays.
""")
st.sidebar.header("User Input Parameters")
def user_input_features():
# Date Input
date = st.sidebar.date_input("Select Date", datetime(2017, 8, 16))
# Store and Family Input
store_nbr = st.sidebar.number_input("Store Number", min_value=1, max_value=54, value=1)
onpromotion = st.sidebar.number_input("Items on Promotion", min_value=0, value=0)
# Simplified dropdowns (we'll map these to the codes the model expects)
# Note: In a production app, you'd map these to the exact category codes used in training
family_code = st.sidebar.slider("Product Family Code", 0, 32, 10)
holiday_code = st.sidebar.slider("Holiday Type Code", 0, 6, 0)
store_type_code = st.sidebar.slider("Store Type Code", 0, 4, 0)
# Static or Derived Features
oil_price = st.sidebar.number_input("Current Oil Price (dcoilwtico)", value=45.0)
# Deriving date-based features
month = date.month
day_of_week = date.weekday()
is_payday = 1 if (date.day == 15 or date.day == pd.Period(date, freq='D').days_in_month) else 0
earthquake = 0 # Currently 0 as the event has passed
data = {
'store_nbr': store_nbr,
'family_code': family_code,
'onpromotion': onpromotion,
'dcoilwtico': oil_price,
'month': month,
'day_of_week': day_of_week,
'holiday_code': holiday_code,
'is_payday': is_payday,
'earthquake': earthquake,
'store_code': store_type_code
}
return pd.DataFrame(data, index=[0])
input_df = user_input_features()
st.subheader("Input Summary")
st.write(input_df)
# Prediction
if st.button("Predict Sales"):
# Reorder columns to match the trained model's features list
input_df = input_df[features]
prediction = model.predict(input_df)
# Apply clip to ensure no negative sales
result = np.clip(prediction[0], 0, None)
st.success(f"### Estimated Sales: {result:.2f} units")
st.info("Note: This prediction is based on a baseline Linear Regression model trained on historical data from 2013-2017.")