frday/framework-dss
0
1import streamlit as st2import numpy as np3import pandas as pd4from data.database import Database5from models import hitung_saw, hitung_wp, hitung_topsis6 7db = Database()8 9st.title("Framework DSS - SAW, WP, TOPSIS")10 11# Search prediksi yang telah dilakukan12text_search = st.text_input("Search prediksi", value="")13 14if text_search:15 hasil_pencarian = db.ambil_prediksi_keyword(text_search)16 if hasil_pencarian:17 st.warning("Prediksi pernah dilakukan sebelumnya.")18 col1, col2 = st.columns(2)19 with col1:20 if st.button("Gunakan Prediksi Lama"):21 data_prediksi = db.ambil_data_prediksi(hasil_pencarian[0][0])22 st.session_state.kriteria = data_prediksi['kriteria']23 st.session_state.bobot = data_prediksi['bobot']24 st.session_state.tipe_kriteria = data_prediksi['tipe_kriteria']25 st.session_state.alternatif = data_prediksi['alternatif']26 st.session_state.matrix = data_prediksi['matrix']27 st.rerun()28 with col2:29 if st.button("Input Baru"):30 st.session_state.kriteria = []31 st.session_state.bobot = []32 st.session_state.tipe_kriteria = []33 st.session_state.alternatif = []34 st.session_state.matrix = []35 st.rerun()36 37# Pastikan session_state terisi38if "kriteria" not in st.session_state:39 st.session_state.kriteria = []40if "alternatif" not in st.session_state:41 st.session_state.alternatif = []42if "matrix" not in st.session_state:43 st.session_state.matrix = []44 45# Input Nama Prediksi dan Metode46nama_prediksi = st.text_input("Nama Prediksi", "Beasiswa")47metode = st.selectbox("Pilih Metode", ["SAW", "WP", "TOPSIS"])48 49# Membuat dua kolom50col1, col2 = st.columns(2)51 52# Kolom 1: Kriteria53with col1:54 jumlah_kriteria = st.number_input("Jumlah Kriteria", min_value=1, step=1, value=len(st.session_state.kriteria) or 1)55 56 while len(st.session_state.kriteria) < jumlah_kriteria:57 st.session_state.kriteria.append([f"Kriteria {len(st.session_state.kriteria) + 1}", "benefit", 0.0])58 59 while len(st.session_state.kriteria) > jumlah_kriteria:60 st.session_state.kriteria.pop()61 62 for i in range(jumlah_kriteria):63 nama = st.text_input(f"Nama Kriteria {i+1}", value=st.session_state.kriteria[i][0], key=f"kriteria_{i}")64 tipe = st.selectbox(f"Tipe Kriteria {i+1}", ["benefit", "cost"], index=["benefit", "cost"].index(st.session_state.kriteria[i][1]), key=f"tipe_{i}")65 bobot = st.number_input(f"Bobot Kriteria {i+1}", min_value=0.0, max_value=1.0, step=0.1, value=st.session_state.kriteria[i][2], key=f"bobot_{i}")66 67 st.session_state.kriteria[i] = [nama, tipe, bobot]68 69 if st.button(f"Hapus Kriteria {i+1}", key=f"hapus_kriteria_{i}"):70 del st.session_state.kriteria[i]71 st.rerun()72 73# Kolom 2: Alternatif74with col2:75 jumlah_alternatif = st.number_input("Jumlah Alternatif", min_value=1, step=1, value=len(st.session_state.alternatif) or 1)76 77 while len(st.session_state.alternatif) < jumlah_alternatif:78 st.session_state.alternatif.append(f"Alternatif {len(st.session_state.alternatif) + 1}")79 st.session_state.matrix.append([0.0] * jumlah_kriteria)80 81 while len(st.session_state.alternatif) > jumlah_alternatif:82 st.session_state.alternatif.pop()83 st.session_state.matrix.pop()84 85 for i in range(jumlah_alternatif):86 nama = st.text_input(f"Nama Alternatif {i+1}", value=st.session_state.alternatif[i], key=f"alt_{i}")87 88 while len(st.session_state.matrix[i]) < jumlah_kriteria:89 st.session_state.matrix[i].append(0.0)90 91 while len(st.session_state.matrix[i]) > jumlah_kriteria:92 st.session_state.matrix[i].pop()93 94 nilai = [95 st.number_input(96 f"Nilai {st.session_state.kriteria[j][0]} untuk {nama}",97 value=st.session_state.matrix[i][j],98 key=f"nilai_{i}_{j}"99 ) for j in range(jumlah_kriteria)100 ]101 102 st.session_state.alternatif[i] = nama103 st.session_state.matrix[i] = nilai104 105 if st.button(f"Hapus Alternatif {i+1}", key=f"hapus_alternatif_{i}"):106 del st.session_state.alternatif[i]107 del st.session_state.matrix[i]108 st.rerun()109 110# Tombol Simpan dan Hitung Prediksi111if st.button("Simpan & Hitung Prediksi"): 112 if not nama_prediksi or not metode or not st.session_state.kriteria or not st.session_state.alternatif or not all(st.session_state.kriteria) or not all(st.session_state.alternatif) or not all(all(row) for row in st.session_state.matrix):113 st.error("Semua data harus diisi sebelum melakukan prediksi.")114 else:115 prediksi_id = db.simpan_prediksi(nama_prediksi, metode)116 117 kriteria_ids = []118 for i in range(jumlah_kriteria):119 kriteria_id = db.simpan_kriteria(prediksi_id, *st.session_state.kriteria[i])120 kriteria_ids.append(kriteria_id)121 122 alternatif_ids = []123 for i in range(jumlah_alternatif):124 alternatif_id = db.simpan_alternatif(prediksi_id, st.session_state.alternatif[i])125 alternatif_ids.append(alternatif_id)126 127 for j in range(jumlah_kriteria):128 db.simpan_nilai_alternatif(alternatif_id, kriteria_ids[j], st.session_state.matrix[i][j])129 130 # Hitung Prediksi131 matrix = np.array(st.session_state.matrix)132 bobot = np.array([k[2] for k in st.session_state.kriteria])133 tipe_kriteria = [k[1] for k in st.session_state.kriteria]134 alternatif = st.session_state.alternatif135 136 if metode == "SAW":137 hasil = hitung_saw(matrix, bobot, tipe_kriteria)138 elif metode == "WP":139 hasil = hitung_wp(matrix, bobot, tipe_kriteria)140 elif metode == "TOPSIS":141 hasil = hitung_topsis(matrix, bobot, tipe_kriteria)142 143 # Menampilkan hasil peringkat dalam tabel144 hasil_df = pd.DataFrame({"Alternatif": alternatif, "Skor": hasil})145 hasil_df = hasil_df.sort_values(by="Skor", ascending=False)146 147 st.write("## Hasil Prediksi:")148 st.dataframe(hasil_df)149 150 # Simpan hasil peringkat ke database151 for _, row in hasil_df.iterrows():152 alternatif_id = db.ambil_alternatif_id(prediksi_id, row["Alternatif"])153 154 if alternatif_id:155 db.simpan_hasil(prediksi_id, alternatif_id, row["Skor"])156 157# Menampilkan Data dari Database dalam Tabel158if st.button("Lihat Data di Database"):159 prediksi_tersimpan = db.ambil_prediksi()160 for prediksi in prediksi_tersimpan:161 st.write(f"## Prediksi: {prediksi[1]}")162 st.write(f"### Metode: {prediksi[2]}")163 164 df_kriteria = pd.DataFrame(db.ambil_data_tabel("kriteria", prediksi[0]), columns=["ID", "Prediksi ID", "Nama", "Tipe", "Bobot"]).drop(columns=["Prediksi ID"])165 df_kriteria.set_index("ID", inplace=True)166 st.write("### Kriteria:")167 st.dataframe(df_kriteria)168 169 df_nilai = pd.DataFrame(db.ambil_data_tabel("nilai_alternatif", prediksi[0]), columns=["Alternatif", "Kriteria", "Nilai"])170 df_nilai = df_nilai.pivot(index="Alternatif", columns="Kriteria", values="Nilai").reset_index()171 df_nilai.set_index("Alternatif", inplace=True)172 173 st.write("### Alternatif:")174 st.dataframe(df_nilai) 175 176 df_hasil = pd.DataFrame(db.ambil_data_tabel("hasil_prediksi", prediksi[0]), columns=["Alternatif", "Skor"])177 df_hasil.set_index("Alternatif", inplace=True)178 st.write("### Hasil Prediksi:")179 st.dataframe(df_hasil)