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)