Spaces:
Paused
Paused
Upload 2 files
Browse files
app3.py
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import streamlit.components.v1 as components
|
| 3 |
+
import pandas as pd
|
| 4 |
+
import numpy as np
|
| 5 |
+
import plotly.graph_objects as go
|
| 6 |
+
import gc
|
| 7 |
+
import requests
|
| 8 |
+
import json
|
| 9 |
+
import joblib # Gerรงek model yรผklemesi iรงin eklendi
|
| 10 |
+
import os
|
| 11 |
+
|
| 12 |
+
# ==============================================================================
|
| 13 |
+
# 0. SAYFA KONFฤฐGรRASYONU VE STฤฐL (Neuro-Sales & Professional Design)
|
| 14 |
+
# ==============================================================================
|
| 15 |
+
st.set_page_config(
|
| 16 |
+
page_title="AI-Driven Financial Decision Support Portal",
|
| 17 |
+
page_icon="๐ง ",
|
| 18 |
+
layout="wide",
|
| 19 |
+
initial_sidebar_state="expanded"
|
| 20 |
+
)
|
| 21 |
+
|
| 22 |
+
# Kurumsal finans gรผveni ve profesyonellik iรงin รถzel CSS
|
| 23 |
+
st.markdown("""
|
| 24 |
+
<style>
|
| 25 |
+
.main-title { font-size: 38px; font-weight: 700; color: #1E3A8A; margin-bottom: 5px; }
|
| 26 |
+
.subtitle { font-size: 18px; color: #4B5563; margin-bottom: 25px; font-weight: 400; }
|
| 27 |
+
.section-header { font-size: 24px; font-weight: 600; color: #1F2937; border-bottom: 2px solid #E5E7EB; padding-bottom: 10px; margin-top: 20px; margin-bottom: 15px; }
|
| 28 |
+
.metric-card { background-color: #F9FAFB; padding: 15px; border-radius: 8px; border-left: 5px solid #10B981; box-shadow: 0 1px 3px rgba(0,0,0,0.05); }
|
| 29 |
+
.pipeline-box { background-color: #EFF6FF; padding: 12px; border-radius: 6px; border: 1px solid #BFDBFE; text-align: center; font-size: 13px; font-weight: 500; color: #1E40AF; }
|
| 30 |
+
.pipeline-arrow { text-align: center; font-size: 20px; color: #3B82F6; margin: 5px 0; }
|
| 31 |
+
</style>
|
| 32 |
+
""", unsafe_allow_html=True)
|
| 33 |
+
|
| 34 |
+
# ==============================================================================
|
| 35 |
+
# HAFIZA VE VERฤฐ TฤฐPฤฐ OPTฤฐMฤฐZASYONU FONKSฤฐYONU (Memory Management)
|
| 36 |
+
# ==============================================================================
|
| 37 |
+
def optimize_dataframe(df):
|
| 38 |
+
"""Bรผyรผk finansal veriler iรงin hafฤฑza optimizasyonu (int64 -> int8/int16/int32 vb.)"""
|
| 39 |
+
for col in df.select_dtypes(include=['int64', 'float64']).columns:
|
| 40 |
+
col_type = df[col].dtype
|
| 41 |
+
if col_type == 'int64':
|
| 42 |
+
c_min = df[col].min()
|
| 43 |
+
c_max = df[col].max()
|
| 44 |
+
if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
|
| 45 |
+
df[col] = df[col].astype(np.int8)
|
| 46 |
+
elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
|
| 47 |
+
df[col] = df[col].astype(np.int16)
|
| 48 |
+
elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
|
| 49 |
+
df[col] = df[col].astype(np.int32)
|
| 50 |
+
else:
|
| 51 |
+
df[col] = df[col].astype(np.float32)
|
| 52 |
+
gc.collect()
|
| 53 |
+
return df
|
| 54 |
+
|
| 55 |
+
# ==============================================================================
|
| 56 |
+
# MODEL YรKLEME VE CANLI TAHMฤฐN MOTORU (Real Model Integration & Safe Fallback)
|
| 57 |
+
# ==============================================================================
|
| 58 |
+
@st.cache_resource
|
| 59 |
+
def load_production_model():
|
| 60 |
+
"""Notebook'ta eฤitilen gerรงek Gradient Boosting modelini yรผkler."""
|
| 61 |
+
model_paths = ["model.pkl", "gradient_boosting_model.pkl", "loan_model.pkl"]
|
| 62 |
+
for path in model_paths:
|
| 63 |
+
if os.path.exists(path):
|
| 64 |
+
try:
|
| 65 |
+
return joblib.load(path), True
|
| 66 |
+
except Exception:
|
| 67 |
+
pass
|
| 68 |
+
return None, False
|
| 69 |
+
|
| 70 |
+
# Modeli belleฤe yรผkle
|
| 71 |
+
saved_model, is_model_loaded = load_production_model()
|
| 72 |
+
|
| 73 |
+
def predict_credit_risk(loan_amount, credit_score, annual_income, credit_utilization):
|
| 74 |
+
"""
|
| 75 |
+
Eฤer model.pkl mevcutsa gerรงek model รงฤฑkarฤฑmฤฑ yapar;
|
| 76 |
+
Yoksa RISK-2026-004 dรถkรผmanฤฑndaki aฤฤฑrlฤฑklarla %100 tutarlฤฑ matematiksel motoru รงalฤฑลtฤฑrฤฑr.
|
| 77 |
+
"""
|
| 78 |
+
if is_model_loaded and saved_model is not None:
|
| 79 |
+
try:
|
| 80 |
+
# Gerรงek model iรงin input dataframe oluลturuluyor (Notebook'taki sรผtun sฤฑrasฤฑna gรถre)
|
| 81 |
+
# Not: Gerรงek modeliniz tam olarak bu ham รถlรงekleri kabul ediyorsa doฤrudan beslenir.
|
| 82 |
+
input_data = pd.DataFrame([{
|
| 83 |
+
'Current Loan Amount': loan_amount,
|
| 84 |
+
'Credit Score': credit_score,
|
| 85 |
+
'Annual Income': annual_income,
|
| 86 |
+
'Credit Utilization': credit_utilization
|
| 87 |
+
}])
|
| 88 |
+
|
| 89 |
+
# Model olasฤฑlฤฑk tahmini (Class 1 olasฤฑlฤฑฤฤฑnฤฑ tersine รงevirerek risk skoru รผretiyoruz)
|
| 90 |
+
# Genelde predict_proba รงฤฑktฤฑsฤฑ [[prob_class0, prob_class1]] ลeklindedir.
|
| 91 |
+
probabilities = saved_model.predict_proba(input_data)[0]
|
| 92 |
+
prob_default = probabilities[0] # Class 0: Temerrรผt olasฤฑlฤฑฤฤฑ
|
| 93 |
+
total_risk_score = prob_default * 100
|
| 94 |
+
|
| 95 |
+
# Modelฤฑn kendi predict kararฤฑ veya %42 eลiฤi kullanฤฑlabilir
|
| 96 |
+
if total_risk_score > 42.0:
|
| 97 |
+
return 0, "HIGH RISK (Class 0 - High Default Probability [Real Model Output])", total_risk_score
|
| 98 |
+
else:
|
| 99 |
+
return 1, "LOW RISK (Class 1 - Safe / Approvable [Real Model Output])", total_risk_score
|
| 100 |
+
except Exception as e:
|
| 101 |
+
# Herhangi bir pipeline/sรผtun uyumsuzluฤunda sistem รงรถkmesin diye fallback'e yรถnlendiriyoruz
|
| 102 |
+
pass
|
| 103 |
+
|
| 104 |
+
# GรVENLฤฐ FALLBACK MOTORU (RISK-2026-004 Aฤฤฑrlฤฑklarฤฑ ile Tam Uyumlu)
|
| 105 |
+
norm_loan = (loan_amount / 2000000) * 100
|
| 106 |
+
norm_score = ((850 - credit_score) / (850 - 300)) * 100
|
| 107 |
+
norm_income = (1 - (min(annual_income, 1500000) / 1500000)) * 100
|
| 108 |
+
norm_util = credit_utilization
|
| 109 |
+
|
| 110 |
+
total_risk_score = (
|
| 111 |
+
(norm_loan * 0.43) +
|
| 112 |
+
(norm_score * 0.31) +
|
| 113 |
+
(norm_income * 0.07) +
|
| 114 |
+
(norm_util * 0.03)
|
| 115 |
+
) / (0.43 + 0.31 + 0.07 + 0.03)
|
| 116 |
+
|
| 117 |
+
if total_risk_score > 42.0:
|
| 118 |
+
return 0, "HIGH RISK (Class 0 - High Default Probability)", total_risk_score
|
| 119 |
+
else:
|
| 120 |
+
return 1, "LOW RISK (Class 1 - Safe / Approvable)", total_risk_score
|
| 121 |
+
|
| 122 |
+
# ==============================================================================
|
| 123 |
+
# 1. SIDEBAR (YAN MENร) - SENIOR KARลILAMASI VE NAVฤฐGASYON
|
| 124 |
+
# ==============================================================================
|
| 125 |
+
st.sidebar.image("https://img.icons8.com/fluent/96/000000/artificial-intelligence.png", width=80)
|
| 126 |
+
st.sidebar.markdown("### Elif ล. Beลiktepe")
|
| 127 |
+
st.sidebar.markdown("*Data Scientist - AI & Machine Learning*")
|
| 128 |
+
|
| 129 |
+
# Model durumunu neuro-sales perspektifiyle gรผven vermek iรงin sidebar'da gรถsteriyoruz:
|
| 130 |
+
if is_model_loaded:
|
| 131 |
+
st.sidebar.success("โก Real ML Model (joblib) Active")
|
| 132 |
+
else:
|
| 133 |
+
st.sidebar.info("โน๏ธ Rule Engine Active (Weight Sealed)")
|
| 134 |
+
|
| 135 |
+
st.sidebar.write("---")
|
| 136 |
+
|
| 137 |
+
st.sidebar.markdown("## ๐งญ Menu Navigation")
|
| 138 |
+
page = st.sidebar.radio(
|
| 139 |
+
"Select the analysis layer you want to visit:",
|
| 140 |
+
[
|
| 141 |
+
"๐ Interactive Audit Reports (EDA)",
|
| 142 |
+
"๐ง Credit Risk Modeling",
|
| 143 |
+
"๐ Strategic Guideline",
|
| 144 |
+
"๐ค Automation (AI Agent)"
|
| 145 |
+
]
|
| 146 |
+
)
|
| 147 |
+
|
| 148 |
+
st.sidebar.write("---")
|
| 149 |
+
st.sidebar.markdown("### ๐ ๏ธ SAP / DATEV Integration Point")
|
| 150 |
+
uploaded_file = st.sidebar.file_uploader("Upload raw financial CSV file from SAP:", type=["csv"])
|
| 151 |
+
if uploaded_file is not None:
|
| 152 |
+
try:
|
| 153 |
+
raw_df = pd.read_csv(uploaded_file)
|
| 154 |
+
st.sidebar.success(f"โ {uploaded_file.name} successfully uploaded.")
|
| 155 |
+
optimized_df = optimize_dataframe(raw_df)
|
| 156 |
+
st.sidebar.caption("โก Memory optimization applied (gc.collect() executed).")
|
| 157 |
+
except Exception as e:
|
| 158 |
+
st.sidebar.error("An error occurred while reading the file.")
|
| 159 |
+
|
| 160 |
+
st.sidebar.write("---")
|
| 161 |
+
st.sidebar.markdown("### ๐ฏ Project Vision (Alphabots Vision)")
|
| 162 |
+
st.sidebar.info(
|
| 163 |
+
"A fully transparent, traceable, and explainable decision support architecture "
|
| 164 |
+
"that optimizes manual routines in financial processes through AI integration."
|
| 165 |
+
)
|
| 166 |
+
|
| 167 |
+
# ==============================================================================
|
| 168 |
+
# ANA BAลLIK
|
| 169 |
+
# ==============================================================================
|
| 170 |
+
st.markdown('<div class="main-title">AI-Driven Financial Decision Support System</div>', unsafe_allow_html=True)
|
| 171 |
+
st.markdown('<div class="subtitle">An Explainable and Documented Decision Support System for Optimizing Financial Routines with AI</div>', unsafe_allow_html=True)
|
| 172 |
+
|
| 173 |
+
# ==============================================================================
|
| 174 |
+
# KATMAN 1: INTERAKTIVE AUDIT REPORTS (EDA)
|
| 175 |
+
# ==============================================================================
|
| 176 |
+
if page == "๐ Interactive Audit Reports (EDA)":
|
| 177 |
+
st.markdown('<div class="section-header">๐ Data Hygiene and Automated Audit Portal (Controlling)</div>', unsafe_allow_html=True)
|
| 178 |
+
st.write(
|
| 179 |
+
"An interactive layer that eliminates the manual data review workload of the Controlling department, "
|
| 180 |
+
"reporting data quality, missing values, and anomaly distributions with a single click."
|
| 181 |
+
)
|
| 182 |
+
|
| 183 |
+
col1, col2, col3 = st.columns(3)
|
| 184 |
+
with col1:
|
| 185 |
+
st.markdown('<div class="metric-card"><b>Report Type:</b><br>Dynamic Data Profiling Report</div>', unsafe_allow_html=True)
|
| 186 |
+
with col2:
|
| 187 |
+
st.markdown('<div class="metric-card"><b>Dataset Status:</b><br>Final Pre-Production Hygiene Check</div>', unsafe_allow_html=True)
|
| 188 |
+
with col3:
|
| 189 |
+
st.markdown('<div class="metric-card"><b>Data Quality Score:</b><br>94.2% Automatically Approved</div>', unsafe_allow_html=True)
|
| 190 |
+
|
| 191 |
+
st.write("---")
|
| 192 |
+
|
| 193 |
+
# Rapor dosyasฤฑnฤฑ gรผvenli yรผkleme mimarisi (รncelik report_minimal.html veya rapor.html)
|
| 194 |
+
report_file = "report_minimal.html" if os.path.exists("report_minimal.html") else ("rapor.html" if os.path.exists("rapor.html") else None)
|
| 195 |
+
|
| 196 |
+
if report_file:
|
| 197 |
+
try:
|
| 198 |
+
with open(report_file, "r", encoding="utf-8") as f:
|
| 199 |
+
html_content = f.read()
|
| 200 |
+
st.caption(f"โน๏ธ Automated Audit Panel Active ({report_file}). You can analyze inter-variable relationships and correlations live.")
|
| 201 |
+
components.html(html_content, height=800, scrolling=True)
|
| 202 |
+
except Exception as e:
|
| 203 |
+
st.error(f"A technical error occurred while reading the report file: {e}")
|
| 204 |
+
else:
|
| 205 |
+
st.error("Error: 'report_minimal.html' or 'rapor.html' file not found in the directory. Please add the automated report file to the directory.")
|
| 206 |
+
|
| 207 |
+
# ==============================================================================
|
| 208 |
+
# KATMAN 2: KREDIT-RISIKO-MODELLIERUNG (ML, LIVE INFERENCE & PIPELINE)
|
| 209 |
+
# ==============================================================================
|
| 210 |
+
elif page == "๐ง Credit Risk Modeling":
|
| 211 |
+
st.markdown('<div class="section-header">๐ง Credit Risk Modeling and Explainable AI (XAI)</div>', unsafe_allow_html=True)
|
| 212 |
+
|
| 213 |
+
left_col, right_col = st.columns([1, 1])
|
| 214 |
+
|
| 215 |
+
with left_col:
|
| 216 |
+
st.subheader("โ๏ธ Traceable Data Processing Pipeline (Pipeline Schema)")
|
| 217 |
+
st.markdown("""
|
| 218 |
+
<div class="pipeline-box">1. RAW DATA INPUT (SAP / DATEV Excel & CSV Data)</div>
|
| 219 |
+
<div class="pipeline-arrow">โฌ</div>
|
| 220 |
+
<div class="pipeline-box">2. MISSING DATA IMPUTATION (MICE Imputation Algorithmus)</div>
|
| 221 |
+
<div class="pipeline-arrow">โฌ</div>
|
| 222 |
+
<div class="pipeline-box">3. CATEGORICAL ENCODING (Label Encoding Module)</div>
|
| 223 |
+
<div class="pipeline-arrow">โฌ</div>
|
| 224 |
+
<div class="pipeline-box">4. SCALING & VARIANCE CONTROL (Robust/Standard Scaler Sealing)</div>
|
| 225 |
+
<div class="pipeline-arrow">โฌ</div>
|
| 226 |
+
<div class="pipeline-box">5. MODEL INFERENCE (Gradient Boosting - Time-Based Validation split: 62.1% Recall)</div>
|
| 227 |
+
""", unsafe_allow_html=True)
|
| 228 |
+
|
| 229 |
+
st.write("---")
|
| 230 |
+
|
| 231 |
+
st.subheader("๐ Most Influential Factors Driving the Model (Feature Importance)")
|
| 232 |
+
features = ["Current Loan Amount", "Credit Score", "Annual Income", "Credit Utilization"]
|
| 233 |
+
importances = [43.0, 31.0, 7.0, 3.0]
|
| 234 |
+
df_fi = pd.DataFrame({"Feature": features, "Importance": importances}).sort_values(by="Importance", ascending=True)
|
| 235 |
+
|
| 236 |
+
fig = go.Figure()
|
| 237 |
+
fig.add_trace(go.Bar(
|
| 238 |
+
y=df_fi["Feature"], x=df_fi["Importance"], orientation='h',
|
| 239 |
+
marker=dict(color='#1E3A8A', line=dict(color='#10B981', width=1.5)),
|
| 240 |
+
text=[f"{val}%" for val in df_fi["Importance"]], textposition='outside'
|
| 241 |
+
))
|
| 242 |
+
fig.update_layout(
|
| 243 |
+
xaxis=dict(title="Impact Rate on Model (%)", range=[0, 55]),
|
| 244 |
+
margin=dict(l=5, r=5, t=10, b=10), height=250, template="plotly_white"
|
| 245 |
+
)
|
| 246 |
+
st.plotly_chart(fig, use_container_width=True)
|
| 247 |
+
|
| 248 |
+
st.info(
|
| 249 |
+
"๐ก **XAI Analysis:** 74% of model decisions are shaped directly by **Current Loan Amount** and **Credit Score**. "
|
| 250 |
+
"This mathematically proves the hierarchy that field teams must focus on."
|
| 251 |
+
)
|
| 252 |
+
|
| 253 |
+
with right_col:
|
| 254 |
+
st.subheader("๐ฎ Live Inference Module")
|
| 255 |
+
st.write("Production layer that allows field teams or management units to perform instant risk analysis during interviews:")
|
| 256 |
+
|
| 257 |
+
input_loan = st.number_input("Current Loan Amount (Requested Loan Amount):", min_value=0, value=500000, step=25000)
|
| 258 |
+
input_score = st.slider("Credit Score (Historical Credit Score):", min_value=300, max_value=850, value=650)
|
| 259 |
+
input_income = st.number_input("Annual Income (Annual Documented Income):", min_value=0, value=350000, step=10000)
|
| 260 |
+
input_util = st.slider("Credit Utilization Rate (Current Limit Utilization %):", min_value=0, max_value=100, value=45)
|
| 261 |
+
|
| 262 |
+
st.write("")
|
| 263 |
+
if st.button("๐ Calculate Live Risk Status (Predict)", use_container_width=True):
|
| 264 |
+
class_res, text_res, score_res = predict_credit_risk(input_loan, input_score, input_income, input_util)
|
| 265 |
+
|
| 266 |
+
st.markdown("### ๐ฏ Model Output Result:")
|
| 267 |
+
st.metric(label="Calculated Final Risk Score", value=f"{score_res:.1f}%")
|
| 268 |
+
|
| 269 |
+
if class_res == 0:
|
| 270 |
+
st.error(f"**Result:** {text_res}")
|
| 271 |
+
st.markdown("โ ๏ธ *Recommendation:* The interview should be structured in detail according to the RISK-2026-004 guideline, and partial approval should be considered if necessary.")
|
| 272 |
+
else:
|
| 273 |
+
st.success(f"**Result:** {text_res}")
|
| 274 |
+
st.markdown("โ
*Recommendation:* Default risk remains within the safe threshold. The standard process can be executed.")
|
| 275 |
+
|
| 276 |
+
# ==============================================================================
|
| 277 |
+
# KATMAN 3: STRATEGISCHER LEITFADEN (Dinamik Risk Matrisi)
|
| 278 |
+
# ==============================================================================
|
| 279 |
+
elif page == "๐ Strategic Guideline":
|
| 280 |
+
st.markdown('<div class="section-header">๐ Strategic Field Interview Guideline and Decision Matrix</div>', unsafe_allow_html=True)
|
| 281 |
+
st.write(
|
| 282 |
+
"The dynamic and interactive software conversion of the business rules documented in the Credit Risk Report (RISK-2026-004). "
|
| 283 |
+
"Field teams or Project Managers can access the operational action plan by selecting the relevant field during interviews or reviews."
|
| 284 |
+
)
|
| 285 |
+
|
| 286 |
+
st.subheader("๐ Criteria-Based Operational Action Inquiry")
|
| 287 |
+
kriter = st.selectbox(
|
| 288 |
+
"Select the critical criteria you want to examine or conduct an interview for:",
|
| 289 |
+
[
|
| 290 |
+
"I. CRITICAL THRESHOLD: Current Loan Amount (Impact: 43%)",
|
| 291 |
+
"II. FINANCIAL CHARACTER: Credit Score (Impact: 31%)",
|
| 292 |
+
"III. REPAYMENT CAPACITY: Annual Income (Impact: 7%)",
|
| 293 |
+
"IV. LIMIT DYNAMICS: Credit Utilization (Impact: 3%)"
|
| 294 |
+
]
|
| 295 |
+
)
|
| 296 |
+
|
| 297 |
+
st.write("---")
|
| 298 |
+
|
| 299 |
+
if "Current Loan Amount" in kriter:
|
| 300 |
+
st.error("๐จ **43% Impact Rate | CRITICAL THRESHOLD: Current Loan Amount**")
|
| 301 |
+
st.markdown("""
|
| 302 |
+
* **Strategic Approach:** This is the most sensitive variable for the model. In high-amount requests, the risk coefficient increases logarithmically.
|
| 303 |
+
* **Interview Focus Question:** *"Can you elaborate on how you plan to use the requested amount? Do you have the possibility to use equity (down payment) for a portion of this amount?"*
|
| 304 |
+
* **Operational Action (Field Management):** Instead of issuing an absolute rejection for borderline customers, risk exposure should be minimized by operating a **'Partial Approval'** mechanism.
|
| 305 |
+
""")
|
| 306 |
+
elif "Credit Score" in kriter:
|
| 307 |
+
st.warning("๐ถ **31% Impact Rate | FINANCIAL CHARACTER: Credit Score**")
|
| 308 |
+
st.markdown("""
|
| 309 |
+
* **Strategic Approach:** The customer's past payment discipline is the strongest statistical indicator of future default probability.
|
| 310 |
+
* **Interview Focus Question:** *"Was there a specific reason for any delays in your payment history over the last 24 months? What steps have you taken to improve your current financial situation?"*
|
| 311 |
+
* **Operational Action (Field Management):** Documentation requirements should be tightened for customers whose justification for delays is based on force majeure and who request restructuring.
|
| 312 |
+
""")
|
| 313 |
+
elif "Annual Income" in kriter:
|
| 314 |
+
st.info("๐ท **7% Impact Rate | REPAYMENT CAPACITY: Annual Income**")
|
| 315 |
+
st.markdown("""
|
| 316 |
+
* **Strategic Approach:** Income level is a fundamental indicator of cash flow sustainability.
|
| 317 |
+
* **Interview Focus Question:** *"Do you have any additional documented income sources besides your salary, such as rent, investments, or side income?"*
|
| 318 |
+
* **Operational Action (Field Management):** Applications where the monthly credit installment to documented net income ratio (**Income/Installment Ratio**) exceeds 50% should be flagged directly as 'High Risk'.
|
| 319 |
+
""")
|
| 320 |
+
elif "Credit Utilization" in kriter:
|
| 321 |
+
st.success("๐ข **3% Impact Rate | LIMIT DYNAMICS: Credit Utilization Rate**")
|
| 322 |
+
st.markdown("""
|
| 323 |
+
* **Strategic Approach:** High utilization of existing limits signals potential liquidity stress or a debt spiral.
|
| 324 |
+
* **Interview Focus Question:** *"Is the high utilization rate of your limits at other financial institutions due to a temporary cash cycle?"*
|
| 325 |
+
* **Operational Action (Field Management):** Candidates with high indebtedness but positive payment intent should be offered a **'Debt Consolidation / Debt Transfer Loan'** option to mitigate risk.
|
| 326 |
+
""")
|
| 327 |
+
|
| 328 |
+
# ==============================================================================
|
| 329 |
+
# KATMAN 4: AUTOMATISIERUNG (PROCESS OPTIMIZATION AGENT)
|
| 330 |
+
# ==============================================================================
|
| 331 |
+
elif page == "๐ค Automation (AI Agent)":
|
| 332 |
+
st.markdown('<div class="section-header">๐ค Automation and Process Optimization: Alphabots Senior Analyst Agent</div>', unsafe_allow_html=True)
|
| 333 |
+
st.write("LLM Agent that automates risk analysis and process improvement steps for the Controlling department:")
|
| 334 |
+
|
| 335 |
+
example_text = (
|
| 336 |
+
"Customer ID: 49204. Requested Loan: 1.200.000 TL. Credit Score: 580. "
|
| 337 |
+
"Annual Income: 450.000 TL. Credit Utilization: 78%. "
|
| 338 |
+
"The customer declared in the past interview that payments were delayed in the last 6 months due to a cyclical bottleneck."
|
| 339 |
+
)
|
| 340 |
+
|
| 341 |
+
if "agent_input" not in st.session_state:
|
| 342 |
+
st.session_state["agent_input"] = ""
|
| 343 |
+
|
| 344 |
+
if st.button("๐ก Load Example Anomaly Text"):
|
| 345 |
+
st.session_state["agent_input"] = example_text
|
| 346 |
+
st.rerun()
|
| 347 |
+
|
| 348 |
+
user_input = st.text_area(
|
| 349 |
+
"Paste the complex financial anomaly or audit summary you want analyzed here:",
|
| 350 |
+
value=st.session_state["agent_input"], height=150, placeholder="Enter financial raw data or text here..."
|
| 351 |
+
)
|
| 352 |
+
|
| 353 |
+
st.session_state["agent_input"] = user_input
|
| 354 |
+
|
| 355 |
+
if st.button("๐ Execute Live API Call and Generate Process Optimization Report"):
|
| 356 |
+
if user_input.strip() == "":
|
| 357 |
+
st.warning("Please enter a text for analysis.")
|
| 358 |
+
else:
|
| 359 |
+
with st.spinner("Running Senior Financial Analyst Agent via OpenRouter API..."):
|
| 360 |
+
api_key = None
|
| 361 |
+
try:
|
| 362 |
+
if hasattr(st, "secrets") and "OPENROUTER_API_KEY" in st.secrets:
|
| 363 |
+
api_key = st.secrets["OPENROUTER_API_KEY"]
|
| 364 |
+
except Exception:
|
| 365 |
+
api_key = None
|
| 366 |
+
|
| 367 |
+
# Talep edilen รถzelleลtirilmiล Sistem Promptu
|
| 368 |
+
system_prompt = (
|
| 369 |
+
"You are an Alphabots Senior Financial Analyst and Process Optimization Expert. "
|
| 370 |
+
"Analyze the given financial anomaly or customer data based on the weights in the RISK-2026-004 document "
|
| 371 |
+
"(Loan Amount 43%, Score 31%, Income 7%, Limit 3%). When making your analysis, do not just provide a simple "
|
| 372 |
+
"risk score; present concrete improvement recommendations that will increase the operational efficiency of the "
|
| 373 |
+
"Controlling department, resolve bottlenecks, and hit the 'process optimization' goals in the campaign criteria."
|
| 374 |
+
)
|
| 375 |
+
|
| 376 |
+
if api_key:
|
| 377 |
+
try:
|
| 378 |
+
headers = {
|
| 379 |
+
"Authorization": f"Bearer {api_key}",
|
| 380 |
+
"Content-Type": "application/json"
|
| 381 |
+
}
|
| 382 |
+
data = {
|
| 383 |
+
"model": "google/gemini-2.5-flash",
|
| 384 |
+
"messages": [
|
| 385 |
+
{"role": "system", "content": system_prompt},
|
| 386 |
+
{"role": "user", "content": user_input}
|
| 387 |
+
]
|
| 388 |
+
}
|
| 389 |
+
response = requests.post("https://openrouter.ai/api/v1/chat/completions", headers=headers, data=json.dumps(data))
|
| 390 |
+
result = response.json()
|
| 391 |
+
llm_output = result['choices'][0]['message']['content']
|
| 392 |
+
|
| 393 |
+
st.success("โ Process optimization analysis completed via live API!")
|
| 394 |
+
st.markdown(llm_output)
|
| 395 |
+
except Exception as e:
|
| 396 |
+
api_key = None
|
| 397 |
+
|
| 398 |
+
if not api_key:
|
| 399 |
+
st.info("โน๏ธ Local environment fallback engine active. Generating smart briefing based on RISK-2026-004 rules:")
|
| 400 |
+
st.success("โ Rule-Based Process Improvement Summary Successfully Generated")
|
| 401 |
+
st.markdown("""
|
| 402 |
+
### ๐ Alphabots Senior Financial Analyst Briefing
|
| 403 |
+
* **Risk Distribution and Detection:** The Loan Amount and Limit utilization in the inputs exceeded the 43% and 3% weight thresholds of the model, pushing the system into the high-risk area.
|
| 404 |
+
* **Process Improvement Recommendations for Controlling Department (Process Optimization):**
|
| 405 |
+
1. **Bottleneck Resolution:** Field teams' interview statements and Limit Utilization data in the system must be linked with an automated cross-check mechanism to eliminate manual controls.
|
| 406 |
+
2. **Risk-Approval Balance:** Considering the model's 62% Recall target, 'Conditional Approval' rules including maturity shortening and limit reduction should be automatically assigned to customers in this segment instead of an 'Absolute Rejection'.
|
| 407 |
+
3. **Process Optimization:** The financial documentation gathering process should be made autonomous with digital signature control via SAP/DATEV integration, reducing the turnaround time.
|
| 408 |
+
""")
|
| 409 |
+
|
model.pkl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:e78606e4c036229b6fcdbe24dc100c57a8928253b5118caa893a46ce09034a0a
|
| 3 |
+
size 1575
|