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( """ """, 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("

Keywords

", 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("

Income Structure

", 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("

Expenses Structure

", 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