Spaces:
Sleeping
Sleeping
Download app.py from basaktamer/Store_Sales: direct link, hf CLI and curl.
- Browser
- Download file 2.66 kB
-
https://huggingface.co/spaces/basaktamer/Store_Sales/resolve/main/app.py
- Command line
-
hf download hf://spaces/basaktamer/Store_Sales/app.py
-
curl -L -o app.py https://huggingface.co/spaces/basaktamer/Store_Sales/resolve/main/app.py
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.") |