Upload 2 files
Browse files
bmw.py
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import pandas as pd
|
| 3 |
+
from photo import *
|
| 4 |
+
from sklearn.preprocessing import LabelEncoder, StandardScaler
|
| 5 |
+
from sklearn.linear_model import LogisticRegression
|
| 6 |
+
|
| 7 |
+
# Load and preprocess dataset
|
| 8 |
+
@st.cache_data
|
| 9 |
+
def load_data():
|
| 10 |
+
df = pd.read_csv("BMW_Car_Sales_Classification.csv")
|
| 11 |
+
label_encoders = {}
|
| 12 |
+
df_encoded = df.copy()
|
| 13 |
+
for col in df.select_dtypes(include='object'):
|
| 14 |
+
le = LabelEncoder()
|
| 15 |
+
df_encoded[col] = le.fit_transform(df[col])
|
| 16 |
+
label_encoders[col] = le
|
| 17 |
+
scaler = StandardScaler()
|
| 18 |
+
X = df_encoded.drop("Sales_Classification", axis=1)
|
| 19 |
+
y = df_encoded["Sales_Classification"]
|
| 20 |
+
X_scaled = scaler.fit_transform(X)
|
| 21 |
+
model = LogisticRegression(max_iter=1000)
|
| 22 |
+
model.fit(X_scaled, y)
|
| 23 |
+
return model, scaler, label_encoders, df
|
| 24 |
+
|
| 25 |
+
model, scaler, label_encoders, df = load_data()
|
| 26 |
+
|
| 27 |
+
# Optional: Custom HTML header
|
| 28 |
+
st.markdown("""
|
| 29 |
+
<div style="background-color:#2c3e50;padding:20px;border-radius:10px;">
|
| 30 |
+
<h2 style="color:white;text-align:center;">🚗 BMW Sales Classification Predictor</h2>
|
| 31 |
+
</div>
|
| 32 |
+
<br>
|
| 33 |
+
""", unsafe_allow_html=True)
|
| 34 |
+
|
| 35 |
+
# Sidebar inputs
|
| 36 |
+
st.sidebar.header("Input Car Details")
|
| 37 |
+
form_data = {
|
| 38 |
+
"Model": st.sidebar.selectbox("Model", df["Model"].unique()),
|
| 39 |
+
"Year": st.sidebar.number_input("Year", min_value=2000, max_value=2025, value=2020),
|
| 40 |
+
"Region": st.sidebar.selectbox("Region", df["Region"].unique()),
|
| 41 |
+
"Color": st.sidebar.selectbox("Color", df["Color"].unique()),
|
| 42 |
+
"Fuel_Type": st.sidebar.selectbox("Fuel Type", df["Fuel_Type"].unique()),
|
| 43 |
+
"Transmission": st.sidebar.selectbox("Transmission", df["Transmission"].unique()),
|
| 44 |
+
"Engine_Size_L": st.sidebar.number_input("Engine Size (L)", min_value=1.0, max_value=6.0, step=0.1, value=2.0),
|
| 45 |
+
"Mileage_KM": st.sidebar.number_input("Mileage (KM)", value=30000),
|
| 46 |
+
"Price_USD": st.sidebar.number_input("Price (USD)", value=40000),
|
| 47 |
+
"Sales_Volume": st.sidebar.number_input("Sales Volume", value=100)
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
if st.sidebar.button("Predict Classification"):
|
| 51 |
+
input_df = pd.DataFrame([form_data])
|
| 52 |
+
for col in input_df.select_dtypes(include='object').columns:
|
| 53 |
+
input_df[col] = label_encoders[col].transform(input_df[col])
|
| 54 |
+
input_scaled = scaler.transform(input_df)
|
| 55 |
+
prediction = model.predict(input_scaled)
|
| 56 |
+
predicted_label = label_encoders['Sales_Classification'].inverse_transform(prediction)
|
| 57 |
+
|
| 58 |
+
st.success(f"🧠 Predicted Sales Classification: **{predicted_label[0]}**")
|
photo.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import base64
|
| 3 |
+
|
| 4 |
+
# ---- Helper Function ----
|
| 5 |
+
def set_background(image_file):
|
| 6 |
+
with open(image_file, "rb") as img:
|
| 7 |
+
encoded = base64.b64encode(img.read()).decode()
|
| 8 |
+
|
| 9 |
+
css = f"""
|
| 10 |
+
<style>
|
| 11 |
+
.stApp {{
|
| 12 |
+
background-image: url("data:image/jpg;base64,{encoded}");
|
| 13 |
+
background-size: cover;
|
| 14 |
+
background-position: center;
|
| 15 |
+
background-repeat: no-repeat;
|
| 16 |
+
}}
|
| 17 |
+
</style>
|
| 18 |
+
"""
|
| 19 |
+
st.markdown(css, unsafe_allow_html=True)
|
| 20 |
+
|
| 21 |
+
# ---- Set background before any UI rendering ----
|
| 22 |
+
set_background("997526.jpg") # your image file
|
| 23 |
+
|
| 24 |
+
# ---- Streamlit UI ----
|
| 25 |
+
|
| 26 |
+
# Example Input
|
| 27 |
+
sales_value = st.number_input("Enter Sales Value ($)", min_value=0)
|
| 28 |
+
|
| 29 |
+
# Predict button
|
| 30 |
+
if st.button("Predict Sales Class"):
|
| 31 |
+
# Dummy logic for demonstration
|
| 32 |
+
if sales_value > 50000:
|
| 33 |
+
st.success("High-end BMW buyer")
|
| 34 |
+
else:
|
| 35 |
+
st.warning("Mid-range BMW buyer")
|