Spaces:
Sleeping
Sleeping
import streamlit as st | |
import joblib | |
import pandas as pd | |
from scipy.stats import yeojohnson | |
import inv_transform | |
# Title of the app | |
st.title("Event Budget Estimate") | |
# Add custom CSS for spacing between columns | |
st.markdown( | |
""" | |
<style> | |
.stColumn > div { | |
padding: 10px; /* Adjust the value as needed to increase spacing */ | |
} | |
h2 { | |
font-size: 20px; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# Create columns with adjusted spacing | |
col1, col2 = st.columns([1, 1], gap="large") # Adjust gap as needed | |
with col1: | |
# Smaller column title | |
#st.subheader("Event Data") | |
st.markdown("### Event Data") | |
countries = pd.read_csv('ISO-3166-Countries-with-Regional-Codes.csv') | |
countries_a2 = list (countries['alpha-2']) | |
countries_names = list (countries['name']) | |
countries = [f"{a2} - {name}" for a2, name in zip(countries_a2, countries_names)] | |
us_index = countries_a2.index('US') | |
#cn_index = countries_a2.index('CN') | |
in_index = countries_a2.index('IN') | |
states = pd.read_csv('USA States.csv', index_col=0) | |
states = list(states.Abbreviation) | |
ca_index = states.index('CA') | |
# Input fields | |
atnd_num = st.number_input("Estimate Number of Attendees", min_value=0, value=180) | |
ppr_num = st.number_input("Estimate Paper Number", min_value=0, value=100) | |
exh_num = st.number_input("Estimate Number of Exhibits", min_value=0, value=0) | |
long = st.number_input("Conference Duration, Days", min_value=0, value=3) | |
# Dropdown menus | |
event_type = st.selectbox("Event Type", ['Colloquium', 'Conference', 'Forum', 'Seminar', 'Symposium', 'Workshop' , 'Other'], index = 1) | |
cntry = st.selectbox("Conference Location Country", countries, index = us_index) | |
chosen_country_index = countries.index(cntry) | |
if chosen_country_index == us_index: | |
loc_state = st.selectbox("Conference Location: State Code", states, index=ca_index) | |
else: | |
loc_state = "Other" | |
# Checkboxes | |
st.markdown("<h4>Keywords</h4>", unsafe_allow_html=True) | |
kw_comp = st.checkbox("Computer(s) / Computing / Computation / Computational") | |
kw_sys = st.checkbox("System(s)") | |
kw_app = st.checkbox("Application(s)") | |
#kw_ntwk = st.checkbox("Network(s) /Networking") | |
kw_wless = st.checkbox("Wireless") | |
#kw_mdl = st.checkbox("Model / Modeling") | |
#kw_arch = st.checkbox("Architecture(s)") | |
kw_img = st.checkbox("Image / Imaging") | |
# kw_adv = st.checkbox("Advanced") | |
# kw_dist = st.checkbox("Distributed") | |
st.write("**Please only use the exact keywords listed and avoid including any variations or additional words!**") | |
submit = st.button("Submit") | |
# If the submit button is clicked, show output in the second column (col2) | |
with col2: | |
if submit: | |
if chosen_country_index != us_index and loc_state != "Other": | |
st.error("Correct Event Location: Country and State!") | |
else: | |
try: | |
p = True | |
regressor = joblib.load("budget_prediction_model.joblib") | |
except: | |
p = False | |
if not p: | |
st.write('Check the model path') | |
st.error("Model doesn't Exist!") | |
else: | |
atnd_num = atnd_num / 1.22 | |
ppr_num = ppr_num / 1.26 | |
data = pd.DataFrame([{ | |
'act_atnd_tot_atnd_num': atnd_num, | |
'long_atnd_ratio':long/atnd_num, | |
'act_paprs_num': ppr_num, | |
'longevity': long, | |
'papr_atnd_ratio':ppr_num/atnd_num, | |
'exh_num': exh_num, | |
'conf_loc_cntry_nm_India': int(chosen_country_index == in_index), | |
'conf_loc_cntry_nm_USA': int(chosen_country_index == us_index), | |
'comput': int(kw_comp), | |
'conf_loc_state_nm_CA': int(loc_state == "CA"), | |
'system': int(kw_sys), | |
'conf_evnt_typ_nm_Conference': int(event_type == "Conference"), | |
'applic': int(kw_app), | |
'conf_evnt_typ_nm_Workshop': int(event_type == "Workshop"), | |
'imag': int(kw_img), | |
'wireless': int(kw_wless), | |
}]) | |
lambdas = pd.read_csv('lambdas_yeojohnson.csv', header=None, index_col=0) | |
lambdas = lambdas.to_dict()[1] | |
for n in ['act_atnd_tot_atnd_num', 'exh_num', 'act_paprs_num']: | |
data[n] = yeojohnson(data[n], lambdas[n]) | |
data.longevity -= 1 | |
# Predict income | |
income = regressor.predict(data)[0] | |
if exh_num > 0: | |
reg_fees_inc = 0.995 * income | |
else: | |
reg_fees_inc = income | |
income = inv_transform.inv_yeojohnson(income, lambdas['fin_inc_tot_amt']) | |
reg_fees_inc = inv_transform.inv_yeojohnson(reg_fees_inc, lambdas['fin_inc_tot_amt']) | |
print(reg_fees_inc) | |
income = round(income / 1000) * 1000 | |
reg_fees_inc = round(reg_fees_inc / 1000) * 1000 | |
exh_inc = 0 | |
sponsor_inc = 0 | |
if exh_num < 10: | |
exh_inc = min(exh_num * 1000, income - reg_fees_inc) | |
elif exh_num < 30: | |
exh_inc = min(10*1000 + (exh_num-10) * 1500, income - reg_fees_inc) | |
elif exh_num < 50: | |
exh_inc = min(10*1000 + 20 * 1500 + (exh_num-30) * 3500, income - reg_fees_inc) | |
else: | |
exh_inc = min(10*1000 + 20 * 1500 + 20 * 3500 + (exh_num-50) * 2900, income - reg_fees_inc) | |
# repeat piecewise function for grants and donations | |
if exh_num < 50: | |
sponsor_inc = min(exh_num * 3900, income - reg_fees_inc - exh_inc) | |
else: | |
sponsor_inc = min(50 * 3900, income - reg_fees_inc - exh_inc) | |
sponsor_inc = round(sponsor_inc / 1000) * 1000 | |
exh_inc = round(exh_inc / 1000) * 1000 | |
other_inc = income - reg_fees_inc - exh_inc - sponsor_inc | |
reg_fees_inc = reg_fees_inc + other_inc | |
expenses = round(income * 0.85 / 1000) * 1000 | |
socl_funcs_exp = round(expenses * 0.54 / 1000) * 1000 | |
local_arr_exp = round(expenses * 0.30 / 1000) * 1000 | |
admintn_exp = round(expenses * 0.07 / 1000) * 1000 | |
promo_exp =round(expenses * 0.04 / 1000) * 1000 | |
audit_exp = min(expenses*0.006, 6000) | |
audit_exp = round(audit_exp / 1000) * 1000 | |
other_exp = expenses - socl_funcs_exp - local_arr_exp - admintn_exp - promo_exp - audit_exp | |
# Display results | |
st.markdown("### Predicted Budget*") | |
st.markdown("<h4>Income Structure</h4>", unsafe_allow_html=True) | |
st.write(f"**Total Income: ${income}**") | |
st.write(f"Registration Fees Income: ${reg_fees_inc}") | |
st.write(f"Exhibit Income: ${exh_inc}") | |
st.write(f"Sponsorship Income: ${sponsor_inc}") | |
#st.write(f"Other Income: ${other_inc}") | |
st.markdown("<h4>Expenses Structure</h4>", unsafe_allow_html=True) | |
st.write(f"**Total Expenses: ${round(round(expenses, -3))}**") | |
st.write(f"Social Functions Expenses: ${round(round(socl_funcs_exp, -3))}") | |
st.write(f"Local Arrangement Expenses: ${round(round(local_arr_exp, -3))}") | |
st.write(f"Administration Expenses: ${round(round(admintn_exp, -3))}") | |
st.write(f"Promotion Expenses Amount: ${round(round(promo_exp, -3))}") | |
st.write(f"Audit Fees Expenses: ${audit_exp}") | |
st.write(f"Other Expenses: ${round(round(other_exp, -3))}") | |
st.write("") | |
st.write("***The numbers are approximate and should be adjusted according to event needs**") | |
# Add button save those numbers to Excel | |