Spaces:
Sleeping
Sleeping
| 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.") | |