RMHalak's picture
Update app.py
f00ad3a verified
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("""
<style>
.stSlider [data-baseweb=slider]{
width: 95%;
}
.stCheckbox, .stSelectbox {
width: 95%px;
}
</style>
""",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('</div>', 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)