import streamlit as st import pandas as pd import pickle import json import pydeck as pdk import utils st.set_page_config(layout="wide") # Load model and files with open('./trained_model.pkl', 'rb') as file: model = pickle.load(file) with open("./min_dict.json", "r") as f: min_dict = json.load(f) with open("./max_dict.json", "r") as f: max_dict = json.load(f) with open("./cities_geo.json", "r") as f: cities_geo = json.load(f) help_dict = { 'bedrooms': "Select the number of bedrooms in the house. The value ranges from the minimum to the maximum available in the dataset.", 'bathrooms': "Select the number of bathrooms in the house. The value ranges from the minimum to the maximum available in the dataset.", 'yr_built': "Select the year the house was built. The value ranges from the earliest to the latest year available in the dataset.", 'yr_renovated': "Select the year the house was renovated. This value cannot be earlier than the year the house was built and ranges up to the maximum renovation year in the dataset.", 'floors': "Select the number of floors in the house. The value ranges from the minimum to the maximum number of floors available in the dataset.", 'view': "Select the quality of the view from the house. The value ranges from 0 (no view) to the highest view quality available in the dataset.", 'condition': "Select the overall condition of the house. The value ranges from the poorest to the best condition available in the dataset.", 'sqft_living': "Select the total square footage of the living space. The value ranges from the minimum to the maximum square footage available in the dataset.", 'sqft_lot': "Select the total square footage of the lot. The value ranges from the minimum to the maximum lot size available in the dataset.", 'sqft_above': "Select the square footage of the living space above ground level. The value ranges from the minimum to the maximum above-ground square footage available in the dataset.", 'sqft_basement': "Select the square footage of the basement. The value ranges from the minimum to the maximum basement square footage available in the dataset." } # Custom CSS to adjust the slider width st.markdown(""" """,unsafe_allow_html=True) # Create two columns: one for the city and one for the map col1, col2 = st.columns([1, 2]) # Adjust the width ratios as needed with col1: st.subheader('Features') with st.container(height=550, border=True): city = st.selectbox('City', list(cities_geo.keys())) # Display city dropdown in the first column waterfront = st.checkbox('Waterfront', value=False) bedrooms = st.slider('Bedrooms', min_value=min_dict['bedrooms'], max_value=max_dict['bedrooms'], value=3, help=help_dict['bedrooms']) bathrooms = st.slider('Bathrooms', min_value=min_dict['bathrooms'], max_value=max_dict['bathrooms'], value=2, help=help_dict['bathrooms']) yr_built = st.slider('Year Built', min_value=min_dict['yr_built'], max_value=max_dict['yr_built'], value=2000, help=help_dict['yr_built']) yr_renovated = st.slider('Year Renovated', min_value=yr_built, max_value=max_dict['yr_renovated'], value=yr_built, help=help_dict['yr_renovated']) floors = st.slider('Floors', min_value=min_dict['floors'], max_value=max_dict['floors'], value=1, help=help_dict['floors']) view = st.slider('View', min_value=min_dict['view'], max_value=max_dict['view'], value=0, help=help_dict['view']) condition = st.slider('Condition', min_value=min_dict['condition'], max_value=max_dict['condition'], value=3, help=help_dict['condition']) sqft_living = st.slider('Square Feet (Living)', min_value=min_dict['sqft_living'], max_value=max_dict['sqft_living'], value=1000, help=help_dict['sqft_living']) sqft_lot = st.slider('Square Feet (Lot)', min_value=min_dict['sqft_lot'], max_value=max_dict['sqft_lot'], value=2000, help=help_dict['sqft_lot']) sqft_above = st.slider('Square Feet (Above)', min_value=min_dict['sqft_above'], max_value=max_dict['sqft_above'], value=1000, help=help_dict['sqft_above']) sqft_basement = st.slider('Square Feet (Basement)', min_value=min_dict['sqft_basement'], max_value=max_dict['sqft_basement'], value=0, help=help_dict['sqft_basement']) st.markdown('', unsafe_allow_html=True) new_pred = utils.init_new_pred() new_pred['bedrooms'] = bedrooms new_pred['bathrooms'] = bathrooms new_pred['sqft_living'] = sqft_living new_pred['sqft_lot'] = sqft_lot new_pred['floors'] = floors new_pred['waterfront'] = int(waterfront) new_pred['view'] = view new_pred['condition'] = condition new_pred['sqft_above'] = sqft_above new_pred['sqft_basement'] = sqft_basement new_pred['yr_built'] = yr_built new_pred['yr_renovated'] = yr_renovated new_pred[f'city_{city}'] = 1 # Process the prediction new_pred = pd.DataFrame([new_pred]) new_pred = utils.create_new_features(new_pred) new_pred = utils.bucketize(new_pred) new_pred = utils.normalize(new_pred) # Predict the price predicted_price = model.predict(new_pred) with col2: # Placeholder for displaying the predicted price at the top price_placeholder = st.empty() price_placeholder.subheader(f'Predicted Price: ${predicted_price[0][0]:,.2f}') map_data = pd.DataFrame(cities_geo[city]) with st.container(height=550, border=True): st.map(map_data, zoom=11)