Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import joblib | |
| import os | |
| # --- KONFIGURASI PATH --- | |
| BASE_MODEL_FOLDER = r"C:\Dokumen\One To Many_17_10_2025\MMBTU\DASHBOARD\One To Many\MODEL CHECKPOINT FOR INVERSE MODEL" | |
| AVAILABLE_PRODUCTS = ["BMR BASE", "CKP BASE", "CKR BASE", "CMR BASE", "MORIGRO BASE"] | |
| INPUT_FEATURES = [ | |
| "D101330TT", "D102260TIC_CV", "D102265TIC_PV", | |
| "D102265TIC_CV", "D102266TIC", "D101264FTSCL" | |
| ] | |
| def load_model_artifacts(product_name, base_folder): | |
| file_name = f"model_checkpoint_xgb_{product_name}.joblib" | |
| model_path = os.path.join(base_folder, file_name) | |
| if not os.path.exists(model_path): | |
| st.error(f"File model tidak ditemukan untuk **{product_name}** di: **{model_path}**") | |
| return None, None, None, None | |
| try: | |
| deployment_bundle = joblib.load(model_path) | |
| # Mengambil artefak sesuai dengan struktur kode awal Anda | |
| model = deployment_bundle.get('model') | |
| poly_transformer = deployment_bundle.get('poly_transformer') | |
| input_features = deployment_bundle.get('input_features') | |
| poly_feature_names = deployment_bundle.get('poly_feature_names') | |
| # Validasi sederhana | |
| if model is None or poly_transformer is None or input_features is None or poly_feature_names is None: | |
| st.error(f"Salah satu artefak (model, poly_transformer, input_features, poly_feature_names) hilang dalam file joblib **{product_name}**.") | |
| return None, None, None, None | |
| return model, poly_transformer, input_features, poly_feature_names | |
| except Exception as e: | |
| st.error(f"Gagal memuat atau membaca file joblib. Error: {e}") | |
| return None, None, None, None | |
| # --- TAMPILAN (UI) STREAMLIT --- | |
| st.set_page_config(page_title="Dashboard Prediksi GAS MMBTU", layout="wide") | |
| with st.sidebar: | |
| st.header("⚙️ Konfigurasi Model") | |
| # Dropdown untuk memilih produk | |
| selected_product = st.selectbox( | |
| "Pilih Produk Target:", | |
| AVAILABLE_PRODUCTS, | |
| index=AVAILABLE_PRODUCTS.index("CKR BASE") if "CKR BASE" in AVAILABLE_PRODUCTS else 0 | |
| ) | |
| st.markdown(f"**Folder Model:** `{BASE_MODEL_FOLDER}`") | |
| st.title(f"🔥 Dashboard Prediksi GAS MMBTU: **{selected_product}**") | |
| st.markdown("Dashboard ini menggunakan model **XGBoost** dan transformasi **Polinomial**.") | |
| st.markdown("---") | |
| model, poly_transformer, input_features_loaded, poly_feature_names = load_model_artifacts( | |
| selected_product, BASE_MODEL_FOLDER | |
| ) | |
| if model is None: | |
| st.stop() # Berhenti jika model gagal dimuat | |
| # Cek apakah fitur input konsisten | |
| if set(input_features_loaded) != set(INPUT_FEATURES): | |
| st.warning("Fitur Input yang dimuat dari joblib berbeda dengan daftar fitur default. Menggunakan fitur dari joblib.") | |
| INPUT_FEATURES = input_features_loaded | |
| st.subheader("🧪 Masukkan Nilai Input Mentah") | |
| st.markdown("Harap masukkan nilai numerik untuk 6 fitur di bawah:") | |
| # Membuat kolom input untuk 6 fitur | |
| cols = st.columns(len(INPUT_FEATURES)) | |
| user_raw_data = {} | |
| for i, feature in enumerate(INPUT_FEATURES): | |
| # Menggunakan nilai default untuk contoh | |
| default_value = 0.0 | |
| if feature == "D101330TT": default_value = 95.0 | |
| elif feature == "D102260TIC_CV": default_value = 45.0 | |
| elif feature == "D102265TIC_PV": default_value = 185.0 | |
| elif feature == "D102265TIC_CV": default_value = 17.0 | |
| elif feature == "D102266TIC": default_value = 16.0 | |
| elif feature == "D101264FTSCL": default_value = 3800.0 | |
| # Input nilai per fitur | |
| user_raw_data[feature] = cols[i].number_input( | |
| feature, | |
| value=default_value, | |
| format="%.4f", | |
| key=f"input_{feature}" | |
| ) | |
| st.markdown("---") | |
| # Tombol prediksi | |
| if st.button("🔮 Prediksi GAS MMBTU Sekarang", type="primary", use_container_width=True): | |
| # Membuat DataFrame dari input mentah (sesuai urutan fitur input) | |
| sim_input_df = pd.DataFrame([user_raw_data])[INPUT_FEATURES] | |
| st.subheader("⚙️ Proses Transformasi & Prediksi") | |
| # 1. Transformasi Polinomial | |
| with st.spinner("1. Menerapkan transformasi polinomial..."): | |
| transformed_input_np = poly_transformer.transform(sim_input_df) | |
| transformed_input_df = pd.DataFrame( | |
| transformed_input_np, | |
| columns=poly_feature_names, | |
| index=sim_input_df.index | |
| ) | |
| # 2. Prediksi | |
| with st.spinner("2. Melakukan prediksi dengan model..."): | |
| predictions = model.predict(transformed_input_df) | |
| prediksi_final = predictions[0] | |
| st.markdown("### ✅ Hasil Prediksi") | |
| st.metric( | |
| f"Prediksi Kebutuhan **GAS MMBTU** untuk {selected_product}", | |
| f"{prediksi_final:.6f}MMBTU" | |
| ) | |
| st.markdown("---") |