|
import streamlit as st |
|
import pandas as pd |
|
import joblib |
|
from sklearn.metrics import r2_score |
|
from utils import data_cleaning |
|
|
|
|
|
DATASET_PATH = "datasets/housePrice.csv" |
|
MODELS_PATH = [ |
|
"models/KernelRidge_pipeline.joblib", |
|
"models/GradientBoostingRegressor_pipeline.joblib", |
|
"models/XGBoostRegressor_pipeline.joblib", |
|
"models/CatBoostRegressor_pipeline.joblib", |
|
] |
|
|
|
|
|
df = data_cleaning(DATASET_PATH) |
|
|
|
|
|
min_area, max_area = df['Area'].min(), df['Area'].max() |
|
rooms = df['Room'].unique().tolist() |
|
addresses = df['Address'].unique().tolist() |
|
|
|
|
|
st.title("🏠 Tehran House Price Prediction") |
|
st.sidebar.header("Input Parameters") |
|
|
|
|
|
st.sidebar.subheader("Enter the details:") |
|
area = st.sidebar.number_input("Area (m²)", min_value=min_area, max_value=max_area, value=min_area, step=10) |
|
room = st.sidebar.selectbox("Room", options=rooms) |
|
parking = st.sidebar.checkbox("Parking", value=True) |
|
warehouse = st.sidebar.checkbox("Warehouse", value=True) |
|
elevator = st.sidebar.checkbox("Elevator", value=True) |
|
address = st.sidebar.selectbox("Address", options=addresses) |
|
|
|
|
|
sample = pd.DataFrame({ |
|
'Area': [area], |
|
'Room': [room], |
|
'Parking': [parking], |
|
'Warehouse': [warehouse], |
|
'Elevator': [elevator], |
|
'Address': [address] |
|
}) |
|
|
|
def load_and_predict(sample): |
|
result = { |
|
'Model': [], |
|
'R2': [], |
|
'Predicted_Price_(IRR)': [] |
|
} |
|
|
|
|
|
X = df.drop(columns=['Price']) |
|
y = df['Price'] |
|
|
|
try: |
|
for path in MODELS_PATH: |
|
model_name = path.split('/')[-1].split('_')[0] |
|
model = joblib.load(path) |
|
|
|
|
|
y_pred = model.predict(X) |
|
price_pred = model.predict(sample)[0] |
|
|
|
result['Model'].append(model_name) |
|
result['R2'].append(r2_score(y, y_pred)) |
|
result['Predicted_Price_(IRR)'].append(price_pred) |
|
|
|
except Exception as e: |
|
st.error(f"An error occurred during model loading or prediction: {str(e)}") |
|
return None |
|
return pd.DataFrame(result).sort_values(by=['R2'], ascending=False) |
|
|
|
|
|
if st.sidebar.button("Predict"): |
|
result_df = load_and_predict(sample) |
|
|
|
if result_df is not None: |
|
st.success('Predicted House Price:') |
|
st.table(result_df) |
|
|
|
|
|
st.sidebar.markdown("### About this App") |
|
st.sidebar.markdown( |
|
"This app predicts house prices based on input features such as area, number of rooms, " |
|
"and facilities like parking, warehouse, and elevator. Please fill in all fields to get the prediction." |
|
) |