import streamlit as st import os import pickle import pandas as pd import shap import matplotlib.pyplot as plt from catboost import Pool import numpy as np import mysql.connector import io import json import streamlit.components.v1 as components import time import json reg_model = pickle.load(open('regression_model_final_1year.sav', 'rb')) class_model = pickle.load(open('clasification_final_model_smote.sav', 'rb')) train_file_path = 'X_train.csv' with open("feature_explanation.json", "r") as f: feature_dict = json.load(f) def connect_to_db(): try: conn = mysql.connector.connect( host=st.secrets["mysql"]["host"], user=st.secrets["mysql"]["user"], password=st.secrets["mysql"]["password"], database=st.secrets["mysql"]["dbname"], port=st.secrets["mysql"]["port"] ) return conn except mysql.connector.Error as e: st.error(f"Koneksi ke database gagal: {e}") return None def get_employee_data_from_db(employee_id): conn = connect_to_db() if conn: try: cursor = conn.cursor(dictionary=True) query = "SELECT * FROM data_employee_db WHERE employee_id = %s" cursor.execute(query, (employee_id,)) result = cursor.fetchone() return result except mysql.connector.Error as e: st.error(f"Terjadi kesalahan saat mengakses database: {e}") return None finally: conn.close() def process_employee_data(df): numeric_columns = [ "job_satisfaction", "performance_rating", "absent_90D", "income", "dependant", "avg_time_work", "total_komp" ] for col in numeric_columns: if col in df.columns: df[col] = pd.to_numeric(df[col], errors="coerce") end_date = pd.to_datetime("2024-10-31") df["date_of_birth"] = pd.to_datetime(df["date_of_birth"], errors='coerce') df["age_years"] = (end_date - df["date_of_birth"]).dt.days // 365 df["join_date"] = pd.to_datetime(df["join_date"]) df["resign_date"] = pd.to_datetime(df["resign_date"]) df["resign_date"].fillna(end_date, inplace=True) df["total_komp"].fillna(0, inplace=True) df["absent_90D"].fillna(0, inplace=True) df["active_work"] = (df["resign_date"] - df["join_date"]).dt.days df["active_work_months"] = df["active_work"] // 30 df["income_3_months"] = df["income"] * 3 df["income_6_months"] = df["income"] * 6 df["total_income_work"] = df["income"] * df["active_work_months"] df["income_dependant_ratio"] = df["income"] / (df["dependant"] + 1) df["work_efficiency"] = df["avg_time_work"] / 8 job_satisfaction_mapping = {1.0: 'Low', 2.0: 'Medium', 3.0: 'High', 4.0: 'Very High'} df['job_satisfaction'] = df['job_satisfaction'].map(job_satisfaction_mapping) performance_rating_mapping = {1.0: 'Low', 2.0: 'Good', 3.0: 'Excellent', 4.0: 'Outstanding'} df['performance_rating'] = df['performance_rating'].map(performance_rating_mapping) return df # Fungsi untuk mendapatkan gambar sebagai base64 def get_image_as_base64(image_path): import base64 with open(image_path, "rb") as img_file: return base64.b64encode(img_file.read()).decode("utf-8") def navbar(): logo_path = os.path.join(os.path.dirname(__file__), "../asset/logo.png") st.markdown( f""" """, unsafe_allow_html=True) col1, col2 = st.columns([10, 1]) with col1: st.markdown(f"""
", unsafe_allow_html=True) def menu(): if "page" not in st.session_state: st.session_state["page"] = "Home" # **Gunakan Streamlit Columns agar Navbar Sejajar (3 Kolom)** col2, col3, col4 = st.columns([1.5, 1.5, 1.5]) # 3 Kolom (Tanpa col5) # **Custom CSS untuk Tombol Navbar yang Spesifik** st.markdown( """ """, unsafe_allow_html=True ) # Tombol navigasi dengan warna berbeda di col2, col3, col4 with col2: if st.button("Prediksi", key="nav_prediksi"): st.switch_page("pages/Prediksi.py") # Pindah ke halaman yang sudah ada with col3: if st.button("Dashboard", key="nav_dashboard"): st.switch_page("pages/Dashboard.py") # Pindah ke halaman yang sesuai with col4: if st.button("Laporan", key="nav_laporan"): st.switch_page("pages/Laporan.py") # Pindah ke halaman laporan def save_prediction_to_db(employee_id, hasil_prediksi_klasifikasi, probabilitas_pred_klasifikasi, hasil_prediksi_regresi): conn = connect_to_db() if conn: try: cursor = conn.cursor() query = """ INSERT INTO history_prediction (employee_id, hasil_prediksi_klasifikasi, probabilitas_pred_klasifikasi, hasil_prediksi_regresi) VALUES (%s, %s, %s, %s) """ cursor.execute(query, (employee_id, hasil_prediksi_klasifikasi, probabilitas_pred_klasifikasi, hasil_prediksi_regresi)) conn.commit() # Pastikan perubahan disimpan except mysql.connector.Error as e: st.error(f"Terjadi kesalahan saat menyimpan ke database: {e}") finally: conn.close() def save_shap_to_db_with_features(employee_id, shap_dict): conn = connect_to_db() if conn: try: shap_values_json = json.dumps(shap_dict) # Query untuk menyimpan data ke database query = """ INSERT INTO shap_pred_result (employee_id, shap_values) VALUES (%s, %s) """ cursor = conn.cursor() cursor.execute(query, (employee_id, shap_values_json)) conn.commit() except mysql.connector.Error as e: st.error(f"Terjadi kesalahan saat menyimpan SHAP values: {e}") finally: conn.close() def show_prediction(): navbar() menu() st.markdown(""" """, unsafe_allow_html=True) st.markdown( """Probabilitas Kemungkinan Retensi: {classification_prob[0][0]:.2f}
Prediksi Durasi Kerja (bulan): {hasil_prediksi_regresi} bulan
{summary_text}