NSVScoreP / src /streamlit_app.py
AstartesDominatis's picture
Update src/streamlit_app.py
511f8c0 verified
import streamlit as st
import pandas as pd
import joblib
from datetime import datetime
st.set_page_config(page_title="RANDOM FOREST TEST SPACE (NVS AI)", page_icon="💼", layout="centered")
# Loading model
model = joblib.load("src/random_forest_model1.pkl")
# Category mappings (must match training time)
home_mapping = {"Own": 2, "Mortgage": 1, "Rent": 0}
intent_mapping = {
"education": 0, "home_improvement": 1, "medical": 2,
"personal": 3, "venture": 4
}
default_mapping = {"Yes": 1, "No": 0}
st.title("RANDOM FOREST TEST SPACE (NVS AI)")
st.markdown("Введите данные заявителя, чтобы предсказать вероятность погашения займа.")
st.header("📝 Информация заявителя")
col1, col2 = st.columns(2)
with col1:
age = st.number_input("Возраст", min_value=18, max_value=100, value=30)
income = st.number_input("Годовой доход", min_value=0.0, value=50000.0)
emp_length = st.number_input("Трудовой стаж (лет)", min_value=0, max_value=50, value=5)
intent = st.selectbox("Назначение займа", ["education", "home_improvement", "medical", "personal", "venture"])
with col2:
home = st.selectbox("Недвижимость", ["Own", "Mortgage", "Rent"])
amount = st.number_input("Размер займа", min_value=0.0, value=10000.0)
rate = st.number_input("Процентная ставка (%)", min_value=0.0, max_value=100.0, value=10.0)
default = st.selectbox("Были ли ранее должником", ["Yes", "No"])
cred_length = st.number_input("Длина кредитной истории (лет)", min_value=0, max_value=50, value=10)
if income == 0:
st.warning("Годовой доход должен быть больше, чем 0.")
st.stop()
# Derived feature
percent_income = amount / income
# Create input dataframe
input_df = pd.DataFrame({
"Age": [age],
"Income": [income],
"Home": [home_mapping[home]],
"Emp_length": [emp_length],
"Intent": [intent_mapping[intent]],
"Amount": [amount],
"Rate": [rate],
"Percent_income": [percent_income],
"Default": [default_mapping[default]],
"Cred_length": [cred_length]
})
# Predict and show results
if st.button("🔍 Прогнозировать кредитный риск"):
prediction = model.predict(input_df)
proba = model.predict_proba(input_df)[0]
status = "🟢 Выплатить!" if prediction[0] == 0 else "🔴 Должник!"
st.success(f"**Прогнозируемый статус кредита:** {status}")
# Risk metric
st.metric(label="Риск Score (Дефолт)", value=f"{proba[1]*100:.1f}%")
# Probabilities
st.subheader("📊 Вероятности прогнозирования.")
st.write(f"🟢 Полная выплата: **{proba[0] * 100:.2f}%**")
st.write(f"🔴 Должник: **{proba[1] * 100:.2f}%**")
# Prepare downloadable result
result_df = input_df.copy()
result_df["Статус предсказания"] = status
result_df["Вероятность возврата (%)"] = round(proba[0] * 100, 2)
result_df["Вероятность долга (%)"] = round(proba[1] * 100, 2)
# Timestamped filename
filename = f"analyt_risk_predict_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
# Download button
st.download_button(
label="💾 Загрузить как CSV",
data=result_df.to_csv(index=False),
file_name=filename,
mime="text/csv"
)
# Footer
st.markdown("---")
st.caption("Minsk 2025 | Created by Kamenev A.I.")