EdgarDataScientist's picture
Upload 10 files
e0356a0 verified
# File: src/dashboard.py
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
from pymongo import MongoClient
# MongoDB settings (can also be loaded from config.yaml)
MONGO_URI = "mongodb://localhost:27017/"
DB_NAME = "customer_db"
COLLECTION_NAME = "customers"
def load_data():
client = MongoClient(MONGO_URI)
db = client[DB_NAME]
collection = db[COLLECTION_NAME]
data = list(collection.find({}, {"_id": 0}))
return pd.DataFrame(data)
st.title("πŸ“Š Advanced Multi-Sector Customer Behavior Dashboard")
df = load_data()
# Sidebar Filters
st.sidebar.header("Filters")
age_min, age_max = st.sidebar.slider("Age Range", 18, 80, (25, 60))
income_min, income_max = st.sidebar.slider("Income Range", 20000, 150000, (30000, 100000))
sectors = st.sidebar.multiselect("Select Sector(s)", options=df["Sector"].unique(), default=df["Sector"].unique())
filtered_df = df[
(df["Age"] >= age_min) & (df["Age"] <= age_max) &
(df["Income"] >= income_min) & (df["Income"] <= income_max) &
(df["Sector"].isin(sectors))
]
st.write(f"### Showing {len(filtered_df)} records based on filters")
st.dataframe(filtered_df.head(50))
# Plot: Distribution by Sector
st.subheader("Customer Distribution by Sector")
sector_counts = filtered_df["Sector"].value_counts()
fig, ax = plt.subplots()
sector_counts.plot(kind="bar", ax=ax)
st.pyplot(fig)
# Sector-specific insights
st.subheader("Sector-specific Insights")
for sector in sectors:
st.write(f"**{sector}**")
sector_data = filtered_df[filtered_df["Sector"] == sector]
if sector in ["Retail", "E-commerce"]:
avg_rating = sector_data["AvgRating"].mean() if "AvgRating" in sector_data.columns else None
st.write(f"Average Product Rating: {avg_rating:.2f}" if avg_rating else "No rating data")
elif sector == "Banking":
avg_credit = sector_data["CreditScore"].mean() if "CreditScore" in sector_data.columns else None
st.write(f"Average Credit Score: {avg_credit:.2f}" if avg_credit else "No credit data")
elif sector == "Telecom":
avg_data = sector_data["MonthlyDataGB"].mean() if "MonthlyDataGB" in sector_data.columns else None
st.write(f"Average Monthly Data Usage: {avg_data:.2f} GB" if avg_data else "No telecom data")
elif sector == "Travel":
avg_trips = sector_data["TripsPerYear"].mean() if "TripsPerYear" in sector_data.columns else None
st.write(f"Average Trips per Year: {avg_trips:.2f}" if avg_trips else "No travel data")
st.write("---")
st.write("Dashboard powered by **Streamlit, MongoDB & an advanced multi-sector synthetic dataset**")