diff --git "a/pages/2_Scenario_Planner.py" "b/pages/2_Scenario_Planner.py" --- "a/pages/2_Scenario_Planner.py" +++ "b/pages/2_Scenario_Planner.py" @@ -18,7 +18,8 @@ from utilities import ( send_email, channel_name_formating, ) - +from io import BytesIO +# import xlsxwriter import warnings # Suppress specific warnings if necessary warnings.filterwarnings("ignore") @@ -62,8 +63,8 @@ def optimize(key, status_placeholder): if key.lower() == "media spends": with status_placeholder: with st.spinner("Optimizing"): - print(channel_list) - print(st.session_state["total_spends_change"]) + # # print(channel_list) + # # print(st.session_state["total_spends_change"]) result = st.session_state["scenario"].optimize( st.session_state["total_spends_change"], channel_list # result = st.session_state["scenario"].spends_optimisation( @@ -110,7 +111,7 @@ def save_scenario(scenario_name): st.session_state["scenario"] ) st.session_state["scenario_input"] = "" - # print(type(st.session_state['saved_scenarios'])) + # # print(type(st.session_state['saved_scenarios'])) with open("../saved_scenarios.pkl", "wb") as f: pickle.dump(st.session_state["saved_scenarios"], f) @@ -187,9 +188,9 @@ def update_sales(): # def update_all_spends_abs_slider(): # actual_spends = _scenario.actual_total_spends # if validate_input(st.session_state["total_spends_change_abs_slider"]): -# print("#" * 100) -# print(st.session_state["total_spends_change_abs_slider"])C:\Users\PragyaJatav\Downloads\Untitled Folder 2\simulatorAldi\pages\8_Scenario_Planner.py -# print("#" * 100) +# # print("#" * 100) +# # print(st.session_state["total_spends_change_abs_slider"])C:\Users\PragyaJatav\Downloads\Untitled Folder 2\simulatorAldi\pages\8_Scenario_Planner.py +# # print("#" * 100) # modified_spends = extract_number_for_string( # st.session_state["total_spends_change_abs_slider"] @@ -360,6 +361,8 @@ def select_channel_for_optimization(channel_name): f"{channel_name}_selected" ] + # if not all(st.session_state["optimization_channels"].values()): + # st.session_state["optimize_all_channels"] = False def select_all_channels_for_optimization(): """ @@ -372,6 +375,7 @@ def select_all_channels_for_optimization(): st.session_state["optimization_channels"][channel_name] = st.session_state[ "optimze_all_channels" ] + def update_penalty(): @@ -382,7 +386,7 @@ def update_penalty(): def reset_scenario(panel_selected, file_selected, updated_rcs): - # #print(st.session_state['default_scenario_dict']) + # ## print(st.session_state['default_scenario_dict']) # st.session_state['scenario'] = class_from_dict(st.session_state['default_scenario_dict']) # for channel in st.session_state['scenario'].channels.values(): # st.session_state[channel.name] = float(channel.actual_total_spends * channel.conversion_rate) @@ -390,16 +394,18 @@ def reset_scenario(panel_selected, file_selected, updated_rcs): if panel_selected == "Total Market": initialize_data( - panel=panel_selected, + target_file=file_selected, + panel=panel_selected, updated_rcs=updated_rcs, metrics=metrics_selected, ) panel = None else: initialize_data( - panel=panel_selected, + target_file=file_selected, + panel=panel_selected, updated_rcs=updated_rcs, metrics=metrics_selected, ) @@ -519,19 +525,19 @@ def calculate_rgba( def debug_temp(x_test, power, K, b, a, x0): - print("*" * 100) + # # print("*" * 100) # Calculate the count of bins count_lower_bin = sum(1 for x in x_test if x <= 2524) count_center_bin = sum(1 for x in x_test if x > 2524 and x <= 3377) count_ = sum(1 for x in x_test if x > 3377) - print( - f""" - lower : {count_lower_bin} - center : {count_center_bin} - upper : {count_} - """ - ) + # # print( + # f""" + # lower : {count_lower_bin} + # center : {count_center_bin} + # upper : {count_} + # """ + # ) # @st.cache @@ -604,6 +610,57 @@ auth_status = st.session_state.get("authentication_status") import os import glob +def upload_file_prospects_calc(df): + df["Prospects"] = 0 + + params = pd.read_excel(r"response_curves_parameters.xlsx",index_col = "channel") + param_dicts = {col: params[col].to_dict() for col in params.columns} + df.index = df.channel +# # print(param_dicts) + for col in df.channel: + + x = (df["Spends"][col]/104 - param_dicts["x_min"][col])/(param_dicts["x_max"][col]-param_dicts["x_min"][col]) + x_out = x**param_dicts["n"][col]/(param_dicts["Kd"][col]**param_dicts["n"][col]+ x**param_dicts["n"][col]) + x_out_inv = (x_out*(param_dicts["y_max"][col]-param_dicts["y_min"][col])+param_dicts["y_min"][col])*104 + df["Prospects"][col] = x_out_inv + # # print(df) + return df + + +def upload_file_format(df): + df1 = df.transpose() + df1.reset_index(inplace = True) + df1.columns = df1.iloc[0] + df1 = df1[1:] + df1["channel"] = pd.to_datetime('1999-08-06').date() + df1.rename(columns = {"channel":"Date"},inplace = True) + + df2 = df1.rename(columns = {"Date":"Week"}) + + df3 =upload_file_prospects_calc(df) + df3 = df3[["Prospects"]].transpose().reset_index() + df3["index"] = pd.to_datetime('1999-08-06').date() + df3.rename(columns = {"index":"Date"},inplace = True) + df3.insert(1, 'const', [0]) + + + # Create a buffer to hold the Excel file + import io + output = io.BytesIO() + + # Write the dataframes to an Excel file + with pd.ExcelWriter(output, engine='openpyxl') as writer: + df1.to_excel(writer, index=False, sheet_name='RAW DATA MMM') + df2.to_excel(writer, index=False, sheet_name='SPEND INPUT') + df3.to_excel(writer, index=False, sheet_name='CONTRIBUTION MMM') + + # Seek to the beginning of the stream + output.seek(0) + + with open('Overview_data_uploaded.xlsx', 'wb') as f: + f.write(output.getvalue()) + + return def get_excel_names(directory): # Create a list to hold the final parts of the filenames @@ -788,7 +845,12 @@ if auth_status == True: authenticator.logout("Logout", "main") st.header("Scenario Planner") - + data_selected = st.selectbox( + "Select base data for optimisation", options=["Optimise Actual Spends", "Optimise Uploaded Spends"], + key = "data_upload_key",index = 1) + # st.text_input("") + + # Response Metrics @@ -807,1071 +869,1147 @@ if auth_status == True: # Target target = name_formating(metrics_selected) - file_selected = ( - f"Overview_data_test_panel@#{metrics_selected}.xlsx" - ) - - # Panel List - panel_list = panel_fetch(file_selected) - - # # Panel Selected - # panel_selected = st.selectbox( - # "Markets", - # ["Total Market"] + panel_list, - # index=0, - # on_change=reset_inputs, + # file_selected = ( + # f"Overview_data_test_panel@#{metrics_selected}.xlsx" # ) - - # st.write(panel_selected) - panel_selected = "Total Market" - st.session_state['selected_markets']=panel_selected + file_selected = None + if data_selected == "Optimise Uploaded Spends": + st.write("Select a file to upload") + uploaded_file = st.file_uploader("Choose an Excel file", type=["xlsx", "xls"]) + if uploaded_file: + try: + # Read the Excel file using pandas + df = pd.read_excel(uploaded_file, engine='openpyxl') + upload_file_format(df) + file_selected = "Overview_data_uploaded.xlsx" + + # initialize_data( + + # target_file=file_selected, + # panel="Total Market", + # updated_rcs=None, + # metrics=metrics_selected, + # ) + except Exception as e: + st.error(f"Error reading the file: {e}") + + elif data_selected == "Optimise Actual Spends": + file_selected = ( + f"Overview_data_test_panel@#{metrics_selected}.xlsx" + ) + # initialize_data( + + # target_file=file_selected, + # panel="Total Market", + # updated_rcs=None, + # metrics=metrics_selected, + # ) + + else : + st.write("") + + if file_selected: + st.session_state['file_selected']=file_selected + # Panel List + panel_list = panel_fetch(file_selected) + + # # Panel Selected + # panel_selected = st.selectbox( + # "Markets", + # ["Total Market"] + panel_list, + # index=0, + # on_change=reset_inputs, + # ) + + # st.write(panel_selected) + panel_selected = "Total Market" + st.session_state['selected_markets']=panel_selected - if "update_rcs" in st.session_state: - updated_rcs = st.session_state["update_rcs"] - else: - updated_rcs = None + if "update_rcs" in st.session_state: + updated_rcs = st.session_state["update_rcs"] + else: + updated_rcs = None - if "first_time" not in st.session_state: - st.session_state["first_time"] = True + if "first_time" not in st.session_state: + st.session_state["first_time"] = True - # Check if state is initiaized - is_state_initiaized = st.session_state.get("initialized", False) - if not is_state_initiaized or st.session_state["first_time"]: - initialize_data( - panel=panel_selected, - target_file=file_selected, - updated_rcs=updated_rcs, - metrics=metrics_selected, + # Check if state is initiaized + is_state_initiaized = st.session_state.get("initialized", False) + if not is_state_initiaized or st.session_state["first_time"]: + initialize_data( + + target_file=file_selected, + panel=panel_selected, + updated_rcs=updated_rcs, + metrics=metrics_selected, + ) + st.session_state["initialized"] = True + st.session_state["first_time"] = False + + # initialize_data( + # panel=panel_selected, + # target_file=file_selected, + # updated_rcs=updated_rcs, + # metrics=metrics_selected, + # ) + # st.session_state["initialized"] = True + # st.session_state["first_time"] = False + + # Channels List + channels_list = st.session_state["channels_list"] + + # ======================================================== # + # ========================== UI ========================== # + # ======================================================== # + + # # print(list(st.session_state.keys())) + main_header = st.columns((2, 2)) + sub_header = st.columns((1, 1, 1, 1)) + _scenario = st.session_state["scenario"] + + if "total_spends_change" not in st.session_state: + st.session_state.total_spends_change = 0 + + if "total_sales_change" not in st.session_state: + st.session_state.total_sales_change = 0 + + if "total_spends_change_abs" not in st.session_state: + st.session_state["total_spends_change_abs"] = numerize( + _scenario.actual_total_spends, 1 ) - st.session_state["initialized"] = True - st.session_state["first_time"] = False - - # initialize_data( - # panel=panel_selected, - # target_file=file_selected, - # updated_rcs=updated_rcs, - # metrics=metrics_selected, - # ) - # st.session_state["initialized"] = True - # st.session_state["first_time"] = False - - # Channels List - channels_list = st.session_state["channels_list"] - - # ======================================================== # - # ========================== UI ========================== # - # ======================================================== # - - # print(list(st.session_state.keys())) - main_header = st.columns((2, 2)) - sub_header = st.columns((1, 1, 1, 1)) - _scenario = st.session_state["scenario"] - - if "total_spends_change" not in st.session_state: - st.session_state.total_spends_change = 0 - - if "total_sales_change" not in st.session_state: - st.session_state.total_sales_change = 0 - - if "total_spends_change_abs" not in st.session_state: - st.session_state["total_spends_change_abs"] = numerize( - _scenario.actual_total_spends, 1 - ) - st.write(_scenario.actual_total_sales) - if "total_sales_change_abs" not in st.session_state: - st.session_state["total_sales_change_abs"] = numerize( - _scenario.actual_total_sales, 1 - ) - - if "total_spends_change_abs_slider" not in st.session_state: - st.session_state.total_spends_change_abs_slider = numerize( - _scenario.actual_total_spends, 1 - ) - - if "total_sales_change_abs_slider" not in st.session_state: - st.session_state.total_sales_change_abs_slider = numerize( - _scenario.actual_total_sales, 1 - ) - - if "lower_bound_key" not in st.session_state: - st.session_state["lower_bound_key"] = 10 - - if "upper_bound_key" not in st.session_state: - st.session_state["upper_bound_key"] = 10 - - st.write(_scenario.modified_total_sales) - header_df = pd.DataFrame(index=["Actual","Simulated","Change","Percent Change"],columns=["Spends","Prospects"]) - header_df["Spends"]["Actual"] = format_numbers(_scenario.actual_total_spends) - header_df["Spends"]["Simulated"] = format_numbers(_scenario.modified_total_spends) - header_df["Spends"]["Change"] = format_numbers(_scenario.delta_spends) #_scenario.modified_total_spends -_scenario.actual_total_spends - header_df["Spends"]["Percent Change"] = numerize(100*(_scenario.delta_spends/_scenario.actual_total_spends))+'%' - - header_df["Prospects"]["Actual"] = format_numbers_f(float(_scenario.actual_total_sales)) - header_df["Prospects"]["Simulated"] = format_numbers_f(float(_scenario.modified_total_sales)) - header_df["Prospects"]["Change"] = format_numbers_f(_scenario.delta_sales) - header_df["Prospects"]["Percent Change"] = numerize(100*(_scenario.delta_sales/_scenario.actual_total_sales),1)+'%' - - st.markdown("""
""", unsafe_allow_html=True) - _columns = st.columns((1, 1, 1, 1, 1)) - st.markdown( - """ - - """, - unsafe_allow_html=True - ) - with _columns[0]: - st.markdown(f'

{"Metrics"}

', unsafe_allow_html=True) - # generate_spending_header("Metric") - with _columns[1]: - st.markdown(f'

{"Actual"}

', unsafe_allow_html=True) - # generate_spending_header("Actual") - with _columns[2]: - st.markdown(f'

{"Simulated"}

', unsafe_allow_html=True) - # generate_spending_header("Optimised") - with _columns[3]: - st.markdown(f'

{"Change"}

', unsafe_allow_html=True) - # generate_spending_header("Change") - with _columns[4]: - st.markdown(f'

{"Change Percent"}

', unsafe_allow_html=True) - # generate_spending_header("Change Percent") - st.markdown("""
""", unsafe_allow_html=True) - - _columns = st.columns((1, 1, 1, 1, 1)) - with _columns[0]: - st.markdown("""

Spends

""",unsafe_allow_html=True) - # st.write("Spends") - with _columns[1]: - st.markdown(f"""

{header_df["Spends"]["Actual"]}

""",unsafe_allow_html=True) - # st.metric(label="", value=header_df["Spends"]["Actual"]) - with _columns[2]: - st.markdown(f"""

{header_df["Spends"]["Simulated"]}

""",unsafe_allow_html=True) - if _scenario.delta_spends < 0: - st.markdown( - """ - - """, - unsafe_allow_html=True - ) - else: - st.markdown( - """ - - """, - unsafe_allow_html=True - ) - # st.metric(label="", value=header_df["Spends"]["Simulated"]) - with _columns[3]: - - # Apply custom styles to text - st.markdown(f'

{header_df["Spends"]["Change"]}

', unsafe_allow_html=True) - with _columns[4]: - # Apply custom styles to text - # st.markdown(f'

', unsafe_allow_html=True) - st.markdown(f'

{header_df["Spends"]["Percent Change"]}

', unsafe_allow_html=True) - st.markdown( - """
""", - unsafe_allow_html=True, + # st.write(_scenario.actual_total_sales) + if "total_sales_change_abs" not in st.session_state: + st.session_state["total_sales_change_abs"] = numerize( + _scenario.actual_total_sales, 1 ) - _columns = st.columns((1, 1, 1, 1, 1)) - with _columns[0]: - # st.header("Prospects") - st.markdown("""

Prospects

""",unsafe_allow_html=True) - with _columns[1]: - st.markdown(f"""

{header_df["Prospects"]["Actual"]}

""",unsafe_allow_html=True) - # st.metric(label="", value=header_df["Prospects"]["Actual"]) - with _columns[2]: - st.markdown(f"""

{header_df["Prospects"]["Simulated"]}

""",unsafe_allow_html=True) - # st.metric(label="", value=header_df["Prospects"]["Simulated"]) - - if _scenario.delta_sales >= 0: - st.markdown( - """ - - """, - unsafe_allow_html=True - ) - else: - st.markdown("""""",unsafe_allow_html=True) - with _columns[3]: - # Apply custom styles to text - st.markdown(f'

{header_df["Prospects"]["Change"]}

', unsafe_allow_html=True) - # st.markdown(f'

{st.metric(label="", value=header_df["Prospects"]["Change"])}

', unsafe_allow_html=True) - # st.markdown(f'

{header_df["Prospects"]["Change"]}

', unsafe_allow_html=True) - - with _columns[4]: - # st.markdown(f'

', unsafe_allow_html=True) - # Apply custom styles to text - st.markdown(f'

{header_df["Prospects"]["Percent Change"]}

', unsafe_allow_html=True) - st.markdown( - """
""", - unsafe_allow_html=True, + + if "total_spends_change_abs_slider" not in st.session_state: + st.session_state.total_spends_change_abs_slider = numerize( + _scenario.actual_total_spends, 1 ) - - _columns = st.columns((1, 1, 1, 1, 1)) - ef1 = (_scenario.actual_total_spends/_scenario.actual_total_sales) - ef2 = (_scenario.modified_total_spends/_scenario.modified_total_sales) - with _columns[0]: - st.markdown("""

Cost Per Prospect

""",unsafe_allow_html=True) - # st.header("Cost Per Prospect") - with _columns[1]: - st.markdown(f"""

{'$ '+numerize(ef1,0)}

""",unsafe_allow_html=True) - # st.metric(label="", value='$ '+numerize(ef1,0)) - with _columns[2]: - st.markdown(f"""

{'$ '+numerize(ef2,0)}

""",unsafe_allow_html=True) - # st.metric(label="", value='$ '+numerize(ef2,0)) - - if ef2 <= ef1: - st.markdown( - """ - - """, - unsafe_allow_html=True - ) - else: - st.markdown( - """ - - """, - unsafe_allow_html=True - ) - with _columns[3]: + if "total_sales_change_abs_slider" not in st.session_state: + st.session_state.total_sales_change_abs_slider = numerize( + _scenario.actual_total_sales, 1 + ) + if "lower_bound_key" not in st.session_state: + st.session_state["lower_bound_key"] = 10 - # Apply custom styles to text - st.markdown(f'

{"$ "+numerize(ef2-ef1,0)}

', unsafe_allow_html=True) - # st.markdown(f'

{st.metric(label="", value=header_df["Prospects"]["Change"])}

', unsafe_allow_html=True) - # st.markdown(f'

{header_df["Prospects"]["Change"]}

', unsafe_allow_html=True) - - with _columns[4]: - # st.markdown(f'

', unsafe_allow_html=True) - # Apply custom styles to text - st.markdown(f'

{round((ef2-ef1)/ef1*100,2)}%

', unsafe_allow_html=True) - st.markdown("""
""",unsafe_allow_html=True) - - # st.markdown("""
""", unsafe_allow_html=True) - - # header_df.reset_index(inplace=True) - # # Function to color the index - # def highlight_index(s): - # return ['background-color: lightblue' for _ in s] - - # # Function to color the header - # def highlight_header(s): - # return ['background-color: lightgreen' for _ in s] - - # # Applying the styles - # styled_df = header_df.style \ - # .apply(highlight_index, axis=0, subset=pd.IndexSlice[:, :]) \ - # .set_table_styles({ - # 'A': [{'selector': 'th', 'props': [('background-color', 'lightgreen')]}], - # 'B': [{'selector': 'th', 'props': [('background-color', 'lightgreen')]}], - # 'C': [{'selector': 'th', 'props': [('background-color', 'lightgreen')]}] - # }) - - # # Function to apply arrows based on value - # def format_arrows(val): - # if val > 0: - # return '' # Green up arrow - # elif val < 0: - # return '' # Red down arrow - # return '' # No arrow for zero - - # # Function to format specific rows and exclude the first column - # def apply_row_formatting(df, rows): - # def format_cell(val, row_idx, col_idx): - # if row_idx in rows and col_idx > 0: # Exclude the first column (col_idx > 0) - # return format_arrows(val) - # return '' # No formatting for other cells + if "upper_bound_key" not in st.session_state: + st.session_state["upper_bound_key"] = 10 + + # st.write(_scenario.modified_total_sales) + header_df = pd.DataFrame(index=["Actual","Simulated","Change","Percent Change"],columns=["Spends","Prospects"]) + header_df["Spends"]["Actual"] = format_numbers(_scenario.actual_total_spends) + header_df["Spends"]["Simulated"] = format_numbers(_scenario.modified_total_spends) + header_df["Spends"]["Change"] = format_numbers(_scenario.delta_spends) #_scenario.modified_total_spends -_scenario.actual_total_spends + header_df["Spends"]["Percent Change"] = numerize(100*(_scenario.delta_spends/_scenario.actual_total_spends))+'%' - # return df.style.apply(lambda x: [format_cell(val, i, col) for i, (val, col) in enumerate(zip(x, range(len(x))))], axis=1) - - # # Apply formatting to 3rd and 4th rows (index 2 and 3) - # styled_df = apply_row_formatting(header_df, [2, 3]) - - # st.markdown(styled_df.to_html(escape=False), unsafe_allow_html=True) - - # st.markdown(header_df.style.set_table_styles - # ([{'selector': 'th', - # 'props': [('background-color', '#D3D3D3'), - # ('font-size', '25px')]}, - # { - # 'selector' : 'td:first-child', - # 'props' : [('background-color', '#D3D3D3'), - # ('font-size', '25px')] - # } - # , - # {'selector': 'tbody td', - # 'props': [('font-size', '20px')]} - - # ]).to_html(),unsafe_allow_html=True) - + header_df["Prospects"]["Actual"] = format_numbers_f(float(_scenario.actual_total_sales)) + header_df["Prospects"]["Simulated"] = format_numbers_f(float(_scenario.modified_total_sales)) + header_df["Prospects"]["Change"] = format_numbers_f(_scenario.delta_sales) + header_df["Prospects"]["Percent Change"] = numerize(100*(_scenario.delta_sales/_scenario.actual_total_sales),1)+'%' + + st.markdown("""
""", unsafe_allow_html=True) + _columns = st.columns((1, 1, 1, 1, 1)) + st.markdown( + """ + + """, + unsafe_allow_html=True + ) + with _columns[0]: + st.markdown(f'

{"Metrics"}

', unsafe_allow_html=True) + # generate_spending_header("Metric") + with _columns[1]: + st.markdown(f'

{"Actual"}

', unsafe_allow_html=True) + # generate_spending_header("Actual") + with _columns[2]: + st.markdown(f'

{"Simulated"}

', unsafe_allow_html=True) + # generate_spending_header("Optimised") + with _columns[3]: + st.markdown(f'

{"Change"}

', unsafe_allow_html=True) + # generate_spending_header("Change") + with _columns[4]: + st.markdown(f'

{"Change Percent"}

', unsafe_allow_html=True) + # generate_spending_header("Change Percent") + st.markdown("""
""", unsafe_allow_html=True) + _columns = st.columns((1, 1, 1, 1, 1)) + with _columns[0]: + st.markdown("""

Spends

""",unsafe_allow_html=True) + # st.write("Spends") + with _columns[1]: + st.markdown(f"""

{header_df["Spends"]["Actual"]}

""",unsafe_allow_html=True) + # st.metric(label="", value=header_df["Spends"]["Actual"]) + with _columns[2]: + st.markdown(f"""

{header_df["Spends"]["Simulated"]}

""",unsafe_allow_html=True) + if _scenario.delta_spends < 0: + st.markdown( + """ + + """, + unsafe_allow_html=True + ) + else: + st.markdown( + """ + + """, + unsafe_allow_html=True + ) + # st.metric(label="", value=header_df["Spends"]["Simulated"]) + with _columns[3]: + + # Apply custom styles to text + st.markdown(f'

{header_df["Spends"]["Change"]}

', unsafe_allow_html=True) + with _columns[4]: + # Apply custom styles to text + # st.markdown(f'

', unsafe_allow_html=True) + st.markdown(f'

{header_df["Spends"]["Percent Change"]}

', unsafe_allow_html=True) + st.markdown( + """
""", + unsafe_allow_html=True, + ) + _columns = st.columns((1, 1, 1, 1, 1)) + with _columns[0]: + # st.header("Prospects") + st.markdown("""

Prospects

""",unsafe_allow_html=True) + with _columns[1]: + st.markdown(f"""

{header_df["Prospects"]["Actual"]}

""",unsafe_allow_html=True) + # st.metric(label="", value=header_df["Prospects"]["Actual"]) + with _columns[2]: + st.markdown(f"""

{header_df["Prospects"]["Simulated"]}

""",unsafe_allow_html=True) + # st.metric(label="", value=header_df["Prospects"]["Simulated"]) + + if _scenario.delta_sales >= 0: + st.markdown( + """ + + """, + unsafe_allow_html=True + ) + else: + st.markdown("""""",unsafe_allow_html=True) + with _columns[3]: + # Apply custom styles to text + st.markdown(f'

{header_df["Prospects"]["Change"]}

', unsafe_allow_html=True) + # st.markdown(f'

{st.metric(label="", value=header_df["Prospects"]["Change"])}

', unsafe_allow_html=True) + # st.markdown(f'

{header_df["Prospects"]["Change"]}

', unsafe_allow_html=True) - # styled_df = header_df.style.apply(highlight_first_col, axis=1) + with _columns[4]: + # st.markdown(f'

', unsafe_allow_html=True) + # Apply custom styles to text + st.markdown(f'

{header_df["Prospects"]["Percent Change"]}

', unsafe_allow_html=True) + st.markdown( + """
""", + unsafe_allow_html=True, + ) + + _columns = st.columns((1, 1, 1, 1, 1)) + ef1 = (_scenario.actual_total_spends/_scenario.actual_total_sales) + ef2 = (_scenario.modified_total_spends/_scenario.modified_total_sales) + with _columns[0]: + st.markdown("""

Cost Per Prospect

""",unsafe_allow_html=True) + # st.header("Cost Per Prospect") + with _columns[1]: + st.markdown(f"""

{'$ '+numerize(ef1,0)}

""",unsafe_allow_html=True) + # st.metric(label="", value='$ '+numerize(ef1,0)) + with _columns[2]: + st.markdown(f"""

{'$ '+numerize(ef2,0)}

""",unsafe_allow_html=True) + # st.metric(label="", value='$ '+numerize(ef2,0)) - # st.table(styled_df) + if ef2 <= ef1: + st.markdown( + """ + + """, + unsafe_allow_html=True + ) + else: + st.markdown( + """ + + """, + unsafe_allow_html=True + ) + with _columns[3]: + + + # Apply custom styles to text + st.markdown(f'

{"$ "+numerize(ef2-ef1,0)}

', unsafe_allow_html=True) + # st.markdown(f'

{st.metric(label="", value=header_df["Prospects"]["Change"])}

', unsafe_allow_html=True) + # st.markdown(f'

{header_df["Prospects"]["Change"]}

', unsafe_allow_html=True) - # with main_header[0]: - # st.subheader("Actual") + with _columns[4]: + # st.markdown(f'

', unsafe_allow_html=True) + # Apply custom styles to text + st.markdown(f'

{round((ef2-ef1)/ef1*100,2)}%

', unsafe_allow_html=True) + st.markdown("""
""",unsafe_allow_html=True) + + # st.markdown("""
""", unsafe_allow_html=True) + + # header_df.reset_index(inplace=True) + # # Function to color the index + # def highlight_index(s): + # return ['background-color: lightblue' for _ in s] + + # # Function to color the header + # def highlight_header(s): + # return ['background-color: lightgreen' for _ in s] + + # # Applying the styles + # styled_df = header_df.style \ + # .apply(highlight_index, axis=0, subset=pd.IndexSlice[:, :]) \ + # .set_table_styles({ + # 'A': [{'selector': 'th', 'props': [('background-color', 'lightgreen')]}], + # 'B': [{'selector': 'th', 'props': [('background-color', 'lightgreen')]}], + # 'C': [{'selector': 'th', 'props': [('background-color', 'lightgreen')]}] + # }) + + # # Function to apply arrows based on value + # def format_arrows(val): + # if val > 0: + # return '' # Green up arrow + # elif val < 0: + # return '' # Red down arrow + # return '' # No arrow for zero + + # # Function to format specific rows and exclude the first column + # def apply_row_formatting(df, rows): + # def format_cell(val, row_idx, col_idx): + # if row_idx in rows and col_idx > 0: # Exclude the first column (col_idx > 0) + # return format_arrows(val) + # return '' # No formatting for other cells + + # return df.style.apply(lambda x: [format_cell(val, i, col) for i, (val, col) in enumerate(zip(x, range(len(x))))], axis=1) - # with main_header[-1]: - # st.subheader("Simulated") + # # Apply formatting to 3rd and 4th rows (index 2 and 3) + # styled_df = apply_row_formatting(header_df, [2, 3]) - # with sub_header[0]: - # st.metric(label="Spends", value=format_numbers(_scenario.actual_total_spends)) + # st.markdown(styled_df.to_html(escape=False), unsafe_allow_html=True) + + # st.markdown(header_df.style.set_table_styles + # ([{'selector': 'th', + # 'props': [('background-color', '#D3D3D3'), + # ('font-size', '25px')]}, + # { + # 'selector' : 'td:first-child', + # 'props' : [('background-color', '#D3D3D3'), + # ('font-size', '25px')] + # } + # , + # {'selector': 'tbody td', + # 'props': [('font-size', '20px')]} + + # ]).to_html(),unsafe_allow_html=True) + + + + # styled_df = header_df.style.apply(highlight_first_col, axis=1) + + # st.table(styled_df) + + + # with main_header[0]: + # st.subheader("Actual") + + # with main_header[-1]: + # st.subheader("Simulated") + + # with sub_header[0]: + # st.metric(label="Spends", value=format_numbers(_scenario.actual_total_spends)) + + # with sub_header[1]: + # st.metric( + # label=target, + # value=format_numbers_f( + # float(_scenario.actual_total_sales) + # ), + # ) + + # with sub_header[2]: + # st.metric( + # label="Spends", + # value=format_numbers(_scenario.modified_total_spends), + # delta=numerize(_scenario.delta_spends, 1), + # ) + + # with sub_header[3]: + # st.metric( + # label=target, + # value=format_numbers_f( + # float(_scenario.modified_total_sales) + # ), + # delta=numerize(_scenario.delta_sales, 1), + # ) + + with st.expander("Channel Spends Simulator", expanded=True): + _columns1 = st.columns((1.5, 1.5, 1,1)) + with _columns1[0]: + optimization_selection = st.selectbox( + "Optimize", options=["Media Spends", target], key="optimization_key" + ) - # with sub_header[1]: - # st.metric( - # label=target, - # value=format_numbers_f( - # float(_scenario.actual_total_sales) - # ), - # ) + with _columns1[1]: + # st.markdown("#") + # if st.checkbox( + # label="Optimize all Channels", + # key="optimze_all_channels", + # value=False, + # # on_change=select_all_channels_for_optimization, + # ): + # select_all_channels_for_optimization() - # with sub_header[2]: - # st.metric( - # label="Spends", - # value=format_numbers(_scenario.modified_total_spends), - # delta=numerize(_scenario.delta_spends, 1), - # ) + st.checkbox( + label="Optimize all Channels", + key="optimze_all_channels", + value=False, + on_change=select_all_channels_for_optimization, + ) - # with sub_header[3]: - # st.metric( - # label=target, - # value=format_numbers_f( - # float(_scenario.modified_total_sales) - # ), - # delta=numerize(_scenario.delta_sales, 1), - # ) + with _columns1[2]: + # st.button( + # "Optimize", + # on_click=optimize, + # args=(st.session_state["optimization_key"]), + # use_container_width=True, + # ) - with st.expander("Channel Spends Simulator", expanded=True): - _columns1 = st.columns((1.5, 1.5, 1,1)) - with _columns1[0]: - optimization_selection = st.selectbox( - "Optimize", options=["Media Spends", target], key="optimization_key" - ) + optimize_placeholder = st.empty() - with _columns1[1]: - # st.markdown("#") - # if st.checkbox( - # label="Optimize all Channels", - # key="optimze_all_channels", - # value=False, - # # on_change=select_all_channels_for_optimization, - # ): - # select_all_channels_for_optimization() - - st.checkbox( - label="Optimize all Channels", - key="optimze_all_channels", - value=False, - on_change=select_all_channels_for_optimization, - ) + with _columns1[3]: + # st.markdown("#") + st.button( + "Reset", + on_click=reset_scenario, + args=(panel_selected, file_selected, updated_rcs), + # use_container_width=True, + ) + # st.write(target) - with _columns1[2]: - # st.button( - # "Optimize", - # on_click=optimize, - # args=(st.session_state["optimization_key"]), - # use_container_width=True, - # ) - - optimize_placeholder = st.empty() - - with _columns1[3]: - # st.markdown("#") - st.button( - "Reset", - on_click=reset_scenario, - args=(panel_selected, file_selected, updated_rcs), - # use_container_width=True, - ) - # st.write(target) + _columns2 = st.columns((2, 2, 2,2)) + if st.session_state["optimization_key"] == "Media Spends": + with _columns2[0]: + spend_input = st.text_input( + "Absolute", + key="total_spends_change_abs", + # label_visibility="collapsed", + on_change=update_all_spends_abs, + ) - _columns2 = st.columns((2, 2, 2,2)) - if st.session_state["optimization_key"] == "Media Spends": - with _columns2[0]: - spend_input = st.text_input( - "Absolute", - key="total_spends_change_abs", - # label_visibility="collapsed", - on_change=update_all_spends_abs, - ) + with _columns2[1]: + st.number_input( + "Percent Change", + key="total_spends_change", + min_value=-50.00, + max_value=50.00, + step=1.00, + value=0.00, + on_change=update_spends, + ) - with _columns2[1]: - st.number_input( - "Percent Change", - key="total_spends_change", - min_value=-50.00, - max_value=50.00, - step=1.00, - value=0.00, - on_change=update_spends, - ) + with _columns2[2]: + overall_lower_bound = st.number_input( + "Overall Lower Bound for Spends", + value = 50 + # key = overall_lower_bound, + # on_change=partial(update_data_bound_min_overall) + ) + with _columns2[3]: + overall_upper_bound = st.number_input( + "Overall Upper Bound for Spends", + value = 50 + # key = overall_upper_bound, + # on_change=partial(update_data_bound_max_overall) + ) + + min_value = round(_scenario.actual_total_spends * (1-overall_lower_bound/100)) + max_value = round(_scenario.actual_total_spends * (1-overall_upper_bound/100)) + st.session_state["total_spends_change_abs_slider_options"] = [ + numerize(value, 1) + for value in range(min_value, max_value + 1, int(1e4)) + ] + + # st.select_slider( + # "Absolute Slider", + # options=st.session_state["total_spends_change_abs_slider_options"], + # key="total_spends_change_abs_slider", + # on_change=update_all_spends_abs_slider, + # ) + + elif st.session_state["optimization_key"] == target: + # st.write(target) + with _columns2[0]: + sales_input = st.text_input( + "Absolute", + key="total_sales_change_abs", + on_change=update_sales_abs, + ) - with _columns2[2]: - overall_lower_bound = st.number_input( + with _columns2[1]: + st.number_input( + "Percent Change", + key="total_sales_change", + min_value=-50.00, + max_value=50.00, + step=1.00, + + value=0.00, + on_change=update_sales, + ) + with _columns2[2]: + overall_lower_bound = st.number_input( "Overall Lower Bound for Spends", - value = 50 - # key = overall_lower_bound, - # on_change=partial(update_data_bound_min_overall) + value = 50 ) - with _columns2[3]: - overall_upper_bound = st.number_input( + with _columns2[3]: + + overall_upper_bound = st.number_input( "Overall Upper Bound for Spends", - value = 50 - # key = overall_upper_bound, - # on_change=partial(update_data_bound_max_overall) + value = 50 ) - min_value = round(_scenario.actual_total_spends * (1-overall_lower_bound/100)) - max_value = round(_scenario.actual_total_spends * (1-overall_upper_bound/100)) - st.session_state["total_spends_change_abs_slider_options"] = [ - numerize(value, 1) - for value in range(min_value, max_value + 1, int(1e4)) - ] - - # st.select_slider( - # "Absolute Slider", - # options=st.session_state["total_spends_change_abs_slider_options"], - # key="total_spends_change_abs_slider", - # on_change=update_all_spends_abs_slider, - # ) - - elif st.session_state["optimization_key"] == target: - # st.write(target) - with _columns2[0]: - sales_input = st.text_input( - "Absolute", - key="total_sales_change_abs", - on_change=update_sales_abs, - ) - - with _columns2[1]: - st.number_input( - "Percent Change", - key="total_sales_change", - min_value=-50.00, - max_value=50.00, - step=1.00, - - value=0.00, - on_change=update_sales, - ) - with _columns2[2]: - overall_lower_bound = st.number_input( - "Overall Lower Bound for Spends", - value = 50 - ) - with _columns2[3]: - - overall_upper_bound = st.number_input( - "Overall Upper Bound for Spends", - value = 50 - ) - - min_value = round(_scenario.actual_total_sales * (1-overall_lower_bound/100)) - max_value = round(_scenario.actual_total_sales * (1+overall_upper_bound/100)) - # st.write(min_value) - # st.write(max_value) - # for value in range(min_value, max_value + 1, int(100)): - # st.write(numerize(value, 1)) - # st.session_state["total_sales_change_abs_slider_options"] = [ - # numerize(value, 1) - # for value in range(min_value, max_value + 1, int(100)) - # ] - - # st.select_slider( - # "Absolute Slider", - # options=st.session_state["total_sales_change_abs_slider_options"], - # key="total_sales_change_abs_slider", - # on_change=update_sales_abs_slider, - # # value=numerize(min_value, 1) - # ) + min_value = round(_scenario.actual_total_sales * (1-overall_lower_bound/100)) + max_value = round(_scenario.actual_total_sales * (1+overall_upper_bound/100)) + # st.write(min_value) + # st.write(max_value) + # for value in range(min_value, max_value + 1, int(100)): + # st.write(numerize(value, 1)) + # st.session_state["total_sales_change_abs_slider_options"] = [ + # numerize(value, 1) + # for value in range(min_value, max_value + 1, int(100)) + # ] + + # st.select_slider( + # "Absolute Slider", + # options=st.session_state["total_sales_change_abs_slider_options"], + # key="total_sales_change_abs_slider", + # on_change=update_sales_abs_slider, + # # value=numerize(min_value, 1) + # ) - if ( - not st.session_state["allow_sales_update"] - and optimization_selection == target - ): - st.warning("Invalid Input") + if ( + not st.session_state["allow_sales_update"] + and optimization_selection == target + ): + st.warning("Invalid Input") - if ( - not st.session_state["allow_spends_update"] - and optimization_selection == "Media Spends" - ): - st.warning("Invalid Input") + if ( + not st.session_state["allow_spends_update"] + and optimization_selection == "Media Spends" + ): + st.warning("Invalid Input") - - status_placeholder = st.empty() - - # if optimize_placeholder.button("Optimize", use_container_width=True): - # optimize(st.session_state["optimization_key"], status_placeholder) - # st.rerun() + + status_placeholder = st.empty() - optimize_placeholder.button( - "Optimize", - on_click=optimize, - args=(st.session_state["optimization_key"], status_placeholder), - # use_container_width=True, - ) + # if optimize_placeholder.button("Optimize", use_container_width=True): + # optimize(st.session_state["optimization_key"], status_placeholder) + # st.rerun() - st.markdown("""
""", unsafe_allow_html=True) - _columns = st.columns((1.5,2.5,2,2, 1)) - with _columns[0]: - generate_spending_header("Channel") - with _columns[1]: - generate_spending_header("Spends Input") - with _columns[2]: - generate_spending_header("Spends") - with _columns[3]: - generate_spending_header(target) - with _columns[4]: - generate_spending_header("Optimize") - - st.markdown("""
""", unsafe_allow_html=True) + optimize_placeholder.button( + "Optimize", + on_click=optimize, + args=(st.session_state["optimization_key"], status_placeholder), + # use_container_width=True, + ) - if "acutual_predicted" not in st.session_state: - st.session_state["acutual_predicted"] = { - "Channel_name": [], - "Actual_spend": [], - "Optimized_spend": [], - "Delta": [], - "New_sales":[], - "Old_sales":[] - } - for i, channel_name in enumerate(channels_list): - # st.write(channel_name) - _channel_class = st.session_state["scenario"].channels[channel_name] - # st.write(st.session_state["scenario"].channels[channel_name]) - # st.write(st.session_state["scenario"].channels[channel_name].actual_total_sales) - # st.write(st.session_state["scenario"].channels[channel_name].actual_total_spends) - # st.write(st.session_state["scenario"].channels[channel_name].modified_total_sales) - # st.write(st.session_state["scenario"].channels[channel_name].modified_total_spends) - # st.write(st.session_state["scenario"].channels[channel_name].bounds) - # st.write(st.session_state["scenario"].channels[channel_name].channel_bounds_min) + st.markdown("""
""", unsafe_allow_html=True) _columns = st.columns((1.5,2.5,2,2, 1)) with _columns[0]: - st.write(channel_name_formating(channel_name)) - bin_placeholder = st.container() - + generate_spending_header("Channel") with _columns[1]: - channel_bounds = _channel_class.bounds - # st.write(channel_bounds) - channel_spends = float(_channel_class.actual_total_spends) - channel_bounds_min = float(_channel_class.channel_bounds_min) - channel_bounds_max = float(_channel_class.channel_bounds_max) - min_value = float((1 - channel_bounds_min / 100) * channel_spends) - max_value = float((1 + channel_bounds_max / 100) * channel_spends) - # st.write(channel_spends) - # st.write(min_value) - # st.write(max_value) - ##print(st.session_state[channel_name]) - - _columns_min = st.columns(2) - with _columns_min[0]: - spend_input = st.text_input( - "Absolute", - key=channel_name, - # label_visibility="collapsed", - on_change=partial(update_data, channel_name), + generate_spending_header("Spends Input") + with _columns[2]: + generate_spending_header("Spends") + with _columns[3]: + generate_spending_header(target) + with _columns[4]: + generate_spending_header("Optimize") + + st.markdown("""
""", unsafe_allow_html=True) + + if "acutual_predicted" not in st.session_state: + st.session_state["acutual_predicted"] = { + "Channel_name": [], + "Actual_spend": [], + "Optimized_spend": [], + "Delta": [], + "New_sales":[], + "Old_sales":[] + } + for i, channel_name in enumerate(channels_list): + # st.write(channel_name) + _channel_class = st.session_state["scenario"].channels[channel_name] + # st.write(st.session_state["scenario"].channels[channel_name]) + # st.write(st.session_state["scenario"].channels[channel_name].actual_total_sales) + # st.write(st.session_state["scenario"].channels[channel_name].actual_total_spends) + # st.write(st.session_state["scenario"].channels[channel_name].modified_total_sales) + # st.write(st.session_state["scenario"].channels[channel_name].modified_total_spends) + # st.write(st.session_state["scenario"].channels[channel_name].bounds) + # st.write(st.session_state["scenario"].channels[channel_name].channel_bounds_min) + + _columns = st.columns((1.5,2.5,2,2, 1)) + response_curve_params = pd.read_excel("response_curves_parameters.xlsx",index_col = "channel") + param_dicts = {col: response_curve_params[col].to_dict() for col in response_curve_params.columns} + + with _columns[0]: + st.write(channel_name_formating(channel_name)) + bin_placeholder = st.container() + + with _columns[1]: + channel_bounds = _channel_class.bounds + # st.write(channel_bounds) + channel_spends = float(_channel_class.actual_total_spends) + channel_bounds_min = float(_channel_class.channel_bounds_min) + channel_bounds_max = float(_channel_class.channel_bounds_max) + min_value = float((1 - channel_bounds_min / 100) * channel_spends) + max_value = float((1 + channel_bounds_max / 100) * channel_spends) + # st.write(channel_spends) + # st.write(min_value) + # st.write(max_value) + ### print(st.session_state[channel_name]) + + _columns_min = st.columns(2) + with _columns_min[0]: + spend_input = st.text_input( + "Absolute", + key=channel_name, + # label_visibility="collapsed", + on_change=partial(update_data, channel_name), + ) + channel_name_lower_bound = f"{channel_name}_lower_bound" + + if channel_name_lower_bound not in st.session_state: + st.session_state[channel_name_lower_bound] = str(round(param_dicts["x_min"][channel_name]*10400/param_dicts["current_spends"][channel_name])) + # st.write(st.session_state[channel_name_lower_bound]) + channel_bounds_min = st.text_input( + "Lower Bound Percentage", + key = channel_name_lower_bound, + on_change=partial(update_data_bound_min,channel_name) + ) + # st.write(st.session_state[channel_name_lower_bound]) + if not validate_input(spend_input): + st.error("Invalid input") + + channel_name_current = f"{channel_name}_change" + with _columns_min[1]: + st.number_input( + "Percent Change", + key=channel_name_current, + step=1.00,value=0.00, + on_change=partial(update_data_by_percent, channel_name), + ) + channel_name_upper_bound = f"{channel_name}_upper_bound" + + if channel_name_upper_bound not in st.session_state: + st.session_state[channel_name_upper_bound] = str(10) + + channel_bounds_max = st.text_input( + "Upper Bound Percentage", + key = channel_name_upper_bound, + on_change=partial(update_data_bound_max,channel_name) + ) + + with _columns[2]: + # spends + current_channel_spends = float( + _channel_class.modified_total_spends + * _channel_class.conversion_rate ) - channel_name_lower_bound = f"{channel_name}_lower_bound" - - if channel_name_lower_bound not in st.session_state: - st.session_state[channel_name_lower_bound] = str(10) - # st.write(st.session_state[channel_name_lower_bound]) - channel_bounds_min = st.text_input( - "Lower Bound Percentage", - key = channel_name_lower_bound, - on_change=partial(update_data_bound_min,channel_name) + actual_channel_spends = float( + _channel_class.actual_total_spends * _channel_class.conversion_rate ) - # st.write(st.session_state[channel_name_lower_bound]) - if not validate_input(spend_input): - st.error("Invalid input") - - channel_name_current = f"{channel_name}_change" - with _columns_min[1]: - st.number_input( - "Percent Change", - key=channel_name_current, - step=1.00,value=0.00, - on_change=partial(update_data_by_percent, channel_name), + spends_delta = float( + _channel_class.delta_spends * _channel_class.conversion_rate ) - channel_name_upper_bound = f"{channel_name}_upper_bound" - - if channel_name_upper_bound not in st.session_state: - st.session_state[channel_name_upper_bound] = str(10) - - channel_bounds_max = st.text_input( - "Upper Bound Percentage", - key = channel_name_upper_bound, - on_change=partial(update_data_bound_max,channel_name) + st.session_state["acutual_predicted"]["Channel_name"].append( + channel_name + ) + st.session_state["acutual_predicted"]["Actual_spend"].append( + actual_channel_spends + ) + st.session_state["acutual_predicted"]["Optimized_spend"].append( + current_channel_spends + ) + st.session_state["acutual_predicted"]["Delta"].append(spends_delta) + _spend_cols = st.columns(2) + with _spend_cols[0]: + # st.write("Actual") + st.markdown(f'

Actual

{format_numbers(actual_channel_spends)}

', unsafe_allow_html=True) + # st.metric( + # label="Actual Spends", + # value=format_numbers(actual_channel_spends), + # # delta=numerize(spends_delta, 1), + # # label_visibility="collapsed", + # ) + + # st.write("Actual") + st.markdown(f'

Change

{format_numbers(spends_delta)}

', unsafe_allow_html=True) + # st.markdown(f'

{format_numbers(spends_delta)}%

', unsafe_allow_html=True) + + # st.metric( + # label="Change", + # value= format_numbers_f(spends_delta), + # delta=numerize(spends_delta, 1), + # # label_visibility="collapsed", + # ) + with _spend_cols[1]: + st.markdown(f'

Simulated

{format_numbers(current_channel_spends)}

', unsafe_allow_html=True) + st.markdown(f'

Percent

{numerize(( spends_delta/actual_channel_spends)*100,0) +"%"}

', unsafe_allow_html=True) + # st.metric( + # label="Simulated Spends", + # value=format_numbers(current_channel_spends), + # # delta=numerize(spends_delta, 1), + # # label_visibility="collapsed", + # ) + + # st.metric( + # label="Percent Change", + # value= numerize(( spends_delta/actual_channel_spends)*100,0) +"%", + # delta=numerize(spends_delta, 1), + # # label_visibility="collapsed", + # ) + + + with _columns[3]: + # sales + current_channel_sales = float(_channel_class.modified_total_sales) + actual_channel_sales = float(_channel_class.actual_total_sales) + sales_delta = float(_channel_class.delta_sales) + st.session_state["acutual_predicted"]["Old_sales"].append(actual_channel_sales) + st.session_state["acutual_predicted"]["New_sales"].append(current_channel_sales) + #st.write(actual_channel_sales) + + _prospect_cols = st.columns(2) + with _prospect_cols[0]: + # st.write("Actual") + st.markdown(f'

Actual

{format_numbers(actual_channel_sales)}

', unsafe_allow_html=True) + st.markdown(f'

Change

{format_numbers(sales_delta)}

', unsafe_allow_html=True) + + # st.metric( + # # target, + # label="Actual Prospects", + # value= format_numbers_f(actual_channel_sales), + # # delta=numerize(sales_delta, 1), + # # label_visibility="collapsed", + # ) + # st.metric( + # label="Change", + # value= format_numbers_f(_channel_class.delta_sales), + # delta=numerize(sales_delta, 1), + # # label_visibility="collapsed", + # ) + with _prospect_cols[1]: + st.markdown(f'

Simulated

{format_numbers(current_channel_sales)}

', unsafe_allow_html=True) + st.markdown(f'

Percent

{numerize(( _channel_class.delta_sales/actual_channel_sales)*100,0) +"%"}

', unsafe_allow_html=True) + + # st.metric( + # label="Simulated Prospects", + # value= format_numbers_f(current_channel_sales), + # # delta=numerize(sales_delta, 1), + # # label_visibility="collapsed", + # ) + + # st.metric( + # label="Percent Change", + # value= numerize((_channel_class.delta_sales/actual_channel_sales)*100,0) +"%", + # delta=numerize(sales_delta, 1), + # # label_visibility="collapsed", + # ) + + + + with _columns[4]: + + # if st.checkbox( + # label="select for optimization", + # key=f"{channel_name}_selected", + # value=False, + # # on_change=partial(select_channel_for_optimization, channel_name), + # label_visibility="collapsed", + # ): + # select_channel_for_optimization(channel_name) + + st.checkbox( + label="select for optimization", + key=f"{channel_name}_selected", + value=False, + on_change=partial(select_channel_for_optimization, channel_name), + label_visibility="collapsed", ) - with _columns[2]: - # spends - current_channel_spends = float( - _channel_class.modified_total_spends - * _channel_class.conversion_rate - ) - actual_channel_spends = float( - _channel_class.actual_total_spends * _channel_class.conversion_rate - ) - spends_delta = float( - _channel_class.delta_spends * _channel_class.conversion_rate - ) - st.session_state["acutual_predicted"]["Channel_name"].append( - channel_name - ) - st.session_state["acutual_predicted"]["Actual_spend"].append( - actual_channel_spends - ) - st.session_state["acutual_predicted"]["Optimized_spend"].append( - current_channel_spends + st.markdown( + """
""", + unsafe_allow_html=True, ) - st.session_state["acutual_predicted"]["Delta"].append(spends_delta) - _spend_cols = st.columns(2) - with _spend_cols[0]: - # st.write("Actual") - st.markdown(f'

Actual

{format_numbers(actual_channel_spends)}

', unsafe_allow_html=True) - # st.metric( - # label="Actual Spends", - # value=format_numbers(actual_channel_spends), - # # delta=numerize(spends_delta, 1), - # # label_visibility="collapsed", - # ) - # st.write("Actual") - st.markdown(f'

Change

{format_numbers(spends_delta)}

', unsafe_allow_html=True) - # st.markdown(f'

{format_numbers(spends_delta)}%

', unsafe_allow_html=True) + # Bins + col = channels_list[i] + x_actual = st.session_state["scenario"].channels[col].actual_spends + x_modified = st.session_state["scenario"].channels[col].modified_spends + # x_modified_total = 0 + # for c in channels_list: + # # st.write(c) + # # st.write(st.session_state["scenario"].channels[c].modified_spends) + # x_modified_total = x_modified_total + st.session_state["scenario"].channels[c].modified_spends.sum() + # st.write(x_modified_total) + + x_total = x_modified.sum() + power = np.ceil(np.log(x_actual.max()) / np.log(10)) - 3 - # st.metric( - # label="Change", - # value= format_numbers_f(spends_delta), - # delta=numerize(spends_delta, 1), - # # label_visibility="collapsed", - # ) - with _spend_cols[1]: - st.markdown(f'

Simulated

{format_numbers(current_channel_spends)}

', unsafe_allow_html=True) - st.markdown(f'

Percent

{numerize(( spends_delta/actual_channel_spends)*100,0) +"%"}

', unsafe_allow_html=True) - # st.metric( - # label="Simulated Spends", - # value=format_numbers(current_channel_spends), - # # delta=numerize(spends_delta, 1), - # # label_visibility="collapsed", - # ) + updated_rcs_key = f"{metrics_selected}#@{panel_selected}#@{channel_name}" - # st.metric( - # label="Percent Change", - # value= numerize(( spends_delta/actual_channel_spends)*100,0) +"%", - # delta=numerize(spends_delta, 1), - # # label_visibility="collapsed", - # ) + # if updated_rcs and updated_rcs_key in list(updated_rcs.keys()): + # K = updated_rcs[updated_rcs_key]["K"] + # b = updated_rcs[updated_rcs_key]["b"] + # a = updated_rcs[updated_rcs_key]["a"] + # x0 = updated_rcs[updated_rcs_key]["x0"] + # else: + # K = st.session_state["rcs"][col]["K"] + # b = st.session_state["rcs"][col]["b"] + # a = st.session_state["rcs"][col]["a"] + # x0 = st.session_state["rcs"][col]["x0"] - - with _columns[3]: - # sales - current_channel_sales = float(_channel_class.modified_total_sales) - actual_channel_sales = float(_channel_class.actual_total_sales) - sales_delta = float(_channel_class.delta_sales) - st.session_state["acutual_predicted"]["Old_sales"].append(actual_channel_sales) - st.session_state["acutual_predicted"]["New_sales"].append(current_channel_sales) - #st.write(actual_channel_sales) - - _prospect_cols = st.columns(2) - with _prospect_cols[0]: - # st.write("Actual") - st.markdown(f'

Actual

{format_numbers(actual_channel_sales)}

', unsafe_allow_html=True) - st.markdown(f'

Change

{format_numbers(sales_delta)}

', unsafe_allow_html=True) - - # st.metric( - # # target, - # label="Actual Prospects", - # value= format_numbers_f(actual_channel_sales), - # # delta=numerize(sales_delta, 1), - # # label_visibility="collapsed", - # ) - # st.metric( - # label="Change", - # value= format_numbers_f(_channel_class.delta_sales), - # delta=numerize(sales_delta, 1), - # # label_visibility="collapsed", - # ) - with _prospect_cols[1]: - st.markdown(f'

Simulated

{format_numbers(current_channel_sales)}

', unsafe_allow_html=True) - st.markdown(f'

Percent

{numerize(( _channel_class.delta_sales/actual_channel_sales)*100,0) +"%"}

', unsafe_allow_html=True) - - # st.metric( - # label="Simulated Prospects", - # value= format_numbers_f(current_channel_sales), - # # delta=numerize(sales_delta, 1), - # # label_visibility="collapsed", - # ) + # x_plot = np.linspace(0, 5 * x_actual.sum(), 200) - # st.metric( - # label="Percent Change", - # value= numerize((_channel_class.delta_sales/actual_channel_sales)*100,0) +"%", - # delta=numerize(sales_delta, 1), - # # label_visibility="collapsed", - # ) + # # Append current_channel_spends to the end of x_plot + # x_plot = np.append(x_plot, current_channel_spends) - + # x, y, marginal_roi = [], [], [] + # for x_p in x_plot: + # x.append(x_p * x_actual / x_actual.sum()) - with _columns[4]: + # for index in range(len(x_plot)): + # y.append(s_curve(x[index] / 10**power, K, b, a, x0)) - # if st.checkbox( - # label="select for optimization", - # key=f"{channel_name}_selected", - # value=False, - # # on_change=partial(select_channel_for_optimization, channel_name), - # label_visibility="collapsed", - # ): - # select_channel_for_optimization(channel_name) + # for index in range(len(x_plot)): + # marginal_roi.append( + # a * y[index] * (1 - y[index] / np.maximum(K, np.finfo(float).eps)) + # ) - st.checkbox( - label="select for optimization", - key=f"{channel_name}_selected", - value=False, - on_change=partial(select_channel_for_optimization, channel_name), - label_visibility="collapsed", - ) + # x = ( + # np.sum(x, axis=1) + # * st.session_state["scenario"].channels[col].conversion_rate + # ) + # y = np.sum(y, axis=1) + # marginal_roi = ( + # np.average(marginal_roi, axis=1) + # / st.session_state["scenario"].channels[col].conversion_rate + # ) - st.markdown( - """
""", - unsafe_allow_html=True, - ) + # roi = y / np.maximum(x, np.finfo(float).eps) + # # roi = (y/np.sum(y))/(x/np.sum(x)) + # # st.write(x) + # # st.write(y) + # # st.write(roi) - # Bins - col = channels_list[i] - x_actual = st.session_state["scenario"].channels[col].actual_spends - x_modified = st.session_state["scenario"].channels[col].modified_spends - # x_modified_total = 0 - # for c in channels_list: - # # st.write(c) - # # st.write(st.session_state["scenario"].channels[c].modified_spends) - # x_modified_total = x_modified_total + st.session_state["scenario"].channels[c].modified_spends.sum() - # st.write(x_modified_total) - - x_total = x_modified.sum() - power = np.ceil(np.log(x_actual.max()) / np.log(10)) - 3 - - updated_rcs_key = f"{metrics_selected}#@{panel_selected}#@{channel_name}" - - # if updated_rcs and updated_rcs_key in list(updated_rcs.keys()): - # K = updated_rcs[updated_rcs_key]["K"] - # b = updated_rcs[updated_rcs_key]["b"] - # a = updated_rcs[updated_rcs_key]["a"] - # x0 = updated_rcs[updated_rcs_key]["x0"] - # else: - # K = st.session_state["rcs"][col]["K"] - # b = st.session_state["rcs"][col]["b"] - # a = st.session_state["rcs"][col]["a"] - # x0 = st.session_state["rcs"][col]["x0"] - - # x_plot = np.linspace(0, 5 * x_actual.sum(), 200) - - # # Append current_channel_spends to the end of x_plot - # x_plot = np.append(x_plot, current_channel_spends) - - # x, y, marginal_roi = [], [], [] - # for x_p in x_plot: - # x.append(x_p * x_actual / x_actual.sum()) - - # for index in range(len(x_plot)): - # y.append(s_curve(x[index] / 10**power, K, b, a, x0)) - - # for index in range(len(x_plot)): - # marginal_roi.append( - # a * y[index] * (1 - y[index] / np.maximum(K, np.finfo(float).eps)) - # ) - - # x = ( - # np.sum(x, axis=1) - # * st.session_state["scenario"].channels[col].conversion_rate - # ) - # y = np.sum(y, axis=1) - # marginal_roi = ( - # np.average(marginal_roi, axis=1) - # / st.session_state["scenario"].channels[col].conversion_rate - # ) - - # roi = y / np.maximum(x, np.finfo(float).eps) - # # roi = (y/np.sum(y))/(x/np.sum(x)) - # # st.write(x) - # # st.write(y) - # # st.write(roi) - - # # st.write(roi[-1]) - - # roi_current, marginal_roi_current = roi[-1], marginal_roi[-1] - # x, y, roi, marginal_roi = ( - # x[:-1], - # y[:-1], - # roi[:-1], - # marginal_roi[:-1], - # ) # Drop data for current spends - - # # roi_current = - - # start_value, end_value, left_value, right_value = find_segment_value( - # x, - # roi, - # marginal_roi, - # ) - - #st.write(roi_current) - - # rgba = calculate_rgba( - # start_value, - # end_value, - # left_value, - # right_value, - # current_channel_spends, - # ) - - summary_df = pd.DataFrame(st.session_state["acutual_predicted"]) - # st.dataframe(summary_df) - summary_df.drop_duplicates(subset="Channel_name", keep="last", inplace=True) - # st.dataframe(summary_df) - - summary_df_sorted = summary_df.sort_values(by="Delta", ascending=False) - summary_df_sorted["Delta_percent"] = np.round( - ((summary_df_sorted["Optimized_spend"] / summary_df_sorted["Actual_spend"]) - 1) - * 100, - 2, - ) + # # st.write(roi[-1]) + + # roi_current, marginal_roi_current = roi[-1], marginal_roi[-1] + # x, y, roi, marginal_roi = ( + # x[:-1], + # y[:-1], + # roi[:-1], + # marginal_roi[:-1], + # ) # Drop data for current spends + + # # roi_current = + + # start_value, end_value, left_value, right_value = find_segment_value( + # x, + # roi, + # marginal_roi, + # ) - summary_df_sorted=summary_df_sorted.sort_values(by=['Optimized_spend'],ascending=False) - summary_df_sorted['old_efficiency']=(summary_df_sorted['Old_sales']/summary_df_sorted['Old_sales'].sum())/(summary_df_sorted['Actual_spend']/summary_df_sorted['Actual_spend'].sum()) - summary_df_sorted['new_efficiency']=(summary_df_sorted['New_sales']/summary_df_sorted['New_sales'].sum())/(summary_df_sorted['Optimized_spend']/summary_df_sorted['Optimized_spend'].sum()) - - a = (summary_df_sorted[summary_df_sorted['Channel_name']== col]).reset_index()['new_efficiency'][0] - b = (summary_df_sorted[summary_df_sorted['Channel_name']== col]).reset_index()['old_efficiency'][0] - # st.write(a) - - with bin_placeholder: - if a> 1: - fill_color_box = "#6bbf6b" - elif a <1: - fill_color_box = "#ff6868" - else: - fill_color_box = "#ff6868" - st.markdown( - f""" -
-

Simulated Efficiency: {round(a,2)}
Actual Efficiency: {round(b,2)}

- -
- """, - unsafe_allow_html=True, - ) - #

Simulated Efficiency: {round(a,2)}
Actual Efficiency: {round(b,2)}

- # - - with st.expander("See Response Curves", expanded=True): - fig = plot_response_curves(summary_df_sorted) - # st.plotly_chart(rc.response_curves(col)) - # st.plotly_chart(fig, use_container_width=True) - - summary_df = pd.DataFrame(st.session_state["acutual_predicted"]) - # st.dataframe(summary_df) - summary_df.drop_duplicates(subset="Channel_name", keep="last", inplace=True) - # st.dataframe(summary_df) - - summary_df_sorted = summary_df.sort_values(by="Delta", ascending=False) - summary_df_sorted["Delta_percent"] = np.round( - ((summary_df_sorted["Optimized_spend"] / summary_df_sorted["Actual_spend"]) - 1) - * 100, - 2, - ) + #st.write(roi_current) + # rgba = calculate_rgba( + # start_value, + # end_value, + # left_value, + # right_value, + # current_channel_spends, + # ) + # # print(st.session_state["acutual_predicted"]) + summary_df = pd.DataFrame(st.session_state["acutual_predicted"]) + # st.dataframe(summary_df) + summary_df.drop_duplicates(subset="Channel_name", keep="last", inplace=True) + # st.dataframe(summary_df) + + summary_df_sorted = summary_df.sort_values(by="Delta", ascending=False) + summary_df_sorted["Delta_percent"] = np.round( + ((summary_df_sorted["Optimized_spend"] / summary_df_sorted["Actual_spend"]) - 1) + * 100, + 2, + ) + + summary_df_sorted=summary_df_sorted.sort_values(by=['Optimized_spend'],ascending=False) + summary_df_sorted['old_efficiency']=(summary_df_sorted['Old_sales']/summary_df_sorted['Old_sales'].sum())/(summary_df_sorted['Actual_spend']/summary_df_sorted['Actual_spend'].sum()) + summary_df_sorted['new_efficiency']=(summary_df_sorted['New_sales']/summary_df_sorted['New_sales'].sum())/(summary_df_sorted['Optimized_spend']/summary_df_sorted['Optimized_spend'].sum()) + + a = (summary_df_sorted[summary_df_sorted['Channel_name']== col]).reset_index()['new_efficiency'][0] + b = (summary_df_sorted[summary_df_sorted['Channel_name']== col]).reset_index()['old_efficiency'][0] + # st.write(a) + + with bin_placeholder: + if a> 1: + fill_color_box = "#6bbf6b" + elif a <1: + fill_color_box = "#ff6868" + else: + fill_color_box = "#ff6868" + st.markdown( + f""" +
+

Simulated Efficiency: {round(a,2)}
Actual Efficiency: {round(b,2)}

+ +
+ """, + unsafe_allow_html=True, + ) + #

Simulated Efficiency: {round(a,2)}
Actual Efficiency: {round(b,2)}

+ # + + with st.expander("See Response Curves", expanded=True): + fig = plot_response_curves(summary_df_sorted) + # st.plotly_chart(rc.response_curves(col)) + # st.plotly_chart(fig, use_container_width=True) + + summary_df = pd.DataFrame(st.session_state["acutual_predicted"]) + # st.dataframe(summary_df) + summary_df.drop_duplicates(subset="Channel_name", keep="last", inplace=True) + # st.dataframe(summary_df) + + summary_df_sorted = summary_df.sort_values(by="Delta", ascending=False) + summary_df_sorted["Delta_percent"] = np.round( + ((summary_df_sorted["Optimized_spend"] / summary_df_sorted["Actual_spend"]) - 1) + * 100, + 2, + ) - - - with open("summary_df.pkl", "wb") as f: - pickle.dump(summary_df_sorted, f) - # st.dataframe(summary_df_sorted) - # ___columns=st.columns(3) - # with ___columns[2]: - # fig=summary_plot(summary_df_sorted, x='Delta_percent', y='Channel_name', title='Delta', text_column='Delta_percent') - # st.plotly_chart(fig,use_container_width=True) - # with ___columns[0]: - # fig=summary_plot(summary_df_sorted, x='Actual_spend', y='Channel_name', title='Actual Spend', text_column='Actual_spend') - # st.plotly_chart(fig,use_container_width=True) - # with ___columns[1]: - # fig=summary_plot(summary_df_sorted, x='Optimized_spend', y='Channel_name', title='Planned Spend', text_column='Optimized_spend') - # st.plotly_chart(fig,use_container_width=True) - - scenario_planner_plots() - - with st.expander ("View Forecasted spends"): - col1, col2, col3 = st.columns(3) - with col1: - default_date = datetime(2024, 1, 28) - start_date1 = st.date_input("Select Start Date: ",value=default_date) - relativedelta(years=1) - - with col2: - default_date = datetime(2024, 2, 24) - end_date1 = st.date_input("Select End Date: ",value=default_date)- relativedelta(years=1) - - with col3: - current_date = datetime(2024, 2, 24) - c1, c2, c3 = st.columns(3) - with c1: - if st.button('Next Month'): - start_date1 = current_date- relativedelta(years=1) - end_date1 = current_date + relativedelta(months=1)- relativedelta(years=1) - with c2: - if st.button('Next Quarter'): - start_date1 = current_date- relativedelta(years=1) - end_date1 = current_date + relativedelta(months = 3)- relativedelta(years=1) - with c3: - if st.button('Next Year'): - start_date1 = current_date- relativedelta(years=1) - end_date1 = current_date + relativedelta(months = 12)- relativedelta(years=1) - - forecasted_table_df = sf.scenario_spend_forecasting(summary_df_sorted,start_date1,end_date1) - st.dataframe(forecasted_table_df) - - forecasted_table_df2 = sf.scenario_spend_forecasting2(summary_df_sorted,start_date1,end_date1) - st.dataframe(forecasted_table_df2) - st.markdown(""" - - """, unsafe_allow_html=True) - - def save_report_forecast(forecasted_table_df,forecasted_table_df2): - from io import BytesIO - # Convert the DataFrame to an Excel file in memory - excel_file = BytesIO() - with pd.ExcelWriter(excel_file, engine='openpyxl') as writer: - forecasted_table_df.to_excel(writer, index=True, sheet_name='Forecasted Spends') - forecasted_table_df2.to_excel(writer, index=False, sheet_name='Monthly Breakdown') - # Seek to the beginning of the BytesIO buffer - excel_file.seek(0) - return excel_file - - st.subheader("Download Report") - report_name = st.text_input( - "Report name", - key="report_input", - placeholder="Report name", - label_visibility="collapsed", - ) + - st.download_button( - "Download Report", - data = save_report_forecast(forecasted_table_df,forecasted_table_df2), - file_name = report_name+".xlsx", - mime="application/vnd.ms-excel", - # on_click=lambda: save_report_forecast(forecasted_table_df,report_name), - disabled=len(st.session_state["report_input"]) == 0,#use_container_width=True + with open("summary_df.pkl", "wb") as f: + pickle.dump(summary_df_sorted, f) + # st.dataframe(summary_df_sorted) + # ___columns=st.columns(3) + # with ___columns[2]: + # fig=summary_plot(summary_df_sorted, x='Delta_percent', y='Channel_name', title='Delta', text_column='Delta_percent') + # st.plotly_chart(fig,use_container_width=True) + # with ___columns[0]: + # fig=summary_plot(summary_df_sorted, x='Actual_spend', y='Channel_name', title='Actual Spend', text_column='Actual_spend') + # st.plotly_chart(fig,use_container_width=True) + # with ___columns[1]: + # fig=summary_plot(summary_df_sorted, x='Optimized_spend', y='Channel_name', title='Planned Spend', text_column='Optimized_spend') + # st.plotly_chart(fig,use_container_width=True) + + scenario_planner_plots() + + with st.expander ("View Forecasted spends"): + col1, col2, col3 = st.columns([1,1,0.75]) + # List of 12 months + months_start = ["January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"] + years_start = range(2022,2100) + months_end = ["January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"] + years_end = range(2022,2100) + with col1: + from datetime import date + st.write ("Select Start Time Period") + sc1,sc2 = st.columns([1,1]) + + with sc1: + # Create a dropdown (selectbox) for months + start_date_mon = st.selectbox("Select Start Month:", months_start) + with sc2: + start_date_year = st.selectbox("Select Start Year:", years_start,index=2) + start_date1 = date(start_date_year, months_start.index(start_date_mon)+1, 1)- relativedelta(years=1) + # st.write(start_date1) + # default_Month = "January" + # start_date_mon = st.text_input("Select Start Month: ",value=default_Month) + + # default_Year = 2024 + # start_date_year = st.number_input("Select Start Year: ",value=default_Year) + + with col2: + st.write ("Select End Time Period") + ec1,ec2 = st.columns([1,1]) + with ec1: + end_date_mon = st.selectbox("Select End Month:", months_end,index=1) + with ec2: + end_date_year = st.selectbox("Select End Year:", years_end,index=2) + end_date1 = date(end_date_year, months_end.index(end_date_mon)+2, 1)- relativedelta(years=1) + # st.write(end_date1) + # default_Month = "February" + # end_date_mon = st.text_input("Select End Month: ",value=default_Month) + + # default_Year = 2024 + # end_date_year = st.number_input("Select End Year: ",value=default_Year) + # end_date1 = st.date_input("Select End Date: ",value=default_date) - relativedelta(years=1) + + with col3: + current_date = datetime.now() + c1, c2, c3 = st.columns(3) + with c1: + if st.button('Next Month'): + start_date1 = current_date- relativedelta(years=1) + end_date1 = current_date + relativedelta(months=1)- relativedelta(years=1) + with c2: + if st.button('Next Quarter'): + start_date1 = current_date- relativedelta(years=1) + end_date1 = current_date + relativedelta(months = 3)- relativedelta(years=1) + with c3: + if st.button('Next Year'): + start_date1 = current_date- relativedelta(years=1) + end_date1 = current_date + relativedelta(months = 12)- relativedelta(years=1) + + forecasted_table_df = sf.scenario_spend_forecasting(summary_df_sorted,start_date1,end_date1) + st.dataframe(forecasted_table_df) + + forecasted_table_df2 = sf.scenario_spend_forecasting2(summary_df_sorted,start_date1,end_date1) + st.dataframe(forecasted_table_df2) + + st.markdown(""" + + """, unsafe_allow_html=True) + + def save_report_forecast(forecasted_table_df,forecasted_table_df2): + + # Convert the DataFrame to an Excel file in memory + excel_file = BytesIO() + with pd.ExcelWriter(excel_file, engine='openpyxl') as writer: + forecasted_table_df.to_excel(writer, index=True, sheet_name='Forecasted Spends') + forecasted_table_df2.to_excel(writer, sheet_name='Monthly Breakdown',index = True) + # Seek to the beginning of the BytesIO buffer + excel_file.seek(0) + return excel_file + + st.subheader("Download Report") + report_name = st.text_input( + "Report name", + key="report_input", + placeholder="Report name", + label_visibility="collapsed", ) - # filename = st.text_input("Save Report: ",placeholder="Report name") - # if st.button("Download Report",disabled= (filename != "Report name")): - # excel_file_path = filename+ '.xlsx' - # forecasted_table_df.to_excel(excel_file_path, index=False) - # message_container = st.empty() + st.download_button( + "Download Report", + data = save_report_forecast(forecasted_table_df,forecasted_table_df2), + file_name = report_name+".xlsx", + mime="application/vnd.ms-excel", + # on_click=lambda: save_report_forecast(forecasted_table_df,report_name), + disabled=len(st.session_state["report_input"]) == 0,#use_container_width=True + ) - # with message_container: - # st.write(f'
{"Report Saved!"}
', unsafe_allow_html=True) - # time.sleep(0.5) - # st.empty() + # filename = st.text_input("Save Report: ",placeholder="Report name") + # if st.button("Download Report",disabled= (filename != "Report name")): + # excel_file_path = filename+ '.xlsx' + # forecasted_table_df.to_excel(excel_file_path, index=False) + # message_container = st.empty() + + + # with message_container: + # st.write(f'
{"Report Saved!"}
', unsafe_allow_html=True) + # time.sleep(0.5) + # st.empty() + + # on_click=lambda: save_scenario(scenario_name), + # disabled=len(st.session_state["scenario_input"]) == 0,#use_container_width=True - # on_click=lambda: save_scenario(scenario_name), - # disabled=len(st.session_state["scenario_input"]) == 0,#use_container_width=True - - _columns = st.columns(2) - # with _columns[0]: - st.subheader("Save Scenario") - scenario_name = st.text_input( - "Scenario name", - key="scenario_input", - placeholder="Scenario name", - label_visibility="collapsed", - ) - st.button( - "Save", - on_click=lambda: save_scenario(scenario_name), - disabled=len(st.session_state["scenario_input"]) == 0,#use_container_width=True + _columns = st.columns(2) + # with _columns[0]: + st.subheader("Save Scenario") + scenario_name = st.text_input( + "Scenario name", + key="scenario_input", + placeholder="Scenario name", + label_visibility="collapsed", + ) + st.button( + "Save", + on_click=lambda: save_scenario(scenario_name), + disabled=len(st.session_state["scenario_input"]) == 0,#use_container_width=True + + ) - ) - elif auth_status == False: - st.error("Username/Password is incorrect") + st.error("Username/Password is incorrect") if auth_status != True: try: username_forgot_pw, email_forgot_password, random_password = ( - authenticator.forgot_password("Forgot password") - ) + authenticator.forgot_password("Forgot password") + ) if username_forgot_pw: - st.session_state["config"]["credentials"]["usernames"][username_forgot_pw][ - "password" - ] = stauth.Hasher([random_password]).generate()[0] - send_email(email_forgot_password, random_password) - st.success("New password sent securely") - # Random password to be transferred to user securely + st.session_state["config"]["credentials"]["usernames"][username_forgot_pw][ + "password" + ] = stauth.Hasher([random_password]).generate()[0] + send_email(email_forgot_password, random_password) + st.success("New password sent securely") + # Random password to be transferred to user securely elif username_forgot_pw == False: - st.error("Username not found") + st.error("Username not found") except Exception as e: st.error(e)