credit-risk-api / prediction_helper.py
junaid17's picture
Upload 6 files
55f820f verified
import joblib
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
MODEL_PATH = 'artifacts/model_data.joblib'
model_data = joblib.load(MODEL_PATH)
model = model_data['model']
scaler = model_data['scaler']
features = model_data['features']
cols_to_scale = model_data['cols_to_scale']
def prepare_input(age, income, loan_amount, loan_tenure_months, avg_dpd_per_delinquency,
delinquency_ratio, credit_utilization_ratio, num_open_accounts, residence_type,
loan_purpose, loan_type):
input_data = {
'age': age,
'loan_tenure_months': loan_tenure_months,
'number_of_open_accounts': num_open_accounts,
'credit_utilization_ratio': credit_utilization_ratio,
'loan_to_income': loan_amount / income if income > 0 else 0,
'delinquency_ratio': delinquency_ratio,
'avg_dpd_per_delinquency': avg_dpd_per_delinquency,
'residence_type_Owned': 1 if residence_type == 'Owned' else 0,
'residence_type_Rented': 1 if residence_type == 'Rented' else 0,
'loan_purpose_Education': 1 if loan_purpose == 'Education' else 0,
'loan_purpose_Home': 1 if loan_purpose == 'Home' else 0,
'loan_purpose_Personal': 1 if loan_purpose == 'Personal' else 0,
'loan_type_Unsecured': 1 if loan_type == 'Unsecured' else 0,
'number_of_dependants': 1,
'years_at_current_address': 1,
'zipcode': 1,
'sanction_amount': 1,
'processing_fee': 1,
'gst': 1,
'net_disbursement': 1,
'principal_outstanding': 1,
'bank_balance_at_application': 1,
'number_of_closed_accounts': 1,
'enquiry_count': 1
}
df = pd.DataFrame([input_data])
df[cols_to_scale] = scaler.transform(df[cols_to_scale])
df = df[features]
return df
def predict(age, income, loan_amount, loan_tenure_months, avg_dpd_per_delinquency,
delinquency_ratio, credit_utilization_ratio, num_open_accounts,
residence_type, loan_purpose, loan_type):
input_df = prepare_input(age, income, loan_amount, loan_tenure_months, avg_dpd_per_delinquency,
delinquency_ratio, credit_utilization_ratio, num_open_accounts, residence_type,
loan_purpose, loan_type)
probability, credit_score, rating = calculate_credit_score(input_df)
return probability, credit_score, rating
def calculate_credit_score(input_df, base_score=300, scale_length=600):
x = np.dot(input_df.values, model.coef_.T) + model.intercept_
default_probability = 1 / (1 + np.exp(-x))
non_default_probability = 1 - default_probability
credit_score = base_score + non_default_probability.flatten() * scale_length
def get_rating(score):
if 300 <= score < 500:
return 'Poor'
elif 500 <= score < 650:
return 'Average'
elif 650 <= score < 750:
return 'Good'
elif 750 <= score <= 900:
return 'Excellent'
else:
return 'Undefined'
rating = get_rating(credit_score[0])
return default_probability.flatten()[0], int(credit_score[0]), rating