CoolFace
Apppublic

frday/framework-dss

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
app.py179 linesDownload Raw Back to root
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)