import gradio as gr import pickle import numpy as np # Load the preprocessor and model with open("processor.pkl", "rb") as f: processor = pickle.load(f) with open("model.pkl", "rb") as f: model = pickle.load(f) # The original FastAPI endpoint URL (not active now) # API_URL = "http://4.186.39.227/predict" # Function to preprocess input data and predict customer segment def predict_customer_segment(data): # Preprocess the data processed_data = processor.transform(np.array([[ data["CUST_ID"], data["BALANCE"], data["BALANCE_FREQUENCY"], data["PURCHASES"], data["ONEOFF_PURCHASES"], data["INSTALLMENTS_PURCHASES"], data["CASH_ADVANCE"], data["PURCHASES_FREQUENCY"], data["ONEOFF_PURCHASES_FREQUENCY"], data["PURCHASES_INSTALLMENTS_FREQUENCY"], data["CASH_ADVANCE_FREQUENCY"], data["CASH_ADVANCE_TRX"], data["PURCHASES_TRX"], data["CREDIT_LIMIT"], data["PAYMENTS"], data["MINIMUM_PAYMENTS"], data["PRC_FULL_PAYMENT"], data["TENURE"] ]])) # Predict the cluster label using the model cluster_label = model.predict(processed_data)[0] # Map the cluster label to a human-readable description cluster_descriptions = { 0: "Low Value Customer", 1: "Medium Value Customer", 2: "High Value Customer", 3: "Premium Customer" } return cluster_descriptions.get(cluster_label, "Unknown Cluster") # Function to handle predictions from form input def predict_from_form(CUST_ID, BALANCE, BALANCE_FREQUENCY, PURCHASES, ONEOFF_PURCHASES, INSTALLMENTS_PURCHASES, CASH_ADVANCE, PURCHASES_FREQUENCY, ONEOFF_PURCHASES_FREQUENCY, PURCHASES_INSTALLMENTS_FREQUENCY, CASH_ADVANCE_FREQUENCY, CASH_ADVANCE_TRX, PURCHASES_TRX, CREDIT_LIMIT, PAYMENTS, MINIMUM_PAYMENTS, PRC_FULL_PAYMENT, TENURE): data = { "CUST_ID": CUST_ID, "BALANCE": BALANCE, "BALANCE_FREQUENCY": BALANCE_FREQUENCY, "PURCHASES": PURCHASES, "ONEOFF_PURCHASES": ONEOFF_PURCHASES, "INSTALLMENTS_PURCHASES": INSTALLMENTS_PURCHASES, "CASH_ADVANCE": CASH_ADVANCE, "PURCHASES_FREQUENCY": PURCHASES_FREQUENCY, "ONEOFF_PURCHASES_FREQUENCY": ONEOFF_PURCHASES_FREQUENCY, "PURCHASES_INSTALLMENTS_FREQUENCY": PURCHASES_INSTALLMENTS_FREQUENCY, "CASH_ADVANCE_FREQUENCY": CASH_ADVANCE_FREQUENCY, "CASH_ADVANCE_TRX": CASH_ADVANCE_TRX, "PURCHASES_TRX": PURCHASES_TRX, "CREDIT_LIMIT": CREDIT_LIMIT, "PAYMENTS": PAYMENTS, "MINIMUM_PAYMENTS": MINIMUM_PAYMENTS, "PRC_FULL_PAYMENT": PRC_FULL_PAYMENT, "TENURE": TENURE } return predict_customer_segment(data) # Define Gradio interface components with gr.Blocks() as demo: gr.Markdown("# Customer Segmentation Model") gr.Markdown("### Predict the customer segment based on the provided details") with gr.Row(): CUST_ID = gr.Textbox(label="Customer ID", lines=1, max_lines=1) BALANCE = gr.Number(label="Balance") BALANCE_FREQUENCY = gr.Number(label="Balance Frequency") PURCHASES = gr.Number(label="Purchases") ONEOFF_PURCHASES = gr.Number(label="One-off Purchases") INSTALLMENTS_PURCHASES = gr.Number(label="Installments Purchases") CASH_ADVANCE = gr.Number(label="Cash Advance") PURCHASES_FREQUENCY = gr.Number(label="Purchases Frequency") ONEOFF_PURCHASES_FREQUENCY = gr.Number(label="One-off Purchases Frequency") PURCHASES_INSTALLMENTS_FREQUENCY = gr.Number(label="Purchases Installments Frequency") CASH_ADVANCE_FREQUENCY = gr.Number(label="Cash Advance Frequency") CASH_ADVANCE_TRX = gr.Number(label="Cash Advance Transactions") PURCHASES_TRX = gr.Number(label="Purchases Transactions") CREDIT_LIMIT = gr.Number(label="Credit Limit") PAYMENTS = gr.Number(label="Payments") MINIMUM_PAYMENTS = gr.Number(label="Minimum Payments") PRC_FULL_PAYMENT = gr.Number(label="Percent Full Payment") TENURE = gr.Number(label="Tenure") predict_button = gr.Button("Predict", variant="primary") prediction_output = gr.Textbox(label="Predicted Customer Segment", lines=1, max_lines=1) predict_button.click(predict_from_form, inputs=[ CUST_ID, BALANCE, BALANCE_FREQUENCY, PURCHASES, ONEOFF_PURCHASES, INSTALLMENTS_PURCHASES, CASH_ADVANCE, PURCHASES_FREQUENCY, ONEOFF_PURCHASES_FREQUENCY, PURCHASES_INSTALLMENTS_FREQUENCY, CASH_ADVANCE_FREQUENCY, CASH_ADVANCE_TRX, PURCHASES_TRX, CREDIT_LIMIT, PAYMENTS, MINIMUM_PAYMENTS, PRC_FULL_PAYMENT, TENURE ], outputs=prediction_output) demo.launch()