Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import joblib | |
| MODEL_PATH = 'src/credit_card_model.joblib' | |
| SCALER_PATH = 'src/card_scaler.joblib' | |
| FEATURES = ['BALANCE', 'PURCHASES', 'CREDIT_LIMIT'] | |
| def load_assets(): | |
| try: | |
| model = joblib.load(MODEL_PATH) | |
| scaler = joblib.load(SCALER_PATH) | |
| return model, scaler | |
| except Exception as e: | |
| st.error(f"Error loading assets. Check if '{MODEL_PATH}' and '{SCALER_PATH}' are uploaded correctly. Error: {e}") | |
| return None, None | |
| def predict_cluster(model, scaler, input_data): | |
| input_df = pd.DataFrame([input_data]) | |
| scaled_data = scaler.transform(input_df[FEATURES]) | |
| prediction = model.predict(scaled_data) | |
| return prediction[0] | |
| # --- Streamlit Interface --- | |
| st.set_page_config(page_title="Credit Card Cluster Predictor", layout="wide") | |
| st.title("π³ Credit Card Customer Segmentation") | |
| st.markdown("Enter the customer's credit card usage details to predict their segment.") | |
| model, scaler = load_assets() | |
| if model is not None and scaler is not None: | |
| st.sidebar.header("Input Customer Data") | |
| balance = st.sidebar.slider("Current Balance ($):", min_value=0, max_value=20000, value=3000) | |
| purchases = st.sidebar.slider("Total Purchases ($):", min_value=0, max_value=15000, value=1000) | |
| credit_limit = st.sidebar.slider("Credit Limit ($):", min_value=1000, max_value=30000, value=5000) | |
| input_data = { | |
| 'BALANCE': balance, | |
| 'PURCHASES': purchases, | |
| 'CREDIT_LIMIT': credit_limit | |
| } | |
| st.subheader("Customer Input Summary:") | |
| st.dataframe(pd.DataFrame([input_data])) | |
| if st.button("Predict Customer Segment"): | |
| with st.spinner('Predicting...'): | |
| cluster_id = predict_cluster(model, scaler, input_data) | |
| # Use simple descriptions (customize based on your 4 cluster names) | |
| cluster_descriptions = { | |
| 0: "Cluster 0", | |
| 1: "Cluster 1", | |
| 2: "Cluster 2", | |
| 3: "Cluster 3", | |
| } | |
| description = cluster_descriptions.get(cluster_id, f"π Cluster ID **{cluster_id}** (Undefined Segment)") | |
| st.success("Prediction Successful!") | |
| st.markdown(f"## Predicted Segment: {description}") |