File size: 11,088 Bytes
6267f13 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
import streamlit as st
import pandas as pd
import joblib
def create_dataframe_from_user_input():
"""
Collects user input for house features using Streamlit and
returns a Pandas DataFrame. The input fields are organized
into categorized sections for better usability.
"""
# Define the lists of possible values for dropdown selections
type_list = ['HOUSE', 'APARTMENT']
subtype_list = ['HOUSE', 'APARTMENT', 'VILLA', 'APARTMENT_BLOCK', 'APARTMENT_GROUP',
'MIXED_USE_BUILDING', 'GROUND_FLOOR', 'DUPLEX', 'HOUSE_GROUP',
'FLAT_STUDIO', 'PENTHOUSE', 'EXCEPTIONAL_PROPERTY', 'MANSION',
'TOWN_HOUSE', 'SERVICE_FLAT', 'BUNGALOW', 'KOT', 'COUNTRY_COTTAGE',
'FARMHOUSE', 'LOFT', 'CHALET', 'TRIPLEX', 'CASTLE', 'OTHER_PROPERTY',
'MANOR_HOUSE', 'PAVILION']
province_list = ['West Flanders', 'Antwerp', 'East Flanders', 'Brussels', 'Hainaut',
'Liège', 'Flemish Brabant', 'Limburg', 'Walloon Brabant', 'Namur',
'Luxembourg']
building_condition_list = ['GOOD', 'AS_NEW', 'TO_RENOVATE', 'TO_BE_DONE_UP',
'JUST_RENOVATED', 'TO_RESTORE']
flood_zone_type_list = ['NON_FLOOD_ZONE', 'POSSIBLE_FLOOD_ZONE', 'RECOGNIZED_FLOOD_ZONE',
'RECOGNIZED_N_CIRCUMSCRIBED_FLOOD_ZONE', 'CIRCUMSCRIBED_WATERSIDE_ZONE',
'CIRCUMSCRIBED_FLOOD_ZONE', 'POSSIBLE_N_CIRCUMSCRIBED_FLOOD_ZONE',
'POSSIBLE_N_CIRCUMSCRIBED_WATERSIDE_ZONE', 'RECOGNIZED_N_CIRCUMSCRIBED_WATERSIDE_ZONE']
heating_type_list = ['GAS', 'FUELOIL', 'ELECTRIC', 'PELLET', 'WOOD', 'SOLAR', 'CARBON']
kitchen_type_list = ['INSTALLED', 'HYPER_EQUIPPED', 'SEMI_EQUIPPED', 'NOT_INSTALLED',
'USA_HYPER_EQUIPPED', 'USA_INSTALLED', 'USA_SEMI_EQUIPPED',
'USA_UNINSTALLED']
garden_orientation_list = ['SOUTH', 'SOUTH_WEST', 'SOUTH_EAST', 'WEST', 'EAST',
'NORTH_WEST', 'NORTH_EAST', 'NORTH']
terrace_orientation_list = ['SOUTH', 'SOUTH_WEST', 'SOUTH_EAST', 'WEST', 'EAST',
'NORTH_WEST', 'NORTH_EAST', 'NORTH']
epc_score_list = ['B', 'C', 'D', 'A', 'F', 'E', 'G', 'A+', 'A++']
# Create Streamlit input fields
st.header("Enter House Information")
# --- Property Details ---
st.subheader("Property Details")
col1, col2 = st.columns(2)
with col1:
property_type = st.selectbox("Property Type", type_list, key='type')
property_subtype = st.selectbox("Subtype", subtype_list, key='subtype')
province = st.selectbox("Province", province_list, key='province')
locality = st.text_input("Locality", key='locality')
post_code = st.number_input("Post Code", min_value=1000, max_value=9999, step=1, key='postCode')
with col2:
building_condition = st.selectbox("Building Condition", building_condition_list, key='buildingCondition')
building_construction_year = st.number_input("Building Construction Year", min_value=1000, max_value=2024, step=1, key='buildingConstructionYear')
facade_count = st.number_input("Facade Count", min_value=0, step=1, key='facadeCount')
floor_count = st.number_input("Floor Count", min_value=0, step=1, key='floorCount')
flood_zone_type = st.selectbox("Flood Zone Type", flood_zone_type_list, key='floodZoneType')
epc_score = st.selectbox("EPC Score", epc_score_list, key='epcScore')
# --- Room Information ---
st.subheader("Room Information")
col3, col4 = st.columns(2)
with col3:
bedroom_count = st.number_input("Bedroom Count", min_value=0, step=1, key='bedroomCount')
bathroom_count = st.number_input("Bathroom Count", min_value=0, step=1, key='bathroomCount')
room_count = st.number_input("Room Count", min_value=0, step=1, key='roomCount')
has_attic = st.selectbox("Has Attic", ['Yes', 'No'], key='hasAttic')
has_basement = st.selectbox("Has Basement", ['Yes', 'No'], key='hasBasement')
has_dressing_room = st.selectbox("Has Dressing Room", ['Yes', 'No'], key='hasDressingRoom')
has_dining_room = st.selectbox("Has Dining Room", ['Yes', 'No'], key='hasDiningRoom')
dining_room_surface = st.number_input("Dining Room Surface (sqm)", min_value=0.0, key='diningRoomSurface')
with col4:
has_living_room = st.selectbox("Has Living Room", ['Yes', 'No'], key='hasLivingRoom')
living_room_surface = st.number_input("Living Room Surface (sqm)", min_value=0.0, key='livingRoomSurface')
kitchen_surface = st.number_input("Kitchen Surface (sqm)", min_value=0.0, key='kitchenSurface')
kitchen_type = st.selectbox("Kitchen Type", kitchen_type_list, key='kitchenType')
toilet_count = st.number_input("Toilet Count", min_value=0, step=1, key='toiletCount')
has_office = st.selectbox("Has Office", ['Yes', 'No'], key='hasOffice')
has_lift = st.selectbox("Has Lift", ['Yes', 'No'], key='hasLift')
# --- Surface Areas ---
st.subheader("Surface Areas")
col5, col6 = st.columns(2)
with col5:
habitable_surface = st.number_input("Habitable Surface (sqm)", min_value=0.0, key='habitableSurface')
land_surface = st.number_input("Land Surface (sqm)", min_value=0.0, key='landSurface')
garden_surface = st.number_input("Garden Surface (sqm)", min_value=0.0, key='gardenSurface')
with col6:
terrace_surface = st.number_input("Terrace Surface (sqm)", min_value=0.0, key='terraceSurface')
street_facade_width = st.number_input("Street Facade Width (m)", min_value=0.0, key='streetFacadeWidth')
monthly_cost = st.number_input("Monthly Cost (€)", min_value=0.0, key='monthlyCost')
# --- Outdoor Features ---
st.subheader("Outdoor Features")
col7, col8 = st.columns(2)
with col7:
has_garden = st.selectbox("Has Garden", ['Yes', 'No'], key='hasGarden')
garden_orientation = st.selectbox("Garden Orientation", garden_orientation_list, key='gardenOrientation')
has_balcony = st.selectbox("Has Balcony", ['Yes', 'No'], key='hasBalcony')
has_terrace = st.selectbox("Has Terrace", ['Yes', 'No'], key='hasTerrace')
terrace_orientation = st.selectbox("Terrace Orientation", terrace_orientation_list, key='terraceOrientation')
with col8:
parking_count_indoor = st.number_input("Indoor Parking Count", min_value=0, step=1, key='parkingCountIndoor')
parking_count_outdoor = st.number_input("Outdoor Parking Count", min_value=0, step=1, key='parkingCountOutdoor')
has_swimming_pool = st.selectbox("Has Swimming Pool", ['Yes', 'No'], key='hasSwimmingPool')
# --- Additional Features ---
st.subheader("Additional Features")
col9, col10 = st.columns(2)
with col9:
heating_type = st.selectbox("Heating Type", heating_type_list, key='heatingType')
has_heat_pump = st.selectbox("Has Heat Pump", ['Yes', 'No'], key='hasHeatPump')
has_photovoltaic_panels = st.selectbox("Has Photovoltaic Panels", ['Yes', 'No'], key='hasPhotovoltaicPanels')
has_thermic_panels = st.selectbox("Has Thermic Panels", ['Yes', 'No'], key='hasThermicPanels')
with col10:
has_air_conditioning = st.selectbox("Has Air Conditioning", ['Yes', 'No'], key='hasAirConditioning')
has_armored_door = st.selectbox("Has Armored Door", ['Yes', 'No'], key='hasArmoredDoor')
has_visiophone = st.selectbox("Has Visiophone", ['Yes', 'No'], key='hasVisiophone')
has_fireplace = st.selectbox("Has Fireplace", ['Yes', 'No'], key='hasFireplace')
accessible_disabled_people = st.selectbox("Accessible Disabled People", ['True', 'False'], key='accessibleDisabledPeople')
# Create a button to trigger DataFrame creation
if st.button("Predict"):
# Create the DataFrame
data = {
'type': property_type,
'subtype': property_subtype,
'bedroomCount': bedroom_count,
'bathroomCount': bathroom_count,
'province': province,
'locality': locality,
'postCode': post_code,
'habitableSurface': habitable_surface,
'roomCount': room_count,
'monthlyCost': monthly_cost,
'hasAttic': has_attic == 'Yes',
'hasBasement': has_basement == 'Yes',
'hasDressingRoom': has_dressing_room == 'Yes',
'diningRoomSurface': dining_room_surface,
'hasDiningRoom': has_dining_room == 'Yes',
'buildingCondition': building_condition,
'buildingConstructionYear': building_construction_year,
'facadeCount': facade_count,
'floorCount': floor_count,
'streetFacadeWidth': street_facade_width,
'hasLift': has_lift == 'Yes',
'floodZoneType': flood_zone_type,
'heatingType': heating_type,
'hasHeatPump': has_heat_pump == 'Yes',
'hasPhotovoltaicPanels': has_photovoltaic_panels == 'Yes',
'hasThermicPanels': has_thermic_panels == 'Yes',
'kitchenSurface': kitchen_surface,
'kitchenType': kitchen_type,
'landSurface': land_surface,
'hasLivingRoom': has_living_room == 'Yes',
'livingRoomSurface': living_room_surface,
'hasBalcony': has_balcony == 'Yes',
'hasGarden': has_garden == 'Yes',
'gardenSurface': garden_surface,
'gardenOrientation': garden_orientation,
'parkingCountIndoor': parking_count_indoor,
'parkingCountOutdoor': parking_count_outdoor,
'hasAirConditioning': has_air_conditioning == 'Yes',
'hasArmoredDoor': has_armored_door == 'Yes',
'hasVisiophone': has_visiophone == 'Yes',
'hasOffice': has_office == 'Yes',
'toiletCount': toilet_count,
'hasSwimmingPool': has_swimming_pool == 'Yes',
'hasFireplace': has_fireplace == 'Yes',
'hasTerrace': has_terrace == 'Yes',
'terraceSurface': terrace_surface,
'terraceOrientation': terrace_orientation,
'accessibleDisabledPeople': accessible_disabled_people == 'True',
'epcScore': epc_score
}
df = pd.DataFrame(data, index=[0])
pipeline = joblib.load('saved/pipeline.pkl')
model = joblib.load('saved/model.pkl')
expected_columns = joblib.load('saved/columns.pkl')
df_test = pipeline.transform(df)
for col in expected_columns:
if col not in df_test.columns:
df_test[col] = 0
df_test = df_test[expected_columns]
preds = model.predict(df_test)
st.subheader("Price prediction")
st.markdown(f"<h1 style='text-align: center; color: red;'>{preds[0]:.2f} €</h1>", unsafe_allow_html=True)
return df
if __name__ == "__main__":
create_dataframe_from_user_input()
|