import streamlit as st import pandas as pd import json from joblib import load import mysql.connector from mysql.connector import Error import logging import c45 import time # Load model yang telah ditraining model = load('model_scratch_2.model') # Fungsi untuk melakukan prediksi def predict(data): try: start_time = time.time() # Waktu mulai prediksi hasil_prediksi = model.predict(data)[0] end_time = time.time() # Waktu selesai prediksi duration = end_time - start_time # Durasi prediksi # Perform prediction hasil_prediksi = model.predict(data)[0] if hasil_prediksi == 1: hasil_prediksi_str = 'Recommended Candidate' elif hasil_prediksi == 0: hasil_prediksi_str = 'Not Recommended Candidate' else: hasil_prediksi_str = 'Data Tidak Sesuai Dengan Format' return hasil_prediksi_str, duration except Exception as e: st.error(f"Error during prediction: {e}") return None # Fungsi untuk menyimpan data ke database def save_to_database(nama, data, posisi_harapan, usia, hasil_prediksi_str): try: connection = mysql.connector.connect(host='sql12.freesqldatabase.com', database='sql12711336', user='sql12711336', password='ufDVxditnx') if connection.is_connected(): cursor = connection.cursor(prepared=True) insert_query = ("INSERT INTO klasifikasi " "(nama, kategori_umur_1, kategori_umur_2, " "kategori_umur_3, kategori_umur_4, kategori_umur_5, kategori_umur_6, " "kategori_umur_7, kategori_umur_8, kategori_umur_9, kategori_umur_10, pendidikan, lama_pengalaman, " "kesesuaian_posisi_dg_skills, kesesuaian_posisi_dg_pengalaman, " "posisi_harapan, usia, hasil_prediksi) " "VALUES " "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)") cursor.execute(insert_query, (nama,) + tuple(data.values()) + (posisi_harapan, usia, hasil_prediksi_str)) connection.commit() st.success("Data berhasil disimpan ke database.") except Error as e: st.error(f"Error while connecting to MySQL: {e}") finally: if connection.is_connected(): cursor.close() connection.close() # Fungsi utama untuk menampilkan aplikasi def main(): st.title('Aplikasi Prediksi Rekomendasi Data Kandidat Outsourcing Menggunakan Metode Decision Tree C4.5') menu = ['Beranda', 'Deteksi', 'Record Kandidat'] choice = st.sidebar.selectbox('Menu', menu) if choice == 'Beranda': st.subheader('Halaman Utama') st.write('Aplikasi ini digunakan untuk melakukan klasifikasi kandidat yang Recommended atau Not Recommended untuk dipromosikan oleh TOG Indonesia ke Perusahaan yang membutuhkan Tenaga Kerja.') elif choice == 'Deteksi': st.subheader('Prediksi Calon Kandidat') nama = st.text_input('Masukkan Nama') posisi_harapan = st.text_input('Masukkan Posisi Harapan') usia = st.number_input('Masukkan Usia Calon', min_value=0, step=1) kategori_umur = {} umur_ranges = [(0, 5), (6, 11), (12, 17), (18, 23), (24, 29), (30, 35), (36, 41), (42, 47), (48, 53), (54, float('inf'))] for i, umur_range in enumerate(umur_ranges): range_str = f"{umur_range[0]}-{umur_range[1]}" if umur_range[1] != float('inf') else f"{umur_range[0]}+" kategori_umur[f'Kategori Umur {i+1}'] = st.checkbox(f'Kategori Umur {i+1} (Umur {range_str})') pendidikan = st.selectbox('Pilih Kategori Pendidikan Calon Kandidat', ['>= S1 / D4 Sederajat', '< S1 / D4 Sederajat']) pendidikan = 1 if pendidikan == '>= S1 / D4 Sederajat' else 0 lama_pengalaman = st.selectbox('Pilih Kategori Lama Pengalaman Calon Kandidat', ['> 1 Tahun', '< 1 Tahun']) lama_pengalaman = 1 if lama_pengalaman == '> 1 Tahun' else 0 kesesuaian_posisi_skill = st.selectbox('Pilih Kategori Kesesuaian Posisi Harapan dengan Skills', ['Sesuai', 'Tidak Sesuai']) kesesuaian_posisi_skill = 1 if kesesuaian_posisi_skill == 'Sesuai' else 0 kesesuaian_posisi_pengalaman = st.selectbox('Pilih Kategori Kesesuaian Posisi Harapan dengan Pengalaman', ['Sesuai', 'Tidak Sesuai']) kesesuaian_posisi_pengalaman = 1 if kesesuaian_posisi_pengalaman == 'Sesuai' else 0 if st.button('Prediksi'): data = {**kategori_umur, 'Pendidikan': pendidikan, 'Lama_Pengalaman': lama_pengalaman, 'Kesesuaian_Posisi_Skill': kesesuaian_posisi_skill, 'Kesesuaian_Posisi_Pengalaman': kesesuaian_posisi_pengalaman} data_df = pd.DataFrame([data]) st.write('Data untuk prediksi:') st.write(data_df) hasil_prediksi, duration = predict(data_df) if hasil_prediksi: st.write(f'Hasil Prediksi: {hasil_prediksi}') st.write(f'Durasi Prediksi: {duration} detik') save_to_database(nama, data, posisi_harapan, usia, hasil_prediksi) elif choice == 'Record Kandidat': st.subheader('Record Kandidat') data = fetch_data() if data: df = pd.DataFrame(data, columns=['Nama Calon Kandidat', 'Usia', 'Posisi Harapan','Pendidikan','Lama Pengalaman','Kesesuaian Posisi Harapan dg Skills yang dimiliki','Kesesuaian Posisi Harapan dengan Pengalaman yang Dimiliki','Label']) st.write(df) else: st.warning("Tidak ada data yang ditemukan.") # Tampilkan record kandidat dari database def create_connection(): connection = mysql.connector.connect(host='sql12.freesqldatabase.com', database='sql12711336', user='sql12711336', password='ufDVxditnx') return connection def fetch_data(): try: connection = create_connection() if connection.is_connected(): cursor = connection.cursor() cursor.execute("SELECT `nama`, `usia`, `posisi_harapan`, `pendidikan`, `lama_pengalaman`, `kesesuaian_posisi_dg_skills`, `kesesuaian_posisi_dg_pengalaman`, `hasil_prediksi` FROM `klasifikasi`;") data = cursor.fetchall() if data: # Konversi nilai integer menjadi string converted_data = [] for row in data: nama, usia, posisi_harapan, pendidikan, lama_pengalaman, kesesuaian_posisi_skill, kesesuaian_posisi_pengalaman, hasil_prediksi = row pendidikan_str = ">= S1" if pendidikan == "1" else "< S1" lama_pengalaman_str = "> 1 Tahun" if lama_pengalaman == "1" else "< 1 Tahun" kesesuaian_posisi_skill_str = "Sesuai" if kesesuaian_posisi_skill == "1" else "Tidak Sesuai" kesesuaian_posisi_pengalaman_str = "Sesuai" if kesesuaian_posisi_pengalaman == "1" else "Tidak Sesuai" converted_data.append((nama, usia, posisi_harapan, pendidikan_str, lama_pengalaman_str, kesesuaian_posisi_skill_str, kesesuaian_posisi_pengalaman_str, hasil_prediksi)) return converted_data else: return None except mysql.connector.Error as e: st.error(f"Error: {e}") finally: if connection.is_connected(): cursor.close() connection.close() if __name__ == '__main__': main()