ahmadardhy's picture
Update app.py
3c31d08 verified
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()