Samkeet-Blend360 commited on
Commit
ae88a56
·
1 Parent(s): e8d72c9

Response Curve

Browse files
__pycache__/response_curves_model_quality.cpython-310.pyc CHANGED
Binary files a/__pycache__/response_curves_model_quality.cpython-310.pyc and b/__pycache__/response_curves_model_quality.cpython-310.pyc differ
 
pages/2_Scenario_Planner.py CHANGED
@@ -2028,7 +2028,7 @@ if auth_status == True:
2028
  st.markdown(
2029
  """<hr class="spends-heading-seperator">""", unsafe_allow_html=True
2030
  )
2031
- _columns = st.columns((1.5, 2.5, 2, 2, 1))
2032
  with _columns[0]:
2033
  generate_spending_header("Channel")
2034
  with _columns[1]:
@@ -2068,7 +2068,7 @@ if auth_status == True:
2068
  # st.write(st.session_state["scenario"].channels[channel_name].bounds)
2069
  # st.write(st.session_state["scenario"].channels[channel_name].channel_bounds_min)
2070
 
2071
- _columns = st.columns((1.5, 2.5, 2, 2, 1))
2072
  response_curve_params = pd.read_excel(
2073
  "response_curves_parameters.xlsx", index_col="channel"
2074
  )
@@ -2099,7 +2099,7 @@ if auth_status == True:
2099
  ### # # print(st.session_state[channel_name])
2100
  # st.write(_channel_class.channel_bounds_min,channel_bounds_min)
2101
  # st.write(_channel_class.channel_bounds_max,channel_bounds_max)
2102
- _columns_min = st.columns(2)
2103
  with _columns_min[0]:
2104
  spend_input = st.text_input(
2105
  "Absolute",
@@ -2135,7 +2135,7 @@ if auth_status == True:
2135
  return float(st.session_state[channel_name_upper_bound])
2136
 
2137
  channel_name_current = f"{channel_name}_change"
2138
- with _columns_min[1]:
2139
  channel_name_upper_bound = f"{channel_name}_upper_bound"
2140
  if channel_name_upper_bound not in st.session_state:
2141
  st.session_state[channel_name_upper_bound] = str(100)
@@ -2187,7 +2187,7 @@ if auth_status == True:
2187
  with _spend_cols[0]:
2188
  # st.write("Actual")
2189
  st.markdown(
2190
- f"<p> Actual <h5>{format_numbers(actual_channel_spends)}</h5> </p>",
2191
  unsafe_allow_html=True,
2192
  )
2193
  # st.metric(
@@ -2199,7 +2199,7 @@ if auth_status == True:
2199
 
2200
  # st.write("Actual")
2201
  st.markdown(
2202
- f"<p> Change <h5>{format_numbers(spends_delta)}</h5> </p>",
2203
  unsafe_allow_html=True,
2204
  )
2205
  # st.markdown(f'<h4 class="custom-text1">{format_numbers(spends_delta)}%</h4>', unsafe_allow_html=True)
@@ -2212,11 +2212,11 @@ if auth_status == True:
2212
  # )
2213
  with _spend_cols[1]:
2214
  st.markdown(
2215
- f"<p> Simulated <h5>{format_numbers(current_channel_spends)}</h5> </p>",
2216
  unsafe_allow_html=True,
2217
  )
2218
  st.markdown(
2219
- f'<p>Percent<h5>{numerize(( spends_delta/actual_channel_spends)*100,0) +"%"}</h5> </p>',
2220
  unsafe_allow_html=True,
2221
  )
2222
  # st.metric(
@@ -2251,11 +2251,11 @@ if auth_status == True:
2251
  with _prospect_cols[0]:
2252
  # st.write("Actual")
2253
  st.markdown(
2254
- f"<p> Actual <h5>{format_numbers_f(actual_channel_sales)}</h5> </p>",
2255
  unsafe_allow_html=True,
2256
  )
2257
  st.markdown(
2258
- f"<p> Change <h5>{format_numbers_f(sales_delta)}</h5> </p>",
2259
  unsafe_allow_html=True,
2260
  )
2261
 
@@ -2274,11 +2274,11 @@ if auth_status == True:
2274
  # )
2275
  with _prospect_cols[1]:
2276
  st.markdown(
2277
- f"<p> Simulated <h5>{format_numbers_f(current_channel_sales)}</h5> </p>",
2278
  unsafe_allow_html=True,
2279
  )
2280
  st.markdown(
2281
- f'<p>Percent<h5>{numerize(( _channel_class.delta_sales/actual_channel_sales)*100,0) +"%"}</h5> </p>',
2282
  unsafe_allow_html=True,
2283
  )
2284
 
 
2028
  st.markdown(
2029
  """<hr class="spends-heading-seperator">""", unsafe_allow_html=True
2030
  )
2031
+ _columns = st.columns((2, 1.5, 3, 3, 1))
2032
  with _columns[0]:
2033
  generate_spending_header("Channel")
2034
  with _columns[1]:
 
2068
  # st.write(st.session_state["scenario"].channels[channel_name].bounds)
2069
  # st.write(st.session_state["scenario"].channels[channel_name].channel_bounds_min)
2070
 
2071
+ _columns = st.columns((2, 1.5, 3, 3, 1))
2072
  response_curve_params = pd.read_excel(
2073
  "response_curves_parameters.xlsx", index_col="channel"
2074
  )
 
2099
  ### # # print(st.session_state[channel_name])
2100
  # st.write(_channel_class.channel_bounds_min,channel_bounds_min)
2101
  # st.write(_channel_class.channel_bounds_max,channel_bounds_max)
2102
+ _columns_min = st.columns(1)
2103
  with _columns_min[0]:
2104
  spend_input = st.text_input(
2105
  "Absolute",
 
2135
  return float(st.session_state[channel_name_upper_bound])
2136
 
2137
  channel_name_current = f"{channel_name}_change"
2138
+ with _columns_min[0]:
2139
  channel_name_upper_bound = f"{channel_name}_upper_bound"
2140
  if channel_name_upper_bound not in st.session_state:
2141
  st.session_state[channel_name_upper_bound] = str(100)
 
2187
  with _spend_cols[0]:
2188
  # st.write("Actual")
2189
  st.markdown(
2190
+ f"<p> Actual Spends<h5>{format_numbers(actual_channel_spends)}</h5> </p>",
2191
  unsafe_allow_html=True,
2192
  )
2193
  # st.metric(
 
2199
 
2200
  # st.write("Actual")
2201
  st.markdown(
2202
+ f"<p>Spends Change<h5>{format_numbers(spends_delta)}</h5> </p>",
2203
  unsafe_allow_html=True,
2204
  )
2205
  # st.markdown(f'<h4 class="custom-text1">{format_numbers(spends_delta)}%</h4>', unsafe_allow_html=True)
 
2212
  # )
2213
  with _spend_cols[1]:
2214
  st.markdown(
2215
+ f"<p>Simulated Spends<h5>{format_numbers(current_channel_spends)}</h5> </p>",
2216
  unsafe_allow_html=True,
2217
  )
2218
  st.markdown(
2219
+ f'<p>Spends Percent<h5>{numerize(( spends_delta/actual_channel_spends)*100,0) +"%"}</h5> </p>',
2220
  unsafe_allow_html=True,
2221
  )
2222
  # st.metric(
 
2251
  with _prospect_cols[0]:
2252
  # st.write("Actual")
2253
  st.markdown(
2254
+ f"<p>Actual Revenue<h5>$ {format_numbers_f(actual_channel_sales)}</h5> </p>",
2255
  unsafe_allow_html=True,
2256
  )
2257
  st.markdown(
2258
+ f"<p>Revenue Change<h5>$ {format_numbers_f(sales_delta)}</h5> </p>",
2259
  unsafe_allow_html=True,
2260
  )
2261
 
 
2274
  # )
2275
  with _prospect_cols[1]:
2276
  st.markdown(
2277
+ f"<p>Simulated Revenue<h5>$ {format_numbers_f(current_channel_sales)}</h5> </p>",
2278
  unsafe_allow_html=True,
2279
  )
2280
  st.markdown(
2281
+ f'<p>Revenue Percent<h5>{numerize(( _channel_class.delta_sales/actual_channel_sales)*100,0) +"%"}</h5> </p>',
2282
  unsafe_allow_html=True,
2283
  )
2284
 
response_curves_model_quality.py CHANGED
@@ -187,63 +187,63 @@ for i in range(1,13):
187
  pdf = fit_data(spend_cols[i],prospect_cols[i],channel_cols[i])
188
  plotly_data = plotly_data.merge(pdf,on = ["Date","MAT"],how = "left")
189
 
190
- def response_curves(channel,x_modified,y_modified):
191
-
192
- # Initialize the Plotly figure
193
- fig = go.Figure()
194
-
195
- x_col = (channel+"_Spends").replace('\xa0', '')
196
- y_col = ("Fit_Data_"+channel).replace('\xa0', '')
197
-
198
- # fig.add_trace(go.Scatter(
199
- # x=plotly_data[x_col],
200
- # y=plotly_data[y_col],
201
- # mode='markers',
202
- # name=x_col.replace('_Spends', '')
203
- # ))
204
-
205
- fig.add_trace(go.Scatter(
206
- x=plotly_data.sort_values(by=x_col, ascending=True)[x_col],
207
- y=plotly_data.sort_values(by=x_col, ascending=True)[y_col],
208
- mode='lines+markers',
209
- name=x_col.replace('_Spends', '')
210
- ))
211
 
212
- plotly_data2 = plotly_data.copy()
213
- plotly_data2 = plotly_data[plotly_data[x_col].isnull()==False]
214
- # # print(plotly_data[plotly_data2['Date'] == plotly_data2['Date'].max()][x_col])
215
- # .dropna(subset=[x_col]).reset_index(inplace = True)
216
- fig.add_trace(go.Scatter(
217
- x=plotly_data[plotly_data2['Date'] == plotly_data2['Date'].max()][x_col],
218
- y=plotly_data[plotly_data2['Date'] == plotly_data2['Date'].max()][y_col],
219
- mode='markers',
220
- marker=dict(
221
- size=13 # Adjust the size value to make the markers larger or smaller
222
- , color = 'yellow'
223
- ),
224
- name="Current Spends"
225
- ))
226
-
227
- fig.add_trace(go.Scatter(
228
- x=[x_modified/104],
229
- y=[y_modified/104],
230
- mode='markers',
231
- marker=dict(
232
- size=13 # Adjust the size value to make the markers larger or smaller
233
- , color = 'blue'
234
- ),
235
- name="Optimised Spends"
236
- ))
237
-
238
- # Update layout with titles
239
- fig.update_layout(
240
- title=channel+' Response Curve',
241
- xaxis_title='Weekly Spends',
242
- yaxis_title='Prospects'
243
- )
244
-
245
- # Show the figure
246
- return fig
247
 
248
  import pandas as pd
249
  import numpy as np
@@ -447,24 +447,61 @@ def response_curves(channel,x_modified,y_modified):
447
  # mode='markers',
448
  # name=x_col.replace('_Spends', '')
449
  # ))
450
- plotly_data1 = plotly_data[plotly_data["MAT"]!="ext"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
451
  fig.add_trace(go.Scatter(
452
- x=plotly_data1.sort_values(by=x_col, ascending=True)[x_col],
453
- y=plotly_data1.sort_values(by=x_col, ascending=True)[y_col],
454
  mode='lines',
455
- marker=dict(color = 'blue'),
456
  name=x_col.replace('_Spends', '')
457
  ))
458
 
459
- dividing_parameter = len(plotly_data1[plotly_data1[x_col].isnull()==False])
 
 
 
 
 
 
 
 
 
 
460
  # print(dividing_parameter)
461
- plotly_data2 = plotly_data.copy()
462
- plotly_data2 = plotly_data[plotly_data[x_col].isnull()==False]
463
- plotly_data2 = plotly_data2[plotly_data2["MAT"]!="ext"]
464
  # .dropna(subset=[x_col]).reset_index(inplace = True)
465
  fig.add_trace(go.Scatter(
466
- x=np.array(plotly_data2[x_col].mean()),
467
- y=np.array(plotly_data2[y_col].mean()),
468
  mode='markers',
469
  marker=dict(
470
  size=13 # Adjust the size value to make the markers larger or smaller
@@ -475,8 +512,8 @@ def response_curves(channel,x_modified,y_modified):
475
 
476
  # # print(dividing_parameter)
477
  fig.add_trace(go.Scatter(
478
- x=[x_modified/dividing_parameter],
479
- y=[y_modified/dividing_parameter],
480
  mode='markers',
481
  marker=dict(
482
  size=13 # Adjust the size value to make the markers larger or smaller
 
187
  pdf = fit_data(spend_cols[i],prospect_cols[i],channel_cols[i])
188
  plotly_data = plotly_data.merge(pdf,on = ["Date","MAT"],how = "left")
189
 
190
+ # def response_curves(channel,x_modified,y_modified):
191
+
192
+ # # Initialize the Plotly figure
193
+ # fig = go.Figure()
194
+
195
+ # x_col = (channel+"_Spends").replace('\xa0', '')
196
+ # y_col = ("Fit_Data_"+channel).replace('\xa0', '')
197
+
198
+ # # fig.add_trace(go.Scatter(
199
+ # # x=plotly_data[x_col],
200
+ # # y=plotly_data[y_col],
201
+ # # mode='markers',
202
+ # # name=x_col.replace('_Spends', '')
203
+ # # ))
204
+
205
+ # fig.add_trace(go.Scatter(
206
+ # x=plotly_data.sort_values(by=x_col, ascending=True)[x_col],
207
+ # y=plotly_data.sort_values(by=x_col, ascending=True)[y_col],
208
+ # mode='lines+markers',
209
+ # name=x_col.replace('_Spends', '')
210
+ # ))
211
 
212
+ # plotly_data2 = plotly_data.copy()
213
+ # plotly_data2 = plotly_data[plotly_data[x_col].isnull()==False]
214
+ # # # print(plotly_data[plotly_data2['Date'] == plotly_data2['Date'].max()][x_col])
215
+ # # .dropna(subset=[x_col]).reset_index(inplace = True)
216
+ # fig.add_trace(go.Scatter(
217
+ # x=plotly_data[plotly_data2['Date'] == plotly_data2['Date'].max()][x_col],
218
+ # y=plotly_data[plotly_data2['Date'] == plotly_data2['Date'].max()][y_col],
219
+ # mode='markers',
220
+ # marker=dict(
221
+ # size=13 # Adjust the size value to make the markers larger or smaller
222
+ # , color = 'yellow'
223
+ # ),
224
+ # name="Current Spends"
225
+ # ))
226
+
227
+ # fig.add_trace(go.Scatter(
228
+ # x=[x_modified/104],
229
+ # y=[y_modified/104],
230
+ # mode='markers',
231
+ # marker=dict(
232
+ # size=13 # Adjust the size value to make the markers larger or smaller
233
+ # , color = 'blue'
234
+ # ),
235
+ # name="Optimised Spends"
236
+ # ))
237
+
238
+ # # Update layout with titles
239
+ # fig.update_layout(
240
+ # title=channel+' Response Curve',
241
+ # xaxis_title='Weekly Spends',
242
+ # yaxis_title='Prospects'
243
+ # )
244
+
245
+ # # Show the figure
246
+ # return fig
247
 
248
  import pandas as pd
249
  import numpy as np
 
447
  # mode='markers',
448
  # name=x_col.replace('_Spends', '')
449
  # ))
450
+
451
+ plotly_data2 = plotly_data.copy()
452
+ plotly_data2 = plotly_data[plotly_data[x_col].isnull()==False]
453
+ plotly_data2 = plotly_data2[plotly_data2["MAT"]!="ext"]
454
+
455
+ x_actual = np.array(plotly_data2[x_col].mean())
456
+ y_actual = np.array(plotly_data2[y_col].mean())
457
+
458
+ # Filter data within the limits
459
+ plotly_data1 = plotly_data[(plotly_data["MAT"] != "ext")]
460
+
461
+ # Sort values for smooth plotting
462
+ plotly_data1 = plotly_data1.sort_values(by=x_col, ascending=True)
463
+ dividing_parameter = len(plotly_data1[plotly_data1[x_col].isnull()==False])
464
+
465
+
466
+ x_mod = x_modified/dividing_parameter
467
+ y_mod = y_modified/dividing_parameter
468
+
469
+ # Define limits
470
+ x_limit = 1.2 * max(x_actual, x_mod)
471
+ # y_limit = 1.5 * y_actual
472
+
473
+ plotly_data1 = plotly_data[(plotly_data["MAT"] != "ext") &
474
+ (plotly_data[x_col] <= x_limit)]
475
+ plotly_data1 = plotly_data1.sort_values(by=x_col, ascending=True)
476
+
477
+ # Plot
478
  fig.add_trace(go.Scatter(
479
+ x=plotly_data1[x_col],
480
+ y=plotly_data1[y_col],
481
  mode='lines',
482
+ marker=dict(color='blue'),
483
  name=x_col.replace('_Spends', '')
484
  ))
485
 
486
+
487
+ # plotly_data1 = plotly_data[plotly_data["MAT"]!="ext"]
488
+ # fig.add_trace(go.Scatter(
489
+ # x=plotly_data1.sort_values(by=x_col, ascending=True)[x_col],
490
+ # y=plotly_data1.sort_values(by=x_col, ascending=True)[y_col],
491
+ # mode='lines',
492
+ # marker=dict(color = 'blue'),
493
+ # name=x_col.replace('_Spends', '')
494
+ # ))
495
+
496
+
497
  # print(dividing_parameter)
498
+ # plotly_data2 = plotly_data.copy()
499
+ # plotly_data2 = plotly_data[plotly_data[x_col].isnull()==False]
500
+ # plotly_data2 = plotly_data2[plotly_data2["MAT"]!="ext"]
501
  # .dropna(subset=[x_col]).reset_index(inplace = True)
502
  fig.add_trace(go.Scatter(
503
+ x=x_actual,
504
+ y=y_actual,
505
  mode='markers',
506
  marker=dict(
507
  size=13 # Adjust the size value to make the markers larger or smaller
 
512
 
513
  # # print(dividing_parameter)
514
  fig.add_trace(go.Scatter(
515
+ x=[x_mod],
516
+ y=[y_mod],
517
  mode='markers',
518
  marker=dict(
519
  size=13 # Adjust the size value to make the markers larger or smaller
summary_df.pkl CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:35f08123f49d9966c361ad8e23d429995e4eac8ac44b70b337e3c2764129ddfc
3
  size 1756
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b903397f79c77828d7f6b534a45d52f33e534aae4ab41e7352be0809e55a8d64
3
  size 1756