import subprocess import random from typing import Any import gradio as gr import joblib import numpy as np import pandas as pd OUTPUT_DATA_PATH = "data/processed/app_dataset.csv" PREDICTIONS_PATH = "models/predictions/app_predictions.csv" UNIQUE_VALUES_PATH = "models/other/unique_column_values.pkl" def predict(*args: tuple) -> Any: app_df = pd.DataFrame(data=[args], columns=columns, index=[0]) app_df.to_csv(OUTPUT_DATA_PATH, index=False) subprocess.run( [ "python", "-m", "src.models.make_predictions", "data/processed/app_dataset.csv", "models/final_model.pkl", "models/predictions/app_predictions.csv", ], shell=True, ) predictions = np.genfromtxt(PREDICTIONS_PATH, delimiter=",", skip_header=1) if predictions[2] == 1: message = "Client is considered bad. Issuance of credit is not recommended." else: message = "Client is considered good. Issuance of credit is allowed." return round(predictions[0], 3), message columns = ( "YEARS_BIRTH", "CODE_GENDER", "AMT_INCOME_TOTAL", "NAME_INCOME_TYPE", "YEARS_EMPLOYED", "OCCUPATION_TYPE", "NAME_EDUCATION_TYPE", "CNT_FAM_MEMBERS", "CNT_CHILDREN", "NAME_FAMILY_STATUS", "FLAG_OWN_CAR", "FLAG_OWN_REALTY", "NAME_HOUSING_TYPE", "FLAG_PHONE", "FLAG_WORK_PHONE", "FLAG_EMAIL", ) unique_values = joblib.load(UNIQUE_VALUES_PATH) with gr.Blocks() as demo: with gr.Row(): with gr.Column(): age = gr.Slider(label="Age", minimum=18, maximum=90, step=1, randomize=True) sex = gr.Dropdown( label="Sex", choices=unique_values["CODE_GENDER"], value=lambda: random.choice(unique_values["CODE_GENDER"]), ) annual_income = gr.Slider( label="Annual income", minimum=0, maximum=7000000, step=10000, randomize=True, ) income_type = gr.Dropdown( label="Income type", choices=unique_values["NAME_INCOME_TYPE"], value=lambda: random.choice(unique_values["NAME_INCOME_TYPE"]), ) work_experience = gr.Slider( label="Work experience at current position", minimum=0, maximum=75, step=1, randomize=True, ) occupation_type = gr.Dropdown( label="Occupation type", choices=unique_values["OCCUPATION_TYPE"], value=lambda: random.choice(unique_values["OCCUPATION_TYPE"]), ) education_type = gr.Dropdown( label="Education type", choices=unique_values["NAME_EDUCATION_TYPE"], value=lambda: random.choice(unique_values["NAME_EDUCATION_TYPE"]), ) amount_of_family_members = gr.Slider( label="Amount of family members", minimum=0, maximum=12, step=1, randomize=True, ) amount_of_children = gr.Slider( label="Amount of children", minimum=0, maximum=10, step=1, randomize=True, ) with gr.Column(): family_status = gr.Dropdown( label="Family status", choices=unique_values["NAME_FAMILY_STATUS"], value=lambda: random.choice(unique_values["NAME_FAMILY_STATUS"]), ) flag_own_car = gr.Dropdown( label="Having a car", choices=unique_values["FLAG_OWN_REALTY"], value=lambda: random.choice(unique_values["FLAG_OWN_REALTY"]), ) flag_own_realty = gr.Dropdown( label="Having a realty", choices=unique_values["FLAG_OWN_REALTY"], value=lambda: random.choice(unique_values["FLAG_OWN_REALTY"]), ) housing_type = gr.Dropdown( label="Housing type", choices=unique_values["NAME_HOUSING_TYPE"], value=lambda: random.choice(unique_values["NAME_HOUSING_TYPE"]), ) flag_phone = gr.Dropdown( label="Having a phone", choices=unique_values["FLAG_PHONE"], value=lambda: random.choice(unique_values["FLAG_PHONE"]), ) flag_work_phone = gr.Dropdown( label="Having a work phone", choices=unique_values["FLAG_WORK_PHONE"], value=lambda: random.choice(unique_values["FLAG_WORK_PHONE"]), ) flag_email = gr.Dropdown( label="Having an email", choices=unique_values["FLAG_EMAIL"], value=lambda: random.choice(unique_values["FLAG_EMAIL"]), ) with gr.Column(): label_1 = gr.Label(label="Client rating") label_2 = gr.Textbox(label="Client verdict (client is considered bad if client rating < 0.99)") with gr.Row(): predict_btn = gr.Button(value="Predict") predict_btn.click( predict, inputs=[ age, sex, annual_income, income_type, work_experience, occupation_type, education_type, amount_of_family_members, amount_of_children, family_status, flag_own_car, flag_own_realty, housing_type, flag_phone, flag_work_phone, flag_email, ], outputs=[label_1, label_2], ) demo.launch()