File size: 5,169 Bytes
1bab85c
 
 
 
 
 
 
 
 
 
 
 
a2ef5e8
1bab85c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

import streamlit as st
import requests

# Page Configuration
st.set_page_config(
    page_title="SuperKart Sales Predictor",
    page_icon=":shopping_cart:",
    layout="centered"
)

# App Title and User Guidance
st.title("Ramakanth's SuperKart Sales Predictor")
st.markdown("""
Welcome to the **SuperKart Sales Forecasting Tool**\!

This application predicts the **total product-store sales revenue** for a given
product and store combination using a trained **XGBoost model** deployed on
Hugging Face Spaces.

**How to use:**
1. Fill in the **Product Details** and **Store Details** below.
2. All fields are required. Hover over each label to see valid values and ranges.
3. Click **Predict Sales** to get an instant forecast.
""")

st.divider()

# Input Form -- Product Details
st.subheader("Product Details")
col1, col2 = st.columns(2)

with col1:
    Product_Weight = st.number_input(
        "Product Weight (kg)",
        min_value=4.0, max_value=22.0, value=12.66, step=0.01,
        help="Weight of the product in kilograms. Valid range: 4.0 to 22.0 kg."
    )
    Product_Allocated_Area = st.number_input(
        "Product Allocated Area (ratio)",
        min_value=0.004, max_value=0.298, value=0.068, step=0.001,
        format="%.3f",
        help="Ratio of display area for this product to total store display. Range: 0.004 to 0.298."
    )
    Product_MRP = st.number_input(
        "Product MRP (INR)",
        min_value=31.0, max_value=266.0, value=147.0, step=0.5,
        help="Maximum Retail Price of the product in Indian Rupees. Range: 31 to 266."
    )

with col2:
    Product_Sugar_Content = st.selectbox(
        "Sugar Content",
        ["Low Sugar", "Regular", "No Sugar"],
        help="Sugar content classification: Low Sugar / Regular / No Sugar."
    )
    Product_Id_char = st.selectbox(
        "Product ID Prefix",
        ["FD", "DR", "NC"],
        help="Two-letter prefix of the Product ID: FD=Food, DR=Drinks, NC=Non-Consumable."
    )
    Product_Type_Category = st.selectbox(
        "Product Type Category",
        ["Perishables", "Non Perishables"],
        help="Perishables: dairy, meat, fruits. Non-Perishables: canned, household, health."
    )

# Input Form -- Store Details
st.subheader("Store Details")
col3, col4 = st.columns(2)

with col3:
    Store_Size = st.selectbox(
        "Store Size",
        ["High", "Medium", "Low"],
        index=1,
        help="Physical size: High=large supermarket, Medium=standard, Low=small food mart."
    )
    Store_Location_City_Type = st.selectbox(
        "City Type",
        ["Tier 1", "Tier 2", "Tier 3"],
        index=1,
        help="Tier 1=metro cities, Tier 2=mid-size cities, Tier 3=smaller towns."
    )

with col4:
    Store_Type = st.selectbox(
        "Store Type",
        ["Departmental Store", "Supermarket Type1", "Supermarket Type2", "Food Mart"],
        index=2,
        help="Store format based on product range offered."
    )
    Store_Age_Years = st.number_input(
        "Store Age (Years)",
        min_value=0, max_value=100, value=26, step=1,
        help="Number of years since the store was established."
    )

st.divider()

# Prediction Button
if st.button("Predict Sales", type="primary", use_container_width=True):
    payload = {
        "Product_Weight":           Product_Weight,
        "Product_Sugar_Content":    Product_Sugar_Content,
        "Product_Allocated_Area":   Product_Allocated_Area,
        "Product_MRP":              Product_MRP,
        "Store_Size":               Store_Size,
        "Store_Location_City_Type": Store_Location_City_Type,
        "Store_Type":               Store_Type,
        "Product_Id_char":          Product_Id_char,
        "Store_Age_Years":          Store_Age_Years,
        "Product_Type_Category":    Product_Type_Category
    }
    with st.spinner("Contacting prediction API -- please wait..."):
        try:
            response = requests.post(
                "https://ramzai9-superkartprediction.hf.space/v1/predict",
                json=payload,
                timeout=60
            )
            if response.status_code == 200:
                predicted_sales = response.json()["Sales"]
                st.success(f"Predicted Product Store Sales Total: INR {predicted_sales:,.2f}")
                st.balloons()
            elif response.status_code == 400:
                st.error(f"Validation Error: {response.json().get('error', 'Bad request')}")
            else:
                st.error(f"API Error (HTTP {response.status_code}): {response.text}")
        except requests.exceptions.Timeout:
            st.warning(
                "Request timed out. The backend space may be waking up -- "
                "please wait 30 seconds and try again."
            )
        except requests.exceptions.ConnectionError:
            st.error(
                "Could not reach the prediction backend. "
                "Please verify the backend Hugging Face Space is running."
            )
        except Exception as e:
            st.error(f"Unexpected error: {str(e)}")

st.caption("SuperKart Sales Predictor | Powered by XGBoost & Streamlit | Deployed on Hugging Face Spaces")