sample_dash / app.py
Solab's picture
Upload app.py
acd4679
# import libraries
import streamlit as st
import pandas as pd
import numpy as np
import pickle
df = pd.read_csv("rtv.csv", low_memory=False)
# load model from pickle file
with open("rf.pkl", "rb") as f:
rf = pickle.load(f)
st.set_page_config(
page_title = 'Real-Time Data Science Dashboard',
page_icon = '✅',
layout = 'wide'
)
# create sidebar title
st.title("Raising the :green[Village] :desert:")
st.image("https://ngosjob.b-cdn.net/wp-content/uploads/2023/03/Raising-The-Village.png")
# creating a single-element container.
placeholder = st.empty()
duration = df['duration'].mean()
mean = pd.to_numeric(df['HH Income (UGX)'], errors='coerce').mean()
maxi = pd.to_numeric(df['HH Income (UGX)'], errors='coerce').max()
with placeholder.container():
# create three columns
kpi1, kpi2, kpi3 = st.columns(3)
# fill in those three columns with respective metrics or KPIs
kpi1.metric(label="Average Income ⏳", value=round(mean))
kpi2.metric(label="Mean Time(minutes) 💍", value= int(duration))
kpi3.metric(label="Max income$", value= f"$ {round(maxi,2)} ")
# create title
st.title("Income Prediction")
# create input fields for each feature
inputs = []
X_columns = ['Season 2 Agriculture Value (Ugx)',
'Casual Labour (Ugx)',
'Season 1 Agriculture Value (Ugx)',
'Perenial Crops Income (Ugx)',
'Personal Business & Self Employment (Ugx)',
'Agriculture Income (UGX) ',
'Perennial Agriculture Value (Ugx)',
'HH Income + Consumption + Residues (UGX)']
for col in X_columns:
value = st.number_input(f"Enter value for {col}", value=0.0)
inputs.append(value)
# create button for prediction
predict = st.button("Predict Income")
if predict:
# convert inputs to numpy array and reshape to match model input shape
inputs = np.array(inputs).reshape(1, -1)
# make prediction using loaded model
y_pred = rf.predict(inputs)
# display prediction result
st.write(f"The predicted income value is {y_pred[0]:.2f}")
st.markdown("============================================================================================================================")
# make prediction and display result if button is clicked and data is uploaded
# display file upload option
st.title("Get predictions of the whole dataset")
st.write("Upload your csv or excel file here:")
st.write("The dashboard supports only csv files at the moment")
uploaded_file = st.file_uploader("Choose a file", type=["csv", "xlsx"])
def preproc(df):
df = df[['Season 2 Agriculture Value (Ugx)',
'Casual Labour (Ugx)',
'Season 1 Agriculture Value (Ugx)',
'Perenial Crops Income (Ugx)',
'Personal Business & Self Employment (Ugx)',
'Agriculture Income (UGX) ',
'Perennial Agriculture Value (Ugx)',
'HH Income + Consumption + Residues (UGX)']]
df.fillna(df.mean(), inplace=True)
return df
# load and display data if uploaded
if uploaded_file is not None:
if uploaded_file.type == "text/csv":
df = pd.read_csv(uploaded_file)
elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
df = pd.read_excel(uploaded_file)
X_new = preproc(df)
else:
st.write("No file uploaded yet.")
# create button for prediction
predict = st.button("Predict")
# make prediction and display result if button is clicked and data is uploaded
if uploaded_file is not None and predict:
# make prediction using loaded model
y_pred = rf.predict(X_new)
# display prediction result as dataframe
df["prediction"] = y_pred.round(2)
st.dataframe(df[["Surveyor_Name", "prediction"]])
job_filter = st.selectbox("Select the Quartile", pd.unique(df['Quartile']))
# dataframe filter
df1 = df[df['Quartile']==job_filter]
st.dataframe(df1)