KevinDHS/Final_Project
0
1import streamlit as st2import pandas as pd3import numpy as np4import pickle5import json6 7# Load necessary files and models8with open('model_scaler.pkl', 'rb') as file_1:9 scaler = pickle.load(file_1)10with open('model_pca.pkl', 'rb') as file_2:11 pca = pickle.load(file_2)12with open('model_kp.pkl', 'rb') as file_3:13 kp = pickle.load(file_3)14with open('index_cols.txt', 'r') as file_4:15 index_cols = json.load(file_4)16with open('num_cols.txt', 'r') as file_5:17 num_cols = json.load(file_5)18with open('cat_cols.txt', 'r') as file_6:19 cat_cols = json.load(file_6)20 21# Define page configuration22def run():23 st.title('APART HELPER')24 25 # Create user input form26 with st.form(key='person'):27 st.write('## Input Apart Data')28 neighborhood = st.selectbox('Neighborhood', options=['Palm Jumeirah', 'Jumeirah Lake Towers', 'Culture Village',29 'Downtown Dubai', 'Dubai Marina', 'Business Bay', 'Old Town',30 'Al Kifaf', 'Meydan', 'Arjan', 'Jumeirah Beach Residence',31 'Dubai Creek Harbour (The Lagoons)', 'Greens', 'City Walk',32 'Al Furjan', 'DAMAC Hills', 'Jumeirah Golf Estates', 'Jumeirah',33 'Dubai Hills Estate', 'Umm Suqeim', 'Motor City', 'DIFC',34 'Jumeirah Village Circle', 'Barsha Heights (Tecom)', 'Al Barari',35 'Dubai Production City (IMPZ)', 'The Hills', 'The Views',36 'Dubai Sports City', 'Dubai Silicon Oasis',37 'Jumeirah Village Triangle', 'Mohammed Bin Rashid City',38 'Dubai Harbour', 'Bluewaters', 'International City',39 'Falcon City of Wonders', 'Mina Rashid', 'Town Square',40 'Green Community', 'Al Barsha', 'Al Sufouh', 'Dubai Festival City',41 'Jebel Ali', 'Dubai Land', 'World Trade Center', 'Mudon',42 'Discovery Gardens', 'Remraam', 'Mirdif',43 'Dubai South (Dubai World Central)', 'Dubai Healthcare City',44 'wasl gate', 'Dubai Residence Complex', 'Al Quoz'])45 46 price = st.number_input('Price', min_value=0, max_value=35000000, value='min', step=1)47 size_in_sqft = st.number_input('Size in Square Feet', min_value=0, max_value=9576, value='min', step=100)48 price_per_sqft = st.number_input('Price per Square Feet', min_value=0, max_value=4806, value='min', step=100)49 no_of_bedrooms = st.number_input('Total Bedrooms', min_value=0, max_value=5, value='min', step=1)50 no_of_bathrooms = st.number_input('Total Bathrooms', min_value=0, max_value=6, value='min', step=1)51 maid_room = st.selectbox('Maid Room', options=['True', 'False'])52 concierge = st.selectbox('Concierge', options=['True', 'False'])53 pets_allowed = st.selectbox('Pets Allowes', options=['True', 'False'])54 private_garden = st.selectbox('Private Garden', options=['True', 'False'])55 private_gym = st.selectbox('Private Gym', options=['True', 'False'])56 private_jacuzzi = st.selectbox('Private Jacuzzi', options=['True', 'False'])57 private_pool = st.selectbox('Private Pool', options=['True', 'False'])58 shared_pool = st.selectbox('Shared Pool', options=['True', 'False'])59 60 submit = st.form_submit_button("Predict")61 62 # Create new data63 data_inf = {64 'neighborhood': neighborhood,65 'price': price,66 'size_in_sqft': size_in_sqft,67 'price_per_sqft': price_per_sqft,68 'no_of_bedrooms': no_of_bedrooms,69 'no_of_bathrooms': no_of_bathrooms,70 'maid_room': maid_room,71 'concierge': concierge,72 'pets_allowed' : pets_allowed,73 'private_garden' : private_garden,74 'private_gym' : private_gym,75 'private_jacuzzi' : private_jacuzzi,76 'private_pool' : private_pool,77 'shared_pool' : shared_pool78 }79 80 # Predict81 if submit:82 # Prepare numeric and categorical data83 inf_num = pd.DataFrame([data_inf])[num_cols]84 inf_cat = pd.DataFrame([data_inf])[cat_cols]85 86 # Scale and perform dimension reduction87 inf_scaled = scaler.transform(inf_num)88 inf_scaled_pca = pca.transform(inf_scaled)89 90 inf_final = np.concatenate([inf_scaled_pca, inf_cat], axis=1)91 inf_final = pd.DataFrame(inf_final, columns=['PCA1', 'PCA2', 'PCA3'] + cat_cols)92 inf_final = inf_final.infer_objects()93 94 result = kp.predict(inf_final, categorical=index_cols)95 st.divider()96 97 # Prediction explanation98 if result is not None:99 if result == 0:100 keterangan_prediksi = "Cluster Apartemen Mewah\n\n" \101 "- Mencakup apartemen paling mahal dalam kumpulan data.\n" \102 "- Mungkin memiliki ukuran terbesar dalam satuan luas.\n" \103 "- Mungkin memiliki harga per satuan luas tertinggi.\n" \104 "- Memiliki jumlah kamar tidur dan kamar mandi yang lebih tinggi dibandingkan dengan cluster lainnya."105 elif result == 1:106 keterangan_prediksi = "Cluster Apartemen Menengah\n\n" \107 "- Memiliki harga lebih rendah daripada Cluster 0 (Cluster Apartemen Mewah) tetapi lebih tinggi dari Cluster 2 (Cluster Apartemen Ekonomis).\n" \108 "- Mungkin memiliki ukuran sedang dalam satuan luas dibandingkan dengan cluster lainnya.\n" \109 "- Harga per satuan luas berada di antara dua cluster lainnya.\n" \110 "- Memiliki jumlah kamar tidur dan kamar mandi yang sedang."111 else:112 keterangan_prediksi = "Cluster Apartemen Ekonomis\n\n" \113 "- Mencakup apartemen paling terjangkau dalam kumpulan data.\n" \114 "- Mungkin memiliki ukuran terkecil dalam satuan luas.\n" \115 "- Mungkin memiliki harga per satuan luas terendah.\n" \116 "- Memiliki jumlah kamar tidur dan kamar mandi yang lebih rendah dibandingkan dengan cluster lainnya."117 118 # Display result119 st.write('# Result')120 st.write(f'Prediksi : {int(result)} - {keterangan_prediksi}')121 122 # Show data table based on the result123 st.subheader('Rekomendasi Apartment :')124 data_cluster = pd.read_csv("data_setelah_clustering.csv")125 data_cluster = data_cluster.drop(columns=['Unnamed: 0']) 126 if result == 0:127 st.write(data_cluster.loc[(data_cluster['cluster']==0)& (data_cluster['price'] <= price)].head(10))128 elif result == 1:129 st.write(data_cluster.loc[(data_cluster['cluster']==1)& (data_cluster['price'] <= price)].head(10))130 else:131 st.write(data_cluster.loc[(data_cluster['cluster']==2) & (data_cluster['price'] <= price)].head(10))132 else:133 st.write('Error: Prediction result is None')134 135if __name__ == '__main__':136 run()