Spaces:
Sleeping
Sleeping
Upload 81 files
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +5 -0
- .gitignore +5 -0
- 10_Model_Build_draft.py +393 -0
- 11_Analysis_Of_Result_draft.py +118 -0
- 8_Scenario_Planner.py +464 -0
- Categorised_data.pkl +3 -0
- Channel_wise_imp_click_spends.xlsx +0 -0
- Channel_wise_imp_click_spends_new.xlsx +0 -0
- Data_Import.py +384 -0
- Data_prep_functions.py +236 -0
- E0DAF720 +3 -0
- EDA_Data.xlsx +0 -0
- EDA_week_3.xlsx +0 -0
- Eda_functions.py +157 -0
- Full_Logo_Blue.jpeg +0 -0
- Full_Logo_Blue.jpg +0 -0
- Full_Logo_Blue.png +0 -0
- Full_Logo_Vibrant_Turquoise.png +0 -0
- LIME_logo.png +0 -0
- Media_data_for_model.csv +182 -0
- Media_data_for_model_dma_level.csv +538 -0
- Model_Results_Pretrained.py +349 -0
- Model_Results_Pretrained_copy.py +365 -0
- Overview1_data.xlsx +0 -0
- Overview_data - Copy.xlsx +0 -0
- Overview_data.xlsx +0 -0
- Overview_data_test.xlsx +0 -0
- Profile_Report.html +3 -0
- SWEETVIZ_REPORT.html +0 -0
- Scenario.py +338 -0
- Tatcic_paid.xlsx +0 -0
- Transformation_functions.py +133 -0
- Untitled.ipynb +81 -0
- Variables.csv +53 -0
- Variables.xlsx +0 -0
- actual_data.csv +158 -0
- attributed_app_installs.csv +130 -0
- attributed_app_installs_tactic.csv +130 -0
- attributed_app_installs_tactic.xlsx +0 -0
- best_model.pkl +3 -0
- best_models.pkl +3 -0
- bucket_data_VB.pkl +3 -0
- classes.py +479 -0
- config.yaml +13 -0
- data.xlsx +0 -0
- data_overview - Copy.xlsx +0 -0
- data_overview.xlsx +0 -0
- df.pkl +3 -0
- edited_dataframe.pkl +3 -0
- filtered_variables.pkl +3 -0
.gitattributes
CHANGED
@@ -33,3 +33,8 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
E0DAF720 filter=lfs diff=lfs merge=lfs -text
|
37 |
+
Profile_Report.html filter=lfs diff=lfs merge=lfs -text
|
38 |
+
raw_data_nov7_combined.xlsx filter=lfs diff=lfs merge=lfs -text
|
39 |
+
raw_data_nov7_combined1.xlsx filter=lfs diff=lfs merge=lfs -text
|
40 |
+
upf_data_converted.xlsx filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*ipynb
|
2 |
+
Model
|
3 |
+
__pycache__
|
4 |
+
*out
|
5 |
+
*pkl
|
10_Model_Build_draft.py
ADDED
@@ -0,0 +1,393 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
import plotly.express as px
|
4 |
+
import plotly.graph_objects as go
|
5 |
+
from Eda_functions import format_numbers,line_plot,summary
|
6 |
+
import numpy as np
|
7 |
+
from Transformation_functions import check_box
|
8 |
+
from Transformation_functions import apply_lag,apply_adstock,top_correlated_feature
|
9 |
+
import pickle
|
10 |
+
from st_aggrid import AgGrid
|
11 |
+
from st_aggrid import GridOptionsBuilder,GridUpdateMode
|
12 |
+
from utilities import set_header,initialize_data,load_local_css
|
13 |
+
from st_aggrid import GridOptionsBuilder
|
14 |
+
import time
|
15 |
+
import itertools
|
16 |
+
import statsmodels.api as sm
|
17 |
+
import numpy as np
|
18 |
+
import re
|
19 |
+
import itertools
|
20 |
+
from sklearn.metrics import mean_absolute_error, r2_score
|
21 |
+
from sklearn.preprocessing import MinMaxScaler
|
22 |
+
from sklearn.metrics import mean_absolute_percentage_error
|
23 |
+
from PIL import Image
|
24 |
+
import os
|
25 |
+
import matplotlib.pyplot as plt
|
26 |
+
from statsmodels.stats.outliers_influence import variance_inflation_factor
|
27 |
+
st.set_option('deprecation.showPyplotGlobalUse', False)
|
28 |
+
|
29 |
+
st.set_page_config(
|
30 |
+
page_title="Model Build",
|
31 |
+
page_icon=":shark:",
|
32 |
+
layout="wide",
|
33 |
+
initial_sidebar_state='collapsed'
|
34 |
+
)
|
35 |
+
load_local_css('styles.css')
|
36 |
+
set_header()
|
37 |
+
|
38 |
+
# logo = Image.open("Full_Logo_Blue.png")
|
39 |
+
|
40 |
+
# # Set the logo size
|
41 |
+
# logo = logo.resize((100, 100))
|
42 |
+
# st.image(logo)
|
43 |
+
# st.markdown("""
|
44 |
+
# <style>
|
45 |
+
# .logo {
|
46 |
+
# position: absolute;
|
47 |
+
# top: 10px;
|
48 |
+
# right: 10px;
|
49 |
+
# }
|
50 |
+
# </style>
|
51 |
+
# """,unsafe_allow_html=True)
|
52 |
+
|
53 |
+
|
54 |
+
|
55 |
+
# st.image(logo, use_column_width=True, top=0.95, right=0.05)
|
56 |
+
|
57 |
+
# Use CSS to position the logo in the top right corner
|
58 |
+
# st.write(
|
59 |
+
# """
|
60 |
+
# <style>
|
61 |
+
# .logo {
|
62 |
+
# position: absolute;
|
63 |
+
# top: 10px;
|
64 |
+
# right: 10px;
|
65 |
+
# }
|
66 |
+
# </style>
|
67 |
+
# """
|
68 |
+
# )
|
69 |
+
|
70 |
+
|
71 |
+
st.title('Model Build')
|
72 |
+
with open("filtered_variables.pkl", 'rb') as file:
|
73 |
+
filtered_variables = pickle.load(file)
|
74 |
+
|
75 |
+
with open('Categorised_data.pkl', 'rb') as file:
|
76 |
+
Categorised_data = pickle.load(file)
|
77 |
+
|
78 |
+
with open("target_column.pkl", 'rb') as file:
|
79 |
+
target_column= pickle.load(file)
|
80 |
+
|
81 |
+
with open("df.pkl", 'rb') as file:
|
82 |
+
df= pickle.load(file)
|
83 |
+
|
84 |
+
#st.markdown('### Generating all the possible combinations of variables')
|
85 |
+
|
86 |
+
if 'final_selection' not in st.session_state:
|
87 |
+
st.session_state['final_selection']=None
|
88 |
+
|
89 |
+
keywords = ['Digital (Impressions)', 'Streaming (Impressions)']
|
90 |
+
|
91 |
+
# Use list comprehension to filter columns
|
92 |
+
#drop_columns = [col for col in df.columns if any(keyword in col for keyword in keywords)]
|
93 |
+
#st.write(drop_columns)
|
94 |
+
#df.drop(drop_columns,axis=1,inplace=True)
|
95 |
+
if st.button('Create all Possibile combinations of Variables'):
|
96 |
+
with st.spinner('Wait for it'):
|
97 |
+
multiple_col=[col for col in filtered_variables.keys() if Categorised_data[col]['VB']=='Holiday']
|
98 |
+
#st.write(multiple_col)
|
99 |
+
|
100 |
+
|
101 |
+
|
102 |
+
|
103 |
+
for var in multiple_col:
|
104 |
+
all_combinations_hol = []
|
105 |
+
for r in range(1, len(filtered_variables[var]) + 1):
|
106 |
+
combinations = itertools.combinations(filtered_variables[var], r)
|
107 |
+
all_combinations_hol.extend(combinations)
|
108 |
+
all_combinations_hol.append([])
|
109 |
+
all_combinations_hol = [list(comb) for comb in all_combinations_hol]
|
110 |
+
filtered_variables[var]=all_combinations_hol
|
111 |
+
|
112 |
+
|
113 |
+
# st.write(filtered_variables)
|
114 |
+
price=[col for col in df.columns if Categorised_data[re.split(r'_adst|_lag', col )[0]]['VB']=='Price']
|
115 |
+
price.append("Non Promo Price")
|
116 |
+
|
117 |
+
price.append('Promo Price') #tempfix
|
118 |
+
|
119 |
+
|
120 |
+
#st.write(price)
|
121 |
+
Distribution=[col for col in df.columns if Categorised_data[re.split(r'_adst|_lag', col )[0]]['VB']=='Distribution']
|
122 |
+
Promotion=[col for col in df.columns if Categorised_data[re.split(r'_adst|_lag', col )[0]]['VB']=='Promotion']
|
123 |
+
Promotion.remove("Non Promo Price")
|
124 |
+
price.append('')
|
125 |
+
Distribution.append('')
|
126 |
+
|
127 |
+
|
128 |
+
Promotion.remove('Promo Price') #temp fi------
|
129 |
+
|
130 |
+
|
131 |
+
filtered_variables['Price']=price
|
132 |
+
filtered_variables['Distribution']=Distribution
|
133 |
+
filtered_variables['Promotion']=Promotion
|
134 |
+
|
135 |
+
variable_names = list(filtered_variables.keys())
|
136 |
+
variable_values = list(filtered_variables.values())
|
137 |
+
|
138 |
+
combinations = list(itertools.product(*variable_values))
|
139 |
+
|
140 |
+
|
141 |
+
# for combo in combinations:
|
142 |
+
# flattened_combo = [item for sublist in combo for item in (sublist if isinstance(sublist, list) else [sublist])]
|
143 |
+
# print(flattened_combo)
|
144 |
+
# st.text(flattened_combo)
|
145 |
+
|
146 |
+
|
147 |
+
|
148 |
+
final_selection=[]
|
149 |
+
for comb in combinations:
|
150 |
+
nested_tuple = comb
|
151 |
+
|
152 |
+
flattened_list = [item for sublist in nested_tuple for item in (sublist if isinstance(sublist, list) else [sublist])]
|
153 |
+
final_selection.append(flattened_list)
|
154 |
+
#st.write(final_selection[:15])
|
155 |
+
|
156 |
+
st.session_state['final_selection']=final_selection
|
157 |
+
|
158 |
+
st.success('Done')
|
159 |
+
st.write(f'Total combinations created {format_numbers(len(final_selection))}')
|
160 |
+
|
161 |
+
if 'Model_results' not in st.session_state:
|
162 |
+
st.session_state['Model_results']={'Model_object':[],
|
163 |
+
'Model_iteration':[],
|
164 |
+
'Feature_set':[],
|
165 |
+
'MAPE':[],
|
166 |
+
'R2':[],
|
167 |
+
'ADJR2':[]
|
168 |
+
}
|
169 |
+
|
170 |
+
#if st.button('Build Model'):
|
171 |
+
save_path = r"C:\Users\ManojP\Documents\MMM\simopt\Model"
|
172 |
+
iterations = st.number_input('Select the number of iterations to perform', min_value=1, step=1, value=1)
|
173 |
+
if st.button("Build Model"):
|
174 |
+
|
175 |
+
progress_bar = st.progress(0) # Initialize the progress bar
|
176 |
+
#time_remaining_text = st.empty() # Create an empty space for time remaining text
|
177 |
+
start_time = time.time() # Record the start time
|
178 |
+
progress_text = st.empty()
|
179 |
+
#time_elapsed_text = st.empty()
|
180 |
+
|
181 |
+
for i, selected_features in enumerate(st.session_state["final_selection"][:int(iterations)]):
|
182 |
+
df = df.reset_index(drop=True)
|
183 |
+
|
184 |
+
fet = [var for var in selected_features if len(var) > 0]
|
185 |
+
X = df[fet]
|
186 |
+
y = df['Prospects']
|
187 |
+
ss = MinMaxScaler()
|
188 |
+
X = pd.DataFrame(ss.fit_transform(X), columns=X.columns)
|
189 |
+
X = sm.add_constant(X)
|
190 |
+
model = sm.OLS(y, X).fit()
|
191 |
+
# st.write(fet)
|
192 |
+
positive_coeff=[col for col in fet if Categorised_data[re.split(r'_adst|_lag', col )[0]]['VB'] in ["Distribution","Promotion TV" ,"Display", "Video" ,"Facebook", "Twitter" ,"Instagram" ,"Pintrest", "YouTube" ,"Paid Search" ,"OOH Radio" ,"Audio Streaming",'Digital']]
|
193 |
+
negetive_coeff=[col for col in fet if Categorised_data[re.split(r'_adst|_lag', col )[0]]['VB'] in ["Price"]]
|
194 |
+
coefficients=model.params.to_dict()
|
195 |
+
model_possitive=[col for col in coefficients.keys() if coefficients[col]>0]
|
196 |
+
model_negatives=[col for col in coefficients.keys() if coefficients[col]<0]
|
197 |
+
# st.write(positive_coeff)
|
198 |
+
# st.write(model_possitive)
|
199 |
+
pvalues=[var for var in list(model.pvalues) if var<=0.06]
|
200 |
+
if (set(positive_coeff).issubset(set(model_possitive))) and (set(negetive_coeff).issubset(model_negatives)) and (len(pvalues)/len(selected_features))>=0.5:
|
201 |
+
|
202 |
+
|
203 |
+
predicted_values = model.predict(X)
|
204 |
+
mape = mean_absolute_percentage_error(y, predicted_values)
|
205 |
+
adjr2 = model.rsquared_adj
|
206 |
+
r2 = model.rsquared
|
207 |
+
filename = os.path.join(save_path, f"model_{i}.pkl")
|
208 |
+
with open(filename, "wb") as f:
|
209 |
+
pickle.dump(model, f)
|
210 |
+
# with open(r"C:\Users\ManojP\Documents\MMM\simopt\Model\model.pkl", 'rb') as file:
|
211 |
+
# model = pickle.load(file)
|
212 |
+
|
213 |
+
st.session_state['Model_results']['Model_object'].append(filename)
|
214 |
+
st.session_state['Model_results']['Model_iteration'].append(i)
|
215 |
+
st.session_state['Model_results']['Feature_set'].append(fet)
|
216 |
+
st.session_state['Model_results']['MAPE'].append(mape)
|
217 |
+
st.session_state['Model_results']['R2'].append(r2)
|
218 |
+
st.session_state['Model_results']['ADJR2'].append(adjr2)
|
219 |
+
|
220 |
+
current_time = time.time()
|
221 |
+
time_taken = current_time - start_time
|
222 |
+
time_elapsed_minutes = time_taken / 60
|
223 |
+
completed_iterations_text = f"{i + 1}/{iterations}"
|
224 |
+
progress_bar.progress((i + 1) / int(iterations))
|
225 |
+
progress_text.text(f'Completed iterations: {completed_iterations_text} Time Elapsed (min): {time_elapsed_minutes:.2f}')
|
226 |
+
|
227 |
+
st.write(f'Out of {iterations} iterations : {len(st.session_state["Model_results"]["Model_object"])} valid models')
|
228 |
+
|
229 |
+
|
230 |
+
def to_percentage(value):
|
231 |
+
return f'{value * 100:.1f}%'
|
232 |
+
|
233 |
+
st.title('Analysis of Results')
|
234 |
+
if st.checkbox('Show Results of Top 10 Models'):
|
235 |
+
st.write('Click on the Row to Generate Model Result')
|
236 |
+
data=pd.DataFrame(st.session_state['Model_results'])
|
237 |
+
data.sort_values(by=['MAPE'],ascending=False,inplace=True)
|
238 |
+
top_10=data.head(10)
|
239 |
+
top_10['Row_number']=np.arange(1,11,1)
|
240 |
+
top_10[['MAPE','R2','ADJR2']]=np.round(top_10[['MAPE','R2','ADJR2']],4).applymap(to_percentage)
|
241 |
+
|
242 |
+
gd=GridOptionsBuilder.from_dataframe(top_10[['Row_number','MAPE','R2','ADJR2','Model_iteration']])
|
243 |
+
gd.configure_pagination(enabled=True)
|
244 |
+
gd.configure_selection(use_checkbox=True)
|
245 |
+
|
246 |
+
#gd.configure_columns_auto_size_mode(GridOptionsBuilder.configure_columns)
|
247 |
+
gridoptions=gd.build()
|
248 |
+
|
249 |
+
table = AgGrid(top_10,gridOptions=gridoptions,update_mode=GridUpdateMode.SELECTION_CHANGED)
|
250 |
+
|
251 |
+
selected_rows=table.selected_rows
|
252 |
+
if len(selected_rows)>0:
|
253 |
+
st.header('Model Summary')
|
254 |
+
#st.text(selected_rows[0]['Model_iteration'])
|
255 |
+
|
256 |
+
model_object=data[data['Model_iteration']==selected_rows[0]['Model_iteration']]['Model_object']
|
257 |
+
features_set=data[data['Model_iteration']==selected_rows[0]['Model_iteration']]['Feature_set']
|
258 |
+
#st.write(features_set.values)
|
259 |
+
|
260 |
+
with open(str(model_object.values[0]), 'rb') as file:
|
261 |
+
model = pickle.load(file)
|
262 |
+
st.write(model.summary())
|
263 |
+
# st.write(df.index)
|
264 |
+
|
265 |
+
|
266 |
+
def plot_actual_vs_predicted(date, y, predicted_values, model):
|
267 |
+
fig = go.Figure()
|
268 |
+
|
269 |
+
fig.add_trace(go.Scatter(x=date, y=y, mode='lines', name='Actual', line=dict(color='#08083B')))
|
270 |
+
fig.add_trace(go.Scatter(x=date, y=predicted_values, mode='lines', name='Predicted', line=dict(color='#11B6BD')))
|
271 |
+
|
272 |
+
# Calculate MAPE
|
273 |
+
mape = mean_absolute_percentage_error(y, predicted_values)
|
274 |
+
|
275 |
+
# Calculate AdjR2 # Assuming X is your feature matrix
|
276 |
+
adjr2 = model.rsquared_adj
|
277 |
+
|
278 |
+
# Create a table to display the metrics
|
279 |
+
metrics_table = pd.DataFrame({
|
280 |
+
'Metric': ['MAPE', 'R-squared', 'AdjR-squared'],
|
281 |
+
'Value': [mape, model.rsquared, adjr2]
|
282 |
+
})
|
283 |
+
|
284 |
+
fig.update_layout(
|
285 |
+
xaxis=dict(title='Date'),
|
286 |
+
yaxis=dict(title=target_column),
|
287 |
+
xaxis_tickangle=-30
|
288 |
+
)
|
289 |
+
#metrics_table.set_index(['Metric'],inplace=True)
|
290 |
+
return metrics_table, fig
|
291 |
+
|
292 |
+
# st.text(features_set.values[0])
|
293 |
+
# st.dataframe(df[features_set.values[0]])
|
294 |
+
|
295 |
+
date=list(df.index)
|
296 |
+
df = df.reset_index(drop=True)
|
297 |
+
X=df[features_set.values[0]]
|
298 |
+
ss = MinMaxScaler()
|
299 |
+
X = pd.DataFrame(ss.fit_transform(X), columns=X.columns)
|
300 |
+
X=sm.add_constant(X)
|
301 |
+
#st.write(model.predict(X))
|
302 |
+
|
303 |
+
#st.write(df[target_column])
|
304 |
+
metrics_table,fig=plot_actual_vs_predicted(date, df[target_column], model.predict(X), model)
|
305 |
+
|
306 |
+
st.plotly_chart(fig,use_container_width=True)
|
307 |
+
|
308 |
+
def plot_residual_predicted(actual, predicted, df_):
|
309 |
+
df_['Residuals'] = actual - pd.Series(predicted)
|
310 |
+
df_['StdResidual'] = (df_['Residuals'] - df_['Residuals'].mean()) / df_['Residuals'].std()
|
311 |
+
|
312 |
+
# Create a Plotly scatter plot
|
313 |
+
fig = px.scatter(df_, x=predicted, y='StdResidual', opacity=0.5)
|
314 |
+
|
315 |
+
# Add horizontal lines
|
316 |
+
fig.add_hline(y=0, line_dash="dash", line_color="darkorange")
|
317 |
+
fig.add_hline(y=2, line_color="red")
|
318 |
+
fig.add_hline(y=-2, line_color="red")
|
319 |
+
|
320 |
+
fig.update_xaxes(title='Predicted')
|
321 |
+
fig.update_yaxes(title='Standardized Residuals (Actual - Predicted)')
|
322 |
+
|
323 |
+
# Set the same width and height for both figures
|
324 |
+
fig.update_layout(title='Residuals over Predicted values', autosize=False, width=600, height=400)
|
325 |
+
|
326 |
+
return fig
|
327 |
+
|
328 |
+
def residual_distribution(actual, predicted):
|
329 |
+
Residuals = actual - pd.Series(predicted)
|
330 |
+
|
331 |
+
# Create a Plotly histogram and distribution curve with custom colors
|
332 |
+
fig = go.Figure()
|
333 |
+
fig.add_trace(go.Histogram(x=Residuals, name='Residuals', histnorm='probability',
|
334 |
+
marker_color="#11B6BD"))
|
335 |
+
fig.add_trace(go.Histogram(x=Residuals, histnorm='probability', showlegend=False,
|
336 |
+
marker_color="#11B6BD"))
|
337 |
+
|
338 |
+
fig.update_layout(title='Distribution of Residuals',title_x=0.5, autosize=False, width=600, height=400)
|
339 |
+
|
340 |
+
return fig
|
341 |
+
|
342 |
+
def qqplot(actual, predicted):
|
343 |
+
Residuals = actual - pd.Series(predicted)
|
344 |
+
Residuals = pd.Series(Residuals)
|
345 |
+
Resud_std = (Residuals - Residuals.mean()) / Residuals.std()
|
346 |
+
|
347 |
+
# Create a QQ plot using Plotly with custom colors
|
348 |
+
fig = go.Figure()
|
349 |
+
fig.add_trace(go.Scatter(x=sm.ProbPlot(Resud_std).theoretical_quantiles,
|
350 |
+
y=sm.ProbPlot(Resud_std).sample_quantiles,
|
351 |
+
mode='markers',
|
352 |
+
marker=dict(size=5, color="#11B6BD"),
|
353 |
+
name='QQ Plot'))
|
354 |
+
|
355 |
+
# Add the 45-degree reference line
|
356 |
+
diagonal_line = go.Scatter(
|
357 |
+
x=[-2, 2], # Adjust the x values as needed to fit the range of your data
|
358 |
+
y=[-2, 2], # Adjust the y values accordingly
|
359 |
+
mode='lines',
|
360 |
+
line=dict(color='red'), # Customize the line color and style
|
361 |
+
name=' '
|
362 |
+
)
|
363 |
+
fig.add_trace(diagonal_line)
|
364 |
+
|
365 |
+
# Customize the layout
|
366 |
+
fig.update_layout(title='QQ Plot of Residuals',title_x=0.5, autosize=False, width=600, height=400,
|
367 |
+
xaxis_title='Theoretical Quantiles', yaxis_title='Sample Quantiles')
|
368 |
+
|
369 |
+
return fig
|
370 |
+
|
371 |
+
st.markdown('## Residual Analysis')
|
372 |
+
columns=st.columns(2)
|
373 |
+
with columns[0]:
|
374 |
+
fig=plot_residual_predicted(df[target_column],model.predict(X),df)
|
375 |
+
st.plotly_chart(fig)
|
376 |
+
|
377 |
+
with columns[1]:
|
378 |
+
st.empty()
|
379 |
+
fig = qqplot(df[target_column],model.predict(X))
|
380 |
+
st.plotly_chart(fig)
|
381 |
+
|
382 |
+
with columns[0]:
|
383 |
+
fig=residual_distribution(df[target_column],model.predict(X))
|
384 |
+
st.plotly_chart(fig)
|
385 |
+
|
386 |
+
|
387 |
+
|
388 |
+
vif_data = pd.DataFrame()
|
389 |
+
X=X.drop('const',axis=1)
|
390 |
+
vif_data["Variable"] = X.columns
|
391 |
+
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
|
392 |
+
vif_data.sort_values(by=['VIF'],ascending=False,inplace=True)
|
393 |
+
st.dataframe(vif_data)
|
11_Analysis_Of_Result_draft.py
ADDED
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import plotly.express as px
|
3 |
+
import numpy as np
|
4 |
+
import plotly.graph_objects as go
|
5 |
+
from sklearn.metrics import r2_score
|
6 |
+
from collections import OrderedDict
|
7 |
+
import pickle
|
8 |
+
import json
|
9 |
+
import streamlit as st
|
10 |
+
import plotly.express as px
|
11 |
+
import numpy as np
|
12 |
+
import plotly.graph_objects as go
|
13 |
+
from sklearn.metrics import r2_score
|
14 |
+
import pickle
|
15 |
+
import json
|
16 |
+
import pandas as pd
|
17 |
+
import statsmodels.api as sm
|
18 |
+
from sklearn.metrics import mean_absolute_percentage_error
|
19 |
+
import sys
|
20 |
+
from utilities import (set_header,
|
21 |
+
initialize_data,
|
22 |
+
load_local_css,
|
23 |
+
create_channel_summary,
|
24 |
+
create_contribution_pie,
|
25 |
+
create_contribuion_stacked_plot,
|
26 |
+
create_channel_spends_sales_plot,
|
27 |
+
format_numbers,
|
28 |
+
channel_name_formating,
|
29 |
+
load_authenticator)
|
30 |
+
|
31 |
+
|
32 |
+
|
33 |
+
|
34 |
+
def plot_actual_vs_predicted(date, y, predicted_values, model):
|
35 |
+
fig = go.Figure()
|
36 |
+
|
37 |
+
fig.add_trace(go.Scatter(x=date, y=y, mode='lines', name='Actual', line=dict(color='#6c757d')))
|
38 |
+
fig.add_trace(go.Scatter(x=date, y=predicted_values, mode='lines', name='Predicted', line=dict(color='#FF3A3B')))
|
39 |
+
|
40 |
+
# Calculate MAPE
|
41 |
+
mape = mean_absolute_percentage_error(y, predicted_values)
|
42 |
+
|
43 |
+
# Calculate AdjR2 # Assuming X is your feature matrix
|
44 |
+
adjr2 = model.rsquared_adj
|
45 |
+
|
46 |
+
# Create a table to display the metrics
|
47 |
+
metrics_table = pd.DataFrame({
|
48 |
+
'Metric': ['MAPE', 'R-squared', 'AdjR-squared'],
|
49 |
+
'Value': [mape, model.rsquared, adjr2]
|
50 |
+
})
|
51 |
+
|
52 |
+
fig.update_layout(
|
53 |
+
xaxis=dict(title='Date'),
|
54 |
+
yaxis=dict(title='Value'),
|
55 |
+
xaxis_tickangle=-30
|
56 |
+
)
|
57 |
+
#metrics_table.set_index(['Metric'],inplace=True)
|
58 |
+
return metrics_table, fig
|
59 |
+
|
60 |
+
|
61 |
+
X=pd.read_csv('actual_data.csv')
|
62 |
+
y=X['total_prospect_id']
|
63 |
+
date=X['date']
|
64 |
+
X=X.drop(['total_prospect_id','date','Unnamed: 0'],axis=1)
|
65 |
+
|
66 |
+
print(X.columns)
|
67 |
+
original_stdout = sys.stdout
|
68 |
+
sys.stdout = open('temp_stdout.txt', 'w')
|
69 |
+
|
70 |
+
# Perform linear regression
|
71 |
+
model = sm.OLS(y, X).fit()
|
72 |
+
|
73 |
+
|
74 |
+
sys.stdout.close()
|
75 |
+
sys.stdout = original_stdout
|
76 |
+
|
77 |
+
st.set_page_config(layout='wide')
|
78 |
+
load_local_css('styles.css')
|
79 |
+
set_header()
|
80 |
+
st.title('Analysis of Result')
|
81 |
+
|
82 |
+
st.write(model.summary(yname='Prospects'))
|
83 |
+
|
84 |
+
st.subheader('Actual vs Predicted Plot')
|
85 |
+
metrics_table,fig = plot_actual_vs_predicted(date, y, model.predict(X), model)
|
86 |
+
|
87 |
+
st.plotly_chart(fig,use_container_width=True)
|
88 |
+
#st.plotly_chart(fig)
|
89 |
+
|
90 |
+
# Display the metrics table
|
91 |
+
|
92 |
+
metrics_table=np.round(metrics_table,2)
|
93 |
+
metrics_table_html = metrics_table.to_html(index=False, escape=False)
|
94 |
+
|
95 |
+
# Display the metrics table in Streamlit as HTML
|
96 |
+
#st.subheader('Model Metrics')
|
97 |
+
#st.markdown(metrics_table_html, unsafe_allow_html=True)
|
98 |
+
# st.subheader('Model Metrics')
|
99 |
+
# st.table(metrics_table)
|
100 |
+
|
101 |
+
custom_css = """
|
102 |
+
<style>
|
103 |
+
table {
|
104 |
+
width: 80%; /* Adjust the table width as needed */
|
105 |
+
border-collapse: collapse;
|
106 |
+
}
|
107 |
+
th, td {
|
108 |
+
padding: 8px;
|
109 |
+
text-align: left;
|
110 |
+
border-bottom: 1px solid #ddd;
|
111 |
+
}
|
112 |
+
</style>
|
113 |
+
"""
|
114 |
+
|
115 |
+
# Display the metrics table in Streamlit as HTML with custom CSS
|
116 |
+
st.subheader('Model Metrics')
|
117 |
+
st.markdown(custom_css, unsafe_allow_html=True)
|
118 |
+
st.markdown(metrics_table_html, unsafe_allow_html=True)
|
8_Scenario_Planner.py
ADDED
@@ -0,0 +1,464 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from numerize.numerize import numerize
|
3 |
+
import numpy as np
|
4 |
+
from functools import partial
|
5 |
+
from collections import OrderedDict
|
6 |
+
from plotly.subplots import make_subplots
|
7 |
+
import plotly.graph_objects as go
|
8 |
+
from utilities import format_numbers,load_local_css,set_header,initialize_data,load_authenticator,send_email,channel_name_formating
|
9 |
+
from classes import class_from_dict,class_to_dict
|
10 |
+
import pickle
|
11 |
+
import streamlit_authenticator as stauth
|
12 |
+
import yaml
|
13 |
+
from yaml import SafeLoader
|
14 |
+
import re
|
15 |
+
import pandas as pd
|
16 |
+
import plotly.express as px
|
17 |
+
target='Revenue'
|
18 |
+
st.set_page_config(layout='wide')
|
19 |
+
load_local_css('styles.css')
|
20 |
+
set_header()
|
21 |
+
|
22 |
+
for k, v in st.session_state.items():
|
23 |
+
if k not in ['logout', 'login','config'] and not k.startswith('FormSubmitter'):
|
24 |
+
st.session_state[k] = v
|
25 |
+
# ======================================================== #
|
26 |
+
# ======================= Functions ====================== #
|
27 |
+
# ======================================================== #
|
28 |
+
|
29 |
+
|
30 |
+
def optimize():
|
31 |
+
"""
|
32 |
+
Optimize the spends for the sales
|
33 |
+
"""
|
34 |
+
|
35 |
+
channel_list = [key for key,value in st.session_state['optimization_channels'].items() if value]
|
36 |
+
print('channel_list')
|
37 |
+
print(channel_list)
|
38 |
+
print('@@@@@@@@')
|
39 |
+
if len(channel_list) > 0 :
|
40 |
+
scenario = st.session_state['scenario']
|
41 |
+
result = st.session_state['scenario'].optimize(st.session_state['total_spends_change'],channel_list)
|
42 |
+
for channel_name, modified_spends in result:
|
43 |
+
st.session_state[channel_name] = numerize(modified_spends * scenario.channels[channel_name].conversion_rate,1)
|
44 |
+
prev_spends = st.session_state['scenario'].channels[channel_name].actual_total_spends
|
45 |
+
st.session_state[f'{channel_name}_change'] = round(100*(modified_spends - prev_spends) / prev_spends,2)
|
46 |
+
|
47 |
+
|
48 |
+
def save_scenario(scenario_name):
|
49 |
+
"""
|
50 |
+
Save the current scenario with the mentioned name in the session state
|
51 |
+
|
52 |
+
Parameters
|
53 |
+
----------
|
54 |
+
scenario_name
|
55 |
+
Name of the scenario to be saved
|
56 |
+
"""
|
57 |
+
if 'saved_scenarios' not in st.session_state:
|
58 |
+
st.session_state = OrderedDict()
|
59 |
+
|
60 |
+
#st.session_state['saved_scenarios'][scenario_name] = st.session_state['scenario'].save()
|
61 |
+
st.session_state['saved_scenarios'][scenario_name] = class_to_dict(st.session_state['scenario'])
|
62 |
+
st.session_state['scenario_input'] = ""
|
63 |
+
print(type(st.session_state['saved_scenarios']))
|
64 |
+
with open('../saved_scenarios.pkl', 'wb') as f:
|
65 |
+
pickle.dump(st.session_state['saved_scenarios'],f)
|
66 |
+
|
67 |
+
def update_all_spends():
|
68 |
+
"""
|
69 |
+
Updates spends for all the channels with the given overall spends change
|
70 |
+
"""
|
71 |
+
percent_change = st.session_state['total_spends_change']
|
72 |
+
for channel_name in st.session_state['channels_list']:
|
73 |
+
channel = st.session_state['scenario'].channels[channel_name]
|
74 |
+
current_spends = channel.actual_total_spends
|
75 |
+
modified_spends = (1 + percent_change/100) * current_spends
|
76 |
+
st.session_state['scenario'].update(channel_name, modified_spends)
|
77 |
+
st.session_state[channel_name] = numerize(modified_spends*channel.conversion_rate,1)
|
78 |
+
st.session_state[f'{channel_name}_change'] = percent_change
|
79 |
+
|
80 |
+
def extract_number_for_string(string_input):
|
81 |
+
string_input = string_input.upper()
|
82 |
+
if string_input.endswith('K'):
|
83 |
+
return float(string_input[:-1])*10**3
|
84 |
+
elif string_input.endswith('M'):
|
85 |
+
return float(string_input[:-1])*10**6
|
86 |
+
elif string_input.endswith('B'):
|
87 |
+
return float(string_input[:-1])*10**9
|
88 |
+
|
89 |
+
def validate_input(string_input):
|
90 |
+
pattern = r'\d+\.?\d*[K|M|B]$'
|
91 |
+
match = re.match(pattern, string_input)
|
92 |
+
if match is None:
|
93 |
+
return False
|
94 |
+
return True
|
95 |
+
|
96 |
+
def update_data_by_percent(channel_name):
|
97 |
+
prev_spends = st.session_state['scenario'].channels[channel_name].actual_total_spends * st.session_state['scenario'].channels[channel_name].conversion_rate
|
98 |
+
modified_spends = prev_spends * (1 + st.session_state[f'{channel_name}_change']/100)
|
99 |
+
st.session_state[channel_name] = numerize(modified_spends,1)
|
100 |
+
st.session_state['scenario'].update(channel_name, modified_spends/st.session_state['scenario'].channels[channel_name].conversion_rate)
|
101 |
+
|
102 |
+
def update_data(channel_name):
|
103 |
+
"""
|
104 |
+
Updates the spends for the given channel
|
105 |
+
"""
|
106 |
+
|
107 |
+
if validate_input(st.session_state[channel_name]):
|
108 |
+
modified_spends = extract_number_for_string(st.session_state[channel_name])
|
109 |
+
prev_spends = st.session_state['scenario'].channels[channel_name].actual_total_spends * st.session_state['scenario'].channels[channel_name].conversion_rate
|
110 |
+
st.session_state[f'{channel_name}_change'] = round(100*(modified_spends - prev_spends) / prev_spends,2)
|
111 |
+
st.session_state['scenario'].update(channel_name, modified_spends/st.session_state['scenario'].channels[channel_name].conversion_rate)
|
112 |
+
# st.session_state['scenario'].update(channel_name, modified_spends)
|
113 |
+
# else:
|
114 |
+
# try:
|
115 |
+
# modified_spends = float(st.session_state[channel_name])
|
116 |
+
# prev_spends = st.session_state['scenario'].channels[channel_name].actual_total_spends * st.session_state['scenario'].channels[channel_name].conversion_rate
|
117 |
+
# st.session_state[f'{channel_name}_change'] = round(100*(modified_spends - prev_spends) / prev_spends,2)
|
118 |
+
# st.session_state['scenario'].update(channel_name, modified_spends/st.session_state['scenario'].channels[channel_name].conversion_rate)
|
119 |
+
# st.session_state[f'{channel_name}'] = numerize(modified_spends,1)
|
120 |
+
# except ValueError:
|
121 |
+
# st.write('Invalid input')
|
122 |
+
|
123 |
+
def select_channel_for_optimization(channel_name):
|
124 |
+
"""
|
125 |
+
Marks the given channel for optimization
|
126 |
+
"""
|
127 |
+
st.session_state['optimization_channels'][channel_name] = st.session_state[f'{channel_name}_selected']
|
128 |
+
|
129 |
+
def select_all_channels_for_optimization():
|
130 |
+
"""
|
131 |
+
Marks all the channel for optimization
|
132 |
+
"""
|
133 |
+
for channel_name in st.session_state['optimization_channels'].keys():
|
134 |
+
st.session_state[f'{channel_name}_selected' ] = st.session_state['optimze_all_channels']
|
135 |
+
st.session_state['optimization_channels'][channel_name] = st.session_state['optimze_all_channels']
|
136 |
+
|
137 |
+
def update_penalty():
|
138 |
+
"""
|
139 |
+
Updates the penalty flag for sales calculation
|
140 |
+
"""
|
141 |
+
st.session_state['scenario'].update_penalty(st.session_state['apply_penalty'])
|
142 |
+
|
143 |
+
def reset_scenario():
|
144 |
+
# print(st.session_state['default_scenario_dict'])
|
145 |
+
# st.session_state['scenario'] = class_from_dict(st.session_state['default_scenario_dict'])
|
146 |
+
# for channel in st.session_state['scenario'].channels.values():
|
147 |
+
# st.session_state[channel.name] = float(channel.actual_total_spends * channel.conversion_rate)
|
148 |
+
initialize_data()
|
149 |
+
for channel_name in st.session_state['channels_list']:
|
150 |
+
st.session_state[f'{channel_name}_selected'] = False
|
151 |
+
st.session_state[f'{channel_name}_change'] = 0
|
152 |
+
st.session_state['optimze_all_channels'] = False
|
153 |
+
|
154 |
+
def format_number(num):
|
155 |
+
if num >= 1_000_000:
|
156 |
+
return f"{num / 1_000_000:.2f}M"
|
157 |
+
elif num >= 1_000:
|
158 |
+
return f"{num / 1_000:.0f}K"
|
159 |
+
else:
|
160 |
+
return f"{num:.2f}"
|
161 |
+
|
162 |
+
def summary_plot(data, x, y, title, text_column):
|
163 |
+
fig = px.bar(data, x=x, y=y, orientation='h',
|
164 |
+
title=title, text=text_column, color='Channel_name')
|
165 |
+
|
166 |
+
# Convert text_column to numeric values
|
167 |
+
data[text_column] = pd.to_numeric(data[text_column], errors='coerce')
|
168 |
+
|
169 |
+
# Update the format of the displayed text based on magnitude
|
170 |
+
fig.update_traces(texttemplate='%{text:.2s}', textposition='outside', hovertemplate='%{x:.2s}')
|
171 |
+
|
172 |
+
fig.update_layout(xaxis_title=x, yaxis_title='Channel Name', showlegend=False)
|
173 |
+
return fig
|
174 |
+
|
175 |
+
def s_curve(x,K,b,a,x0):
|
176 |
+
return K / (1 + b*np.exp(-a*(x-x0)))
|
177 |
+
|
178 |
+
@st.cache
|
179 |
+
def plot_response_curves():
|
180 |
+
cols=4
|
181 |
+
rcs = st.session_state['rcs']
|
182 |
+
shapes = []
|
183 |
+
fig = make_subplots(rows=6, cols=cols,subplot_titles=channels_list)
|
184 |
+
for i in range(0, len(channels_list)):
|
185 |
+
col = channels_list[i]
|
186 |
+
x = st.session_state['actual_df'][col].values
|
187 |
+
spends = x.sum()
|
188 |
+
power = (np.ceil(np.log(x.max()) / np.log(10) )- 3)
|
189 |
+
x = np.linspace(0,3*x.max(),200)
|
190 |
+
|
191 |
+
K = rcs[col]['K']
|
192 |
+
b = rcs[col]['b']
|
193 |
+
a = rcs[col]['a']
|
194 |
+
x0 = rcs[col]['x0']
|
195 |
+
|
196 |
+
y = s_curve(x/10**power,K,b,a,x0)
|
197 |
+
roi = y/x
|
198 |
+
marginal_roi = a * (y)*(1-y/K)
|
199 |
+
fig.add_trace(
|
200 |
+
go.Scatter(x=52*x*st.session_state['scenario'].channels[col].conversion_rate,
|
201 |
+
y=52*y,
|
202 |
+
name=col,
|
203 |
+
customdata = np.stack((roi, marginal_roi),axis=-1),
|
204 |
+
hovertemplate="Spend:%{x:$.2s}<br>Sale:%{y:$.2s}<br>ROI:%{customdata[0]:.3f}<br>MROI:%{customdata[1]:.3f}"),
|
205 |
+
row=1+(i)//cols , col=i%cols + 1
|
206 |
+
)
|
207 |
+
|
208 |
+
fig.add_trace(go.Scatter(x=[spends*st.session_state['scenario'].channels[col].conversion_rate],
|
209 |
+
y=[52*s_curve(spends/(10**power*52),K,b,a,x0)],
|
210 |
+
name=col,
|
211 |
+
legendgroup=col,
|
212 |
+
showlegend=False,
|
213 |
+
marker=dict(color=['black'])),
|
214 |
+
row=1+(i)//cols , col=i%cols + 1)
|
215 |
+
|
216 |
+
shapes.append(go.layout.Shape(type="line",
|
217 |
+
x0=0,
|
218 |
+
y0=52*s_curve(spends/(10**power*52),K,b,a,x0),
|
219 |
+
x1=spends*st.session_state['scenario'].channels[col].conversion_rate,
|
220 |
+
y1=52*s_curve(spends/(10**power*52),K,b,a,x0),
|
221 |
+
line_width=1,
|
222 |
+
line_dash="dash",
|
223 |
+
line_color="black",
|
224 |
+
xref= f'x{i+1}',
|
225 |
+
yref= f'y{i+1}'))
|
226 |
+
|
227 |
+
shapes.append(go.layout.Shape(type="line",
|
228 |
+
x0=spends*st.session_state['scenario'].channels[col].conversion_rate,
|
229 |
+
y0=0,
|
230 |
+
x1=spends*st.session_state['scenario'].channels[col].conversion_rate,
|
231 |
+
y1=52*s_curve(spends/(10**power*52),K,b,a,x0),
|
232 |
+
line_width=1,
|
233 |
+
line_dash="dash",
|
234 |
+
line_color="black",
|
235 |
+
xref= f'x{i+1}',
|
236 |
+
yref= f'y{i+1}'))
|
237 |
+
|
238 |
+
|
239 |
+
|
240 |
+
fig.update_layout(height=1500, width=1000, title_text="Response Curves",showlegend=False,shapes=shapes)
|
241 |
+
fig.update_annotations(font_size=10)
|
242 |
+
fig.update_xaxes(title='Spends')
|
243 |
+
fig.update_yaxes(title=target)
|
244 |
+
return fig
|
245 |
+
|
246 |
+
|
247 |
+
|
248 |
+
# ======================================================== #
|
249 |
+
# ==================== HTML Components =================== #
|
250 |
+
# ======================================================== #
|
251 |
+
|
252 |
+
def generate_spending_header(heading):
|
253 |
+
return st.markdown(f"""<h2 class="spends-header">{heading}</h2>""",unsafe_allow_html=True)
|
254 |
+
|
255 |
+
|
256 |
+
# ======================================================== #
|
257 |
+
# =================== Session variables ================== #
|
258 |
+
# ======================================================== #
|
259 |
+
|
260 |
+
with open('config.yaml') as file:
|
261 |
+
config = yaml.load(file, Loader=SafeLoader)
|
262 |
+
st.session_state['config'] = config
|
263 |
+
|
264 |
+
authenticator = stauth.Authenticate(
|
265 |
+
config['credentials'],
|
266 |
+
config['cookie']['name'],
|
267 |
+
config['cookie']['key'],
|
268 |
+
config['cookie']['expiry_days'],
|
269 |
+
config['preauthorized']
|
270 |
+
)
|
271 |
+
st.session_state['authenticator'] = authenticator
|
272 |
+
name, authentication_status, username = authenticator.login('Login', 'main')
|
273 |
+
auth_status = st.session_state.get('authentication_status')
|
274 |
+
if auth_status == True:
|
275 |
+
authenticator.logout('Logout', 'main')
|
276 |
+
is_state_initiaized = st.session_state.get('initialized',False)
|
277 |
+
if not is_state_initiaized:
|
278 |
+
initialize_data()
|
279 |
+
|
280 |
+
|
281 |
+
channels_list = st.session_state['channels_list']
|
282 |
+
|
283 |
+
|
284 |
+
# ======================================================== #
|
285 |
+
# ========================== UI ========================== #
|
286 |
+
# ======================================================== #
|
287 |
+
|
288 |
+
print(list(st.session_state.keys()))
|
289 |
+
|
290 |
+
st.header('Simulation')
|
291 |
+
main_header = st.columns((2,2))
|
292 |
+
sub_header = st.columns((1,1,1,1))
|
293 |
+
_scenario = st.session_state['scenario']
|
294 |
+
|
295 |
+
with main_header[0]:
|
296 |
+
st.subheader('Actual')
|
297 |
+
|
298 |
+
with main_header[-1]:
|
299 |
+
st.subheader('Simulated')
|
300 |
+
|
301 |
+
with sub_header[0]:
|
302 |
+
st.metric(label = 'Spends', value=format_numbers(_scenario.actual_total_spends))
|
303 |
+
|
304 |
+
with sub_header[1]:
|
305 |
+
st.metric(label = target, value=format_numbers(float(_scenario.actual_total_sales),include_indicator=False))
|
306 |
+
|
307 |
+
with sub_header[2]:
|
308 |
+
st.metric(label = 'Spends',
|
309 |
+
value=format_numbers(_scenario.modified_total_spends),
|
310 |
+
delta=numerize(_scenario.delta_spends,1))
|
311 |
+
|
312 |
+
with sub_header[3]:
|
313 |
+
st.metric(label = target,
|
314 |
+
value=format_numbers(float(_scenario.modified_total_sales),include_indicator=False),
|
315 |
+
delta=numerize(_scenario.delta_sales,1))
|
316 |
+
|
317 |
+
|
318 |
+
|
319 |
+
with st.expander("Channel Spends Simulator"):
|
320 |
+
_columns = st.columns((2,4,1,1))
|
321 |
+
with _columns[0]:
|
322 |
+
st.checkbox(label='Optimize all Channels',
|
323 |
+
key=f'optimze_all_channels',
|
324 |
+
value=False,
|
325 |
+
on_change=select_all_channels_for_optimization,
|
326 |
+
)
|
327 |
+
st.number_input('Percent change of total spends',
|
328 |
+
key=f'total_spends_change',
|
329 |
+
step= 1,
|
330 |
+
on_change=update_all_spends)
|
331 |
+
with _columns[2]:
|
332 |
+
st.button('Optimize',on_click=optimize)
|
333 |
+
with _columns[3]:
|
334 |
+
st.button('Reset',on_click=reset_scenario)
|
335 |
+
|
336 |
+
|
337 |
+
|
338 |
+
st.markdown("""<hr class="spends-heading-seperator">""", unsafe_allow_html=True)
|
339 |
+
_columns = st.columns((2.5,2,1.5,1.5,1))
|
340 |
+
with _columns[0]:
|
341 |
+
generate_spending_header('Channel')
|
342 |
+
with _columns[1]:
|
343 |
+
generate_spending_header('Spends Input')
|
344 |
+
with _columns[2]:
|
345 |
+
generate_spending_header('Spends')
|
346 |
+
with _columns[3]:
|
347 |
+
generate_spending_header(target)
|
348 |
+
with _columns[4]:
|
349 |
+
generate_spending_header('Optimize')
|
350 |
+
|
351 |
+
st.markdown("""<hr class="spends-heading-seperator">""", unsafe_allow_html=True)
|
352 |
+
|
353 |
+
if 'acutual_predicted' not in st.session_state:
|
354 |
+
st.session_state['acutual_predicted']={'Channel_name':[],
|
355 |
+
'Actual_spend':[],
|
356 |
+
'Optimized_spend':[],
|
357 |
+
'Delta':[]
|
358 |
+
}
|
359 |
+
for i,channel_name in enumerate(channels_list):
|
360 |
+
_channel_class = st.session_state['scenario'].channels[channel_name]
|
361 |
+
_columns = st.columns((2.5,1.5,1.5,1.5,1))
|
362 |
+
with _columns[0]:
|
363 |
+
st.write(channel_name_formating(channel_name))
|
364 |
+
with _columns[1]:
|
365 |
+
channel_bounds = _channel_class.bounds
|
366 |
+
channel_spends = float(_channel_class.actual_total_spends )
|
367 |
+
min_value = float((1+channel_bounds[0]/100) * channel_spends )
|
368 |
+
max_value = float((1+channel_bounds[1]/100) * channel_spends )
|
369 |
+
#print(st.session_state[channel_name])
|
370 |
+
spend_input = st.text_input(channel_name,
|
371 |
+
key=channel_name,
|
372 |
+
label_visibility='collapsed',
|
373 |
+
on_change=partial(update_data,channel_name))
|
374 |
+
if not validate_input(spend_input):
|
375 |
+
st.error('Invalid input')
|
376 |
+
|
377 |
+
st.number_input('Percent change',
|
378 |
+
key=f'{channel_name}_change',
|
379 |
+
step= 1,
|
380 |
+
on_change=partial(update_data_by_percent,channel_name))
|
381 |
+
|
382 |
+
with _columns[2]:
|
383 |
+
# spends
|
384 |
+
current_channel_spends = float(_channel_class.modified_total_spends * _channel_class.conversion_rate)
|
385 |
+
actual_channel_spends = float(_channel_class.actual_total_spends * _channel_class.conversion_rate)
|
386 |
+
spends_delta = float(_channel_class.delta_spends * _channel_class.conversion_rate)
|
387 |
+
st.session_state['acutual_predicted']['Channel_name'].append(channel_name)
|
388 |
+
st.session_state['acutual_predicted']['Actual_spend'].append(actual_channel_spends)
|
389 |
+
st.session_state['acutual_predicted']['Optimized_spend'].append(current_channel_spends)
|
390 |
+
st.session_state['acutual_predicted']['Delta'].append(spends_delta)
|
391 |
+
## REMOVE
|
392 |
+
st.metric('Spends',
|
393 |
+
format_numbers(current_channel_spends),
|
394 |
+
delta=numerize(spends_delta,1),
|
395 |
+
label_visibility='collapsed')
|
396 |
+
|
397 |
+
with _columns[3]:
|
398 |
+
# sales
|
399 |
+
current_channel_sales = float(_channel_class.modified_total_sales)
|
400 |
+
actual_channel_sales = float(_channel_class.actual_total_sales)
|
401 |
+
sales_delta = float(_channel_class.delta_sales)
|
402 |
+
st.metric(target,
|
403 |
+
format_numbers(current_channel_sales,include_indicator=False),
|
404 |
+
delta=numerize(sales_delta,1),
|
405 |
+
label_visibility='collapsed')
|
406 |
+
|
407 |
+
with _columns[4]:
|
408 |
+
|
409 |
+
st.checkbox(label='select for optimization',
|
410 |
+
key=f'{channel_name}_selected',
|
411 |
+
value=False,
|
412 |
+
on_change=partial(select_channel_for_optimization,channel_name),
|
413 |
+
label_visibility='collapsed')
|
414 |
+
|
415 |
+
|
416 |
+
st.markdown("""<hr class="spends-child-seperator">""",unsafe_allow_html=True)
|
417 |
+
|
418 |
+
|
419 |
+
with st.expander("See Response Curves"):
|
420 |
+
fig = plot_response_curves()
|
421 |
+
st.plotly_chart(fig,use_container_width=True)
|
422 |
+
|
423 |
+
_columns = st.columns(2)
|
424 |
+
with _columns[0]:
|
425 |
+
st.subheader('Save Scenario')
|
426 |
+
scenario_name = st.text_input('Scenario name', key='scenario_input',placeholder='Scenario name',label_visibility='collapsed')
|
427 |
+
st.button('Save', on_click=lambda : save_scenario(scenario_name),disabled=len(st.session_state['scenario_input']) == 0)
|
428 |
+
|
429 |
+
summary_df=pd.DataFrame(st.session_state['acutual_predicted'])
|
430 |
+
summary_df.drop_duplicates(subset='Channel_name',keep='last',inplace=True)
|
431 |
+
|
432 |
+
summary_df_sorted = summary_df.sort_values(by='Delta', ascending=False)
|
433 |
+
summary_df_sorted['Delta_percent'] = np.round(((summary_df_sorted['Optimized_spend'] / summary_df_sorted['Actual_spend'])-1) * 100, 2)
|
434 |
+
|
435 |
+
with open("summary_df.pkl", "wb") as f:
|
436 |
+
pickle.dump(summary_df_sorted, f)
|
437 |
+
#st.dataframe(summary_df_sorted)
|
438 |
+
# ___columns=st.columns(3)
|
439 |
+
# with ___columns[2]:
|
440 |
+
# fig=summary_plot(summary_df_sorted, x='Delta_percent', y='Channel_name', title='Delta', text_column='Delta_percent')
|
441 |
+
# st.plotly_chart(fig,use_container_width=True)
|
442 |
+
# with ___columns[0]:
|
443 |
+
# fig=summary_plot(summary_df_sorted, x='Actual_spend', y='Channel_name', title='Actual Spend', text_column='Actual_spend')
|
444 |
+
# st.plotly_chart(fig,use_container_width=True)
|
445 |
+
# with ___columns[1]:
|
446 |
+
# fig=summary_plot(summary_df_sorted, x='Optimized_spend', y='Channel_name', title='Planned Spend', text_column='Optimized_spend')
|
447 |
+
# st.plotly_chart(fig,use_container_width=True)
|
448 |
+
|
449 |
+
elif auth_status == False:
|
450 |
+
st.error('Username/Password is incorrect')
|
451 |
+
|
452 |
+
if auth_status != True:
|
453 |
+
try:
|
454 |
+
username_forgot_pw, email_forgot_password, random_password = authenticator.forgot_password('Forgot password')
|
455 |
+
if username_forgot_pw:
|
456 |
+
st.session_state['config']['credentials']['usernames'][username_forgot_pw]['password'] = stauth.Hasher([random_password]).generate()[0]
|
457 |
+
send_email(email_forgot_password, random_password)
|
458 |
+
st.success('New password sent securely')
|
459 |
+
# Random password to be transferred to user securely
|
460 |
+
elif username_forgot_pw == False:
|
461 |
+
st.error('Username not found')
|
462 |
+
except Exception as e:
|
463 |
+
st.error(e)
|
464 |
+
|
Categorised_data.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:345f0822aa370833a5e502764925cd46eeac20459c61e6e7922b8e756cba1d2b
|
3 |
+
size 696
|
Channel_wise_imp_click_spends.xlsx
ADDED
Binary file (139 kB). View file
|
|
Channel_wise_imp_click_spends_new.xlsx
ADDED
Binary file (217 kB). View file
|
|
Data_Import.py
ADDED
@@ -0,0 +1,384 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Importing necessary libraries
|
2 |
+
import streamlit as st
|
3 |
+
import pickle
|
4 |
+
|
5 |
+
st.set_page_config(
|
6 |
+
page_title="Model Build",
|
7 |
+
page_icon=":shark:",
|
8 |
+
layout="wide",
|
9 |
+
initial_sidebar_state="collapsed",
|
10 |
+
)
|
11 |
+
|
12 |
+
from utilities import load_authenticator
|
13 |
+
import numpy as np
|
14 |
+
import pandas as pd
|
15 |
+
from utilities import set_header, load_local_css
|
16 |
+
|
17 |
+
load_local_css("styles.css")
|
18 |
+
set_header()
|
19 |
+
|
20 |
+
|
21 |
+
for k, v in st.session_state.items():
|
22 |
+
if k not in ['logout', 'login','config'] and not k.startswith('FormSubmitter'):
|
23 |
+
st.session_state[k] = v
|
24 |
+
|
25 |
+
authenticator = st.session_state.get('authenticator')
|
26 |
+
if authenticator is None:
|
27 |
+
authenticator = load_authenticator()
|
28 |
+
|
29 |
+
name, authentication_status, username = authenticator.login('Login', 'main')
|
30 |
+
auth_status = st.session_state.get('authentication_status')
|
31 |
+
|
32 |
+
if auth_status == True:
|
33 |
+
is_state_initiaized = st.session_state.get('initialized',False)
|
34 |
+
if not is_state_initiaized:
|
35 |
+
a=1
|
36 |
+
|
37 |
+
|
38 |
+
# Function to expand dataframe to daily
|
39 |
+
@st.cache_resource(show_spinner=False)
|
40 |
+
def expand_to_daily(df, granularity, start_date, end_date):
|
41 |
+
# Create a new DataFrame with a row for each day
|
42 |
+
all_dates = pd.date_range(start=start_date, end=end_date, freq="D")
|
43 |
+
daily_df = pd.DataFrame(all_dates, columns=["Date"])
|
44 |
+
|
45 |
+
if granularity == "daily":
|
46 |
+
# For daily data, simply merge to fill missing dates
|
47 |
+
daily_df = daily_df.merge(df, on="Date", how="left")
|
48 |
+
else:
|
49 |
+
# For weekly or monthly, distribute values to daily rows
|
50 |
+
for column in df.columns:
|
51 |
+
if column != "Date": # Skip 'Date' column
|
52 |
+
daily_df[column] = np.nan # Initialize with NaNs
|
53 |
+
|
54 |
+
# Group by the required frequency and distribute values
|
55 |
+
freq = "W-MON" if granularity == "weekly" else "MS"
|
56 |
+
for _, group in df.groupby(pd.Grouper(key="Date", freq=freq)):
|
57 |
+
num_days = len(
|
58 |
+
pd.date_range(group["Date"].min(), group["Date"].max(), freq="D")
|
59 |
+
)
|
60 |
+
for column in group.columns:
|
61 |
+
if column == "Date": # Skip 'Date' column
|
62 |
+
continue
|
63 |
+
value = group[column].sum() / num_days
|
64 |
+
date_range = pd.date_range(
|
65 |
+
group["Date"].min(), periods=num_days, freq="D"
|
66 |
+
)
|
67 |
+
daily_df.loc[daily_df["Date"].isin(date_range), column] = value
|
68 |
+
|
69 |
+
return daily_df
|
70 |
+
|
71 |
+
|
72 |
+
# Function to validate date column in dataframe
|
73 |
+
def validate_date_column(df):
|
74 |
+
try:
|
75 |
+
# Attempt to convert the 'Date' column to datetime
|
76 |
+
df["Date"] = pd.to_datetime(df["Date"], format="%d-%m-%Y")
|
77 |
+
return True
|
78 |
+
except:
|
79 |
+
return False
|
80 |
+
|
81 |
+
|
82 |
+
# Function to determine data interval
|
83 |
+
def determine_data_interval(common_freq):
|
84 |
+
if common_freq == 1:
|
85 |
+
return "daily"
|
86 |
+
elif common_freq == 7:
|
87 |
+
return "weekly"
|
88 |
+
elif 28 <= common_freq <= 31:
|
89 |
+
return "monthly"
|
90 |
+
else:
|
91 |
+
return "irregular"
|
92 |
+
|
93 |
+
|
94 |
+
# Function to convert and fill dates in dataframe
|
95 |
+
def convert_and_fill_dates(df, start_date, end_date, interval):
|
96 |
+
# Create a date range for the desired period
|
97 |
+
all_dates = pd.date_range(start=start_date, end=end_date, freq="D")
|
98 |
+
new_df = pd.DataFrame(all_dates, columns=["Date"])
|
99 |
+
|
100 |
+
# Preprocess and aggregate data based on the original interval
|
101 |
+
if interval != "daily":
|
102 |
+
# Resample to start of each week/month, then sum values for the same period
|
103 |
+
if interval == "weekly":
|
104 |
+
df = df.resample("W-MON", on="Date").sum().reset_index()
|
105 |
+
elif interval == "monthly":
|
106 |
+
df = df.resample("MS", on="Date").sum().reset_index()
|
107 |
+
|
108 |
+
# Distribute values equally across the days in each week/month
|
109 |
+
expanded_rows = []
|
110 |
+
for _, row in df.iterrows():
|
111 |
+
if interval == "weekly":
|
112 |
+
period_dates = pd.date_range(row["Date"], periods=7)
|
113 |
+
elif interval == "monthly":
|
114 |
+
period_end = row["Date"] + pd.offsets.MonthEnd(1)
|
115 |
+
period_dates = pd.date_range(row["Date"], period_end)
|
116 |
+
|
117 |
+
for date in period_dates:
|
118 |
+
new_row = row.copy()
|
119 |
+
new_row["Date"] = date
|
120 |
+
for col in df.columns:
|
121 |
+
if col != "Date": # Skip 'Date' column
|
122 |
+
new_row[col] = row[col] / len(period_dates)
|
123 |
+
expanded_rows.append(new_row)
|
124 |
+
|
125 |
+
# Create a DataFrame from expanded rows
|
126 |
+
expanded_df = pd.DataFrame(expanded_rows)
|
127 |
+
new_df = pd.merge(new_df, expanded_df, how="left", on="Date")
|
128 |
+
else:
|
129 |
+
# Daily data, aggregate if there are multiple entries for the same day
|
130 |
+
df = df.groupby("Date").sum().reset_index()
|
131 |
+
new_df = pd.merge(new_df, df, how="left", on="Date")
|
132 |
+
|
133 |
+
# Ensure all dates from start to end are present, filling missing values with NaN
|
134 |
+
new_df["Date"] = pd.to_datetime(new_df["Date"]) # Ensure 'Date' is datetime type
|
135 |
+
new_df = new_df.set_index("Date").reindex(all_dates).reset_index()
|
136 |
+
new_df.rename(columns={"index": "Date"}, inplace=True)
|
137 |
+
|
138 |
+
return new_df
|
139 |
+
|
140 |
+
|
141 |
+
# Function to convert a DataFrame from daily level granularity to either weekly or monthly level
|
142 |
+
def convert_to_higher_granularity(df, required_granularity):
|
143 |
+
if required_granularity == "daily":
|
144 |
+
return df
|
145 |
+
|
146 |
+
# Ensure 'Date' is the index and is in datetime format
|
147 |
+
if not pd.api.types.is_datetime64_any_dtype(df["Date"]):
|
148 |
+
df["Date"] = pd.to_datetime(df["Date"])
|
149 |
+
df.set_index("Date", inplace=True)
|
150 |
+
|
151 |
+
# Resample and aggregate
|
152 |
+
if required_granularity == "weekly":
|
153 |
+
# Resample to weekly, using 'W-MON' to indicate weeks starting on Monday
|
154 |
+
df = df.resample("W-MON").sum()
|
155 |
+
elif required_granularity == "monthly":
|
156 |
+
# Resample to monthly, using 'MS' to indicate month start
|
157 |
+
df = df.resample("MS").sum()
|
158 |
+
|
159 |
+
# Reset index to move 'Date' back to a column
|
160 |
+
df.reset_index(inplace=True)
|
161 |
+
|
162 |
+
return df
|
163 |
+
|
164 |
+
|
165 |
+
# # Read the CSV file, parsing 'Date' column as datetime
|
166 |
+
main_df = pd.read_csv("Media_data_for_model_dma_level.csv", dayfirst=True, parse_dates=["Date"])
|
167 |
+
# st.write(main_df)
|
168 |
+
|
169 |
+
# Get the start date (minimum) and end date (maximum) from the 'Date' column
|
170 |
+
api_start_date = main_df["Date"].min()
|
171 |
+
api_end_date = main_df["Date"].max()
|
172 |
+
|
173 |
+
# Infer the granularity from the most common difference between consecutive dates
|
174 |
+
date_diffs = main_df["Date"].diff().dt.days.dropna()
|
175 |
+
common_diff = date_diffs.mode()[0]
|
176 |
+
api_granularity = determine_data_interval(common_diff)
|
177 |
+
|
178 |
+
# Convert the DataFrame to daily level granularity
|
179 |
+
main_df = expand_to_daily(main_df, api_granularity, api_start_date, api_end_date)
|
180 |
+
|
181 |
+
# Page Title
|
182 |
+
st.title("Data Import")
|
183 |
+
|
184 |
+
# File uploader
|
185 |
+
uploaded_files = st.file_uploader(
|
186 |
+
"Upload additional data", type=["xlsx"], accept_multiple_files=True
|
187 |
+
)
|
188 |
+
|
189 |
+
# Custom HTML for upload instructions
|
190 |
+
recommendation_html = f"""
|
191 |
+
<div style="text-align: justify;">
|
192 |
+
<strong>Recommendation:</strong> For optimal processing, please ensure that all uploaded datasets including media, internal, and exogenous data adhere to the following guidelines: Each dataset must include a <code>Date</code> column formatted as <code>DD-MM-YYYY</code>, be free of missing values, and aggregated to a {api_granularity} level.
|
193 |
+
</div>
|
194 |
+
"""
|
195 |
+
|
196 |
+
st.markdown(recommendation_html, unsafe_allow_html=True)
|
197 |
+
|
198 |
+
# Initialize a list to collect all processed DataFrames
|
199 |
+
all_data_dfs = []
|
200 |
+
|
201 |
+
if uploaded_files:
|
202 |
+
for uploaded_file in uploaded_files:
|
203 |
+
# Extract the file name
|
204 |
+
file_name = uploaded_file.name
|
205 |
+
|
206 |
+
# Load the file into a DataFrame
|
207 |
+
data_df = pd.read_excel(
|
208 |
+
uploaded_file,
|
209 |
+
)
|
210 |
+
|
211 |
+
# Identify numeric columns in the DataFrame
|
212 |
+
numeric_columns = data_df.select_dtypes(include="number").columns.tolist()
|
213 |
+
|
214 |
+
# Validate the 'Date' column and ensure there's at least one numeric column
|
215 |
+
if validate_date_column(data_df) and len(numeric_columns) > 0:
|
216 |
+
data_df = data_df[["Date"] + numeric_columns]
|
217 |
+
|
218 |
+
# Ensure the 'Date' column is in datetime format and sorted
|
219 |
+
data_df["Date"] = pd.to_datetime(data_df["Date"], dayfirst=True)
|
220 |
+
data_df.sort_values("Date", inplace=True)
|
221 |
+
|
222 |
+
# Calculate the most common day difference between dates to determine frequency
|
223 |
+
common_freq = data_df["Date"].diff().dt.days.dropna().mode()[0]
|
224 |
+
|
225 |
+
# Calculate the data interval (daily, weekly, monthly or irregular)
|
226 |
+
interval = determine_data_interval(common_freq)
|
227 |
+
|
228 |
+
if interval == "irregular":
|
229 |
+
# Warn the user if the 'Date' column doesn't meet the format requirements
|
230 |
+
st.warning(
|
231 |
+
f"File Name: {file_name} ➜ Please upload data in daily, weekly or monthly interval."
|
232 |
+
)
|
233 |
+
continue
|
234 |
+
|
235 |
+
# Convert data to specified interval and redistribute to daily
|
236 |
+
data_df = convert_and_fill_dates(
|
237 |
+
data_df, api_start_date, api_end_date, interval
|
238 |
+
)
|
239 |
+
|
240 |
+
# Add the processed DataFrame to the list
|
241 |
+
all_data_dfs.append(data_df)
|
242 |
+
|
243 |
+
else:
|
244 |
+
# Warn the user if the 'Date' column doesn't meet the format requirements
|
245 |
+
st.warning(
|
246 |
+
f"File Name: {file_name} ➜ Please upload data with Date column in 'DD-MM-YYYY' format and at least one media/exogenous column."
|
247 |
+
)
|
248 |
+
|
249 |
+
# Sequentially merge each of the other DataFrames with the main DataFrame on 'Date'
|
250 |
+
for df in all_data_dfs:
|
251 |
+
main_df = pd.merge(main_df, df, on="Date", how="left")
|
252 |
+
|
253 |
+
|
254 |
+
# Function to calculate missing stats and prepare for editable DataFrame
|
255 |
+
def prepare_missing_stats_df(df):
|
256 |
+
missing_stats = []
|
257 |
+
for column in df.columns:
|
258 |
+
if (
|
259 |
+
column == "Date" or column == "Total Approved Accounts - Revenue"
|
260 |
+
): # Skip Date and Revenue column
|
261 |
+
continue
|
262 |
+
|
263 |
+
missing = df[column].isnull().sum()
|
264 |
+
pct_missing = round((missing / len(df)) * 100, 2)
|
265 |
+
missing_stats.append(
|
266 |
+
{
|
267 |
+
"Column": column,
|
268 |
+
"Missing Values": missing,
|
269 |
+
"Missing Percentage": pct_missing,
|
270 |
+
"Impute Method": "Fill with 0", # Default value
|
271 |
+
"Category": "Media", # Default value
|
272 |
+
}
|
273 |
+
)
|
274 |
+
stats_df = pd.DataFrame(missing_stats)
|
275 |
+
return stats_df
|
276 |
+
|
277 |
+
|
278 |
+
# Prepare missing stats DataFrame for editing
|
279 |
+
missing_stats_df = prepare_missing_stats_df(main_df)
|
280 |
+
|
281 |
+
# Create an editable DataFrame in Streamlit
|
282 |
+
st.markdown("#### Select Variables Category & Impute Missing Values")
|
283 |
+
|
284 |
+
edited_stats_df = st.data_editor(
|
285 |
+
missing_stats_df,
|
286 |
+
column_config={
|
287 |
+
"Impute Method": st.column_config.SelectboxColumn(
|
288 |
+
options=[
|
289 |
+
"Drop Column",
|
290 |
+
"Fill with Mean",
|
291 |
+
"Fill with Median",
|
292 |
+
"Fill with 0",
|
293 |
+
],
|
294 |
+
required=True,
|
295 |
+
default="Fill with 0",
|
296 |
+
),
|
297 |
+
"Category": st.column_config.SelectboxColumn(
|
298 |
+
options=[
|
299 |
+
"Date",
|
300 |
+
"Media",
|
301 |
+
"Exogenous",
|
302 |
+
"Internal",
|
303 |
+
"DMA/Panel",
|
304 |
+
"Response_Metric"
|
305 |
+
],
|
306 |
+
required=True,
|
307 |
+
default="Media",
|
308 |
+
),
|
309 |
+
},
|
310 |
+
disabled=["Column", "Missing Values", "Missing Percentage"],
|
311 |
+
hide_index=True,
|
312 |
+
use_container_width=True,
|
313 |
+
)
|
314 |
+
|
315 |
+
|
316 |
+
# Apply changes based on edited DataFrame
|
317 |
+
for i, row in edited_stats_df.iterrows():
|
318 |
+
column = row["Column"]
|
319 |
+
if row["Impute Method"] == "Drop Column":
|
320 |
+
main_df.drop(columns=[column], inplace=True)
|
321 |
+
|
322 |
+
elif row["Impute Method"] == "Fill with Mean":
|
323 |
+
main_df[column].fillna(main_df[column].mean(), inplace=True)
|
324 |
+
|
325 |
+
elif row["Impute Method"] == "Fill with Median":
|
326 |
+
main_df[column].fillna(main_df[column].median(), inplace=True)
|
327 |
+
|
328 |
+
elif row["Impute Method"] == "Fill with 0":
|
329 |
+
main_df[column].fillna(0, inplace=True)
|
330 |
+
|
331 |
+
|
332 |
+
# Convert the Final DataFrame to required granularity
|
333 |
+
main_df = convert_to_higher_granularity(main_df, api_granularity)
|
334 |
+
|
335 |
+
# Display the Final DataFrame and exogenous variables
|
336 |
+
st.markdown("#### Final DataFrame:")
|
337 |
+
st.dataframe(main_df)
|
338 |
+
|
339 |
+
|
340 |
+
|
341 |
+
# Initialize an empty dictionary to hold categories and their variables
|
342 |
+
category_dict = {}
|
343 |
+
|
344 |
+
# Iterate over each row in the edited DataFrame to populate the dictionary
|
345 |
+
for i, row in edited_stats_df.iterrows():
|
346 |
+
column = row["Column"]
|
347 |
+
category = row["Category"] # The category chosen by the user for this variable
|
348 |
+
|
349 |
+
# Check if the category already exists in the dictionary
|
350 |
+
if category not in category_dict:
|
351 |
+
# If not, initialize it with the current column as its first element
|
352 |
+
category_dict[category] = [column]
|
353 |
+
else:
|
354 |
+
# If it exists, append the current column to the list of variables under this category
|
355 |
+
category_dict[category].append(column)
|
356 |
+
|
357 |
+
# Display the dictionary
|
358 |
+
st.markdown("#### Variable Category:")
|
359 |
+
for category, variables in category_dict.items():
|
360 |
+
# Check if there are multiple variables to handle "and" insertion correctly
|
361 |
+
if len(variables) > 1:
|
362 |
+
# Join all but the last variable with ", ", then add " and " before the last variable
|
363 |
+
variables_str = ", ".join(variables[:-1]) + " and " + variables[-1]
|
364 |
+
else:
|
365 |
+
# If there's only one variable, no need for "and"
|
366 |
+
variables_str = variables[0]
|
367 |
+
|
368 |
+
# Display the category and its variables in the desired format
|
369 |
+
st.markdown(f"**{category}:** {variables_str}\n\n", unsafe_allow_html=True)
|
370 |
+
|
371 |
+
# storing maindf and categories in session_state
|
372 |
+
# st.write(main_df)
|
373 |
+
|
374 |
+
|
375 |
+
# st.session_state['Cleaned_data']=main_df
|
376 |
+
|
377 |
+
# st.session_state['category_dict']=category_dict
|
378 |
+
if st.button('Save Changes'):
|
379 |
+
|
380 |
+
with open("Pickle_files/main_df", 'wb') as f:
|
381 |
+
pickle.dump(main_df, f)
|
382 |
+
with open("Pickle_files/category_dict",'wb') as c:
|
383 |
+
pickle.dump(category_dict,c)
|
384 |
+
st.success('Changes Saved!')
|
Data_prep_functions.py
ADDED
@@ -0,0 +1,236 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
import plotly.express as px
|
4 |
+
import plotly.graph_objects as go
|
5 |
+
import numpy as np
|
6 |
+
import pickle
|
7 |
+
import statsmodels.api as sm
|
8 |
+
import numpy as np
|
9 |
+
from sklearn.metrics import mean_absolute_error, r2_score,mean_absolute_percentage_error
|
10 |
+
from sklearn.preprocessing import MinMaxScaler
|
11 |
+
import matplotlib.pyplot as plt
|
12 |
+
from statsmodels.stats.outliers_influence import variance_inflation_factor
|
13 |
+
from plotly.subplots import make_subplots
|
14 |
+
|
15 |
+
st.set_option('deprecation.showPyplotGlobalUse', False)
|
16 |
+
from datetime import datetime
|
17 |
+
import seaborn as sns
|
18 |
+
|
19 |
+
def calculate_discount(promo_price_series, non_promo_price_series):
|
20 |
+
# Calculate the 4-week moving average of non-promo price
|
21 |
+
window_size = 4
|
22 |
+
base_price = non_promo_price_series.rolling(window=window_size).mean()
|
23 |
+
|
24 |
+
# Calculate discount_raw
|
25 |
+
discount_raw_series = (1 - promo_price_series / base_price) * 100
|
26 |
+
|
27 |
+
# Calculate discount_final
|
28 |
+
discount_final_series = discount_raw_series.where(discount_raw_series >= 5, 0)
|
29 |
+
|
30 |
+
return base_price, discount_raw_series, discount_final_series
|
31 |
+
|
32 |
+
|
33 |
+
def create_dual_axis_line_chart(date_series, promo_price_series, non_promo_price_series, base_price_series, discount_series):
|
34 |
+
# Create traces for the primary axis (price vars)
|
35 |
+
trace1 = go.Scatter(
|
36 |
+
x=date_series,
|
37 |
+
y=promo_price_series,
|
38 |
+
name='Promo Price',
|
39 |
+
yaxis='y1'
|
40 |
+
)
|
41 |
+
|
42 |
+
trace2 = go.Scatter(
|
43 |
+
x=date_series,
|
44 |
+
y=non_promo_price_series,
|
45 |
+
name='Non-Promo Price',
|
46 |
+
yaxis='y1'
|
47 |
+
)
|
48 |
+
|
49 |
+
trace3 = go.Scatter(
|
50 |
+
x=date_series,
|
51 |
+
y=base_price_series,
|
52 |
+
name='Base Price',
|
53 |
+
yaxis='y1'
|
54 |
+
)
|
55 |
+
|
56 |
+
# Create a trace for the secondary axis (discount)
|
57 |
+
trace4 = go.Scatter(
|
58 |
+
x=date_series,
|
59 |
+
y=discount_series,
|
60 |
+
name='Discount',
|
61 |
+
yaxis='y2'
|
62 |
+
)
|
63 |
+
|
64 |
+
# Create the layout with dual axes
|
65 |
+
layout = go.Layout(
|
66 |
+
title='Price and Discount Over Time',
|
67 |
+
yaxis=dict(
|
68 |
+
title='Price',
|
69 |
+
side='left'
|
70 |
+
),
|
71 |
+
yaxis2=dict(
|
72 |
+
title='Discount',
|
73 |
+
side='right',
|
74 |
+
overlaying='y',
|
75 |
+
showgrid=False
|
76 |
+
),
|
77 |
+
xaxis=dict(title='Date'),
|
78 |
+
)
|
79 |
+
|
80 |
+
# Create the figure with the defined traces and layout
|
81 |
+
fig = go.Figure(data=[trace1, trace2, trace3, trace4], layout=layout)
|
82 |
+
|
83 |
+
return fig
|
84 |
+
|
85 |
+
|
86 |
+
def to_percentage(value):
|
87 |
+
return f'{value * 100:.1f}%'
|
88 |
+
|
89 |
+
def plot_actual_vs_predicted(date, y, predicted_values, model,target_column=None, flag=None, repeat_all_years=False, is_panel=False):
|
90 |
+
if flag is not None :
|
91 |
+
fig = make_subplots(specs=[[{"secondary_y": True}]])
|
92 |
+
else :
|
93 |
+
fig = go.Figure()
|
94 |
+
|
95 |
+
if is_panel :
|
96 |
+
df=pd.DataFrame()
|
97 |
+
df['date'] = date
|
98 |
+
df['Actual'] = y
|
99 |
+
df['Predicted'] = predicted_values
|
100 |
+
df_agg = df.groupby('date').agg({'Actual':'sum', 'Predicted':'sum'}).reset_index()
|
101 |
+
df_agg.columns = ['date', 'Actual', 'Predicted']
|
102 |
+
assert len(df_agg) == pd.Series(date).nunique()
|
103 |
+
# date = df_agg['date']
|
104 |
+
# y = df_agg['Actual']
|
105 |
+
# predicted_values = df_agg['Predicted']
|
106 |
+
# ymax = df_agg['Actual'].max() # Sprint3 - ymax to set y value for flag
|
107 |
+
|
108 |
+
fig.add_trace(go.Scatter(x=df_agg['date'], y=df_agg['Actual'], mode='lines', name='Actual', line=dict(color='#08083B')))
|
109 |
+
fig.add_trace(go.Scatter(x=df_agg['date'], y=df_agg['Predicted'], mode='lines', name='Predicted', line=dict(color='#11B6BD')))
|
110 |
+
|
111 |
+
else :
|
112 |
+
fig.add_trace(go.Scatter(x=date, y=y, mode='lines', name='Actual', line=dict(color='#08083B')))
|
113 |
+
fig.add_trace(go.Scatter(x=date, y=predicted_values, mode='lines', name='Predicted', line=dict(color='#11B6BD')))
|
114 |
+
|
115 |
+
line_values=[]
|
116 |
+
if flag:
|
117 |
+
min_date, max_date = flag[0], flag[1]
|
118 |
+
min_week = datetime.strptime(str(min_date), "%Y-%m-%d").strftime("%U")
|
119 |
+
max_week = datetime.strptime(str(max_date), "%Y-%m-%d").strftime("%U")
|
120 |
+
month=pd.to_datetime(min_date).month
|
121 |
+
day=pd.to_datetime(min_date).day
|
122 |
+
#st.write(pd.to_datetime(min_date).week)
|
123 |
+
#st.write(min_week)
|
124 |
+
# Initialize an empty list to store line values
|
125 |
+
|
126 |
+
# Sprint3 change : put flags to secondary axis, & made their y value to 1 instead of 5M
|
127 |
+
if repeat_all_years:
|
128 |
+
#line_values=list(pd.to_datetime((pd.Series(date)).dt.week).map(lambda x: 10000 if x==min_week else 0 ))
|
129 |
+
#st.write(pd.Series(date).map(lambda x: pd.Timestamp(x).week))
|
130 |
+
line_values=list(pd.Series(date).map(lambda x: 1 if (pd.Timestamp(x).week >=int(min_week)) & (pd.Timestamp(x).week <=int(max_week)) else 0))
|
131 |
+
assert len(line_values) == len(date)
|
132 |
+
#st.write(line_values)
|
133 |
+
fig.add_trace(go.Scatter(x=date, y=line_values, mode='lines', name='Flag', line=dict(color='#FF5733')),secondary_y=True)
|
134 |
+
else:
|
135 |
+
line_values = []
|
136 |
+
|
137 |
+
line_values = list(pd.Series(date).map(lambda x: 1 if (pd.Timestamp(x) >= pd.Timestamp(min_date)) and (pd.Timestamp(x) <= pd.Timestamp(max_date)) else 0))
|
138 |
+
|
139 |
+
#st.write(line_values)
|
140 |
+
fig.add_trace(go.Scatter(x=date, y=line_values, mode='lines', name='Flag', line=dict(color='#FF5733')),secondary_y=True)
|
141 |
+
|
142 |
+
|
143 |
+
# Calculate MAPE
|
144 |
+
mape = mean_absolute_percentage_error(y, predicted_values)
|
145 |
+
|
146 |
+
# Calculate AdjR2 # Assuming X is your feature matrix
|
147 |
+
r2 = r2_score(y, predicted_values)
|
148 |
+
adjr2 = 1 - (1 - r2) * (len(y) - 1) / (len(y) - len(model.fe_params) - 1)
|
149 |
+
|
150 |
+
# Create a table to display the metrics
|
151 |
+
metrics_table = pd.DataFrame({
|
152 |
+
'Metric': ['MAPE', 'R-squared', 'AdjR-squared'],
|
153 |
+
'Value': [mape, r2, adjr2]
|
154 |
+
})
|
155 |
+
# st.write(metrics_table)
|
156 |
+
fig.update_layout(
|
157 |
+
xaxis=dict(title='Date'),
|
158 |
+
yaxis=dict(title=target_column),
|
159 |
+
xaxis_tickangle=-30
|
160 |
+
)
|
161 |
+
fig.add_annotation(
|
162 |
+
text=f"MAPE: {mape*100:0.1f}%, Adjr2: {adjr2 *100:.1f}%",
|
163 |
+
xref="paper",
|
164 |
+
yref="paper",
|
165 |
+
x=0.95, # Adjust these values to position the annotation
|
166 |
+
y=1.2,
|
167 |
+
showarrow=False,
|
168 |
+
)
|
169 |
+
# print("{}{}"*20, len(line_values))
|
170 |
+
#metrics_table.set_index(['Metric'],inplace=True)
|
171 |
+
return metrics_table,line_values, fig
|
172 |
+
|
173 |
+
def plot_residual_predicted(actual, predicted, df):
|
174 |
+
df_=df.copy()
|
175 |
+
df_['Residuals'] = actual - pd.Series(predicted)
|
176 |
+
df_['StdResidual'] = (df_['Residuals'] - df_['Residuals'].mean()) / df_['Residuals'].std()
|
177 |
+
|
178 |
+
# Create a Plotly scatter plot
|
179 |
+
fig = px.scatter(df_, x=predicted, y='StdResidual', opacity=0.5,color_discrete_sequence=["#11B6BD"])
|
180 |
+
|
181 |
+
# Add horizontal lines
|
182 |
+
fig.add_hline(y=0, line_dash="dash", line_color="darkorange")
|
183 |
+
fig.add_hline(y=2, line_color="red")
|
184 |
+
fig.add_hline(y=-2, line_color="red")
|
185 |
+
|
186 |
+
fig.update_xaxes(title='Predicted')
|
187 |
+
fig.update_yaxes(title='Standardized Residuals (Actual - Predicted)')
|
188 |
+
|
189 |
+
# Set the same width and height for both figures
|
190 |
+
fig.update_layout(title='2.3.1 Residuals over Predicted Values', autosize=False, width=600, height=400)
|
191 |
+
|
192 |
+
return fig
|
193 |
+
|
194 |
+
def residual_distribution(actual, predicted):
|
195 |
+
Residuals = actual - pd.Series(predicted)
|
196 |
+
|
197 |
+
# Create a Seaborn distribution plot
|
198 |
+
sns.set(style="whitegrid")
|
199 |
+
plt.figure(figsize=(6, 4))
|
200 |
+
sns.histplot(Residuals, kde=True, color="#11B6BD")
|
201 |
+
|
202 |
+
plt.title('2.3.3 Distribution of Residuals')
|
203 |
+
plt.xlabel('Residuals')
|
204 |
+
plt.ylabel('Probability Density')
|
205 |
+
|
206 |
+
return plt
|
207 |
+
|
208 |
+
|
209 |
+
def qqplot(actual, predicted):
|
210 |
+
Residuals = actual - pd.Series(predicted)
|
211 |
+
Residuals = pd.Series(Residuals)
|
212 |
+
Resud_std = (Residuals - Residuals.mean()) / Residuals.std()
|
213 |
+
|
214 |
+
# Create a QQ plot using Plotly with custom colors
|
215 |
+
fig = go.Figure()
|
216 |
+
fig.add_trace(go.Scatter(x=sm.ProbPlot(Resud_std).theoretical_quantiles,
|
217 |
+
y=sm.ProbPlot(Resud_std).sample_quantiles,
|
218 |
+
mode='markers',
|
219 |
+
marker=dict(size=5, color="#11B6BD"),
|
220 |
+
name='QQ Plot'))
|
221 |
+
|
222 |
+
# Add the 45-degree reference line
|
223 |
+
diagonal_line = go.Scatter(
|
224 |
+
x=[-2, 2], # Adjust the x values as needed to fit the range of your data
|
225 |
+
y=[-2, 2], # Adjust the y values accordingly
|
226 |
+
mode='lines',
|
227 |
+
line=dict(color='red'), # Customize the line color and style
|
228 |
+
name=' '
|
229 |
+
)
|
230 |
+
fig.add_trace(diagonal_line)
|
231 |
+
|
232 |
+
# Customize the layout
|
233 |
+
fig.update_layout(title='2.3.2 QQ Plot of Residuals',title_x=0.5, autosize=False, width=600, height=400,
|
234 |
+
xaxis_title='Theoretical Quantiles', yaxis_title='Sample Quantiles')
|
235 |
+
|
236 |
+
return fig
|
E0DAF720
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:c17424a08cc3cf634abd12627072cd158aa6934e7441e9886a6556bf4f5a319b
|
3 |
+
size 7185190
|
EDA_Data.xlsx
ADDED
Binary file (62.3 kB). View file
|
|
EDA_week_3.xlsx
ADDED
Binary file (796 kB). View file
|
|
Eda_functions.py
ADDED
@@ -0,0 +1,157 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import plotly.express as px
|
3 |
+
import numpy as np
|
4 |
+
import plotly.graph_objects as go
|
5 |
+
from sklearn.metrics import r2_score
|
6 |
+
from collections import OrderedDict
|
7 |
+
import plotly.express as px
|
8 |
+
import plotly.graph_objects as go
|
9 |
+
import pandas as pd
|
10 |
+
import seaborn as sns
|
11 |
+
import matplotlib.pyplot as plt
|
12 |
+
import streamlit as st
|
13 |
+
import re
|
14 |
+
from matplotlib.colors import ListedColormap
|
15 |
+
# from st_aggrid import AgGrid, GridOptionsBuilder
|
16 |
+
# from src.agstyler import PINLEFT, PRECISION_TWO, draw_grid
|
17 |
+
|
18 |
+
|
19 |
+
def format_numbers(x):
|
20 |
+
if abs(x) >= 1e6:
|
21 |
+
# Format as millions with one decimal place and commas
|
22 |
+
return f'{x/1e6:,.1f}M'
|
23 |
+
elif abs(x) >= 1e3:
|
24 |
+
# Format as thousands with one decimal place and commas
|
25 |
+
return f'{x/1e3:,.1f}K'
|
26 |
+
else:
|
27 |
+
# Format with one decimal place and commas for values less than 1000
|
28 |
+
return f'{x:,.1f}'
|
29 |
+
|
30 |
+
|
31 |
+
|
32 |
+
def line_plot(data, x_col, y1_cols, y2_cols, title):
|
33 |
+
fig = go.Figure()
|
34 |
+
|
35 |
+
for y1_col in y1_cols:
|
36 |
+
fig.add_trace(go.Scatter(x=data[x_col], y=data[y1_col], mode='lines', name=y1_col,line=dict(color='#11B6BD')))
|
37 |
+
|
38 |
+
for y2_col in y2_cols:
|
39 |
+
fig.add_trace(go.Scatter(x=data[x_col], y=data[y2_col], mode='lines', name=y2_col, yaxis='y2',line=dict(color='#739FAE')))
|
40 |
+
if len(y2_cols)!=0:
|
41 |
+
fig.update_layout(yaxis=dict(), yaxis2=dict(overlaying='y', side='right'))
|
42 |
+
else:
|
43 |
+
fig.update_layout(yaxis=dict(), yaxis2=dict(overlaying='y', side='right'))
|
44 |
+
if title:
|
45 |
+
fig.update_layout(title=title)
|
46 |
+
fig.update_xaxes(showgrid=False)
|
47 |
+
fig.update_yaxes(showgrid=False)
|
48 |
+
|
49 |
+
return fig
|
50 |
+
|
51 |
+
|
52 |
+
def line_plot_target(df,target,title):
|
53 |
+
|
54 |
+
coefficients = np.polyfit(df['date'].view('int64'), df[target], 1)
|
55 |
+
trendline = np.poly1d(coefficients)
|
56 |
+
fig = go.Figure()
|
57 |
+
|
58 |
+
fig.add_trace(go.Scatter(x=df['date'], y=df[target], mode='lines', name=target,line=dict(color='#11B6BD')))
|
59 |
+
trendline_x = df['date']
|
60 |
+
trendline_y = trendline(df['date'].view('int64'))
|
61 |
+
|
62 |
+
|
63 |
+
fig.add_trace(go.Scatter(x=trendline_x, y=trendline_y, mode='lines', name='Trendline', line=dict(color='#739FAE')))
|
64 |
+
|
65 |
+
fig.update_layout(
|
66 |
+
title=title,
|
67 |
+
xaxis=dict(type='date')
|
68 |
+
)
|
69 |
+
|
70 |
+
for year in df['date'].dt.year.unique()[1:]:
|
71 |
+
|
72 |
+
january_1 = pd.Timestamp(year=year, month=1, day=1)
|
73 |
+
fig.add_shape(
|
74 |
+
go.layout.Shape(
|
75 |
+
type="line",
|
76 |
+
x0=january_1,
|
77 |
+
x1=january_1,
|
78 |
+
y0=0,
|
79 |
+
y1=1,
|
80 |
+
xref="x",
|
81 |
+
yref="paper",
|
82 |
+
line=dict(color="grey", width=1.5, dash="dash"),
|
83 |
+
)
|
84 |
+
)
|
85 |
+
|
86 |
+
return fig
|
87 |
+
|
88 |
+
def correlation_plot(df,selected_features,target):
|
89 |
+
custom_cmap = ListedColormap(['#08083B', "#11B6BD"])
|
90 |
+
corr_df=df[selected_features]
|
91 |
+
corr_df=pd.concat([corr_df,df[target]],axis=1)
|
92 |
+
fig, ax = plt.subplots(figsize=(16, 12))
|
93 |
+
sns.heatmap(corr_df.corr(),annot=True, cmap='Blues', fmt=".2f", linewidths=0.5,mask=np.triu(corr_df.corr()))
|
94 |
+
#plt.title('Correlation Plot')
|
95 |
+
plt.xticks(rotation=45)
|
96 |
+
plt.yticks(rotation=0)
|
97 |
+
return fig
|
98 |
+
|
99 |
+
def summary(data,selected_feature,spends,Target=None):
|
100 |
+
|
101 |
+
if Target:
|
102 |
+
sum_df = data[selected_feature]
|
103 |
+
sum_df['Year']=data['date'].dt.year
|
104 |
+
sum_df=sum_df.groupby('Year')[selected_feature].sum()
|
105 |
+
sum_df=sum_df.reset_index()
|
106 |
+
total_sum = sum_df.sum(numeric_only=True)
|
107 |
+
total_sum['Year'] = 'Total'
|
108 |
+
sum_df = sum_df.append(total_sum, ignore_index=True)
|
109 |
+
sum_df.set_index(['Year'],inplace=True)
|
110 |
+
sum_df=sum_df.applymap(format_numbers)
|
111 |
+
spends_col=[col for col in sum_df.columns if any(keyword in col for keyword in ['spends', 'cost'])]
|
112 |
+
for col in spends_col:
|
113 |
+
sum_df[col]=sum_df[col].map(lambda x: f'${x}')
|
114 |
+
# st.write(spends_col)
|
115 |
+
# sum_df = sum_df.reindex(sorted(sum_df.columns), axis=1)
|
116 |
+
|
117 |
+
return sum_df
|
118 |
+
else:
|
119 |
+
#selected_feature=list(selected_feature)
|
120 |
+
selected_feature.append(spends)
|
121 |
+
selected_feature=list(set(selected_feature))
|
122 |
+
if len(selected_feature)>1:
|
123 |
+
sum_df = data[selected_feature]
|
124 |
+
sum_df['Year']=data['date'].dt.year
|
125 |
+
sum_df=sum_df.groupby('Year')[selected_feature].agg('sum')
|
126 |
+
sum_df['CPM/CPC']=(sum_df.iloc[:, 1] / sum_df.iloc[:, 0])*1000
|
127 |
+
sum_df.loc['Grand Total']=sum_df.sum()
|
128 |
+
|
129 |
+
sum_df=sum_df.applymap(format_numbers)
|
130 |
+
sum_df.fillna('-',inplace=True)
|
131 |
+
sum_df=sum_df.replace({"0.0":'-','nan':'-'})
|
132 |
+
spends_col=[col for col in sum_df.columns if any(keyword in col for keyword in ['spends', 'cost'])]
|
133 |
+
for col in spends_col:
|
134 |
+
sum_df[col]=sum_df[col].map(lambda x: f'${x}')
|
135 |
+
return sum_df
|
136 |
+
else:
|
137 |
+
sum_df = data[selected_feature]
|
138 |
+
sum_df['Year']=data['date'].dt.year
|
139 |
+
sum_df=sum_df.groupby('Year')[selected_feature].agg('sum')
|
140 |
+
sum_df.loc['Grand Total']=sum_df.sum()
|
141 |
+
sum_df=sum_df.applymap(format_numbers)
|
142 |
+
sum_df.fillna('-',inplace=True)
|
143 |
+
sum_df=sum_df.replace({"0.0":'-','nan':'-'})
|
144 |
+
spends_col=[col for col in sum_df.columns if any(keyword in col for keyword in ['spends', 'cost'])]
|
145 |
+
for col in spends_col:
|
146 |
+
sum_df[col]=sum_df[col].map(lambda x: f'${x}')
|
147 |
+
return sum_df
|
148 |
+
|
149 |
+
|
150 |
+
def sanitize_key(key, prefix=""):
|
151 |
+
# Use regular expressions to remove non-alphanumeric characters and spaces
|
152 |
+
key = re.sub(r'[^a-zA-Z0-9]', '', key)
|
153 |
+
return f"{prefix}{key}"
|
154 |
+
|
155 |
+
|
156 |
+
|
157 |
+
|
Full_Logo_Blue.jpeg
ADDED
Full_Logo_Blue.jpg
ADDED
Full_Logo_Blue.png
ADDED
Full_Logo_Vibrant_Turquoise.png
ADDED
LIME_logo.png
ADDED
Media_data_for_model.csv
ADDED
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Date,paid_search_impressions,paid_search_clicks,kwai_impressions,kwai_clicks,programmaticimpressions,programmaticclicks,affiliates_impressions,affiliates_clicks,indicacao_impressions,indicacao_clicks,infleux_impressions,infleux_clicks,influencer_impressions,influencer_clicks,Total Approved Accounts - Revenue,FB: Level Achieved - Tier 1 Impressions, FB: Level Achieved - Tier 2 Impressions,paid_social_others, GA App: Will And Cid Pequena Baixo Risco Clicks,digital_tactic_others
|
2 |
+
2023-05-09,6111,1916,1365036.0,5044.0,104781,31371909,0,3341,0,11190,0,61956,0,457,5066400,2371841.0,1021599.0,2302543.0,34816.0,19205.0
|
3 |
+
2023-05-10,6233,1888,1234034.0,3899.0,140810,32973036,0,3214,0,9988,0,52049,0,705,5480000,2100238.0,943808.0,2336369.0,19716.0,17415.0
|
4 |
+
2023-05-11,5568,1816,1016155.0,2788.0,102248,50729517,0,3203,0,10869,0,8042,0,381,4133100,2461265.0,1127717.0,1110415.0,21547.0,11051.0
|
5 |
+
2023-05-12,5109,1769,1228032.0,3101.0,100246,63142114,0,2492,0,7096,0,10596,0,299,3573910,2313368.0,1107256.0,1191901.0,31966.0,11081.0
|
6 |
+
2023-05-13,3712,1231,1344557.0,3399.0,100714,59509032,0,3986,0,4282,0,9753,0,366,2776120,3067797.0,1388882.0,1403486.0,38518.0,10762.0
|
7 |
+
2023-05-14,3719,1241,1520157.0,3491.0,120162,49538293,0,1891,0,3002,0,7363,0,278,2611960,3140882.0,1429620.0,2518831.0,44744.0,12151.0
|
8 |
+
2023-05-15,7735,2663,2102264.0,5175.0,106903,46609819,0,2518,0,4548,0,16201,0,880,3951760,2916228.0,1288902.0,2456845.0,36269.0,15290.0
|
9 |
+
2023-05-16,9409,3206,2134290.0,5636.0,88201,9662393,0,2247,0,6690,0,15031,0,1588,4150900,3161940.0,1370882.0,2403330.0,37393.0,14187.0
|
10 |
+
2023-05-17,8409,2785,1473128.0,4336.0,56382,2232239,0,2557,0,6401,0,8946,0,322,3788540,3199527.0,1379566.0,2608845.0,39190.0,12591.0
|
11 |
+
2023-05-18,8364,2873,1733275.0,5009.0,38145,7321146,0,2912,0,7286,0,14366,0,660,3652210,2623727.0,1115471.0,1723470.0,36020.0,12100.0
|
12 |
+
2023-05-19,6432,2050,1784426.0,5063.0,23340,8715910,0,3934,0,6035,0,20378,0,362,3777590,2995998.0,1287313.0,1959870.0,36885.0,12848.0
|
13 |
+
2023-05-20,5428,1724,1635604.0,4408.0,34693,8783612,0,3318,0,4714,0,21030,0,236,3437270,2996479.0,1326416.0,1903323.0,31048.0,12256.0
|
14 |
+
2023-05-21,5657,1807,1788487.0,4492.0,24812,5015214,0,2253,0,4227,0,11656,0,494,3020020,3167634.0,1309450.0,3651254.0,33361.0,13073.0
|
15 |
+
2023-05-22,5768,2036,2176947.0,5688.0,25298,3002995,0,2739,0,8313,0,25663,0,1147,3643240,3573865.0,1548365.0,3939226.0,33410.0,14092.0
|
16 |
+
2023-05-23,5051,1720,2359219.0,6966.0,24773,3005057,0,4738,0,13827,0,47900,0,965,5146270,3248157.0,1376975.0,3631390.0,35016.0,13025.0
|
17 |
+
2023-05-24,6078,1977,1612918.0,4924.0,24591,2833280,0,4816,0,12417,0,94489,0,1254,5832220,3572793.0,1550315.0,3532105.0,37491.0,12546.0
|
18 |
+
2023-05-25,6547,2075,1468456.0,3624.0,19705,2771412,0,5070,0,7395,0,70016,0,762,5217860,3164337.0,1353382.0,3253308.0,34658.0,13154.0
|
19 |
+
2023-05-26,3719,1189,1770048.0,4874.0,16879,2875657,0,2855,0,6964,0,29015,0,627,4123930,2989794.0,1248779.0,3345390.0,38267.0,12788.0
|
20 |
+
2023-05-27,3620,1145,1900387.0,5061.0,14156,2663378,0,3295,0,4472,0,5625,0,1473,2668440,3576647.0,1527545.0,3694843.0,40685.0,12844.0
|
21 |
+
2023-05-28,4195,1302,2026053.0,5703.0,12334,2609966,0,2190,0,3737,0,5030,0,1401,2630380,3376177.0,1447089.0,2563297.0,42359.0,13543.0
|
22 |
+
2023-05-29,5265,1798,2328823.0,6483.0,14783,2537637,0,3954,0,5211,0,221,0,1575,3057510,3765997.0,1720747.0,2865333.0,39579.0,8116.0
|
23 |
+
2023-05-30,3879,1366,2294654.0,6008.0,15979,2489630,0,4465,0,6041,0,6,0,1192,3360270,3790830.0,1751416.0,2822819.0,37234.0,8830.0
|
24 |
+
2023-05-31,3933,1348,1645187.0,4081.0,14208,2337652,0,3797,0,4794,0,6,0,888,3158130,4151434.0,1953620.0,2714074.0,45856.0,6861.0
|
25 |
+
2023-06-01,4817,1530,1862175.0,4841.0,48192,3241822,0,3060,0,4802,0,12820,0,1137,3322330,4151797.0,1903421.0,2255850.0,51175.0,7095.0
|
26 |
+
2023-06-02,5733,1800,966546.0,2646.0,43573,4582872,0,1563,0,10678,0,46810,0,1309,4244170,4313201.0,2009602.0,2074692.0,47378.0,6120.0
|
27 |
+
2023-06-03,4142,1290,2445721.0,11111.0,90587,4764628,0,2176,0,5144,0,27735,0,518,3711670,4514302.0,2083217.0,2095544.0,58527.0,5748.0
|
28 |
+
2023-06-04,5143,1613,2296690.0,6790.0,40929,4717779,0,1280,0,4237,0,5606,0,325,2851980,4179140.0,1889452.0,2152476.0,45239.0,6093.0
|
29 |
+
2023-06-05,5384,1832,3509278.0,8938.0,56272,19979584,0,1377,0,11493,0,25647,0,579,4117320,3683204.0,1641254.0,3616732.0,40356.0,6453.0
|
30 |
+
2023-06-06,4802,1594,3216944.0,7861.0,20049,33102789,0,1485,0,9086,0,36532,0,545,4627290,3822453.0,1716540.0,3687300.0,53347.0,6334.0
|
31 |
+
2023-06-07,5072,1648,2143372.0,5356.0,22553,21321547,0,1576,0,7213,0,21215,0,628,4019320,4178339.0,1811963.0,2354753.0,51632.0,6259.0
|
32 |
+
2023-06-08,4444,1465,3190766.0,8024.0,53653,10254268,0,2046,0,10491,0,19549,0,769,4272770,3941272.0,1738344.0,2283350.0,59291.0,6775.0
|
33 |
+
2023-06-09,4818,1605,3278715.0,9328.0,18347,4890758,0,1925,0,8360,0,32385,0,1732,4788710,3969227.0,1777864.0,2353376.0,52000.0,6026.0
|
34 |
+
2023-06-10,3465,1207,2887842.0,8529.0,725,5489947,0,1230,0,5401,0,37954,0,2136,4707070,4458593.0,2061762.0,2535928.0,66567.0,5554.0
|
35 |
+
2023-06-11,4727,1501,3149290.0,8114.0,738,5313957,0,1839,0,8198,0,32493,0,1533,4560170,4442610.0,2006438.0,2183963.0,47655.0,6008.0
|
36 |
+
2023-06-12,6437,2208,4416005.0,12345.0,149561,5298884,0,1905,0,8542,0,101079,0,472,7031980,4645531.0,1995891.0,3301882.0,38760.0,4966.0
|
37 |
+
2023-06-13,3556,1254,4626697.0,12984.0,258088,5952266,0,2095,0,10415,0,59770,0,1016,5335600,4508060.0,1912958.0,3440789.0,47281.0,4630.0
|
38 |
+
2023-06-14,3178,1060,3389530.0,10298.0,685692,10454400,0,2258,0,24457,0,16016,0,1101,4382390,4573214.0,1920050.0,3160905.0,41549.0,5083.0
|
39 |
+
2023-06-15,2981,999,3131350.0,10791.0,1072645,11631302,0,2265,0,17304,0,10395,0,1188,4334320,4075106.0,1690702.0,3267810.0,50496.0,5037.0
|
40 |
+
2023-06-16,2705,947,2923279.0,11124.0,1166424,11840950,0,1780,0,8938,0,24339,0,966,4560830,4533368.0,1939737.0,2881833.0,41872.0,4604.0
|
41 |
+
2023-06-17,3697,1154,2955836.0,10440.0,807683,9748201,0,2139,0,5741,0,54129,0,766,4890110,4958344.0,2059487.0,3183051.0,52618.0,3675.0
|
42 |
+
2023-06-18,3229,1080,3280006.0,12373.0,116340,8176712,0,1481,0,4741,0,16724,0,864,3388060,4270249.0,1735486.0,3251229.0,39780.0,3696.0
|
43 |
+
2023-06-19,3082,1003,6545797.0,24462.0,55763,4841897,0,2098,0,10520,0,26558,0,2211,4639400,4137846.0,1743715.0,2680413.0,43156.0,4347.0
|
44 |
+
2023-06-20,2422,857,6734594.0,28910.0,52166,4718912,0,2205,0,10284,0,30610,0,1002,4969720,4218772.0,1771102.0,2058734.0,42288.0,4260.0
|
45 |
+
2023-06-21,3366,1132,4784180.0,17247.0,52817,5971594,0,3387,0,9277,0,41697,0,645,4489250,4113884.0,1743016.0,2111350.0,44159.0,4193.0
|
46 |
+
2023-06-22,2841,924,3300680.0,13360.0,29784,6803330,0,4064,0,7068,0,68638,0,481,5006920,3738171.0,1533407.0,1597072.0,35381.0,4173.0
|
47 |
+
2023-06-23,2474,805,2284446.0,9012.0,80066,6833289,0,3274,0,7379,0,13501,0,721,3069350,4479743.0,1889155.0,1647740.0,39089.0,3640.0
|
48 |
+
2023-06-24,2462,814,1947190.0,7247.0,50309,6526903,0,2767,0,4703,0,8438,0,616,2776800,3758421.0,1565736.0,1648519.0,46332.0,3834.0
|
49 |
+
2023-06-25,2082,679,3560248.0,14850.0,50806,6368664,0,2767,0,4414,0,5346,0,628,2860440,4038846.0,1700182.0,2514456.0,43065.0,4201.0
|
50 |
+
2023-06-26,2399,839,5999950.0,28401.0,23209,10788275,0,3699,0,13383,0,13592,0,790,3928490,3427918.0,1403888.0,3598236.0,33883.0,4642.0
|
51 |
+
2023-06-27,2307,804,5005495.0,18260.0,81344,14103220,0,7082,0,8898,0,40917,0,945,5851320,3819654.0,1523667.0,3556028.0,35326.0,4628.0
|
52 |
+
2023-06-28,2215,759,3721084.0,11248.0,20153,10547995,0,8387,0,7120,0,39693,0,944,6083570,3671994.0,1568555.0,1397196.0,33212.0,2998.0
|
53 |
+
2023-06-29,2013,706,3918049.0,10226.0,155296,8525871,0,10096,0,5693,0,24049,0,1512,4328260,3937747.0,1585655.0,3393043.0,30700.0,2519.0
|
54 |
+
2023-06-30,1258,454,3088874.0,7943.0,902115,10945715,0,8904,0,9611,0,62404,0,1029,5252540,4945464.0,1946944.0,1835310.0,52445.0,2839.0
|
55 |
+
2023-07-01,1641,539,3872657.0,12034.0,191537,12141356,0,4956,0,6049,0,31194,0,923,4626340,5328149.0,2224200.0,2123805.0,56724.0,2513.0
|
56 |
+
2023-07-02,1336,485,5799582.0,17238.0,576858,12180985,0,4148,0,4670,0,4766,0,617,3416990,4527404.0,1997256.0,2038953.0,50510.0,21201.0
|
57 |
+
2023-07-03,2712,924,9986061.0,28191.0,442261,14059535,0,5347,0,7408,0,19028,0,1044,4925290,4179823.0,1854231.0,2234940.0,57543.0,14473.0
|
58 |
+
2023-07-04,4137,1419,4717456.0,14519.0,2137830,14463201,0,6164,0,8277,0,12283,0,1531,4394760,4449073.0,1959412.0,2350308.0,49085.0,9854.0
|
59 |
+
2023-07-05,4166,1422,4779589.0,12676.0,2354716,18574154,0,7967,0,11552,0,6628,0,1420,4497600,4464681.0,1969744.0,2390838.0,41411.0,12751.0
|
60 |
+
2023-07-06,4182,1444,4939385.0,12222.0,2364811,15879491,0,6575,0,8461,0,18225,0,997,5114750,4490815.0,1942923.0,2239375.0,44808.0,16216.0
|
61 |
+
2023-07-07,3497,1181,3121447.0,7534.0,1063284,17341347,0,6025,0,8113,0,25962,0,659,4910810,4891573.0,2128787.0,1976413.0,57373.0,12464.0
|
62 |
+
2023-07-08,2760,856,3295227.0,9788.0,1119268,19207341,0,4102,0,6195,0,40506,0,832,4471260,5039604.0,2277255.0,2330435.0,44052.0,15163.0
|
63 |
+
2023-07-09,2809,875,3913741.0,11815.0,749310,25182206,0,6420,0,5222,0,49626,0,718,5706060,4669470.0,2144473.0,3908306.0,49659.0,11716.0
|
64 |
+
2023-07-10,4312,1489,5972974.0,18402.0,1511035,25950979,0,9842,0,10638,0,36204,0,935,5299330,4584106.0,2019220.0,4391654.0,52303.0,12983.0
|
65 |
+
2023-07-11,4579,1550,4999618.0,16469.0,559119,23938153,0,11688,0,36570,0,25216,0,1289,5532390,4458364.0,1932300.0,4150666.0,47979.0,12292.0
|
66 |
+
2023-07-12,4079,1418,4465722.0,13191.0,583520,25196511,0,4610,0,9813,0,20388,0,1210,5067480,4558876.0,2000168.0,4109583.0,54631.0,12366.0
|
67 |
+
2023-07-13,3719,1260,4635033.0,12302.0,903614,25720336,0,7867,0,6792,0,22248,0,857,4393760,4596184.0,1957206.0,3729970.0,48474.0,11017.0
|
68 |
+
2023-07-14,3632,1224,3441594.0,9800.0,1566300,28606996,0,6726,0,6172,0,14670,0,432,3983150,4683387.0,2007387.0,3912229.0,52588.0,10079.0
|
69 |
+
2023-07-15,2909,941,6025085.0,21326.0,1836196,28705476,0,5705,0,4369,0,31202,0,595,4220310,5008167.0,2251661.0,3727627.0,58143.0,10214.0
|
70 |
+
2023-07-16,2818,853,7339565.0,26586.0,4043959,26752554,0,7733,0,3961,0,27180,0,1082,3832400,4716541.0,2092258.0,2114014.0,59204.0,11281.0
|
71 |
+
2023-07-17,4420,1486,9638491.0,32269.0,819444,29437537,0,11485,0,5220,0,66236,0,2418,5691990,4359325.0,1937825.0,1989872.0,55815.0,11896.0
|
72 |
+
2023-07-18,4574,1551,9498457.0,31230.0,1206114,29164369,0,5012,0,7146,0,47074,0,2358,5347820,4882304.0,2163458.0,2157773.0,69573.0,12604.0
|
73 |
+
2023-07-19,4632,1537,9742535.0,26935.0,1491736,30394328,0,6147,0,7028,0,11807,0,1476,4690310,4613422.0,2080215.0,1981362.0,67495.0,12116.0
|
74 |
+
2023-07-20,4891,1632,7630122.0,20720.0,2370192,23939153,0,6261,0,5635,0,17220,0,1338,4576570,4484291.0,1922090.0,1663127.0,75312.0,12252.0
|
75 |
+
2023-07-21,3978,1378,7284968.0,21477.0,2456715,17869335,0,6360,0,10877,0,11431,0,769,4357960,4519305.0,1975730.0,1686467.0,68931.0,10065.0
|
76 |
+
2023-07-22,3151,978,5638955.0,16181.0,2015345,12808440,0,7097,0,5145,0,13811,0,699,3959970,4689346.0,2086993.0,1861883.0,71898.0,9081.0
|
77 |
+
2023-07-23,2905,986,6133144.0,16089.0,881691,11267535,0,5593,0,4746,0,68021,0,514,5284400,4242878.0,1843843.0,1681215.0,61164.0,10797.0
|
78 |
+
2023-07-24,4606,1651,8830736.0,21931.0,189913,35658281,0,8836,0,6040,0,64066,0,1626,6253530,3943001.0,1708849.0,1900126.0,59494.0,10236.0
|
79 |
+
2023-07-25,4414,1597,7750251.0,15384.0,3348941,25011847,0,10262,0,9572,0,15072,0,916,4938210,3976490.0,1729916.0,1911109.0,68826.0,11468.0
|
80 |
+
2023-07-26,4488,1530,8125332.0,16391.0,1040452,24380635,0,9947,0,16453,0,38777,0,1551,5687460,3837786.0,1680967.0,1856885.0,74924.0,13290.0
|
81 |
+
2023-07-27,4105,1494,8054962.0,14724.0,220302,13070502,0,6758,0,8841,0,20622,0,1313,5138270,3636297.0,1544742.0,1772602.0,63935.0,11680.0
|
82 |
+
2023-07-28,3743,1318,6955526.0,11566.0,3991586,5347413,0,10451,0,8496,0,20184,0,1563,4621140,3890784.0,1680538.0,1608577.0,73120.0,11390.0
|
83 |
+
2023-07-29,3395,1192,5132501.0,9837.0,1349895,4441709,0,7115,0,5449,0,18983,0,1129,3893270,4295602.0,1813637.0,1824777.0,80511.0,11911.0
|
84 |
+
2023-07-30,2746,903,4903153.0,11018.0,710000,4431986,0,8491,0,4599,0,24834,0,1109,4020490,3924352.0,1733790.0,1740605.0,72221.0,11440.0
|
85 |
+
2023-07-31,4208,1476,6832832.0,19648.0,1721973,4079656,0,7754,0,7818,0,27918,0,2050,4709550,3760475.0,1501134.0,1957900.0,62124.0,11605.0
|
86 |
+
2023-08-01,4203,1489,6398210.0,15890.0,2250090,5457683,0,7588,0,7948,0,61894,0,1248,5602170,3687038.0,1439092.0,1774701.0,61448.0,11492.0
|
87 |
+
2023-08-02,4285,1515,5402871.0,14825.0,785167,6582085,0,6079,0,7236,0,79041,0,1345,5992910,3807266.0,1493340.0,2025308.0,54506.0,11515.0
|
88 |
+
2023-08-03,4667,1744,4724924.0,8903.0,1111815,10407793,0,9077,0,7117,0,31714,0,1983,4941800,3797879.0,1479623.0,1718831.0,52587.0,11408.0
|
89 |
+
2023-08-04,4201,1562,3732952.0,9116.0,4574481,10660977,0,8436,0,6970,0,25097,0,1055,4659060,3814852.0,1466211.0,1374674.0,57482.0,10785.0
|
90 |
+
2023-08-05,3080,1110,3310732.0,9884.0,3460283,11580456,0,5735,0,5049,0,5911,0,704,3260640,4048945.0,1601234.0,1442690.0,65158.0,9942.0
|
91 |
+
2023-08-06,2809,979,4153998.0,11663.0,5103054,8381689,0,4868,0,4184,0,28658,0,637,4005470,4040770.0,1250223.0,1844909.0,47698.0,10816.0
|
92 |
+
2023-08-07,3522,1186,3164171.0,10000.0,4137349,8709017,0,6112,0,6640,0,43866,0,1285,5034960,3928811.0,1288638.0,1861166.0,44623.0,11648.0
|
93 |
+
2023-08-08,4111,1495,6020074.0,15008.0,2923076,5012245,0,6684,0,6961,0,12257,0,3038,4235970,3921429.0,1094791.0,2059462.0,48047.0,10379.0
|
94 |
+
2023-08-09,3609,1285,5616011.0,13195.0,2483117,3900778,0,8177,0,6447,0,12774,0,1309,4131270,3322165.0,452000.0,2262292.0,52219.0,11047.0
|
95 |
+
2023-08-10,3872,1330,5270940.0,11342.0,1305507,3614496,0,6927,0,6602,0,21830,0,986,4946040,2868345.0,452896.0,1541791.0,46720.0,10556.0
|
96 |
+
2023-08-11,3673,1257,4485834.0,10445.0,3562053,5521177,0,5810,0,13751,0,5797,0,751,3309470,3242607.0,511016.0,1679989.0,47262.0,10344.0
|
97 |
+
2023-08-12,2744,960,3946512.0,10052.0,4015316,5813616,0,6205,0,10379,0,9890,0,532,3177130,3761072.0,595191.0,1931989.0,54787.0,9210.0
|
98 |
+
2023-08-13,2418,775,5051792.0,11809.0,1869057,6348414,0,4093,0,5187,0,21320,0,399,2953700,3279816.0,503805.0,2171335.0,55136.0,10546.0
|
99 |
+
2023-08-14,3551,1196,4839009.0,11805.0,1765326,3758610,0,6170,0,7226,0,19575,0,706,3873510,2974893.0,427940.0,1822890.0,49127.0,11042.0
|
100 |
+
2023-08-15,3430,1312,6520709.0,24857.0,1792924,1852314,0,6063,0,9302,0,34681,0,778,4412810,3080012.0,462344.0,1935145.0,57900.0,11083.0
|
101 |
+
2023-08-16,3253,1175,4844378.0,27290.0,3478033,1293346,0,5884,0,8280,0,29077,0,1055,4074580,3150093.0,468159.0,2094524.0,58937.0,11823.0
|
102 |
+
2023-08-17,3714,1417,4702754.0,23408.0,4058942,1186576,0,11301,0,10504,0,15462,0,1017,3587780,3071572.0,444690.0,1961293.0,58681.0,10987.0
|
103 |
+
2023-08-18,1936,710,4370177.0,18919.0,3789636,1020973,0,9525,0,8958,0,32346,0,909,3722530,3252966.0,461174.0,2031390.0,61098.0,10354.0
|
104 |
+
2023-08-19,1998,723,3683868.0,14860.0,5187185,1336224,0,8305,0,6265,0,13396,0,1267,2943410,3460234.0,494225.0,2037289.0,68988.0,9709.0
|
105 |
+
2023-08-20,2458,839,5558511.0,16917.0,6444084,1333600,0,8083,0,5668,0,9425,0,593,2640290,3233047.0,427550.0,2093935.0,58698.0,11658.0
|
106 |
+
2023-08-21,2316,892,5802540.0,21997.0,1578062,1099659,0,9057,0,8434,0,11204,0,597,3510210,3110596.0,442523.0,1991499.0,71910.0,13059.0
|
107 |
+
2023-08-22,2208,845,5006504.0,13886.0,598218,939529,0,18631,0,11119,0,18304,0,666,3877380,3020862.0,419659.0,1960342.0,66769.0,12591.0
|
108 |
+
2023-08-23,2104,821,5240143.0,16309.0,1941212,2081327,0,17073,0,8077,0,6042,0,709,3219310,2634348.0,409468.0,1726842.0,53998.0,13783.0
|
109 |
+
2023-08-24,2011,685,5623870.0,14314.0,380971,2132605,0,13223,0,7340,0,11449,0,1774,3474730,2244344.0,385012.0,1409286.0,55699.0,13185.0
|
110 |
+
2023-08-25,1889,680,4674166.0,13506.0,1119189,1818097,0,33200,0,7250,0,16577,0,3622,4003360,2405697.0,395219.0,1564070.0,61103.0,13348.0
|
111 |
+
2023-08-26,1229,379,5475213.0,18030.0,476090,1048919,0,15316,0,4976,0,16625,0,3546,3448630,2662312.0,434769.0,1789446.0,61768.0,13346.0
|
112 |
+
2023-08-27,1333,486,5591938.0,13138.0,956722,732493,0,12952,0,4227,0,19562,0,2354,3032970,2470188.0,417919.0,1980888.0,53707.0,14151.0
|
113 |
+
2023-08-28,2031,760,7120359.0,17304.0,592505,571748,0,44816,0,8728,0,19999,0,3813,3941750,2357294.0,420574.0,1878047.0,50335.0,13442.0
|
114 |
+
2023-08-29,1560,550,6349650.0,18074.0,395464,276869,0,217642,0,8742,0,36555,0,2778,4403680,2437012.0,455532.0,1707585.0,52913.0,12648.0
|
115 |
+
2023-08-30,1788,623,6774580.0,17019.0,804715,227676,0,92490,0,7576,0,33376,0,1815,4493600,2461827.0,452647.0,1924554.0,57945.0,12244.0
|
116 |
+
2023-08-31,2251,790,6881955.0,16586.0,462096,216142,0,177608,0,7188,0,13212,0,1862,3467310,2630688.0,508779.0,1691540.0,44071.0,12093.0
|
117 |
+
2023-09-01,2763,930,5360505.0,17680.0,259775,323504,0,21865,0,7383,0,4899,0,1313,2588380,2723715.0,529388.0,1841032.0,48663.0,11275.0
|
118 |
+
2023-09-02,2597,870,4478842.0,15289.0,1226680,320820,0,26924,0,6477,0,4896,0,1454,2531920,2929332.0,613163.0,1945160.0,60288.0,10815.0
|
119 |
+
2023-09-03,2332,762,5174329.0,13994.0,449228,288375,0,20423,0,5755,0,10890,0,1494,2747410,2516381.0,558353.0,1697712.0,54329.0,11996.0
|
120 |
+
2023-09-04,3561,1229,5334952.0,17444.0,296660,306771,0,324815,0,7849,0,41134,0,2069,3987700,2485534.0,613680.0,1823512.0,52578.0,12787.0
|
121 |
+
2023-09-05,2261,816,6113505.0,20426.0,302910,227998,0,287642,0,7998,0,21025,0,1448,3377390,2453507.0,595873.0,1648165.0,49590.0,11749.0
|
122 |
+
2023-09-06,2868,1031,5558783.0,13407.0,1266416,255848,0,203777,0,8887,0,9020,0,933,2814330,2766708.0,736889.0,1987155.0,47189.0,10851.0
|
123 |
+
2023-09-07,2394,832,4907653.0,9041.0,191893,285511,0,202017,0,8317,0,6879,0,801,2893090,2616416.0,630668.0,1712157.0,47089.0,11632.0
|
124 |
+
2023-09-08,2689,910,4752031.0,8867.0,157343,302141,0,201772,0,8717,0,5684,0,1428,2858250,2705167.0,791338.0,1852090.0,43707.0,10493.0
|
125 |
+
2023-09-09,2204,752,3975657.0,10022.0,227113,245700,0,201776,0,7299,0,4098,0,758,2717380,2929279.0,827015.0,2001938.0,50033.0,10082.0
|
126 |
+
2023-09-10,2167,743,4243960.0,10399.0,270612,291468,0,201256,0,6099,0,8097,0,809,2878400,2352670.0,1241029.0,1966290.0,41767.0,10185.0
|
127 |
+
2023-09-11,3381,1227,4492340.0,10684.0,1192346,154867,0,202476,0,8393,0,6493,0,838,2923700,2573007.0,1455728.0,1830559.0,39596.0,12910.0
|
128 |
+
2023-09-12,2511,884,4936079.0,10015.0,199137,170680,0,50740,0,8506,0,26721,0,1085,4318830,2527461.0,1481401.0,1856155.0,40974.0,11883.0
|
129 |
+
2023-09-13,2143,778,5115564.0,10338.0,292239,238162,0,2408,0,7172,0,36811,0,836,3837560,2621020.0,1580825.0,1962940.0,39948.0,11634.0
|
130 |
+
2023-09-14,2307,798,4859067.0,12717.0,1181194,308251,0,948,0,7404,0,38152,0,1282,3797130,2677877.0,1397139.0,1251585.0,46129.0,10253.0
|
131 |
+
2023-09-15,2467,882,4260164.0,9702.0,399193,291844,0,756,0,6932,0,16060,0,2982,3201640,2751748.0,1416780.0,1269521.0,57909.0,10048.0
|
132 |
+
2023-09-16,2076,687,3350011.0,7707.0,620978,196303,0,663,0,6018,0,9889,0,1188,2843020,3083552.0,1564491.0,1439332.0,61159.0,9435.0
|
133 |
+
2023-09-17,2467,802,4503316.0,11119.0,581720,236009,0,637,0,4814,0,10024,0,2464,2605750,2935930.0,1503370.0,1649587.0,48796.0,10073.0
|
134 |
+
2023-09-18,2910,1024,5568066.0,14302.0,184276,143660,0,888,0,6922,0,10381,0,1767,3209930,2373681.0,1330212.0,1479501.0,51224.0,10488.0
|
135 |
+
2023-09-19,3252,1309,6105220.0,12193.0,208312,187769,0,1464,0,5210,0,8092,0,1504,3291230,2373344.0,1285881.0,1407015.0,40642.0,10547.0
|
136 |
+
2023-09-20,2796,1185,6055420.0,14003.0,291395,272928,0,1077,0,4246,0,10472,0,1830,3121460,2565110.0,1425196.0,1460886.0,48962.0,10318.0
|
137 |
+
2023-09-21,2208,878,5225528.0,8679.0,697480,160425,0,1033,0,6726,0,13928,0,1357,3634580,2686089.0,1447330.0,1236533.0,49940.0,10259.0
|
138 |
+
2023-09-22,1734,783,4373391.0,8141.0,2220006,88968,0,738,0,9534,0,8771,0,1690,3160370,2460283.0,1353647.0,1258771.0,45467.0,9910.0
|
139 |
+
2023-09-23,1190,492,4948823.0,10035.0,2432739,154849,0,702,0,8285,0,4369,0,806,2718390,2740252.0,1531672.0,1407980.0,51747.0,8665.0
|
140 |
+
2023-09-24,1124,496,6239124.0,10744.0,248085,231243,0,477,0,8032,0,8640,0,1449,2680930,2648532.0,1476875.0,1294436.0,36638.0,10410.0
|
141 |
+
2023-09-25,2358,1041,5325249.0,9804.0,251517,447312,0,591,0,11299,0,21103,0,1135,3830560,2371891.0,1333464.0,1222194.0,36894.0,9191.0
|
142 |
+
2023-09-26,2092,994,5361926.0,13223.0,90916,351820,0,910,0,10598,0,27697,0,2803,3971740,2612585.0,1502573.0,1256804.0,33211.0,8893.0
|
143 |
+
2023-09-27,1835,792,4600061.0,14060.0,728920,347014,0,1111,0,8811,0,104094,0,1780,5686340,2488689.0,1390273.0,1203937.0,33935.0,8769.0
|
144 |
+
2023-09-28,1787,807,4114657.0,9434.0,84913,564139,0,279332,0,6975,0,51946,0,2516,4377350,2290090.0,1309586.0,1316086.0,32443.0,8606.0
|
145 |
+
2023-09-29,1513,641,4477584.0,8505.0,211297,372199,0,443,0,4039,0,4466,0,1774,2520650,2429135.0,1379398.0,1425850.0,31700.0,7184.0
|
146 |
+
2023-09-30,1127,478,4089760.0,9316.0,222854,364180,0,517,0,3251,0,13297,0,1425,2765900,1049942.0,435407.0,548780.0,10869.0,4505.0
|
147 |
+
2023-10-01,1021,436,748856.0,2639.0,301970,224135,0,846,0,2731,0,7574,0,962,2069510,935755.0,413098.0,1084400.0,13147.0,5335.0
|
148 |
+
2023-10-02,1673,764,1692932.0,4211.0,387802,237932,0,1564,0,12820,0,9400,0,1463,2321500,877002.0,383352.0,1016934.0,14302.0,5965.0
|
149 |
+
2023-10-03,1516,725,1757367.0,3947.0,568156,171003,0,1739,0,21454,0,5276,0,1640,2455260,833524.0,365270.0,973716.0,14227.0,5936.0
|
150 |
+
2023-10-04,1786,763,1733340.0,3119.0,567654,129402,0,1726,0,15833,0,13543,0,2940,2496730,836392.0,368220.0,1029847.0,13931.0,5864.0
|
151 |
+
2023-10-05,1986,861,1671129.0,3736.0,504268,159069,0,1747,0,24285,0,8234,0,3163,2626960,830805.0,380396.0,476125.0,13399.0,5529.0
|
152 |
+
2023-10-06,1774,753,1348401.0,2784.0,702326,205479,0,1686,0,15228,0,12269,0,2107,2378150,817142.0,382879.0,504402.0,11840.0,5476.0
|
153 |
+
2023-10-07,1150,416,1175733.0,2242.0,359848,180366,0,1446,0,19417,0,27951,0,2050,3080590,921412.0,418533.0,520370.0,11215.0,5083.0
|
154 |
+
2023-10-08,999,337,1296701.0,2609.0,662748,293989,0,1415,0,14589,0,18476,0,1786,2484160,768086.0,352949.0,357821.0,12788.0,5550.0
|
155 |
+
2023-10-09,772,289,1942734.0,4167.0,3096792,191352,0,1855,0,24331,0,21658,0,1757,2722910,653538.0,261410.0,590317.0,14449.0,6333.0
|
156 |
+
2023-10-10,737,241,1911227.0,4238.0,565419,164827,0,2101,0,11526,0,9057,0,2720,2528280,734200.0,300476.0,568450.0,13952.0,6145.0
|
157 |
+
2023-10-11,681,256,2171216.0,4714.0,503802,216630,0,1921,0,7255,0,7549,0,2025,2463820,958835.0,399349.0,595481.0,12432.0,5599.0
|
158 |
+
2023-10-12,673,240,1820266.0,4067.0,233553,161215,0,8042,0,4686,0,5288,0,1408,2044540,861845.0,336598.0,557239.0,13130.0,5889.0
|
159 |
+
2023-10-13,595,233,1529402.0,3094.0,68852,156834,0,7184,0,4986,0,14364,0,1924,2576940,801772.0,317596.0,563967.0,12222.0,5539.0
|
160 |
+
2023-10-14,748,266,1013578.0,2156.0,48430,185877,0,3043,0,4287,0,14809,0,2117,2441800,929822.0,362662.0,603684.0,11533.0,5191.0
|
161 |
+
2023-10-15,602,201,1596953.0,4098.0,55580,222305,0,12269,0,4366,0,15778,0,1639,2190130,891052.0,327915.0,425822.0,13301.0,6358.0
|
162 |
+
2023-10-16,964,369,2144206.0,5169.0,31683,118393,0,6488,0,5537,0,65656,0,1254,4509620,842123.0,317951.0,810650.0,16455.0,7813.0
|
163 |
+
2023-10-17,1105,415,2112245.0,5363.0,69479,70676,0,4964,0,4816,0,18719,0,2353,2816530,816941.0,328053.0,766996.0,14912.0,7402.0
|
164 |
+
2023-10-18,913,348,1892230.0,4633.0,451927,111742,0,4068,0,4855,0,32612,0,2028,3728560,957593.0,377866.0,689470.0,15228.0,7272.0
|
165 |
+
2023-10-19,914,302,1550243.0,3817.0,100009,183549,0,4309,0,4468,0,68322,0,2169,4292380,846076.0,336810.0,775970.0,14394.0,6925.0
|
166 |
+
2023-10-20,663,208,1100622.0,2740.0,174916,181797,0,3695,0,4056,0,58835,0,1887,4493840,910115.0,366406.0,653096.0,15447.0,6572.0
|
167 |
+
2023-10-21,559,184,1405730.0,3216.0,207981,276329,0,2723,0,3213,0,44899,0,1893,3204000,1184901.0,485051.0,850250.0,14780.0,6181.0
|
168 |
+
2023-10-22,545,198,1467468.0,3228.0,520836,253840,0,2213,0,2850,0,27411,0,1911,2969510,1154732.0,423852.0,1027954.0,10344.0,4893.0
|
169 |
+
2023-10-23,625,231,2018062.0,5517.0,333114,436011,0,2839,0,3772,0,11121,0,1351,2287750,1208181.0,428535.0,1111507.0,11684.0,6220.0
|
170 |
+
2023-10-24,574,226,1889784.0,5099.0,188275,228582,0,2709,0,2462,0,1109,0,1918,1952480,1083131.0,378488.0,1161439.0,11452.0,5728.0
|
171 |
+
2023-10-25,536,184,2276229.0,5661.0,77308,332105,0,2708,0,2679,0,525,0,2402,1869210,905535.0,310989.0,865636.0,11200.0,5884.0
|
172 |
+
2023-10-26,609,200,1753696.0,4367.0,85971,236204,0,2136,0,2300,0,10,0,3842,1710220,968078.0,332008.0,771447.0,10098.0,5558.0
|
173 |
+
2023-10-27,563,209,1636932.0,3338.0,246909,285904,0,1992,0,2323,0,5,0,2851,1458010,1063329.0,352124.0,929257.0,9507.0,5001.0
|
174 |
+
2023-10-28,450,155,1588245.0,4276.0,235960,324079,0,2716,0,1753,0,1,0,2585,1510690,1191854.0,384343.0,1028724.0,8578.0,4958.0
|
175 |
+
2023-10-29,309,117,1731474.0,5065.0,70210,331208,0,2241,0,1708,0,5,0,3120,1547290,1137463.0,385520.0,764681.0,10186.0,5650.0
|
176 |
+
2023-10-31,486,182,2220653.0,5950.0,41641,213812,0,149,0,2404,0,15,0,1380,1648060,913362.0,318222.0,1020094.0,10416.0,3703.0
|
177 |
+
2023-11-01,296,123,1834772.0,4275.0,201158,313487,0,889,0,2485,0,33093,0,2287,2939670,862276.0,316545.0,798469.0,11740.0,3972.0
|
178 |
+
2023-11-02,346,111,1697213.0,2987.0,1586296,64435,0,957,0,2130,0,16368,0,3586,2385890,840477.0,298617.0,830972.0,10008.0,3641.0
|
179 |
+
2023-11-03,224,89,1759831.0,2940.0,93667,74522,0,962,0,2484,0,14150,0,953,1937810,952592.0,350909.0,800378.0,11090.0,3818.0
|
180 |
+
2023-11-04,214,76,1677064.0,2752.0,65182,61325,0,1796,0,3084,0,10438,0,1148,1622250,957265.0,344580.0,821570.0,11309.0,4380.0
|
181 |
+
2023-11-05,350,100,1553224.0,3167.0,224953,172587,0,727,0,2295,0,17642,0,1535,2117090,,,,,
|
182 |
+
2023-11-06,217,81,718827.0,1492.0,197532,226189,0,8785,0,3391,0,13745,0,1229,2102830,,,,,
|
Media_data_for_model_dma_level.csv
ADDED
@@ -0,0 +1,538 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Date,paid_search_impressions,paid_search_clicks,kwai_impressions,kwai_clicks,programmaticimpressions,programmaticclicks,affiliates_impressions,affiliates_clicks,indicacao_impressions,indicacao_clicks,infleux_impressions,infleux_clicks,influencer_impressions,influencer_clicks,FB: Level Achieved - Tier 1 Impressions, FB: Level Achieved - Tier 2 Impressions,paid_social_others, GA App: Will And Cid Pequena Baixo Risco Clicks,digital_tactic_others,DMA,Panel,Account Requests - Appsflyer,App Installs - Appsflyer,BAU approved clients - Appsflyer,BAU approved clients - Revenue,Gamified approved clients - Appsflyer,Gamified approved clients - Revenue,Total Approved Accounts - Appsflyer,Total Approved Accounts - Revenue,Adjusted Account Approval,Adjusted Account Approval BAU
|
2 |
+
9/5/2023,6111,1916,1365036,5044,104781,31371909,0,3341,0,11190,0,61956,0,457,2371841,1021599,2302543,34816,19205,D1,P1,35411,86251,2786,4926900,1395,139500,4181,5066400,6110.89,4301.97
|
3 |
+
10/5/2023,6233,1888,1234034,3899,140810,32973036,0,3214,0,9988,0,52049,0,705,2100238,943808,2336369,19716,17415,D1,P1,37986,96199,3087,5328400,1515,151500,4603,5480000,7186.64,5128.37
|
4 |
+
11/5/2023,5568,1816,1016155,2788,102248,50729517,0,3203,0,10869,0,8042,0,381,2461265,1127717,1110415,21547,11051,D1,P1,24496,77036,2337,4001750,1327,132700,3663,4133100,5892.4,4091.77
|
5 |
+
12/5/2023,5109,1769,1228032,3101,100246,63142114,0,2492,0,7096,0,10596,0,299,2313368,1107256,1191901,31966,11081,D1,P1,21030,75112,2052,3462310,1116,111600,3168,3573910,5091.46,3601.62
|
6 |
+
13/05/2023,3712,1231,1344557,3399,100714,59509032,0,3986,0,4282,0,9753,0,366,3067797,1388882,1403486,38518,10762,D1,P1,16294,64652,1611,2693420,827,82700,2438,2776120,3925.27,2780.04
|
7 |
+
14/05/2023,3719,1241,1520157,3491,120162,49538293,0,1891,0,3002,0,7363,0,278,3140882,1429620,2518831,44744,12151,D1,P1,13378,55706,1428,2535460,765,76500,2193,2611960,3658.41,2543.11
|
8 |
+
15/05/2023,7735,2663,2102264,5175,106903,46609819,0,2518,0,4548,0,16201,0,880,2916228,1288902,2456845,36269,15290,D1,P1,21857,67301,2149,3844360,1075,107500,3223,3951760,5540.69,3945.07
|
9 |
+
16/05/2023,9409,3206,2134290,5636,88201,9662393,0,2247,0,6690,0,15031,0,1588,3161940,1370882,2403330,37393,14187,D1,P1,26562,53380,2486,4026650,1251,125100,3736,4150900,6839.28,4817.99
|
10 |
+
17/05/2023,8409,2785,1473128,4336,56382,2232239,0,2557,0,6401,0,8946,0,322,3199527,1379566,2608845,39190,12591,D1,P1,21930,41033,2100,3675940,1126,112600,3226,3788540,6156.6,4185.47
|
11 |
+
18/05/2023,8364,2873,1733275,5009,38145,7321146,0,2912,0,7286,0,14366,0,660,2623727,1115471,1723470,36020,12100,D1,P1,21813,40251,1987,3528210,1240,124000,3227,3652210,6388.27,4150.71
|
12 |
+
19/05/2023,6432,2050,1784426,5063,23340,8715910,0,3934,0,6035,0,20378,0,362,2995998,1287313,1959870,36885,12848,D1,P1,19874,38360,1888,3663690,1140,114000,3027,3777590,5981.25,3891.85
|
13 |
+
20/05/2023,5428,1724,1635604,4408,34693,8783612,0,3318,0,4714,0,21030,0,236,2996479,1326416,1903323,31048,12256,D1,P1,17568,33060,1691,3342720,931,93100,2623,3437270,5113.91,3453.26
|
14 |
+
21/05/2023,5657,1807,1788487,4492,24812,5015214,0,2253,0,4227,0,11656,0,494,3167634,1309450,3651254,33361,13073,D1,P1,14766,28367,1461,2940020,800,80000,2261,3020020,4874.35,3300.96
|
15 |
+
22/05/2023,5768,2036,2176947,5688,25298,3002995,0,2739,0,8313,0,25663,0,1147,3573865,1548365,3939226,33410,14092,D1,P1,21520,40205,1854,3533540,1097,109700,2951,3643240,6425.41,4211.67
|
16 |
+
23/05/2023,5051,1720,2359219,6966,24773,3005057,0,4738,0,13827,0,47900,0,965,3248157,1376975,3631390,35016,13025,D1,P1,29860,51811,2527,5012370,1339,133900,3866,5146270,7978.08,5238.68
|
17 |
+
24/05/2023,6078,1977,1612918,4924,24591,2833280,0,4816,0,12417,0,94489,0,1254,3572793,1550315,3532105,37491,12546,D1,P1,41297,68099,2993,5666720,1655,165500,4648,5832220,8715.48,5761.11
|
18 |
+
25/05/2023,6547,2075,1468456,3624,19705,2771412,0,5070,0,7395,0,70016,0,762,3164337,1353382,3253308,34658,13154,D1,P1,33436,56714,2588,5066960,1509,150900,4097,5217860,7939.09,5062.98
|
19 |
+
26/05/2023,3719,1189,1770048,4874,16879,2875657,0,2855,0,6964,0,29015,0,627,2989794,1248779,3345390,38267,12788,D1,P1,22185,40261,2101,4010930,1130,113000,3231,4123930,6785.57,4495.67
|
20 |
+
27/05/2023,3620,1145,1900387,5061,14156,2663378,0,3295,0,4472,0,5625,0,1473,3576647,1527545,3694843,40685,12844,D1,P1,13490,26751,1407,2592840,756,75600,2163,2668440,5325.41,3549.17
|
21 |
+
28/05/2023,4195,1302,2026053,5703,12334,2609966,0,2190,0,3737,0,5030,0,1401,3376177,1447089,2563297,42359,13543,D1,P1,13124,25607,1374,2558180,722,72200,2096,2630380,5282.85,3554.29
|
22 |
+
29/05/2023,5265,1798,2328823,6483,14783,2537637,0,3954,0,5211,0,221,0,1575,3765997,1720747,2865333,39579,8116,D1,P1,15619,30688,1585,2979010,785,78500,2370,3057510,5961.63,4097.14
|
23 |
+
30/05/2023,3879,1366,2294654,6008,15979,2489630,0,4465,0,6041,0,6,0,1192,3790830,1751416,2822819,37234,8830,D1,P1,17258,32693,1773,3270270,900,90000,2673,3360270,6752.47,4596.75
|
24 |
+
31/05/2023,3933,1348,1645187,4081,14208,2337652,0,3797,0,4794,0,6,0,888,4151434,1953620,2714074,45856,6861,D1,P1,16458,31379,1688,3065730,924,92400,2612,3158130,6598.66,4373.22
|
25 |
+
1/6/2023,4817,1530,1862175,4841,48192,3241822,0,3060,0,4802,0,12820,0,1137,4151797,1903421,2255850,51175,7095,D1,P1,17582,34622,1700,3231430,909,90900,2609,3322330,6342.48,4257.19
|
26 |
+
2/6/2023,5733,1800,966546,2646,43573,4582872,0,1563,0,10678,0,46810,0,1309,4313201,2009602,2074692,47378,6120,D1,P1,25710,47869,2271,4131170,1130,113000,3401,4244170,6992.72,4747.36
|
27 |
+
3/6/2023,4142,1290,2445721,11111,90587,4764628,0,2176,0,5144,0,27735,0,518,4514302,2083217,2095544,58527,5748,D1,P1,19247,37244,1905,3615570,961,96100,2866,3711670,5996.2,4065.63
|
28 |
+
4/6/2023,5143,1613,2296690,6790,40929,4717779,0,1280,0,4237,0,5606,0,325,4179140,1889452,2152476,45239,6093,D1,P1,13474,29405,1475,2776480,755,75500,2230,2851980,5219.47,3571.73
|
29 |
+
5/6/2023,5384,1832,3509278,8938,56272,19979584,0,1377,0,11493,0,25647,0,579,3683204,1641254,3616732,40356,6453,D1,P1,22558,54639,2114,4004520,1128,112800,3242,4117320,6672.4,4468.93
|
30 |
+
6/6/2023,4802,1594,3216944,7861,20049,33102789,0,1485,0,9086,0,36532,0,545,3822453,1716540,3687300,53347,6334,D1,P1,26643,69935,2358,4505090,1222,122200,3580,4627290,6855.89,4686.82
|
31 |
+
7/6/2023,5072,1648,2143372,5356,22553,21321547,0,1576,0,7213,0,21215,0,628,4178339,1811963,2354753,51632,6259,D1,P1,22242,56660,2125,3900920,1184,118400,3309,4019320,6611.5,4370.78
|
32 |
+
8/6/2023,4444,1465,3190766,8024,53653,10254268,0,2046,0,10491,0,19549,0,769,3941272,1738344,2283350,59291,6775,D1,P1,23293,50105,2238,4145770,1270,127000,3508,4272770,6851.85,4515.66
|
33 |
+
9/6/2023,4818,1605,3278715,9328,18347,4890758,0,1925,0,8360,0,32385,0,1732,3969227,1777864,2353376,52000,6026,D1,P1,25950,50611,2404,4657210,1315,131500,3719,4788710,6881.12,4639.8
|
34 |
+
10/6/2023,3465,1207,2887842,8529,725,5489947,0,1230,0,5401,0,37954,0,2136,4458593,2061762,2535928,66567,5554,D1,P1,24413,47973,2370,4584570,1225,122500,3595,4707070,6334.68,4283.38
|
35 |
+
11/6/2023,4727,1501,3149290,8114,738,5313957,0,1839,0,8198,0,32493,0,1533,4442610,2006438,2183963,47655,6008,D1,P1,23656,46275,2220,4441870,1183,118300,3403,4560170,6134.11,4098
|
36 |
+
12/6/2023,6437,2208,4416005,12345,149561,5298884,0,1905,0,8542,0,101079,0,472,4645531,1995891,3301882,38760,4966,D1,P1,44382,76997,3520,6853780,1782,178200,5302,7031980,8549.02,5779.3
|
37 |
+
13/06/2023,3556,1254,4626697,12984,258088,5952266,0,2095,0,10415,0,59770,0,1016,4508060,1912958,3440789,47281,4630,D1,P1,35764,67060,2737,5184020,1530,153000,4266,5335600,7908.1,5200.7
|
38 |
+
14/06/2023,3178,1060,3389530,10298,685692,10454400,0,2258,0,24457,0,16016,0,1101,4573214,1920050,3160905,41549,5083,D1,P1,27677,56158,2257,4257990,1244,124400,3501,4382390,7187.71,4826.11
|
39 |
+
15/06/2023,2981,999,3131350,10791,1072645,11631302,0,2265,0,17304,0,10395,0,1188,4075106,1690702,3267810,50496,5037,D1,P1,23775,50354,2201,4212820,1215,121500,3416,4334320,7339.75,4890.1
|
40 |
+
16/06/2023,2705,947,2923279,11124,1166424,11840950,0,1780,0,8938,0,24339,0,966,4533368,1939737,2881833,41872,4604,D1,P1,22957,49677,2225,4445430,1154,115400,3379,4560830,6663.77,4416.03
|
41 |
+
17/06/2023,3697,1154,2955836,10440,807683,9748201,0,2139,0,5741,0,54129,0,766,4958344,2059487,3183051,52618,3675,D1,P1,26623,53187,2434,4755560,1286,128600,3723,4890110,6983.5,4694.41
|
42 |
+
18/06/2023,3229,1080,3280006,12373,116340,8176712,0,1481,0,4741,0,16724,0,864,4270249,1735486,3251229,39780,3696,D1,P1,16690,36522,1715,3294460,936,93600,2651,3388060,5614.57,3749.6
|
43 |
+
19/06/2023,3082,1003,6545797,24462,55763,4841897,0,2098,0,10520,0,26558,0,2211,4137846,1743715,2680413,43156,4347,D1,P1,25736,50759,2343,4515000,1244,124400,3587,4639400,7090.09,4789.96
|
44 |
+
20/06/2023,2422,857,6734594,28910,52166,4718912,0,2205,0,10284,0,30610,0,1002,4218772,1771102,2058734,42288,4260,D1,P1,27941,52107,2478,4829920,1398,139800,3876,4969720,7584.9,4974.28
|
45 |
+
21/06/2023,3366,1132,4784180,17247,52817,5971594,0,3387,0,9277,0,41697,0,645,4113884,1743016,2111350,44159,4193,D1,P1,28338,53853,2376,4353550,1357,135700,3733,4489250,7214.21,4702.88
|
46 |
+
22/06/2023,2841,924,3300680,13360,29784,6803330,0,4064,0,7068,0,68638,0,481,3738171,1533407,1597072,35381,4173,D1,P1,34683,62182,2532,4863520,1434,143400,3966,5006920,7223.75,4679.68
|
47 |
+
23/06/2023,2474,805,2284446,9012,80066,6833289,0,3274,0,7379,0,13501,0,721,4479743,1889155,1647740,39089,3640,D1,P1,16506,35549,1530,2980550,888,88800,2418,3069350,5295.75,3457.41
|
48 |
+
24/06/2023,2462,814,1947190,7247,50309,6526903,0,2767,0,4703,0,8438,0,616,3758421,1565736,1648519,46332,3834,D1,P1,13804,31588,1381,2698000,788,78800,2169,2776800,4822.39,3136
|
49 |
+
25/06/2023,2082,679,3560248,14850,50806,6368664,0,2767,0,4414,0,5346,0,628,4038846,1700182,2514456,43065,4201,D1,P1,13435,30121,1424,2782640,778,77800,2202,2860440,5082.66,3353.86
|
50 |
+
26/06/2023,2399,839,5999950,28401,23209,10788275,0,3699,0,13383,0,13592,0,790,3427918,1403888,3598236,33883,4642,D1,P1,21114,49622,1959,3810990,1175,117500,3134,3928490,6965.39,4504.75
|
51 |
+
27/06/2023,2307,804,5005495,18260,81344,14103220,0,7082,0,8898,0,40917,0,945,3819654,1523667,3556028,35326,4628,D1,P1,32019,65348,2877,5691820,1595,159500,4472,5851320,9589,6333.48
|
52 |
+
28/06/2023,2215,759,3721084,11248,20153,10547995,0,8387,0,7120,0,39693,0,944,3671994,1568555,1397196,33212,2998,D1,P1,30267,63086,2863,5931970,1516,151600,4379,6083570,8919.81,5942.75
|
53 |
+
29/06/2023,2013,706,3918049,10226,155296,8525871,0,10096,0,5693,0,24049,0,1512,3937747,1585655,3393043,30700,2519,D1,P1,22893,54097,2125,4215060,1132,113200,3257,4328260,7178.85,4806.94
|
54 |
+
30/06/2023,1258,454,3088874,7943,902115,10945715,0,8904,0,9611,0,62404,0,1029,4945464,1946944,1835310,52445,2839,D1,P1,30707,67849,2616,5112840,1397,139700,4013,5252540,7664.09,5203.16
|
55 |
+
1/7/2023,1641,539,3872657,12034,191537,12141356,0,4956,0,6049,0,31194,0,923,5328149,2224200,2123805,56724,2513,D1,P1,22229,54353,2266,4505840,1205,120500,3471,4626340,6983.83,4746.37
|
56 |
+
2/7/2023,1336,485,5799582,17238,576858,12180985,0,4148,0,4670,0,4766,0,617,4527404,1997256,2038953,50510,21201,D1,P1,15205,43684,1672,3328290,886,88600,2559,3416990,5952.59,4038.91
|
57 |
+
3/7/2023,2712,924,9986061,28191,442261,14059535,0,5347,0,7408,0,19028,0,1044,4179823,1854231,2234940,57543,14473,D1,P1,22798,57392,2425,4796940,1308,130800,3732,4925290,7701.44,5182.84
|
58 |
+
4/7/2023,4137,1419,4717456,14519,2137830,14463201,0,6164,0,8277,0,12283,0,1531,4449073,1959412,2350308,49085,9854,D1,P1,23585,60143,2220,4262060,1327,132700,3547,4394760,7689.38,5021.95
|
59 |
+
5/7/2023,4166,1422,4779589,12676,2354716,18574154,0,7967,0,11552,0,6628,0,1420,4464681,1969744,2390838,41411,12751,D1,P1,22847,61021,2348,4359400,1422,142200,3769,4497600,7976.49,5170.89
|
60 |
+
6/7/2023,4182,1444,4939385,12222,2364811,15879491,0,6575,0,8461,0,18225,0,997,4490815,1942923,2239375,44808,16216,D1,P1,23716,60282,2602,4960450,1543,154300,4145,5114750,8225.73,5423.76
|
61 |
+
7/7/2023,3497,1181,3121447,7534,1063284,17341347,0,6025,0,8113,0,25962,0,659,4891573,2128787,1976413,57373,12464,D1,P1,23336,58252,2335,4783910,1269,126900,3604,4910810,7182.26,4846.37
|
62 |
+
8/7/2023,2760,856,3295227,9788,1119268,19207341,0,4102,0,6195,0,40506,0,832,5039604,2277255,2330435,44052,15163,D1,P1,22278,62471,2128,4352160,1191,119100,3319,4471260,6706.12,4485.38
|
63 |
+
9/7/2023,2809,875,3913741,11815,749310,25182206,0,6420,0,5222,0,49626,0,718,4669470,2144473,3908306,49659,11716,D1,P1,24736,69003,2620,5573560,1325,132500,3945,5706060,7673.85,5278.59
|
64 |
+
10/7/2023,4312,1489,5972974,18402,1511035,25950979,0,9842,0,10638,0,36204,0,935,4584106,2019220,4391654,52303,12983,D1,P1,28497,78251,2578,5157430,1419,141900,3997,5299330,8174.81,5453.8
|
65 |
+
11/7/2023,4579,1550,4999618,16469,559119,23938153,0,11688,0,36570,0,25216,0,1289,4458364,1932300,4150666,47979,12292,D1,P1,28688,77223,2707,5384090,1483,148300,4190,5532390,8594.12,5787.78
|
66 |
+
12/7/2023,4079,1418,4465722,13191,583520,25196511,0,4610,0,9813,0,20388,0,1210,4558876,2000168,4109583,54631,12366,D1,P1,25749,73523,2403,4926480,1410,141000,3813,5067480,8000.73,5259.61
|
67 |
+
13/07/2023,3719,1260,4635033,12302,903614,25720336,0,7867,0,6792,0,22248,0,857,4596184,1957206,3729970,48474,11017,D1,P1,22447,69283,2134,4261960,1312,131200,3447,4393760,7385.89,4769.15
|
68 |
+
14/07/2023,3632,1224,3441594,9800,1566300,28606996,0,6726,0,6172,0,14670,0,432,4683387,2007387,3912229,52588,10079,D1,P1,19225,67928,2002,3875450,1077,107700,3079,3983150,6615.15,4505.74
|
69 |
+
15/07/2023,2909,941,6025085,21326,1836196,28705476,0,5705,0,4369,0,31202,0,595,5008167,2251661,3727627,58143,10214,D1,P1,19533,64001,2026,4112810,1066,106600,3093,4220310,6115.73,4122.89
|
70 |
+
16/07/2023,2818,853,7339565,26586,4043959,26752554,0,7733,0,3961,0,27180,0,1082,4716541,2092258,2114014,59204,11281,D1,P1,18871,60797,1956,3715100,1126,112600,3084,3832400,6216.99,4066.5
|
71 |
+
17/07/2023,4420,1486,9638491,32269,819444,29437537,0,11485,0,5220,0,66236,0,2418,4359325,1937825,1989872,55815,11896,D1,P1,35493,89662,2771,5539890,1521,152100,4292,5691990,8025.2,5388.69
|
72 |
+
18/07/2023,4574,1551,9498457,31230,1206114,29164369,0,5012,0,7146,0,47074,0,2358,4882304,2163458,2157773,69573,12604,D1,P1,32238,84091,2687,5214920,1329,132900,4016,5347820,7833.63,5336.47
|
73 |
+
19/07/2023,4632,1537,9742535,26935,1491736,30394328,0,6147,0,7028,0,11807,0,1476,4613422,2080215,1981362,67495,12116,D1,P1,23193,69138,2342,4581910,1084,108400,3426,4690310,7118.68,4991.3
|
74 |
+
20/07/2023,4891,1632,7630122,20720,2370192,23939153,0,6261,0,5635,0,17220,0,1338,4484291,1922090,1663127,75312,12252,D1,P1,23193,63445,2209,4471970,995,99500,3255,4576570,6700.79,4599.1
|
75 |
+
21/07/2023,3978,1378,7284968,21477,2456715,17869335,0,6360,0,10877,0,11431,0,769,4519305,1975730,1686467,68931,10065,D1,P1,21478,57996,2115,4257360,1006,100600,3121,4357960,6467.01,4497.43
|
76 |
+
22/07/2023,3151,978,5638955,16181,2015345,12808440,0,7097,0,5145,0,13811,0,699,4689346,2086993,1861883,71898,9081,D1,P1,17602,50209,1897,3876970,830,83000,2727,3959970,5812.35,4126.62
|
77 |
+
23/07/2023,2905,986,6133144,16089,881691,11267535,0,5593,0,4746,0,68021,0,514,4242878,1843843,1681215,61164,10797,D1,P1,25804,58279,2442,5168300,1161,116100,3603,5284400,6622.56,4639.27
|
78 |
+
24/07/2023,4606,1651,8830736,21931,189913,35658281,0,8836,0,6040,0,64066,0,1626,3943001,1708849,1900126,59494,10236,D1,P1,31953,73505,2898,6111230,1424,142400,4321,6253530,8030.22,5492.47
|
79 |
+
25/07/2023,4414,1597,7750251,15384,3348941,25011847,0,10262,0,9572,0,15072,0,916,3976490,1729916,1911109,68826,11468,D1,P1,26162,65005,2440,4822810,1154,115400,3594,4938210,7092.81,4965.39
|
80 |
+
26/07/2023,4488,1530,8125332,16391,1040452,24380635,0,9947,0,16453,0,38777,0,1551,3837786,1680967,1856885,74924,13290,D1,P1,31894,69746,2797,5552460,1348,134800,4147,5687460,7359.12,5027.76
|
81 |
+
27/07/2023,4105,1494,8054962,14724,220302,13070502,0,6758,0,8841,0,20622,0,1313,3636297,1544742,1772602,63935,11680,D1,P1,24634,57255,2498,5018670,1196,119600,3694,5138270,7106.66,4875.99
|
82 |
+
28/07/2023,3743,1318,6955526,11566,3991586,5347413,0,10451,0,8496,0,20184,0,1563,3890784,1680538,1608577,73120,11390,D1,P1,22265,50660,2204,4515740,1054,105400,3258,4621140,6441.87,4432.07
|
83 |
+
29/07/2023,3395,1192,5132501,9837,1349895,4441709,0,7115,0,5449,0,18983,0,1129,4295602,1813637,1824777,80511,11911,D1,P1,17626,42341,1930,3807270,860,86000,2790,3893270,5519.71,3922.54
|
84 |
+
30/07/2023,2746,903,4903153,11018,710000,4431986,0,8491,0,4599,0,24834,0,1109,3924352,1733790,1740605,72221,11440,D1,P1,17619,43309,1942,3937090,834,83400,2776,4020490,5556.3,3945.89
|
85 |
+
31/07/2023,4208,1476,6832832,19648,1721973,4079656,0,7754,0,7818,0,27918,0,2050,3760475,1501134,1957900,62124,11605,D1,P1,22728,51399,2256,4604950,1046,104600,3302,4709550,6481.79,4556.75
|
86 |
+
1/8/2023,4203,1489,6398210,15890,2250090,5457683,0,7588,0,7948,0,61894,0,1248,3687038,1439092,1774701,61448,11492,D1,P1,31009,67515,2609,5471270,1309,130900,3918,5602170,6825.97,4671.87
|
87 |
+
2/8/2023,4285,1515,5402871,14825,785167,6582085,0,6079,0,7236,0,79041,0,1345,3807266,1493340,2025308,54506,11515,D1,P1,34034,74123,2858,5856910,1360,136000,4218,5992910,7171.23,4989.3
|
88 |
+
3/8/2023,4667,1744,4724924,8903,1111815,10407793,0,9077,0,7117,0,31714,0,1983,3797879,1479623,1718831,52587,11408,D1,P1,23978,62504,2404,4832400,1095,109500,3498,4941800,6670.71,4627.48
|
89 |
+
4/8/2023,4201,1562,3732952,9116,4574481,10660977,0,8436,0,6970,0,25097,0,1055,3814852,1466211,1374674,57482,10785,D1,P1,21714,62922,2226,4561560,975,97500,3201,4659060,6133.71,4366.77
|
90 |
+
5/8/2023,3080,1110,3310732,9884,3460283,11580456,0,5735,0,5049,0,5911,0,704,4048945,1601234,1442690,65158,9942,D1,P1,13792,52995,1578,3188640,720,72000,2298,3260640,4760.04,3375.44
|
91 |
+
6/8/2023,2809,979,4153998,11663,5103054,8381689,0,4868,0,4184,0,28658,0,637,4040770,1250223,1844909,47698,10816,D1,P1,17706,56827,1841,3921270,842,84200,2683,4005470,5062.91,3520.39
|
92 |
+
7/8/2023,3522,1186,3164171,10000,4137349,8709017,0,6112,0,6640,0,43866,0,1285,3928811,1288638,1861166,44623,11648,D1,P1,26772,71580,2456,4923260,1132,113200,3587,5034960,6580.87,4648.84
|
93 |
+
8/8/2023,4111,1495,6020074,15008,2923076,5012245,0,6684,0,6961,0,12257,0,3038,3921429,1094791,2059462,48047,10379,D1,P1,22363,60212,2075,4138870,971,97100,3046,4235970,6286.57,4418.71
|
94 |
+
9/8/2023,3609,1285,5616011,13195,2483117,3900778,0,8177,0,6447,0,12774,0,1309,3322165,452000,2262292,52219,11047,D1,P1,21099,53059,2067,4030270,1010,101000,3077,4131270,6309.32,4273.88
|
95 |
+
10/8/2023,3872,1330,5270940,11342,1305507,3614496,0,6927,0,6602,0,21830,0,986,2868345,452896,1541791,46720,10556,D1,P1,22515,52055,2216,4848640,974,97400,3190,4946040,6281.59,4498.26
|
96 |
+
11/8/2023,3673,1257,4485834,10445,3562053,5521177,0,5810,0,13751,0,5797,0,751,3242607,511016,1679989,47262,10344,D1,P1,17086,46491,1551,3242370,671,67100,2222,3309470,4608.96,3355.58
|
97 |
+
12/8/2023,2744,960,3946512,10052,4015316,5813616,0,6205,0,10379,0,9890,0,532,3761072,595191,1931989,54787,9210,D1,P1,15949,46498,1376,3113130,639,63900,2016,3177130,4121.65,2907.82
|
98 |
+
13/08/2023,2418,775,5051792,11809,1869057,6348414,0,4093,0,5187,0,21320,0,399,3279816,503805,2171335,55136,10546,D1,P1,14745,44224,1327,2888900,648,64800,1975,2953700,3905.29,2752.8
|
99 |
+
14/08/2023,3551,1196,4839009,11805,1765326,3758610,0,6170,0,7226,0,19575,0,706,2974893,427940,1822890,49127,11042,D1,P1,20336,49993,1770,3798710,748,74800,2518,3873510,5195.83,3786.85
|
100 |
+
15/08/2023,3430,1312,6520709,24857,1792924,1852314,0,6063,0,9302,0,34681,0,778,3080012,462344,1935145,57900,11083,D1,P1,24449,48710,1946,4332210,807,80700,2752,4412810,5367.05,3930.18
|
101 |
+
16/08/2023,3253,1175,4844378,27290,3478033,1293346,0,5884,0,8280,0,29077,0,1055,3150093,468159,2094524,58937,11823,D1,P1,23892,46995,1911,3996580,780,78000,2691,4074580,5452.88,3979.2
|
102 |
+
17/08/2023,3714,1417,4702754,23408,4058942,1186576,0,11301,0,10504,0,15462,0,1017,3071572,444690,1961293,58681,10987,D1,P1,21265,42100,1700,3517380,704,70400,2404,3587780,5150.22,3718.85
|
103 |
+
18/08/2023,1936,710,4370177,18919,3789636,1020973,0,9525,0,8958,0,32346,0,909,3252966,461174,2031390,61098,10354,D1,P1,20983,41383,1778,3654630,679,67900,2457,3722530,5019.58,3716.93
|
104 |
+
19/08/2023,1998,723,3683868,14860,5187185,1336224,0,8305,0,6265,0,13396,0,1267,3460234,494225,2037289,68988,9709,D1,P1,14640,31119,1331,2887610,528,52800,1860,2943410,4059.2,3012.38
|
105 |
+
20/08/2023,2458,839,5558511,16917,6444084,1333600,0,8083,0,5668,0,9425,0,593,3233047,427550,2093935,58698,11658,D1,P1,13616,29557,1227,2592690,476,47600,1703,2640290,3842.86,2850.38
|
106 |
+
21/08/2023,2316,892,5802540,21997,1578062,1099659,0,9057,0,8434,0,11204,0,597,3110596,442523,1991499,71910,13059,D1,P1,19336,38812,1656,3445610,663,66300,2319,3510210,5100.16,3789.37
|
107 |
+
22/08/2023,2208,845,5006504,13886,598218,939529,0,18631,0,11119,0,18304,0,666,3020862,419659,1960342,66769,12591,D1,P1,21348,42166,1844,3824050,762,76200,2582,3877380,5610.58,4088.17
|
108 |
+
23/08/2023,2104,821,5240143,16309,1941212,2081327,0,17073,0,8077,0,6042,0,709,2634348,409468,1726842,53998,13783,D1,P1,18864,38949,1513,3153720,655,65500,2165,3219310,4984.78,3596.01
|
109 |
+
24/08/2023,2011,685,5623870,14314,380971,2132605,0,13223,0,7340,0,11449,0,1774,2244344,385012,1409286,55699,13185,D1,P1,18821,38282,1665,3378840,678,67800,2358,3474730,5209.76,3795.85
|
110 |
+
25/08/2023,1889,680,4674166,13506,1119189,1818097,0,33200,0,7250,0,16577,0,3622,2405697,395219,1564070,61103,13348,D1,P1,18364,37536,1863,3939560,638,63800,2501,4003360,5070.56,3850.47
|
111 |
+
26/08/2023,1229,379,5475213,18030,476090,1048919,0,15316,0,4976,0,16625,0,3546,2662312,434769,1789446,61768,13346,D1,P1,16076,32992,1816,3388030,606,60600,2422,3448630,4877.02,3729.33
|
112 |
+
27/08/2023,1333,486,5591938,13138,956722,732493,0,12952,0,4227,0,19562,0,2354,2470188,417919,1980888,53707,14151,D1,P1,14834,30563,1572,2979370,536,53600,2108,3032970,4232.88,3241.64
|
113 |
+
28/08/2023,2031,760,7120359,17304,592505,571748,0,44816,0,8728,0,19999,0,3813,2357294,420574,1878047,50335,13442,D1,P1,20994,42982,1970,3877550,642,64200,2612,3941750,5610.5,4325.83
|
114 |
+
29/08/2023,1560,550,6349650,18074,395464,276869,0,217642,0,8742,0,36555,0,2778,2437012,455532,1707585,52913,12648,D1,P1,25919,51217,2270,4323380,803,80300,3073,4403680,6223.41,4701.59
|
115 |
+
30/08/2023,1788,623,6774580,17019,804715,227676,0,92490,0,7576,0,33376,0,1815,2461827,452647,1924554,57945,12244,D1,P1,24015,48307,2298,4414000,796,79600,3094,4493600,5983.31,4520.44
|
116 |
+
31/08/2023,2251,790,6881955,16586,462096,216142,0,177608,0,7188,0,13212,0,1862,2630688,508779,1691540,44071,12093,D1,P1,17587,35874,1809,3406910,604,60400,2413,3467310,5218.62,4005.29
|
117 |
+
1/9/2023,2763,930,5360505,17680,259775,323504,0,21865,0,7383,0,4899,0,1313,2723715,529388,1841032,48663,11275,D1,P1,13457,29785,1396,2542480,459,45900,1855,2588380,4243.41,3270.46
|
118 |
+
2/9/2023,2597,870,4478842,15289,1226680,320820,0,26924,0,6477,0,4896,0,1454,2929332,613163,1945160,60288,10815,D1,P1,12337,27451,1347,2481120,508,50800,1855,2531920,4227.98,3109.35
|
119 |
+
3/9/2023,2332,762,5174329,13994,449228,288375,0,20423,0,5755,0,10890,0,1494,2516381,558353,1697712,54329,11996,D1,P1,12609,27028,1428,2699310,481,48100,1909,2747410,4177.46,3164.79
|
120 |
+
4/9/2023,3561,1229,5334952,17444,296660,306771,0,324815,0,7849,0,41134,0,2069,2485534,613680,1823512,52578,12787,D1,P1,22283,45146,2065,3908960,791,79100,2855,3987700,5743.35,4264.57
|
121 |
+
5/9/2023,2261,816,6113505,20426,302910,227998,0,287642,0,7998,0,21025,0,1448,2453507,595873,1648165,49590,11749,D1,P1,19096,40015,1818,3314870,588,58800,2407,3377390,5367.87,4153.87
|
122 |
+
6/9/2023,2868,1031,5558783,13407,1266416,255848,0,203777,0,8887,0,9020,0,933,2766708,736889,1987155,47189,10851,D1,P1,14311,31495,1502,2764430,499,49900,2001,2814330,4575.2,3510.97
|
123 |
+
7/9/2023,2394,832,4907653,9041,191893,285511,0,202017,0,8317,0,6879,0,801,2616416,630668,1712157,47089,11632,D1,P1,13483,29283,1544,2846790,463,46300,2007,2893090,4770.64,3739.02
|
124 |
+
8/9/2023,2689,910,4752031,8867,157343,302141,0,201772,0,8717,0,5684,0,1428,2705167,791338,1852090,43707,10493,D1,P1,13830,29726,1531,2806450,518,51800,2049,2858250,4807.58,3697.23
|
125 |
+
9/9/2023,2204,752,3975657,10022,227113,245700,0,201776,0,7299,0,4098,0,758,2929279,827015,2001938,50033,10082,D1,P1,12284,26212,1414,2674080,433,43300,1847,2717380,4310.87,3354.94
|
126 |
+
10/9/2023,2167,743,4243960,10399,270612,291468,0,201256,0,6099,0,8097,0,809,2352670,1241029,1966290,41767,10185,D1,P1,12594,26398,1498,2834900,435,43500,1933,2878400,4460.59,3531.69
|
127 |
+
11/9/2023,3381,1227,4492340,10684,1192346,154867,0,202476,0,8393,0,6493,0,838,2573007,1455728,1830559,39596,12910,D1,P1,15510,32142,1544,2881650,449,44900,1992,2923700,4715.59,3736.66
|
128 |
+
12/9/2023,2511,884,4936079,10015,199137,170680,0,50740,0,8506,0,26721,0,1085,2527461,1481401,1856155,40974,11883,D1,P1,22786,42733,2027,4286230,326,32600,2353,4318830,5172.4,4510.57
|
129 |
+
13/09/2023,2143,778,5115564,10338,292239,238162,0,2408,0,7172,0,36811,0,836,2621020,1580825,1962940,39948,11634,D1,P1,22084,41155,1880,3809460,281,28100,2161,3837560,4765.04,4181.98
|
130 |
+
14/09/2023,2307,798,4859067,12717,1181194,308251,0,948,0,7404,0,38152,0,1282,2677877,1397139,1251585,46129,10253,D1,P1,21377,40308,1959,3742130,550,55000,2509,3797130,5413.06,4301.68
|
131 |
+
15/09/2023,2467,882,4260164,9702,399193,291844,0,756,0,6932,0,16060,0,2982,2751748,1416780,1269521,57909,10048,D1,P1,16118,32895,1659,3149040,526,52600,2185,3201640,4920.59,3802.04
|
132 |
+
16/09/2023,2076,687,3350011,7707,620978,196303,0,663,0,6018,0,9889,0,1188,3083552,1564491,1439332,61159,9435,D1,P1,12830,26945,1488,2798420,446,44600,1934,2843020,4519.52,3564.8
|
133 |
+
17/09/2023,2467,802,4503316,11119,581720,236009,0,637,0,4814,0,10024,0,2464,2935930,1503370,1649587,48796,10073,D1,P1,12357,25262,1396,2560250,455,45500,1851,2605750,4246.67,3287.31
|
134 |
+
18/09/2023,2910,1024,5568066,14302,184276,143660,0,888,0,6922,0,10381,0,1767,2373681,1330212,1479501,51224,10488,D1,P1,16441,33582,1727,3152630,572,57200,2300,3209930,5491.87,4171.85
|
135 |
+
19/09/2023,3252,1309,6105220,12193,208312,187769,0,1464,0,5210,0,8092,0,1504,2373344,1285881,1407015,40642,10547,D1,P1,17770,36578,1743,3229930,653,65300,2395,3291230,5666.71,4236.34
|
136 |
+
20/09/2023,2796,1185,6055420,14003,291395,272928,0,1077,0,4246,0,10472,0,1830,2565110,1425196,1460886,48962,10318,D1,P1,16656,34188,1627,3048960,738,73800,2365,3121460,5577.7,3950.97
|
137 |
+
21/09/2023,2208,878,5225528,8679,697480,160425,0,1033,0,6726,0,13928,0,1357,2686089,1447330,1236533,49940,10259,D1,P1,17253,34210,1912,3553480,811,81100,2723,3634580,6248.63,4440.07
|
138 |
+
22/09/2023,1734,783,4373391,8141,2220006,88968,0,738,0,9534,0,8771,0,1690,2460283,1353647,1258771,45467,9910,D1,P1,14958,31389,1714,3084570,758,75800,2472,3160370,5984.05,4280.38
|
139 |
+
23/09/2023,1190,492,4948823,10035,2432739,154849,0,702,0,8285,0,4369,0,806,2740252,1531672,1407980,51747,8665,D1,P1,12641,27336,1443,2653190,652,65200,2095,2718390,5094.46,3633.56
|
140 |
+
24/09/2023,1124,496,6239124,10744,248085,231243,0,477,0,8032,0,8640,0,1449,2648532,1476875,1294436,36638,10410,D1,P1,12153,26113,1395,2618830,621,62100,2016,2680930,4558.91,3242.77
|
141 |
+
25/09/2023,2358,1041,5325249,9804,251517,447312,0,591,0,11299,0,21103,0,1135,2371891,1333464,1222194,36894,9191,D1,P1,18608,38878,2041,3740860,897,89700,2938,3830560,6554.2,4744.62
|
142 |
+
26/09/2023,2092,994,5361926,13223,90916,351820,0,910,0,10598,0,27697,0,2803,2612585,1502573,1256804,33211,8893,D1,P1,21214,41166,2128,3878240,935,93500,3063,3971740,6565.1,4696.86
|
143 |
+
27/09/2023,1835,792,4600061,14060,728920,347014,0,1111,0,8811,0,104094,0,1780,2488689,1390273,1203937,33935,8769,D1,P1,37289,65137,2933,5530540,1595,159500,4525,5686340,8073.74,5545.54
|
144 |
+
28/09/2023,1787,807,4114657,9434,84913,564139,0,279332,0,6975,0,51946,0,2516,2290090,1309586,1316086,32443,8606,D1,P1,25651,47307,2343,4257450,1199,119900,3542,4377350,7151.36,4963.98
|
145 |
+
29/09/2023,1513,641,4477584,8505,211297,372199,0,443,0,4039,0,4466,0,1774,2429135,1379398,1425850,31700,7184,D1,P1,12276,26946,1488,2459350,613,61300,2101,2520650,5148.56,3726.34
|
146 |
+
30/09/2023,1127,478,4089760,9316,222854,364180,0,517,0,3251,0,13297,0,1425,1049942,435407,548780,10869,4505,D1,P1,12905,27091,1533,2701900,640,64000,2173,2765900,5022.4,3685.32
|
147 |
+
1/10/2023,1021,436,748856,2639,301970,224135,0,846,0,2731,0,7574,0,962,935755,413098,1084400,13147,5335,D1,P1,9103,18479,1165,2022810,467,46700,1632,2069510,3823.3,2818.63
|
148 |
+
2/10/2023,1673,764,1692932,4211,387802,237932,0,1564,0,12820,0,9400,0,1463,877002,383352,1016934,14302,5965,D1,P1,12307,24110,1290,2265000,565,56500,1855,2321500,4314.73,3091.4
|
149 |
+
3/10/2023,1516,725,1757367,3947,568156,171003,0,1739,0,21454,0,5276,0,1640,833524,365270,973716,14227,5936,D1,P1,12568,24900,1344,2390760,645,64500,1989,2455260,4686.71,3259.46
|
150 |
+
4/10/2023,1786,763,1733340,3119,567654,129402,0,1726,0,15833,0,13543,0,2940,836392,368220,1029847,13931,5864,D1,P1,13780,26581,1383,2427230,695,69500,2078,2496730,4764.92,3278.39
|
151 |
+
5/10/2023,1986,861,1671129,3736,504268,159069,0,1747,0,24285,0,8234,0,3163,830805,380396,476125,13399,5529,D1,P1,12797,24819,1428,2572910,640,64050,2067,2626960,4940.4,3504.67
|
152 |
+
6/10/2023,1774,753,1348401,2784,702326,205479,0,1686,0,15228,0,12269,0,2107,817142,382879,504402,11840,5476,D1,P1,11345,22554,1268,2317850,601,60300,1869,2378150,4247.46,3014.11
|
153 |
+
7/10/2023,1150,416,1175733,2242,359848,180366,0,1446,0,19417,0,27951,0,2050,921412,418533,520370,11215,5083,D1,P1,14047,25738,1516,3012040,684,68550,2200,3080590,4256.92,3052.07
|
154 |
+
8/10/2023,999,337,1296701,2609,662748,293989,0,1415,0,14589,0,18476,0,1786,768086,352949,357821,12788,5550,D1,P1,11419,21977,1320,2426760,572,57400,1892,2484160,4025.59,2933.34
|
155 |
+
9/10/2023,772,289,1942734,4167,3096792,191352,0,1855,0,24331,0,21658,0,1757,653538,261410,590317,14449,6333,D1,P1,14624,27809,1367,2649310,715,73600,2082,2722910,4326.63,2956.14
|
156 |
+
10/10/2023,737,241,1911227,4238,565419,164827,0,2101,0,11526,0,9057,0,2720,734200,300476,568450,13952,6145,D1,P1,12640,24537,1376,2459930,653,68350,2029,2528280,4537.77,3219.59
|
157 |
+
11/10/2023,681,256,2171216,4714,503802,216630,0,1921,0,7255,0,7549,0,2025,958835,399349,595481,12432,5599,D1,P1,11486,22322,1319,2395980,638,66400,1958,2463820,4317.3,3006.02
|
158 |
+
12/10/2023,673,240,1820266,4067,233553,161215,0,8042,0,4686,0,5288,0,1408,861845,336598,557239,13130,5889,D1,P1,9536,18332,1167,1988790,536,56350,1702,2044540,3786.09,2688.23
|
159 |
+
13/10/2023,595,233,1529402,3094,68852,156834,0,7184,0,4986,0,14364,0,1924,801772,317596,563967,12222,5539,D1,P1,12220,23105,1373,2510340,641,66600,2014,2576940,4218.4,2949.55
|
160 |
+
14/10/2023,748,266,1013578,2156,48430,185877,0,3043,0,4287,0,14809,0,2117,929822,362662,603684,11533,5191,D1,P1,11280,21172,1275,2379750,592,62050,1867,2441800,3859.27,2715.54
|
161 |
+
15/10/2023,602,201,1596953,4098,55580,222305,0,12269,0,4366,0,15778,0,1639,891052,327915,425822,13301,6358,D1,P1,10476,19507,1178,2129330,587,60800,1765,2190130,3766.36,2609.81
|
162 |
+
16/10/2023,964,369,2144206,5169,31683,118393,0,6488,0,5537,0,65656,0,1254,842123,317951,810650,16455,7813,D1,P1,23493,39642,2233,4391770,1136,117850,3369,4509620,5998.13,4174.09
|
163 |
+
17/10/2023,1105,415,2112245,5363,69479,70676,0,4964,0,4816,0,18719,0,2353,816941,328053,766996,14912,7402,D1,P1,15733,28542,1531,2735230,779,81300,2310,2816530,5078.87,3496.45
|
164 |
+
18/10/2023,913,348,1892230,4633,451927,111742,0,4068,0,4855,0,32612,0,2028,957593,377866,689470,15228,7272,D1,P1,18694,32354,1918,3636660,883,91900,2801,3728560,5610.31,3986.54
|
165 |
+
19/10/2023,914,302,1550243,3817,100009,183549,0,4309,0,4468,0,68322,0,2169,846076,336810,775970,14394,6925,D1,P1,26120,43767,2170,4171580,1158,120800,3328,4292380,5891.41,4024.57
|
166 |
+
20/10/2023,663,208,1100622,2740,174916,181797,0,3695,0,4056,0,58835,0,1887,910115,366406,653096,15447,6572,D1,P1,22398,38504,2218,4385190,1035,108650,3253,4493840,5680.14,4012.57
|
167 |
+
21/10/2023,559,184,1405730,3216,207981,276329,0,2723,0,3213,0,44899,0,1893,1184901,485051,850250,14780,6181,D1,P1,17236,31207,1638,3121900,793,82100,2431,3204000,4493.8,3159.39
|
168 |
+
22/10/2023,545,198,1467468,3228,520836,253840,0,2213,0,2850,0,27411,0,1911,1154732,423852,1027954,10344,4893,D1,P1,13607,25217,1482,2893810,725,75700,2207,2969510,4332.98,3030.72
|
169 |
+
23/10/2023,625,231,2018062,5517,333114,436011,0,2839,0,3772,0,11121,0,1351,1208181,428535,1111507,11684,6220,D1,P1,12048,23419,1256,2226550,585,61300,1840,2287750,4042.32,2864.75
|
170 |
+
24/10/2023,574,226,1889784,5099,188275,228582,0,2709,0,2462,0,1109,0,1918,1083131,378488,1161439,11452,5728,D1,P1,10595,21221,1092,1909130,407,43350,1499,1952480,3725.66,2756.39
|
171 |
+
25/10/2023,536,184,2276229,5661,77308,332105,0,2708,0,2679,0,525,0,2402,905535,310989,865636,11200,5884,D1,P1,10143,20535,887,1832160,331,37050,1218,1869210,3037.38,2236.69
|
172 |
+
26/10/2023,609,200,1753696,4367,85971,236204,0,2136,0,2300,0,10,0,3842,968078,332008,771447,10098,5558,D1,P1,9900,19640,858,1671270,347,38950,1205,1710220,2995.78,2165.99
|
173 |
+
27/10/2023,563,209,1636932,3338,246909,285904,0,1992,0,2323,0,5,0,2851,1063329,352124,929257,9507,5001,D1,P1,8240,17233,780,1422510,309,35500,1089,1458010,2635.69,1927
|
174 |
+
28/10/2023,450,155,1588245,4276,235960,324079,0,2716,0,1753,0,1,0,2585,1191854,384343,1028724,8578,4958,D1,P1,7529,15744,725,1476840,300,33850,1025,1510690,2588.52,1884.51
|
175 |
+
29/10/2023,309,117,1731474,5065,70210,331208,0,2241,0,1708,0,5,0,3120,1137463,385520,764681,10186,5650,D1,P1,7535,14889,747,1514990,287,32300,1034,1547290,2594.6,1909.86
|
176 |
+
31/10/2023,486,182,2220653,5950,41641,213812,0,149,0,2404,0,15,0,1380,913362,318222,1020094,10416,3703,D1,P1,8678,18059,784,1613510,309,34550,1093,1648060,2844.9,2076.88
|
177 |
+
1/11/2023,296,123,1834772,4275,201158,313487,0,889,0,2485,0,33093,0,2287,862276,316545,798469,11740,3972,D1,P1,16341,28782,1292,2880920,542,58750,1834,2939670,3468.46,2536.62
|
178 |
+
2/11/2023,346,111,1697213,2987,1586296,64435,0,957,0,2130,0,16368,0,3586,840477,298617,830972,10008,3641,D1,P1,12216,22498,1071,2342490,402,43400,1473,2385890,3237.48,2396.17
|
179 |
+
3/11/2023,224,89,1759831,2940,93667,74522,0,962,0,2484,0,14150,0,953,952592,350909,800378,11090,3818,D1,P1,10460,20113,902,1897210,372,40600,1274,1937810,2883.8,2066.5
|
180 |
+
4/11/2023,214,76,1677064,2752,65182,61325,0,1796,0,3084,0,10438,0,1148,957265,344580,821570,11309,4380,D1,P1,8630,17741,757,1590600,290,31650,1047,1622250,2519.34,1826.6
|
181 |
+
9/5/2023,6111,1916,1365036,5044,104781,31371909,0,3341,0,11190,0,61956,0,457,2371841,1021599,2302543,34816,19205,D2,P2,35411,86251,2786,4926900,1395,139500,4181,5066400,6110.89,4301.97
|
182 |
+
10/5/2023,6233,1888,1234034,3899,140810,32973036,0,3214,0,9988,0,52049,0,705,2100238,943808,2336369,19716,17415,D2,P2,37986,96199,3087,5328400,1515,151500,4603,5480000,7186.64,5128.37
|
183 |
+
11/5/2023,5568,1816,1016155,2788,102248,50729517,0,3203,0,10869,0,8042,0,381,2461265,1127717,1110415,21547,11051,D2,P2,24496,77036,2337,4001750,1327,132700,3663,4133100,5892.4,4091.77
|
184 |
+
12/5/2023,5109,1769,1228032,3101,100246,63142114,0,2492,0,7096,0,10596,0,299,2313368,1107256,1191901,31966,11081,D2,P2,21030,75112,2052,3462310,1116,111600,3168,3573910,5091.46,3601.62
|
185 |
+
13/05/2023,3712,1231,1344557,3399,100714,59509032,0,3986,0,4282,0,9753,0,366,3067797,1388882,1403486,38518,10762,D2,P2,16294,64652,1611,2693420,827,82700,2438,2776120,3925.27,2780.04
|
186 |
+
14/05/2023,3719,1241,1520157,3491,120162,49538293,0,1891,0,3002,0,7363,0,278,3140882,1429620,2518831,44744,12151,D2,P2,13378,55706,1428,2535460,765,76500,2193,2611960,3658.41,2543.11
|
187 |
+
15/05/2023,7735,2663,2102264,5175,106903,46609819,0,2518,0,4548,0,16201,0,880,2916228,1288902,2456845,36269,15290,D2,P2,21857,67301,2149,3844360,1075,107500,3223,3951760,5540.69,3945.07
|
188 |
+
16/05/2023,9409,3206,2134290,5636,88201,9662393,0,2247,0,6690,0,15031,0,1588,3161940,1370882,2403330,37393,14187,D2,P2,26562,53380,2486,4026650,1251,125100,3736,4150900,6839.28,4817.99
|
189 |
+
17/05/2023,8409,2785,1473128,4336,56382,2232239,0,2557,0,6401,0,8946,0,322,3199527,1379566,2608845,39190,12591,D2,P2,21930,41033,2100,3675940,1126,112600,3226,3788540,6156.6,4185.47
|
190 |
+
18/05/2023,8364,2873,1733275,5009,38145,7321146,0,2912,0,7286,0,14366,0,660,2623727,1115471,1723470,36020,12100,D2,P2,21813,40251,1987,3528210,1240,124000,3227,3652210,6388.27,4150.71
|
191 |
+
19/05/2023,6432,2050,1784426,5063,23340,8715910,0,3934,0,6035,0,20378,0,362,2995998,1287313,1959870,36885,12848,D2,P2,19874,38360,1888,3663690,1140,114000,3027,3777590,5981.25,3891.85
|
192 |
+
20/05/2023,5428,1724,1635604,4408,34693,8783612,0,3318,0,4714,0,21030,0,236,2996479,1326416,1903323,31048,12256,D2,P2,17568,33060,1691,3342720,931,93100,2623,3437270,5113.91,3453.26
|
193 |
+
21/05/2023,5657,1807,1788487,4492,24812,5015214,0,2253,0,4227,0,11656,0,494,3167634,1309450,3651254,33361,13073,D2,P2,14766,28367,1461,2940020,800,80000,2261,3020020,4874.35,3300.96
|
194 |
+
22/05/2023,5768,2036,2176947,5688,25298,3002995,0,2739,0,8313,0,25663,0,1147,3573865,1548365,3939226,33410,14092,D2,P2,21520,40205,1854,3533540,1097,109700,2951,3643240,6425.41,4211.67
|
195 |
+
23/05/2023,5051,1720,2359219,6966,24773,3005057,0,4738,0,13827,0,47900,0,965,3248157,1376975,3631390,35016,13025,D2,P2,29860,51811,2527,5012370,1339,133900,3866,5146270,7978.08,5238.68
|
196 |
+
24/05/2023,6078,1977,1612918,4924,24591,2833280,0,4816,0,12417,0,94489,0,1254,3572793,1550315,3532105,37491,12546,D2,P2,41297,68099,2993,5666720,1655,165500,4648,5832220,8715.48,5761.11
|
197 |
+
25/05/2023,6547,2075,1468456,3624,19705,2771412,0,5070,0,7395,0,70016,0,762,3164337,1353382,3253308,34658,13154,D2,P2,33436,56714,2588,5066960,1509,150900,4097,5217860,7939.09,5062.98
|
198 |
+
26/05/2023,3719,1189,1770048,4874,16879,2875657,0,2855,0,6964,0,29015,0,627,2989794,1248779,3345390,38267,12788,D2,P2,22185,40261,2101,4010930,1130,113000,3231,4123930,6785.57,4495.67
|
199 |
+
27/05/2023,3620,1145,1900387,5061,14156,2663378,0,3295,0,4472,0,5625,0,1473,3576647,1527545,3694843,40685,12844,D2,P2,13490,26751,1407,2592840,756,75600,2163,2668440,5325.41,3549.17
|
200 |
+
28/05/2023,4195,1302,2026053,5703,12334,2609966,0,2190,0,3737,0,5030,0,1401,3376177,1447089,2563297,42359,13543,D2,P2,13124,25607,1374,2558180,722,72200,2096,2630380,5282.85,3554.29
|
201 |
+
29/05/2023,5265,1798,2328823,6483,14783,2537637,0,3954,0,5211,0,221,0,1575,3765997,1720747,2865333,39579,8116,D2,P2,15619,30688,1585,2979010,785,78500,2370,3057510,5961.63,4097.14
|
202 |
+
30/05/2023,3879,1366,2294654,6008,15979,2489630,0,4465,0,6041,0,6,0,1192,3790830,1751416,2822819,37234,8830,D2,P2,17258,32693,1773,3270270,900,90000,2673,3360270,6752.47,4596.75
|
203 |
+
31/05/2023,3933,1348,1645187,4081,14208,2337652,0,3797,0,4794,0,6,0,888,4151434,1953620,2714074,45856,6861,D2,P2,16458,31379,1688,3065730,924,92400,2612,3158130,6598.66,4373.22
|
204 |
+
1/6/2023,4817,1530,1862175,4841,48192,3241822,0,3060,0,4802,0,12820,0,1137,4151797,1903421,2255850,51175,7095,D2,P2,17582,34622,1700,3231430,909,90900,2609,3322330,6342.48,4257.19
|
205 |
+
2/6/2023,5733,1800,966546,2646,43573,4582872,0,1563,0,10678,0,46810,0,1309,4313201,2009602,2074692,47378,6120,D2,P2,25710,47869,2271,4131170,1130,113000,3401,4244170,6992.72,4747.36
|
206 |
+
3/6/2023,4142,1290,2445721,11111,90587,4764628,0,2176,0,5144,0,27735,0,518,4514302,2083217,2095544,58527,5748,D2,P2,19247,37244,1905,3615570,961,96100,2866,3711670,5996.2,4065.63
|
207 |
+
4/6/2023,5143,1613,2296690,6790,40929,4717779,0,1280,0,4237,0,5606,0,325,4179140,1889452,2152476,45239,6093,D2,P2,13474,29405,1475,2776480,755,75500,2230,2851980,5219.47,3571.73
|
208 |
+
5/6/2023,5384,1832,3509278,8938,56272,19979584,0,1377,0,11493,0,25647,0,579,3683204,1641254,3616732,40356,6453,D2,P2,22558,54639,2114,4004520,1128,112800,3242,4117320,6672.4,4468.93
|
209 |
+
6/6/2023,4802,1594,3216944,7861,20049,33102789,0,1485,0,9086,0,36532,0,545,3822453,1716540,3687300,53347,6334,D2,P2,26643,69935,2358,4505090,1222,122200,3580,4627290,6855.89,4686.82
|
210 |
+
7/6/2023,5072,1648,2143372,5356,22553,21321547,0,1576,0,7213,0,21215,0,628,4178339,1811963,2354753,51632,6259,D2,P2,22242,56660,2125,3900920,1184,118400,3309,4019320,6611.5,4370.78
|
211 |
+
8/6/2023,4444,1465,3190766,8024,53653,10254268,0,2046,0,10491,0,19549,0,769,3941272,1738344,2283350,59291,6775,D2,P2,23293,50105,2238,4145770,1270,127000,3508,4272770,6851.85,4515.66
|
212 |
+
9/6/2023,4818,1605,3278715,9328,18347,4890758,0,1925,0,8360,0,32385,0,1732,3969227,1777864,2353376,52000,6026,D2,P2,25950,50611,2404,4657210,1315,131500,3719,4788710,6881.12,4639.8
|
213 |
+
10/6/2023,3465,1207,2887842,8529,725,5489947,0,1230,0,5401,0,37954,0,2136,4458593,2061762,2535928,66567,5554,D2,P2,24413,47973,2370,4584570,1225,122500,3595,4707070,6334.68,4283.38
|
214 |
+
11/6/2023,4727,1501,3149290,8114,738,5313957,0,1839,0,8198,0,32493,0,1533,4442610,2006438,2183963,47655,6008,D2,P2,23656,46275,2220,4441870,1183,118300,3403,4560170,6134.11,4098
|
215 |
+
12/6/2023,6437,2208,4416005,12345,149561,5298884,0,1905,0,8542,0,101079,0,472,4645531,1995891,3301882,38760,4966,D2,P2,44382,76997,3520,6853780,1782,178200,5302,7031980,8549.02,5779.3
|
216 |
+
13/06/2023,3556,1254,4626697,12984,258088,5952266,0,2095,0,10415,0,59770,0,1016,4508060,1912958,3440789,47281,4630,D2,P2,35764,67060,2737,5184020,1530,153000,4266,5335600,7908.1,5200.7
|
217 |
+
14/06/2023,3178,1060,3389530,10298,685692,10454400,0,2258,0,24457,0,16016,0,1101,4573214,1920050,3160905,41549,5083,D2,P2,27677,56158,2257,4257990,1244,124400,3501,4382390,7187.71,4826.11
|
218 |
+
15/06/2023,2981,999,3131350,10791,1072645,11631302,0,2265,0,17304,0,10395,0,1188,4075106,1690702,3267810,50496,5037,D2,P2,23775,50354,2201,4212820,1215,121500,3416,4334320,7339.75,4890.1
|
219 |
+
16/06/2023,2705,947,2923279,11124,1166424,11840950,0,1780,0,8938,0,24339,0,966,4533368,1939737,2881833,41872,4604,D2,P2,22957,49677,2225,4445430,1154,115400,3379,4560830,6663.77,4416.03
|
220 |
+
17/06/2023,3697,1154,2955836,10440,807683,9748201,0,2139,0,5741,0,54129,0,766,4958344,2059487,3183051,52618,3675,D2,P2,26623,53187,2434,4755560,1286,128600,3723,4890110,6983.5,4694.41
|
221 |
+
18/06/2023,3229,1080,3280006,12373,116340,8176712,0,1481,0,4741,0,16724,0,864,4270249,1735486,3251229,39780,3696,D2,P2,16690,36522,1715,3294460,936,93600,2651,3388060,5614.57,3749.6
|
222 |
+
19/06/2023,3082,1003,6545797,24462,55763,4841897,0,2098,0,10520,0,26558,0,2211,4137846,1743715,2680413,43156,4347,D2,P2,25736,50759,2343,4515000,1244,124400,3587,4639400,7090.09,4789.96
|
223 |
+
20/06/2023,2422,857,6734594,28910,52166,4718912,0,2205,0,10284,0,30610,0,1002,4218772,1771102,2058734,42288,4260,D2,P2,27941,52107,2478,4829920,1398,139800,3876,4969720,7584.9,4974.28
|
224 |
+
21/06/2023,3366,1132,4784180,17247,52817,5971594,0,3387,0,9277,0,41697,0,645,4113884,1743016,2111350,44159,4193,D2,P2,28338,53853,2376,4353550,1357,135700,3733,4489250,7214.21,4702.88
|
225 |
+
22/06/2023,2841,924,3300680,13360,29784,6803330,0,4064,0,7068,0,68638,0,481,3738171,1533407,1597072,35381,4173,D2,P2,34683,62182,2532,4863520,1434,143400,3966,5006920,7223.75,4679.68
|
226 |
+
23/06/2023,2474,805,2284446,9012,80066,6833289,0,3274,0,7379,0,13501,0,721,4479743,1889155,1647740,39089,3640,D2,P2,16506,35549,1530,2980550,888,88800,2418,3069350,5295.75,3457.41
|
227 |
+
24/06/2023,2462,814,1947190,7247,50309,6526903,0,2767,0,4703,0,8438,0,616,3758421,1565736,1648519,46332,3834,D2,P2,13804,31588,1381,2698000,788,78800,2169,2776800,4822.39,3136
|
228 |
+
25/06/2023,2082,679,3560248,14850,50806,6368664,0,2767,0,4414,0,5346,0,628,4038846,1700182,2514456,43065,4201,D2,P2,13435,30121,1424,2782640,778,77800,2202,2860440,5082.66,3353.86
|
229 |
+
26/06/2023,2399,839,5999950,28401,23209,10788275,0,3699,0,13383,0,13592,0,790,3427918,1403888,3598236,33883,4642,D2,P2,21114,49622,1959,3810990,1175,117500,3134,3928490,6965.39,4504.75
|
230 |
+
27/06/2023,2307,804,5005495,18260,81344,14103220,0,7082,0,8898,0,40917,0,945,3819654,1523667,3556028,35326,4628,D2,P2,32019,65348,2877,5691820,1595,159500,4472,5851320,9589,6333.48
|
231 |
+
28/06/2023,2215,759,3721084,11248,20153,10547995,0,8387,0,7120,0,39693,0,944,3671994,1568555,1397196,33212,2998,D2,P2,30267,63086,2863,5931970,1516,151600,4379,6083570,8919.81,5942.75
|
232 |
+
29/06/2023,2013,706,3918049,10226,155296,8525871,0,10096,0,5693,0,24049,0,1512,3937747,1585655,3393043,30700,2519,D2,P2,22893,54097,2125,4215060,1132,113200,3257,4328260,7178.85,4806.94
|
233 |
+
30/06/2023,1258,454,3088874,7943,902115,10945715,0,8904,0,9611,0,62404,0,1029,4945464,1946944,1835310,52445,2839,D2,P2,30707,67849,2616,5112840,1397,139700,4013,5252540,7664.09,5203.16
|
234 |
+
1/7/2023,1641,539,3872657,12034,191537,12141356,0,4956,0,6049,0,31194,0,923,5328149,2224200,2123805,56724,2513,D2,P2,22229,54353,2266,4505840,1205,120500,3471,4626340,6983.83,4746.37
|
235 |
+
2/7/2023,1336,485,5799582,17238,576858,12180985,0,4148,0,4670,0,4766,0,617,4527404,1997256,2038953,50510,21201,D2,P2,15205,43684,1672,3328290,886,88600,2559,3416990,5952.59,4038.91
|
236 |
+
3/7/2023,2712,924,9986061,28191,442261,14059535,0,5347,0,7408,0,19028,0,1044,4179823,1854231,2234940,57543,14473,D2,P2,22798,57392,2425,4796940,1308,130800,3732,4925290,7701.44,5182.84
|
237 |
+
4/7/2023,4137,1419,4717456,14519,2137830,14463201,0,6164,0,8277,0,12283,0,1531,4449073,1959412,2350308,49085,9854,D2,P2,23585,60143,2220,4262060,1327,132700,3547,4394760,7689.38,5021.95
|
238 |
+
5/7/2023,4166,1422,4779589,12676,2354716,18574154,0,7967,0,11552,0,6628,0,1420,4464681,1969744,2390838,41411,12751,D2,P2,22847,61021,2348,4359400,1422,142200,3769,4497600,7976.49,5170.89
|
239 |
+
6/7/2023,4182,1444,4939385,12222,2364811,15879491,0,6575,0,8461,0,18225,0,997,4490815,1942923,2239375,44808,16216,D2,P2,23716,60282,2602,4960450,1543,154300,4145,5114750,8225.73,5423.76
|
240 |
+
7/7/2023,3497,1181,3121447,7534,1063284,17341347,0,6025,0,8113,0,25962,0,659,4891573,2128787,1976413,57373,12464,D2,P2,23336,58252,2335,4783910,1269,126900,3604,4910810,7182.26,4846.37
|
241 |
+
8/7/2023,2760,856,3295227,9788,1119268,19207341,0,4102,0,6195,0,40506,0,832,5039604,2277255,2330435,44052,15163,D2,P2,22278,62471,2128,4352160,1191,119100,3319,4471260,6706.12,4485.38
|
242 |
+
9/7/2023,2809,875,3913741,11815,749310,25182206,0,6420,0,5222,0,49626,0,718,4669470,2144473,3908306,49659,11716,D2,P2,24736,69003,2620,5573560,1325,132500,3945,5706060,7673.85,5278.59
|
243 |
+
10/7/2023,4312,1489,5972974,18402,1511035,25950979,0,9842,0,10638,0,36204,0,935,4584106,2019220,4391654,52303,12983,D2,P2,28497,78251,2578,5157430,1419,141900,3997,5299330,8174.81,5453.8
|
244 |
+
11/7/2023,4579,1550,4999618,16469,559119,23938153,0,11688,0,36570,0,25216,0,1289,4458364,1932300,4150666,47979,12292,D2,P2,28688,77223,2707,5384090,1483,148300,4190,5532390,8594.12,5787.78
|
245 |
+
12/7/2023,4079,1418,4465722,13191,583520,25196511,0,4610,0,9813,0,20388,0,1210,4558876,2000168,4109583,54631,12366,D2,P2,25749,73523,2403,4926480,1410,141000,3813,5067480,8000.73,5259.61
|
246 |
+
13/07/2023,3719,1260,4635033,12302,903614,25720336,0,7867,0,6792,0,22248,0,857,4596184,1957206,3729970,48474,11017,D2,P2,22447,69283,2134,4261960,1312,131200,3447,4393760,7385.89,4769.15
|
247 |
+
14/07/2023,3632,1224,3441594,9800,1566300,28606996,0,6726,0,6172,0,14670,0,432,4683387,2007387,3912229,52588,10079,D2,P2,19225,67928,2002,3875450,1077,107700,3079,3983150,6615.15,4505.74
|
248 |
+
15/07/2023,2909,941,6025085,21326,1836196,28705476,0,5705,0,4369,0,31202,0,595,5008167,2251661,3727627,58143,10214,D2,P2,19533,64001,2026,4112810,1066,106600,3093,4220310,6115.73,4122.89
|
249 |
+
16/07/2023,2818,853,7339565,26586,4043959,26752554,0,7733,0,3961,0,27180,0,1082,4716541,2092258,2114014,59204,11281,D2,P2,18871,60797,1956,3715100,1126,112600,3084,3832400,6216.99,4066.5
|
250 |
+
17/07/2023,4420,1486,9638491,32269,819444,29437537,0,11485,0,5220,0,66236,0,2418,4359325,1937825,1989872,55815,11896,D2,P2,35493,89662,2771,5539890,1521,152100,4292,5691990,8025.2,5388.69
|
251 |
+
18/07/2023,4574,1551,9498457,31230,1206114,29164369,0,5012,0,7146,0,47074,0,2358,4882304,2163458,2157773,69573,12604,D2,P2,32238,84091,2687,5214920,1329,132900,4016,5347820,7833.63,5336.47
|
252 |
+
19/07/2023,4632,1537,9742535,26935,1491736,30394328,0,6147,0,7028,0,11807,0,1476,4613422,2080215,1981362,67495,12116,D2,P2,23193,69138,2342,4581910,1084,108400,3426,4690310,7118.68,4991.3
|
253 |
+
20/07/2023,4891,1632,7630122,20720,2370192,23939153,0,6261,0,5635,0,17220,0,1338,4484291,1922090,1663127,75312,12252,D2,P2,23193,63445,2209,4471970,995,99500,3255,4576570,6700.79,4599.1
|
254 |
+
21/07/2023,3978,1378,7284968,21477,2456715,17869335,0,6360,0,10877,0,11431,0,769,4519305,1975730,1686467,68931,10065,D2,P2,21478,57996,2115,4257360,1006,100600,3121,4357960,6467.01,4497.43
|
255 |
+
22/07/2023,3151,978,5638955,16181,2015345,12808440,0,7097,0,5145,0,13811,0,699,4689346,2086993,1861883,71898,9081,D2,P2,17602,50209,1897,3876970,830,83000,2727,3959970,5812.35,4126.62
|
256 |
+
23/07/2023,2905,986,6133144,16089,881691,11267535,0,5593,0,4746,0,68021,0,514,4242878,1843843,1681215,61164,10797,D2,P2,25804,58279,2442,5168300,1161,116100,3603,5284400,6622.56,4639.27
|
257 |
+
24/07/2023,4606,1651,8830736,21931,189913,35658281,0,8836,0,6040,0,64066,0,1626,3943001,1708849,1900126,59494,10236,D2,P2,31953,73505,2898,6111230,1424,142400,4321,6253530,8030.22,5492.47
|
258 |
+
25/07/2023,4414,1597,7750251,15384,3348941,25011847,0,10262,0,9572,0,15072,0,916,3976490,1729916,1911109,68826,11468,D2,P2,26162,65005,2440,4822810,1154,115400,3594,4938210,7092.81,4965.39
|
259 |
+
26/07/2023,4488,1530,8125332,16391,1040452,24380635,0,9947,0,16453,0,38777,0,1551,3837786,1680967,1856885,74924,13290,D2,P2,31894,69746,2797,5552460,1348,134800,4147,5687460,7359.12,5027.76
|
260 |
+
27/07/2023,4105,1494,8054962,14724,220302,13070502,0,6758,0,8841,0,20622,0,1313,3636297,1544742,1772602,63935,11680,D2,P2,24634,57255,2498,5018670,1196,119600,3694,5138270,7106.66,4875.99
|
261 |
+
28/07/2023,3743,1318,6955526,11566,3991586,5347413,0,10451,0,8496,0,20184,0,1563,3890784,1680538,1608577,73120,11390,D2,P2,22265,50660,2204,4515740,1054,105400,3258,4621140,6441.87,4432.07
|
262 |
+
29/07/2023,3395,1192,5132501,9837,1349895,4441709,0,7115,0,5449,0,18983,0,1129,4295602,1813637,1824777,80511,11911,D2,P2,17626,42341,1930,3807270,860,86000,2790,3893270,5519.71,3922.54
|
263 |
+
30/07/2023,2746,903,4903153,11018,710000,4431986,0,8491,0,4599,0,24834,0,1109,3924352,1733790,1740605,72221,11440,D2,P2,17619,43309,1942,3937090,834,83400,2776,4020490,5556.3,3945.89
|
264 |
+
31/07/2023,4208,1476,6832832,19648,1721973,4079656,0,7754,0,7818,0,27918,0,2050,3760475,1501134,1957900,62124,11605,D2,P2,22728,51399,2256,4604950,1046,104600,3302,4709550,6481.79,4556.75
|
265 |
+
1/8/2023,4203,1489,6398210,15890,2250090,5457683,0,7588,0,7948,0,61894,0,1248,3687038,1439092,1774701,61448,11492,D2,P2,31009,67515,2609,5471270,1309,130900,3918,5602170,6825.97,4671.87
|
266 |
+
2/8/2023,4285,1515,5402871,14825,785167,6582085,0,6079,0,7236,0,79041,0,1345,3807266,1493340,2025308,54506,11515,D2,P2,34034,74123,2858,5856910,1360,136000,4218,5992910,7171.23,4989.3
|
267 |
+
3/8/2023,4667,1744,4724924,8903,1111815,10407793,0,9077,0,7117,0,31714,0,1983,3797879,1479623,1718831,52587,11408,D2,P2,23978,62504,2404,4832400,1095,109500,3498,4941800,6670.71,4627.48
|
268 |
+
4/8/2023,4201,1562,3732952,9116,4574481,10660977,0,8436,0,6970,0,25097,0,1055,3814852,1466211,1374674,57482,10785,D2,P2,21714,62922,2226,4561560,975,97500,3201,4659060,6133.71,4366.77
|
269 |
+
5/8/2023,3080,1110,3310732,9884,3460283,11580456,0,5735,0,5049,0,5911,0,704,4048945,1601234,1442690,65158,9942,D2,P2,13792,52995,1578,3188640,720,72000,2298,3260640,4760.04,3375.44
|
270 |
+
6/8/2023,2809,979,4153998,11663,5103054,8381689,0,4868,0,4184,0,28658,0,637,4040770,1250223,1844909,47698,10816,D2,P2,17706,56827,1841,3921270,842,84200,2683,4005470,5062.91,3520.39
|
271 |
+
7/8/2023,3522,1186,3164171,10000,4137349,8709017,0,6112,0,6640,0,43866,0,1285,3928811,1288638,1861166,44623,11648,D2,P2,26772,71580,2456,4923260,1132,113200,3587,5034960,6580.87,4648.84
|
272 |
+
8/8/2023,4111,1495,6020074,15008,2923076,5012245,0,6684,0,6961,0,12257,0,3038,3921429,1094791,2059462,48047,10379,D2,P2,22363,60212,2075,4138870,971,97100,3046,4235970,6286.57,4418.71
|
273 |
+
9/8/2023,3609,1285,5616011,13195,2483117,3900778,0,8177,0,6447,0,12774,0,1309,3322165,452000,2262292,52219,11047,D2,P2,21099,53059,2067,4030270,1010,101000,3077,4131270,6309.32,4273.88
|
274 |
+
10/8/2023,3872,1330,5270940,11342,1305507,3614496,0,6927,0,6602,0,21830,0,986,2868345,452896,1541791,46720,10556,D2,P2,22515,52055,2216,4848640,974,97400,3190,4946040,6281.59,4498.26
|
275 |
+
11/8/2023,3673,1257,4485834,10445,3562053,5521177,0,5810,0,13751,0,5797,0,751,3242607,511016,1679989,47262,10344,D2,P2,17086,46491,1551,3242370,671,67100,2222,3309470,4608.96,3355.58
|
276 |
+
12/8/2023,2744,960,3946512,10052,4015316,5813616,0,6205,0,10379,0,9890,0,532,3761072,595191,1931989,54787,9210,D2,P2,15949,46498,1376,3113130,639,63900,2016,3177130,4121.65,2907.82
|
277 |
+
13/08/2023,2418,775,5051792,11809,1869057,6348414,0,4093,0,5187,0,21320,0,399,3279816,503805,2171335,55136,10546,D2,P2,14745,44224,1327,2888900,648,64800,1975,2953700,3905.29,2752.8
|
278 |
+
14/08/2023,3551,1196,4839009,11805,1765326,3758610,0,6170,0,7226,0,19575,0,706,2974893,427940,1822890,49127,11042,D2,P2,20336,49993,1770,3798710,748,74800,2518,3873510,5195.83,3786.85
|
279 |
+
15/08/2023,3430,1312,6520709,24857,1792924,1852314,0,6063,0,9302,0,34681,0,778,3080012,462344,1935145,57900,11083,D2,P2,24449,48710,1946,4332210,807,80700,2752,4412810,5367.05,3930.18
|
280 |
+
16/08/2023,3253,1175,4844378,27290,3478033,1293346,0,5884,0,8280,0,29077,0,1055,3150093,468159,2094524,58937,11823,D2,P2,23892,46995,1911,3996580,780,78000,2691,4074580,5452.88,3979.2
|
281 |
+
17/08/2023,3714,1417,4702754,23408,4058942,1186576,0,11301,0,10504,0,15462,0,1017,3071572,444690,1961293,58681,10987,D2,P2,21265,42100,1700,3517380,704,70400,2404,3587780,5150.22,3718.85
|
282 |
+
18/08/2023,1936,710,4370177,18919,3789636,1020973,0,9525,0,8958,0,32346,0,909,3252966,461174,2031390,61098,10354,D2,P2,20983,41383,1778,3654630,679,67900,2457,3722530,5019.58,3716.93
|
283 |
+
19/08/2023,1998,723,3683868,14860,5187185,1336224,0,8305,0,6265,0,13396,0,1267,3460234,494225,2037289,68988,9709,D2,P2,14640,31119,1331,2887610,528,52800,1860,2943410,4059.2,3012.38
|
284 |
+
20/08/2023,2458,839,5558511,16917,6444084,1333600,0,8083,0,5668,0,9425,0,593,3233047,427550,2093935,58698,11658,D2,P2,13616,29557,1227,2592690,476,47600,1703,2640290,3842.86,2850.38
|
285 |
+
21/08/2023,2316,892,5802540,21997,1578062,1099659,0,9057,0,8434,0,11204,0,597,3110596,442523,1991499,71910,13059,D2,P2,19336,38812,1656,3445610,663,66300,2319,3510210,5100.16,3789.37
|
286 |
+
22/08/2023,2208,845,5006504,13886,598218,939529,0,18631,0,11119,0,18304,0,666,3020862,419659,1960342,66769,12591,D2,P2,21348,42166,1844,3824050,762,76200,2582,3877380,5610.58,4088.17
|
287 |
+
23/08/2023,2104,821,5240143,16309,1941212,2081327,0,17073,0,8077,0,6042,0,709,2634348,409468,1726842,53998,13783,D2,P2,18864,38949,1513,3153720,655,65500,2165,3219310,4984.78,3596.01
|
288 |
+
24/08/2023,2011,685,5623870,14314,380971,2132605,0,13223,0,7340,0,11449,0,1774,2244344,385012,1409286,55699,13185,D2,P2,18821,38282,1665,3378840,678,67800,2358,3474730,5209.76,3795.85
|
289 |
+
25/08/2023,1889,680,4674166,13506,1119189,1818097,0,33200,0,7250,0,16577,0,3622,2405697,395219,1564070,61103,13348,D2,P2,18364,37536,1863,3939560,638,63800,2501,4003360,5070.56,3850.47
|
290 |
+
26/08/2023,1229,379,5475213,18030,476090,1048919,0,15316,0,4976,0,16625,0,3546,2662312,434769,1789446,61768,13346,D2,P2,16076,32992,1816,3388030,606,60600,2422,3448630,4877.02,3729.33
|
291 |
+
27/08/2023,1333,486,5591938,13138,956722,732493,0,12952,0,4227,0,19562,0,2354,2470188,417919,1980888,53707,14151,D2,P2,14834,30563,1572,2979370,536,53600,2108,3032970,4232.88,3241.64
|
292 |
+
28/08/2023,2031,760,7120359,17304,592505,571748,0,44816,0,8728,0,19999,0,3813,2357294,420574,1878047,50335,13442,D2,P2,20994,42982,1970,3877550,642,64200,2612,3941750,5610.5,4325.83
|
293 |
+
29/08/2023,1560,550,6349650,18074,395464,276869,0,217642,0,8742,0,36555,0,2778,2437012,455532,1707585,52913,12648,D2,P2,25919,51217,2270,4323380,803,80300,3073,4403680,6223.41,4701.59
|
294 |
+
30/08/2023,1788,623,6774580,17019,804715,227676,0,92490,0,7576,0,33376,0,1815,2461827,452647,1924554,57945,12244,D2,P2,24015,48307,2298,4414000,796,79600,3094,4493600,5983.31,4520.44
|
295 |
+
31/08/2023,2251,790,6881955,16586,462096,216142,0,177608,0,7188,0,13212,0,1862,2630688,508779,1691540,44071,12093,D2,P2,17587,35874,1809,3406910,604,60400,2413,3467310,5218.62,4005.29
|
296 |
+
1/9/2023,2763,930,5360505,17680,259775,323504,0,21865,0,7383,0,4899,0,1313,2723715,529388,1841032,48663,11275,D2,P2,13457,29785,1396,2542480,459,45900,1855,2588380,4243.41,3270.46
|
297 |
+
2/9/2023,2597,870,4478842,15289,1226680,320820,0,26924,0,6477,0,4896,0,1454,2929332,613163,1945160,60288,10815,D2,P2,12337,27451,1347,2481120,508,50800,1855,2531920,4227.98,3109.35
|
298 |
+
3/9/2023,2332,762,5174329,13994,449228,288375,0,20423,0,5755,0,10890,0,1494,2516381,558353,1697712,54329,11996,D2,P2,12609,27028,1428,2699310,481,48100,1909,2747410,4177.46,3164.79
|
299 |
+
4/9/2023,3561,1229,5334952,17444,296660,306771,0,324815,0,7849,0,41134,0,2069,2485534,613680,1823512,52578,12787,D2,P2,22283,45146,2065,3908960,791,79100,2855,3987700,5743.35,4264.57
|
300 |
+
5/9/2023,2261,816,6113505,20426,302910,227998,0,287642,0,7998,0,21025,0,1448,2453507,595873,1648165,49590,11749,D2,P2,19096,40015,1818,3314870,588,58800,2407,3377390,5367.87,4153.87
|
301 |
+
6/9/2023,2868,1031,5558783,13407,1266416,255848,0,203777,0,8887,0,9020,0,933,2766708,736889,1987155,47189,10851,D2,P2,14311,31495,1502,2764430,499,49900,2001,2814330,4575.2,3510.97
|
302 |
+
7/9/2023,2394,832,4907653,9041,191893,285511,0,202017,0,8317,0,6879,0,801,2616416,630668,1712157,47089,11632,D2,P2,13483,29283,1544,2846790,463,46300,2007,2893090,4770.64,3739.02
|
303 |
+
8/9/2023,2689,910,4752031,8867,157343,302141,0,201772,0,8717,0,5684,0,1428,2705167,791338,1852090,43707,10493,D2,P2,13830,29726,1531,2806450,518,51800,2049,2858250,4807.58,3697.23
|
304 |
+
9/9/2023,2204,752,3975657,10022,227113,245700,0,201776,0,7299,0,4098,0,758,2929279,827015,2001938,50033,10082,D2,P2,12284,26212,1414,2674080,433,43300,1847,2717380,4310.87,3354.94
|
305 |
+
10/9/2023,2167,743,4243960,10399,270612,291468,0,201256,0,6099,0,8097,0,809,2352670,1241029,1966290,41767,10185,D2,P2,12594,26398,1498,2834900,435,43500,1933,2878400,4460.59,3531.69
|
306 |
+
11/9/2023,3381,1227,4492340,10684,1192346,154867,0,202476,0,8393,0,6493,0,838,2573007,1455728,1830559,39596,12910,D2,P2,15510,32142,1544,2881650,449,44900,1992,2923700,4715.59,3736.66
|
307 |
+
12/9/2023,2511,884,4936079,10015,199137,170680,0,50740,0,8506,0,26721,0,1085,2527461,1481401,1856155,40974,11883,D2,P2,22786,42733,2027,4286230,326,32600,2353,4318830,5172.4,4510.57
|
308 |
+
13/09/2023,2143,778,5115564,10338,292239,238162,0,2408,0,7172,0,36811,0,836,2621020,1580825,1962940,39948,11634,D2,P2,22084,41155,1880,3809460,281,28100,2161,3837560,4765.04,4181.98
|
309 |
+
14/09/2023,2307,798,4859067,12717,1181194,308251,0,948,0,7404,0,38152,0,1282,2677877,1397139,1251585,46129,10253,D2,P2,21377,40308,1959,3742130,550,55000,2509,3797130,5413.06,4301.68
|
310 |
+
15/09/2023,2467,882,4260164,9702,399193,291844,0,756,0,6932,0,16060,0,2982,2751748,1416780,1269521,57909,10048,D2,P2,16118,32895,1659,3149040,526,52600,2185,3201640,4920.59,3802.04
|
311 |
+
16/09/2023,2076,687,3350011,7707,620978,196303,0,663,0,6018,0,9889,0,1188,3083552,1564491,1439332,61159,9435,D2,P2,12830,26945,1488,2798420,446,44600,1934,2843020,4519.52,3564.8
|
312 |
+
17/09/2023,2467,802,4503316,11119,581720,236009,0,637,0,4814,0,10024,0,2464,2935930,1503370,1649587,48796,10073,D2,P2,12357,25262,1396,2560250,455,45500,1851,2605750,4246.67,3287.31
|
313 |
+
18/09/2023,2910,1024,5568066,14302,184276,143660,0,888,0,6922,0,10381,0,1767,2373681,1330212,1479501,51224,10488,D2,P2,16441,33582,1727,3152630,572,57200,2300,3209930,5491.87,4171.85
|
314 |
+
19/09/2023,3252,1309,6105220,12193,208312,187769,0,1464,0,5210,0,8092,0,1504,2373344,1285881,1407015,40642,10547,D2,P2,17770,36578,1743,3229930,653,65300,2395,3291230,5666.71,4236.34
|
315 |
+
20/09/2023,2796,1185,6055420,14003,291395,272928,0,1077,0,4246,0,10472,0,1830,2565110,1425196,1460886,48962,10318,D2,P2,16656,34188,1627,3048960,738,73800,2365,3121460,5577.7,3950.97
|
316 |
+
21/09/2023,2208,878,5225528,8679,697480,160425,0,1033,0,6726,0,13928,0,1357,2686089,1447330,1236533,49940,10259,D2,P2,17253,34210,1912,3553480,811,81100,2723,3634580,6248.63,4440.07
|
317 |
+
22/09/2023,1734,783,4373391,8141,2220006,88968,0,738,0,9534,0,8771,0,1690,2460283,1353647,1258771,45467,9910,D2,P2,14958,31389,1714,3084570,758,75800,2472,3160370,5984.05,4280.38
|
318 |
+
23/09/2023,1190,492,4948823,10035,2432739,154849,0,702,0,8285,0,4369,0,806,2740252,1531672,1407980,51747,8665,D2,P2,12641,27336,1443,2653190,652,65200,2095,2718390,5094.46,3633.56
|
319 |
+
24/09/2023,1124,496,6239124,10744,248085,231243,0,477,0,8032,0,8640,0,1449,2648532,1476875,1294436,36638,10410,D2,P2,12153,26113,1395,2618830,621,62100,2016,2680930,4558.91,3242.77
|
320 |
+
25/09/2023,2358,1041,5325249,9804,251517,447312,0,591,0,11299,0,21103,0,1135,2371891,1333464,1222194,36894,9191,D2,P2,18608,38878,2041,3740860,897,89700,2938,3830560,6554.2,4744.62
|
321 |
+
26/09/2023,2092,994,5361926,13223,90916,351820,0,910,0,10598,0,27697,0,2803,2612585,1502573,1256804,33211,8893,D2,P2,21214,41166,2128,3878240,935,93500,3063,3971740,6565.1,4696.86
|
322 |
+
27/09/2023,1835,792,4600061,14060,728920,347014,0,1111,0,8811,0,104094,0,1780,2488689,1390273,1203937,33935,8769,D2,P2,37289,65137,2933,5530540,1595,159500,4525,5686340,8073.74,5545.54
|
323 |
+
28/09/2023,1787,807,4114657,9434,84913,564139,0,279332,0,6975,0,51946,0,2516,2290090,1309586,1316086,32443,8606,D2,P2,25651,47307,2343,4257450,1199,119900,3542,4377350,7151.36,4963.98
|
324 |
+
29/09/2023,1513,641,4477584,8505,211297,372199,0,443,0,4039,0,4466,0,1774,2429135,1379398,1425850,31700,7184,D2,P2,12276,26946,1488,2459350,613,61300,2101,2520650,5148.56,3726.34
|
325 |
+
30/09/2023,1127,478,4089760,9316,222854,364180,0,517,0,3251,0,13297,0,1425,1049942,435407,548780,10869,4505,D2,P2,12905,27091,1533,2701900,640,64000,2173,2765900,5022.4,3685.32
|
326 |
+
1/10/2023,1021,436,748856,2639,301970,224135,0,846,0,2731,0,7574,0,962,935755,413098,1084400,13147,5335,D2,P2,9103,18479,1165,2022810,467,46700,1632,2069510,3823.3,2818.63
|
327 |
+
2/10/2023,1673,764,1692932,4211,387802,237932,0,1564,0,12820,0,9400,0,1463,877002,383352,1016934,14302,5965,D2,P2,12307,24110,1290,2265000,565,56500,1855,2321500,4314.73,3091.4
|
328 |
+
3/10/2023,1516,725,1757367,3947,568156,171003,0,1739,0,21454,0,5276,0,1640,833524,365270,973716,14227,5936,D2,P2,12568,24900,1344,2390760,645,64500,1989,2455260,4686.71,3259.46
|
329 |
+
4/10/2023,1786,763,1733340,3119,567654,129402,0,1726,0,15833,0,13543,0,2940,836392,368220,1029847,13931,5864,D2,P2,13780,26581,1383,2427230,695,69500,2078,2496730,4764.92,3278.39
|
330 |
+
5/10/2023,1986,861,1671129,3736,504268,159069,0,1747,0,24285,0,8234,0,3163,830805,380396,476125,13399,5529,D2,P2,12797,24819,1428,2572910,640,64050,2067,2626960,4940.4,3504.67
|
331 |
+
6/10/2023,1774,753,1348401,2784,702326,205479,0,1686,0,15228,0,12269,0,2107,817142,382879,504402,11840,5476,D2,P2,11345,22554,1268,2317850,601,60300,1869,2378150,4247.46,3014.11
|
332 |
+
7/10/2023,1150,416,1175733,2242,359848,180366,0,1446,0,19417,0,27951,0,2050,921412,418533,520370,11215,5083,D2,P2,14047,25738,1516,3012040,684,68550,2200,3080590,4256.92,3052.07
|
333 |
+
8/10/2023,999,337,1296701,2609,662748,293989,0,1415,0,14589,0,18476,0,1786,768086,352949,357821,12788,5550,D2,P2,11419,21977,1320,2426760,572,57400,1892,2484160,4025.59,2933.34
|
334 |
+
9/10/2023,772,289,1942734,4167,3096792,191352,0,1855,0,24331,0,21658,0,1757,653538,261410,590317,14449,6333,D2,P2,14624,27809,1367,2649310,715,73600,2082,2722910,4326.63,2956.14
|
335 |
+
10/10/2023,737,241,1911227,4238,565419,164827,0,2101,0,11526,0,9057,0,2720,734200,300476,568450,13952,6145,D2,P2,12640,24537,1376,2459930,653,68350,2029,2528280,4537.77,3219.59
|
336 |
+
11/10/2023,681,256,2171216,4714,503802,216630,0,1921,0,7255,0,7549,0,2025,958835,399349,595481,12432,5599,D2,P2,11486,22322,1319,2395980,638,66400,1958,2463820,4317.3,3006.02
|
337 |
+
12/10/2023,673,240,1820266,4067,233553,161215,0,8042,0,4686,0,5288,0,1408,861845,336598,557239,13130,5889,D2,P2,9536,18332,1167,1988790,536,56350,1702,2044540,3786.09,2688.23
|
338 |
+
13/10/2023,595,233,1529402,3094,68852,156834,0,7184,0,4986,0,14364,0,1924,801772,317596,563967,12222,5539,D2,P2,12220,23105,1373,2510340,641,66600,2014,2576940,4218.4,2949.55
|
339 |
+
14/10/2023,748,266,1013578,2156,48430,185877,0,3043,0,4287,0,14809,0,2117,929822,362662,603684,11533,5191,D2,P2,11280,21172,1275,2379750,592,62050,1867,2441800,3859.27,2715.54
|
340 |
+
15/10/2023,602,201,1596953,4098,55580,222305,0,12269,0,4366,0,15778,0,1639,891052,327915,425822,13301,6358,D2,P2,10476,19507,1178,2129330,587,60800,1765,2190130,3766.36,2609.81
|
341 |
+
16/10/2023,964,369,2144206,5169,31683,118393,0,6488,0,5537,0,65656,0,1254,842123,317951,810650,16455,7813,D2,P2,23493,39642,2233,4391770,1136,117850,3369,4509620,5998.13,4174.09
|
342 |
+
17/10/2023,1105,415,2112245,5363,69479,70676,0,4964,0,4816,0,18719,0,2353,816941,328053,766996,14912,7402,D2,P2,15733,28542,1531,2735230,779,81300,2310,2816530,5078.87,3496.45
|
343 |
+
18/10/2023,913,348,1892230,4633,451927,111742,0,4068,0,4855,0,32612,0,2028,957593,377866,689470,15228,7272,D2,P2,18694,32354,1918,3636660,883,91900,2801,3728560,5610.31,3986.54
|
344 |
+
19/10/2023,914,302,1550243,3817,100009,183549,0,4309,0,4468,0,68322,0,2169,846076,336810,775970,14394,6925,D2,P2,26120,43767,2170,4171580,1158,120800,3328,4292380,5891.41,4024.57
|
345 |
+
20/10/2023,663,208,1100622,2740,174916,181797,0,3695,0,4056,0,58835,0,1887,910115,366406,653096,15447,6572,D2,P2,22398,38504,2218,4385190,1035,108650,3253,4493840,5680.14,4012.57
|
346 |
+
21/10/2023,559,184,1405730,3216,207981,276329,0,2723,0,3213,0,44899,0,1893,1184901,485051,850250,14780,6181,D2,P2,17236,31207,1638,3121900,793,82100,2431,3204000,4493.8,3159.39
|
347 |
+
22/10/2023,545,198,1467468,3228,520836,253840,0,2213,0,2850,0,27411,0,1911,1154732,423852,1027954,10344,4893,D2,P2,13607,25217,1482,2893810,725,75700,2207,2969510,4332.98,3030.72
|
348 |
+
23/10/2023,625,231,2018062,5517,333114,436011,0,2839,0,3772,0,11121,0,1351,1208181,428535,1111507,11684,6220,D2,P2,12048,23419,1256,2226550,585,61300,1840,2287750,4042.32,2864.75
|
349 |
+
24/10/2023,574,226,1889784,5099,188275,228582,0,2709,0,2462,0,1109,0,1918,1083131,378488,1161439,11452,5728,D2,P2,10595,21221,1092,1909130,407,43350,1499,1952480,3725.66,2756.39
|
350 |
+
25/10/2023,536,184,2276229,5661,77308,332105,0,2708,0,2679,0,525,0,2402,905535,310989,865636,11200,5884,D2,P2,10143,20535,887,1832160,331,37050,1218,1869210,3037.38,2236.69
|
351 |
+
26/10/2023,609,200,1753696,4367,85971,236204,0,2136,0,2300,0,10,0,3842,968078,332008,771447,10098,5558,D2,P2,9900,19640,858,1671270,347,38950,1205,1710220,2995.78,2165.99
|
352 |
+
27/10/2023,563,209,1636932,3338,246909,285904,0,1992,0,2323,0,5,0,2851,1063329,352124,929257,9507,5001,D2,P2,8240,17233,780,1422510,309,35500,1089,1458010,2635.69,1927
|
353 |
+
28/10/2023,450,155,1588245,4276,235960,324079,0,2716,0,1753,0,1,0,2585,1191854,384343,1028724,8578,4958,D2,P2,7529,15744,725,1476840,300,33850,1025,1510690,2588.52,1884.51
|
354 |
+
29/10/2023,309,117,1731474,5065,70210,331208,0,2241,0,1708,0,5,0,3120,1137463,385520,764681,10186,5650,D2,P2,7535,14889,747,1514990,287,32300,1034,1547290,2594.6,1909.86
|
355 |
+
31/10/2023,486,182,2220653,5950,41641,213812,0,149,0,2404,0,15,0,1380,913362,318222,1020094,10416,3703,D2,P2,8678,18059,784,1613510,309,34550,1093,1648060,2844.9,2076.88
|
356 |
+
1/11/2023,296,123,1834772,4275,201158,313487,0,889,0,2485,0,33093,0,2287,862276,316545,798469,11740,3972,D2,P2,16341,28782,1292,2880920,542,58750,1834,2939670,3468.46,2536.62
|
357 |
+
2/11/2023,346,111,1697213,2987,1586296,64435,0,957,0,2130,0,16368,0,3586,840477,298617,830972,10008,3641,D2,P2,12216,22498,1071,2342490,402,43400,1473,2385890,3237.48,2396.17
|
358 |
+
3/11/2023,224,89,1759831,2940,93667,74522,0,962,0,2484,0,14150,0,953,952592,350909,800378,11090,3818,D2,P2,10460,20113,902,1897210,372,40600,1274,1937810,2883.8,2066.5
|
359 |
+
4/11/2023,214,76,1677064,2752,65182,61325,0,1796,0,3084,0,10438,0,1148,957265,344580,821570,11309,4380,D2,P2,8630,17741,757,1590600,290,31650,1047,1622250,2519.34,1826.6
|
360 |
+
9/5/2023,6111,1916,1365036,5044,104781,31371909,0,3341,0,11190,0,61956,0,457,2371841,1021599,2302543,34816,19205,D3,P3,35411,86251,2786,4926900,1395,139500,4181,5066400,6110.89,4301.97
|
361 |
+
10/5/2023,6233,1888,1234034,3899,140810,32973036,0,3214,0,9988,0,52049,0,705,2100238,943808,2336369,19716,17415,D3,P3,37986,96199,3087,5328400,1515,151500,4603,5480000,7186.64,5128.37
|
362 |
+
11/5/2023,5568,1816,1016155,2788,102248,50729517,0,3203,0,10869,0,8042,0,381,2461265,1127717,1110415,21547,11051,D3,P3,24496,77036,2337,4001750,1327,132700,3663,4133100,5892.4,4091.77
|
363 |
+
12/5/2023,5109,1769,1228032,3101,100246,63142114,0,2492,0,7096,0,10596,0,299,2313368,1107256,1191901,31966,11081,D3,P3,21030,75112,2052,3462310,1116,111600,3168,3573910,5091.46,3601.62
|
364 |
+
13/05/2023,3712,1231,1344557,3399,100714,59509032,0,3986,0,4282,0,9753,0,366,3067797,1388882,1403486,38518,10762,D3,P3,16294,64652,1611,2693420,827,82700,2438,2776120,3925.27,2780.04
|
365 |
+
14/05/2023,3719,1241,1520157,3491,120162,49538293,0,1891,0,3002,0,7363,0,278,3140882,1429620,2518831,44744,12151,D3,P3,13378,55706,1428,2535460,765,76500,2193,2611960,3658.41,2543.11
|
366 |
+
15/05/2023,7735,2663,2102264,5175,106903,46609819,0,2518,0,4548,0,16201,0,880,2916228,1288902,2456845,36269,15290,D3,P3,21857,67301,2149,3844360,1075,107500,3223,3951760,5540.69,3945.07
|
367 |
+
16/05/2023,9409,3206,2134290,5636,88201,9662393,0,2247,0,6690,0,15031,0,1588,3161940,1370882,2403330,37393,14187,D3,P3,26562,53380,2486,4026650,1251,125100,3736,4150900,6839.28,4817.99
|
368 |
+
17/05/2023,8409,2785,1473128,4336,56382,2232239,0,2557,0,6401,0,8946,0,322,3199527,1379566,2608845,39190,12591,D3,P3,21930,41033,2100,3675940,1126,112600,3226,3788540,6156.6,4185.47
|
369 |
+
18/05/2023,8364,2873,1733275,5009,38145,7321146,0,2912,0,7286,0,14366,0,660,2623727,1115471,1723470,36020,12100,D3,P3,21813,40251,1987,3528210,1240,124000,3227,3652210,6388.27,4150.71
|
370 |
+
19/05/2023,6432,2050,1784426,5063,23340,8715910,0,3934,0,6035,0,20378,0,362,2995998,1287313,1959870,36885,12848,D3,P3,19874,38360,1888,3663690,1140,114000,3027,3777590,5981.25,3891.85
|
371 |
+
20/05/2023,5428,1724,1635604,4408,34693,8783612,0,3318,0,4714,0,21030,0,236,2996479,1326416,1903323,31048,12256,D3,P3,17568,33060,1691,3342720,931,93100,2623,3437270,5113.91,3453.26
|
372 |
+
21/05/2023,5657,1807,1788487,4492,24812,5015214,0,2253,0,4227,0,11656,0,494,3167634,1309450,3651254,33361,13073,D3,P3,14766,28367,1461,2940020,800,80000,2261,3020020,4874.35,3300.96
|
373 |
+
22/05/2023,5768,2036,2176947,5688,25298,3002995,0,2739,0,8313,0,25663,0,1147,3573865,1548365,3939226,33410,14092,D3,P3,21520,40205,1854,3533540,1097,109700,2951,3643240,6425.41,4211.67
|
374 |
+
23/05/2023,5051,1720,2359219,6966,24773,3005057,0,4738,0,13827,0,47900,0,965,3248157,1376975,3631390,35016,13025,D3,P3,29860,51811,2527,5012370,1339,133900,3866,5146270,7978.08,5238.68
|
375 |
+
24/05/2023,6078,1977,1612918,4924,24591,2833280,0,4816,0,12417,0,94489,0,1254,3572793,1550315,3532105,37491,12546,D3,P3,41297,68099,2993,5666720,1655,165500,4648,5832220,8715.48,5761.11
|
376 |
+
25/05/2023,6547,2075,1468456,3624,19705,2771412,0,5070,0,7395,0,70016,0,762,3164337,1353382,3253308,34658,13154,D3,P3,33436,56714,2588,5066960,1509,150900,4097,5217860,7939.09,5062.98
|
377 |
+
26/05/2023,3719,1189,1770048,4874,16879,2875657,0,2855,0,6964,0,29015,0,627,2989794,1248779,3345390,38267,12788,D3,P3,22185,40261,2101,4010930,1130,113000,3231,4123930,6785.57,4495.67
|
378 |
+
27/05/2023,3620,1145,1900387,5061,14156,2663378,0,3295,0,4472,0,5625,0,1473,3576647,1527545,3694843,40685,12844,D3,P3,13490,26751,1407,2592840,756,75600,2163,2668440,5325.41,3549.17
|
379 |
+
28/05/2023,4195,1302,2026053,5703,12334,2609966,0,2190,0,3737,0,5030,0,1401,3376177,1447089,2563297,42359,13543,D3,P3,13124,25607,1374,2558180,722,72200,2096,2630380,5282.85,3554.29
|
380 |
+
29/05/2023,5265,1798,2328823,6483,14783,2537637,0,3954,0,5211,0,221,0,1575,3765997,1720747,2865333,39579,8116,D3,P3,15619,30688,1585,2979010,785,78500,2370,3057510,5961.63,4097.14
|
381 |
+
30/05/2023,3879,1366,2294654,6008,15979,2489630,0,4465,0,6041,0,6,0,1192,3790830,1751416,2822819,37234,8830,D3,P3,17258,32693,1773,3270270,900,90000,2673,3360270,6752.47,4596.75
|
382 |
+
31/05/2023,3933,1348,1645187,4081,14208,2337652,0,3797,0,4794,0,6,0,888,4151434,1953620,2714074,45856,6861,D3,P3,16458,31379,1688,3065730,924,92400,2612,3158130,6598.66,4373.22
|
383 |
+
1/6/2023,4817,1530,1862175,4841,48192,3241822,0,3060,0,4802,0,12820,0,1137,4151797,1903421,2255850,51175,7095,D3,P3,17582,34622,1700,3231430,909,90900,2609,3322330,6342.48,4257.19
|
384 |
+
2/6/2023,5733,1800,966546,2646,43573,4582872,0,1563,0,10678,0,46810,0,1309,4313201,2009602,2074692,47378,6120,D3,P3,25710,47869,2271,4131170,1130,113000,3401,4244170,6992.72,4747.36
|
385 |
+
3/6/2023,4142,1290,2445721,11111,90587,4764628,0,2176,0,5144,0,27735,0,518,4514302,2083217,2095544,58527,5748,D3,P3,19247,37244,1905,3615570,961,96100,2866,3711670,5996.2,4065.63
|
386 |
+
4/6/2023,5143,1613,2296690,6790,40929,4717779,0,1280,0,4237,0,5606,0,325,4179140,1889452,2152476,45239,6093,D3,P3,13474,29405,1475,2776480,755,75500,2230,2851980,5219.47,3571.73
|
387 |
+
5/6/2023,5384,1832,3509278,8938,56272,19979584,0,1377,0,11493,0,25647,0,579,3683204,1641254,3616732,40356,6453,D3,P3,22558,54639,2114,4004520,1128,112800,3242,4117320,6672.4,4468.93
|
388 |
+
6/6/2023,4802,1594,3216944,7861,20049,33102789,0,1485,0,9086,0,36532,0,545,3822453,1716540,3687300,53347,6334,D3,P3,26643,69935,2358,4505090,1222,122200,3580,4627290,6855.89,4686.82
|
389 |
+
7/6/2023,5072,1648,2143372,5356,22553,21321547,0,1576,0,7213,0,21215,0,628,4178339,1811963,2354753,51632,6259,D3,P3,22242,56660,2125,3900920,1184,118400,3309,4019320,6611.5,4370.78
|
390 |
+
8/6/2023,4444,1465,3190766,8024,53653,10254268,0,2046,0,10491,0,19549,0,769,3941272,1738344,2283350,59291,6775,D3,P3,23293,50105,2238,4145770,1270,127000,3508,4272770,6851.85,4515.66
|
391 |
+
9/6/2023,4818,1605,3278715,9328,18347,4890758,0,1925,0,8360,0,32385,0,1732,3969227,1777864,2353376,52000,6026,D3,P3,25950,50611,2404,4657210,1315,131500,3719,4788710,6881.12,4639.8
|
392 |
+
10/6/2023,3465,1207,2887842,8529,725,5489947,0,1230,0,5401,0,37954,0,2136,4458593,2061762,2535928,66567,5554,D3,P3,24413,47973,2370,4584570,1225,122500,3595,4707070,6334.68,4283.38
|
393 |
+
11/6/2023,4727,1501,3149290,8114,738,5313957,0,1839,0,8198,0,32493,0,1533,4442610,2006438,2183963,47655,6008,D3,P3,23656,46275,2220,4441870,1183,118300,3403,4560170,6134.11,4098
|
394 |
+
12/6/2023,6437,2208,4416005,12345,149561,5298884,0,1905,0,8542,0,101079,0,472,4645531,1995891,3301882,38760,4966,D3,P3,44382,76997,3520,6853780,1782,178200,5302,7031980,8549.02,5779.3
|
395 |
+
13/06/2023,3556,1254,4626697,12984,258088,5952266,0,2095,0,10415,0,59770,0,1016,4508060,1912958,3440789,47281,4630,D3,P3,35764,67060,2737,5184020,1530,153000,4266,5335600,7908.1,5200.7
|
396 |
+
14/06/2023,3178,1060,3389530,10298,685692,10454400,0,2258,0,24457,0,16016,0,1101,4573214,1920050,3160905,41549,5083,D3,P3,27677,56158,2257,4257990,1244,124400,3501,4382390,7187.71,4826.11
|
397 |
+
15/06/2023,2981,999,3131350,10791,1072645,11631302,0,2265,0,17304,0,10395,0,1188,4075106,1690702,3267810,50496,5037,D3,P3,23775,50354,2201,4212820,1215,121500,3416,4334320,7339.75,4890.1
|
398 |
+
16/06/2023,2705,947,2923279,11124,1166424,11840950,0,1780,0,8938,0,24339,0,966,4533368,1939737,2881833,41872,4604,D3,P3,22957,49677,2225,4445430,1154,115400,3379,4560830,6663.77,4416.03
|
399 |
+
17/06/2023,3697,1154,2955836,10440,807683,9748201,0,2139,0,5741,0,54129,0,766,4958344,2059487,3183051,52618,3675,D3,P3,26623,53187,2434,4755560,1286,128600,3723,4890110,6983.5,4694.41
|
400 |
+
18/06/2023,3229,1080,3280006,12373,116340,8176712,0,1481,0,4741,0,16724,0,864,4270249,1735486,3251229,39780,3696,D3,P3,16690,36522,1715,3294460,936,93600,2651,3388060,5614.57,3749.6
|
401 |
+
19/06/2023,3082,1003,6545797,24462,55763,4841897,0,2098,0,10520,0,26558,0,2211,4137846,1743715,2680413,43156,4347,D3,P3,25736,50759,2343,4515000,1244,124400,3587,4639400,7090.09,4789.96
|
402 |
+
20/06/2023,2422,857,6734594,28910,52166,4718912,0,2205,0,10284,0,30610,0,1002,4218772,1771102,2058734,42288,4260,D3,P3,27941,52107,2478,4829920,1398,139800,3876,4969720,7584.9,4974.28
|
403 |
+
21/06/2023,3366,1132,4784180,17247,52817,5971594,0,3387,0,9277,0,41697,0,645,4113884,1743016,2111350,44159,4193,D3,P3,28338,53853,2376,4353550,1357,135700,3733,4489250,7214.21,4702.88
|
404 |
+
22/06/2023,2841,924,3300680,13360,29784,6803330,0,4064,0,7068,0,68638,0,481,3738171,1533407,1597072,35381,4173,D3,P3,34683,62182,2532,4863520,1434,143400,3966,5006920,7223.75,4679.68
|
405 |
+
23/06/2023,2474,805,2284446,9012,80066,6833289,0,3274,0,7379,0,13501,0,721,4479743,1889155,1647740,39089,3640,D3,P3,16506,35549,1530,2980550,888,88800,2418,3069350,5295.75,3457.41
|
406 |
+
24/06/2023,2462,814,1947190,7247,50309,6526903,0,2767,0,4703,0,8438,0,616,3758421,1565736,1648519,46332,3834,D3,P3,13804,31588,1381,2698000,788,78800,2169,2776800,4822.39,3136
|
407 |
+
25/06/2023,2082,679,3560248,14850,50806,6368664,0,2767,0,4414,0,5346,0,628,4038846,1700182,2514456,43065,4201,D3,P3,13435,30121,1424,2782640,778,77800,2202,2860440,5082.66,3353.86
|
408 |
+
26/06/2023,2399,839,5999950,28401,23209,10788275,0,3699,0,13383,0,13592,0,790,3427918,1403888,3598236,33883,4642,D3,P3,21114,49622,1959,3810990,1175,117500,3134,3928490,6965.39,4504.75
|
409 |
+
27/06/2023,2307,804,5005495,18260,81344,14103220,0,7082,0,8898,0,40917,0,945,3819654,1523667,3556028,35326,4628,D3,P3,32019,65348,2877,5691820,1595,159500,4472,5851320,9589,6333.48
|
410 |
+
28/06/2023,2215,759,3721084,11248,20153,10547995,0,8387,0,7120,0,39693,0,944,3671994,1568555,1397196,33212,2998,D3,P3,30267,63086,2863,5931970,1516,151600,4379,6083570,8919.81,5942.75
|
411 |
+
29/06/2023,2013,706,3918049,10226,155296,8525871,0,10096,0,5693,0,24049,0,1512,3937747,1585655,3393043,30700,2519,D3,P3,22893,54097,2125,4215060,1132,113200,3257,4328260,7178.85,4806.94
|
412 |
+
30/06/2023,1258,454,3088874,7943,902115,10945715,0,8904,0,9611,0,62404,0,1029,4945464,1946944,1835310,52445,2839,D3,P3,30707,67849,2616,5112840,1397,139700,4013,5252540,7664.09,5203.16
|
413 |
+
1/7/2023,1641,539,3872657,12034,191537,12141356,0,4956,0,6049,0,31194,0,923,5328149,2224200,2123805,56724,2513,D3,P3,22229,54353,2266,4505840,1205,120500,3471,4626340,6983.83,4746.37
|
414 |
+
2/7/2023,1336,485,5799582,17238,576858,12180985,0,4148,0,4670,0,4766,0,617,4527404,1997256,2038953,50510,21201,D3,P3,15205,43684,1672,3328290,886,88600,2559,3416990,5952.59,4038.91
|
415 |
+
3/7/2023,2712,924,9986061,28191,442261,14059535,0,5347,0,7408,0,19028,0,1044,4179823,1854231,2234940,57543,14473,D3,P3,22798,57392,2425,4796940,1308,130800,3732,4925290,7701.44,5182.84
|
416 |
+
4/7/2023,4137,1419,4717456,14519,2137830,14463201,0,6164,0,8277,0,12283,0,1531,4449073,1959412,2350308,49085,9854,D3,P3,23585,60143,2220,4262060,1327,132700,3547,4394760,7689.38,5021.95
|
417 |
+
5/7/2023,4166,1422,4779589,12676,2354716,18574154,0,7967,0,11552,0,6628,0,1420,4464681,1969744,2390838,41411,12751,D3,P3,22847,61021,2348,4359400,1422,142200,3769,4497600,7976.49,5170.89
|
418 |
+
6/7/2023,4182,1444,4939385,12222,2364811,15879491,0,6575,0,8461,0,18225,0,997,4490815,1942923,2239375,44808,16216,D3,P3,23716,60282,2602,4960450,1543,154300,4145,5114750,8225.73,5423.76
|
419 |
+
7/7/2023,3497,1181,3121447,7534,1063284,17341347,0,6025,0,8113,0,25962,0,659,4891573,2128787,1976413,57373,12464,D3,P3,23336,58252,2335,4783910,1269,126900,3604,4910810,7182.26,4846.37
|
420 |
+
8/7/2023,2760,856,3295227,9788,1119268,19207341,0,4102,0,6195,0,40506,0,832,5039604,2277255,2330435,44052,15163,D3,P3,22278,62471,2128,4352160,1191,119100,3319,4471260,6706.12,4485.38
|
421 |
+
9/7/2023,2809,875,3913741,11815,749310,25182206,0,6420,0,5222,0,49626,0,718,4669470,2144473,3908306,49659,11716,D3,P3,24736,69003,2620,5573560,1325,132500,3945,5706060,7673.85,5278.59
|
422 |
+
10/7/2023,4312,1489,5972974,18402,1511035,25950979,0,9842,0,10638,0,36204,0,935,4584106,2019220,4391654,52303,12983,D3,P3,28497,78251,2578,5157430,1419,141900,3997,5299330,8174.81,5453.8
|
423 |
+
11/7/2023,4579,1550,4999618,16469,559119,23938153,0,11688,0,36570,0,25216,0,1289,4458364,1932300,4150666,47979,12292,D3,P3,28688,77223,2707,5384090,1483,148300,4190,5532390,8594.12,5787.78
|
424 |
+
12/7/2023,4079,1418,4465722,13191,583520,25196511,0,4610,0,9813,0,20388,0,1210,4558876,2000168,4109583,54631,12366,D3,P3,25749,73523,2403,4926480,1410,141000,3813,5067480,8000.73,5259.61
|
425 |
+
13/07/2023,3719,1260,4635033,12302,903614,25720336,0,7867,0,6792,0,22248,0,857,4596184,1957206,3729970,48474,11017,D3,P3,22447,69283,2134,4261960,1312,131200,3447,4393760,7385.89,4769.15
|
426 |
+
14/07/2023,3632,1224,3441594,9800,1566300,28606996,0,6726,0,6172,0,14670,0,432,4683387,2007387,3912229,52588,10079,D3,P3,19225,67928,2002,3875450,1077,107700,3079,3983150,6615.15,4505.74
|
427 |
+
15/07/2023,2909,941,6025085,21326,1836196,28705476,0,5705,0,4369,0,31202,0,595,5008167,2251661,3727627,58143,10214,D3,P3,19533,64001,2026,4112810,1066,106600,3093,4220310,6115.73,4122.89
|
428 |
+
16/07/2023,2818,853,7339565,26586,4043959,26752554,0,7733,0,3961,0,27180,0,1082,4716541,2092258,2114014,59204,11281,D3,P3,18871,60797,1956,3715100,1126,112600,3084,3832400,6216.99,4066.5
|
429 |
+
17/07/2023,4420,1486,9638491,32269,819444,29437537,0,11485,0,5220,0,66236,0,2418,4359325,1937825,1989872,55815,11896,D3,P3,35493,89662,2771,5539890,1521,152100,4292,5691990,8025.2,5388.69
|
430 |
+
18/07/2023,4574,1551,9498457,31230,1206114,29164369,0,5012,0,7146,0,47074,0,2358,4882304,2163458,2157773,69573,12604,D3,P3,32238,84091,2687,5214920,1329,132900,4016,5347820,7833.63,5336.47
|
431 |
+
19/07/2023,4632,1537,9742535,26935,1491736,30394328,0,6147,0,7028,0,11807,0,1476,4613422,2080215,1981362,67495,12116,D3,P3,23193,69138,2342,4581910,1084,108400,3426,4690310,7118.68,4991.3
|
432 |
+
20/07/2023,4891,1632,7630122,20720,2370192,23939153,0,6261,0,5635,0,17220,0,1338,4484291,1922090,1663127,75312,12252,D3,P3,23193,63445,2209,4471970,995,99500,3255,4576570,6700.79,4599.1
|
433 |
+
21/07/2023,3978,1378,7284968,21477,2456715,17869335,0,6360,0,10877,0,11431,0,769,4519305,1975730,1686467,68931,10065,D3,P3,21478,57996,2115,4257360,1006,100600,3121,4357960,6467.01,4497.43
|
434 |
+
22/07/2023,3151,978,5638955,16181,2015345,12808440,0,7097,0,5145,0,13811,0,699,4689346,2086993,1861883,71898,9081,D3,P3,17602,50209,1897,3876970,830,83000,2727,3959970,5812.35,4126.62
|
435 |
+
23/07/2023,2905,986,6133144,16089,881691,11267535,0,5593,0,4746,0,68021,0,514,4242878,1843843,1681215,61164,10797,D3,P3,25804,58279,2442,5168300,1161,116100,3603,5284400,6622.56,4639.27
|
436 |
+
24/07/2023,4606,1651,8830736,21931,189913,35658281,0,8836,0,6040,0,64066,0,1626,3943001,1708849,1900126,59494,10236,D3,P3,31953,73505,2898,6111230,1424,142400,4321,6253530,8030.22,5492.47
|
437 |
+
25/07/2023,4414,1597,7750251,15384,3348941,25011847,0,10262,0,9572,0,15072,0,916,3976490,1729916,1911109,68826,11468,D3,P3,26162,65005,2440,4822810,1154,115400,3594,4938210,7092.81,4965.39
|
438 |
+
26/07/2023,4488,1530,8125332,16391,1040452,24380635,0,9947,0,16453,0,38777,0,1551,3837786,1680967,1856885,74924,13290,D3,P3,31894,69746,2797,5552460,1348,134800,4147,5687460,7359.12,5027.76
|
439 |
+
27/07/2023,4105,1494,8054962,14724,220302,13070502,0,6758,0,8841,0,20622,0,1313,3636297,1544742,1772602,63935,11680,D3,P3,24634,57255,2498,5018670,1196,119600,3694,5138270,7106.66,4875.99
|
440 |
+
28/07/2023,3743,1318,6955526,11566,3991586,5347413,0,10451,0,8496,0,20184,0,1563,3890784,1680538,1608577,73120,11390,D3,P3,22265,50660,2204,4515740,1054,105400,3258,4621140,6441.87,4432.07
|
441 |
+
29/07/2023,3395,1192,5132501,9837,1349895,4441709,0,7115,0,5449,0,18983,0,1129,4295602,1813637,1824777,80511,11911,D3,P3,17626,42341,1930,3807270,860,86000,2790,3893270,5519.71,3922.54
|
442 |
+
30/07/2023,2746,903,4903153,11018,710000,4431986,0,8491,0,4599,0,24834,0,1109,3924352,1733790,1740605,72221,11440,D3,P3,17619,43309,1942,3937090,834,83400,2776,4020490,5556.3,3945.89
|
443 |
+
31/07/2023,4208,1476,6832832,19648,1721973,4079656,0,7754,0,7818,0,27918,0,2050,3760475,1501134,1957900,62124,11605,D3,P3,22728,51399,2256,4604950,1046,104600,3302,4709550,6481.79,4556.75
|
444 |
+
1/8/2023,4203,1489,6398210,15890,2250090,5457683,0,7588,0,7948,0,61894,0,1248,3687038,1439092,1774701,61448,11492,D3,P3,31009,67515,2609,5471270,1309,130900,3918,5602170,6825.97,4671.87
|
445 |
+
2/8/2023,4285,1515,5402871,14825,785167,6582085,0,6079,0,7236,0,79041,0,1345,3807266,1493340,2025308,54506,11515,D3,P3,34034,74123,2858,5856910,1360,136000,4218,5992910,7171.23,4989.3
|
446 |
+
3/8/2023,4667,1744,4724924,8903,1111815,10407793,0,9077,0,7117,0,31714,0,1983,3797879,1479623,1718831,52587,11408,D3,P3,23978,62504,2404,4832400,1095,109500,3498,4941800,6670.71,4627.48
|
447 |
+
4/8/2023,4201,1562,3732952,9116,4574481,10660977,0,8436,0,6970,0,25097,0,1055,3814852,1466211,1374674,57482,10785,D3,P3,21714,62922,2226,4561560,975,97500,3201,4659060,6133.71,4366.77
|
448 |
+
5/8/2023,3080,1110,3310732,9884,3460283,11580456,0,5735,0,5049,0,5911,0,704,4048945,1601234,1442690,65158,9942,D3,P3,13792,52995,1578,3188640,720,72000,2298,3260640,4760.04,3375.44
|
449 |
+
6/8/2023,2809,979,4153998,11663,5103054,8381689,0,4868,0,4184,0,28658,0,637,4040770,1250223,1844909,47698,10816,D3,P3,17706,56827,1841,3921270,842,84200,2683,4005470,5062.91,3520.39
|
450 |
+
7/8/2023,3522,1186,3164171,10000,4137349,8709017,0,6112,0,6640,0,43866,0,1285,3928811,1288638,1861166,44623,11648,D3,P3,26772,71580,2456,4923260,1132,113200,3587,5034960,6580.87,4648.84
|
451 |
+
8/8/2023,4111,1495,6020074,15008,2923076,5012245,0,6684,0,6961,0,12257,0,3038,3921429,1094791,2059462,48047,10379,D3,P3,22363,60212,2075,4138870,971,97100,3046,4235970,6286.57,4418.71
|
452 |
+
9/8/2023,3609,1285,5616011,13195,2483117,3900778,0,8177,0,6447,0,12774,0,1309,3322165,452000,2262292,52219,11047,D3,P3,21099,53059,2067,4030270,1010,101000,3077,4131270,6309.32,4273.88
|
453 |
+
10/8/2023,3872,1330,5270940,11342,1305507,3614496,0,6927,0,6602,0,21830,0,986,2868345,452896,1541791,46720,10556,D3,P3,22515,52055,2216,4848640,974,97400,3190,4946040,6281.59,4498.26
|
454 |
+
11/8/2023,3673,1257,4485834,10445,3562053,5521177,0,5810,0,13751,0,5797,0,751,3242607,511016,1679989,47262,10344,D3,P3,17086,46491,1551,3242370,671,67100,2222,3309470,4608.96,3355.58
|
455 |
+
12/8/2023,2744,960,3946512,10052,4015316,5813616,0,6205,0,10379,0,9890,0,532,3761072,595191,1931989,54787,9210,D3,P3,15949,46498,1376,3113130,639,63900,2016,3177130,4121.65,2907.82
|
456 |
+
13/08/2023,2418,775,5051792,11809,1869057,6348414,0,4093,0,5187,0,21320,0,399,3279816,503805,2171335,55136,10546,D3,P3,14745,44224,1327,2888900,648,64800,1975,2953700,3905.29,2752.8
|
457 |
+
14/08/2023,3551,1196,4839009,11805,1765326,3758610,0,6170,0,7226,0,19575,0,706,2974893,427940,1822890,49127,11042,D3,P3,20336,49993,1770,3798710,748,74800,2518,3873510,5195.83,3786.85
|
458 |
+
15/08/2023,3430,1312,6520709,24857,1792924,1852314,0,6063,0,9302,0,34681,0,778,3080012,462344,1935145,57900,11083,D3,P3,24449,48710,1946,4332210,807,80700,2752,4412810,5367.05,3930.18
|
459 |
+
16/08/2023,3253,1175,4844378,27290,3478033,1293346,0,5884,0,8280,0,29077,0,1055,3150093,468159,2094524,58937,11823,D3,P3,23892,46995,1911,3996580,780,78000,2691,4074580,5452.88,3979.2
|
460 |
+
17/08/2023,3714,1417,4702754,23408,4058942,1186576,0,11301,0,10504,0,15462,0,1017,3071572,444690,1961293,58681,10987,D3,P3,21265,42100,1700,3517380,704,70400,2404,3587780,5150.22,3718.85
|
461 |
+
18/08/2023,1936,710,4370177,18919,3789636,1020973,0,9525,0,8958,0,32346,0,909,3252966,461174,2031390,61098,10354,D3,P3,20983,41383,1778,3654630,679,67900,2457,3722530,5019.58,3716.93
|
462 |
+
19/08/2023,1998,723,3683868,14860,5187185,1336224,0,8305,0,6265,0,13396,0,1267,3460234,494225,2037289,68988,9709,D3,P3,14640,31119,1331,2887610,528,52800,1860,2943410,4059.2,3012.38
|
463 |
+
20/08/2023,2458,839,5558511,16917,6444084,1333600,0,8083,0,5668,0,9425,0,593,3233047,427550,2093935,58698,11658,D3,P3,13616,29557,1227,2592690,476,47600,1703,2640290,3842.86,2850.38
|
464 |
+
21/08/2023,2316,892,5802540,21997,1578062,1099659,0,9057,0,8434,0,11204,0,597,3110596,442523,1991499,71910,13059,D3,P3,19336,38812,1656,3445610,663,66300,2319,3510210,5100.16,3789.37
|
465 |
+
22/08/2023,2208,845,5006504,13886,598218,939529,0,18631,0,11119,0,18304,0,666,3020862,419659,1960342,66769,12591,D3,P3,21348,42166,1844,3824050,762,76200,2582,3877380,5610.58,4088.17
|
466 |
+
23/08/2023,2104,821,5240143,16309,1941212,2081327,0,17073,0,8077,0,6042,0,709,2634348,409468,1726842,53998,13783,D3,P3,18864,38949,1513,3153720,655,65500,2165,3219310,4984.78,3596.01
|
467 |
+
24/08/2023,2011,685,5623870,14314,380971,2132605,0,13223,0,7340,0,11449,0,1774,2244344,385012,1409286,55699,13185,D3,P3,18821,38282,1665,3378840,678,67800,2358,3474730,5209.76,3795.85
|
468 |
+
25/08/2023,1889,680,4674166,13506,1119189,1818097,0,33200,0,7250,0,16577,0,3622,2405697,395219,1564070,61103,13348,D3,P3,18364,37536,1863,3939560,638,63800,2501,4003360,5070.56,3850.47
|
469 |
+
26/08/2023,1229,379,5475213,18030,476090,1048919,0,15316,0,4976,0,16625,0,3546,2662312,434769,1789446,61768,13346,D3,P3,16076,32992,1816,3388030,606,60600,2422,3448630,4877.02,3729.33
|
470 |
+
27/08/2023,1333,486,5591938,13138,956722,732493,0,12952,0,4227,0,19562,0,2354,2470188,417919,1980888,53707,14151,D3,P3,14834,30563,1572,2979370,536,53600,2108,3032970,4232.88,3241.64
|
471 |
+
28/08/2023,2031,760,7120359,17304,592505,571748,0,44816,0,8728,0,19999,0,3813,2357294,420574,1878047,50335,13442,D3,P3,20994,42982,1970,3877550,642,64200,2612,3941750,5610.5,4325.83
|
472 |
+
29/08/2023,1560,550,6349650,18074,395464,276869,0,217642,0,8742,0,36555,0,2778,2437012,455532,1707585,52913,12648,D3,P3,25919,51217,2270,4323380,803,80300,3073,4403680,6223.41,4701.59
|
473 |
+
30/08/2023,1788,623,6774580,17019,804715,227676,0,92490,0,7576,0,33376,0,1815,2461827,452647,1924554,57945,12244,D3,P3,24015,48307,2298,4414000,796,79600,3094,4493600,5983.31,4520.44
|
474 |
+
31/08/2023,2251,790,6881955,16586,462096,216142,0,177608,0,7188,0,13212,0,1862,2630688,508779,1691540,44071,12093,D3,P3,17587,35874,1809,3406910,604,60400,2413,3467310,5218.62,4005.29
|
475 |
+
1/9/2023,2763,930,5360505,17680,259775,323504,0,21865,0,7383,0,4899,0,1313,2723715,529388,1841032,48663,11275,D3,P3,13457,29785,1396,2542480,459,45900,1855,2588380,4243.41,3270.46
|
476 |
+
2/9/2023,2597,870,4478842,15289,1226680,320820,0,26924,0,6477,0,4896,0,1454,2929332,613163,1945160,60288,10815,D3,P3,12337,27451,1347,2481120,508,50800,1855,2531920,4227.98,3109.35
|
477 |
+
3/9/2023,2332,762,5174329,13994,449228,288375,0,20423,0,5755,0,10890,0,1494,2516381,558353,1697712,54329,11996,D3,P3,12609,27028,1428,2699310,481,48100,1909,2747410,4177.46,3164.79
|
478 |
+
4/9/2023,3561,1229,5334952,17444,296660,306771,0,324815,0,7849,0,41134,0,2069,2485534,613680,1823512,52578,12787,D3,P3,22283,45146,2065,3908960,791,79100,2855,3987700,5743.35,4264.57
|
479 |
+
5/9/2023,2261,816,6113505,20426,302910,227998,0,287642,0,7998,0,21025,0,1448,2453507,595873,1648165,49590,11749,D3,P3,19096,40015,1818,3314870,588,58800,2407,3377390,5367.87,4153.87
|
480 |
+
6/9/2023,2868,1031,5558783,13407,1266416,255848,0,203777,0,8887,0,9020,0,933,2766708,736889,1987155,47189,10851,D3,P3,14311,31495,1502,2764430,499,49900,2001,2814330,4575.2,3510.97
|
481 |
+
7/9/2023,2394,832,4907653,9041,191893,285511,0,202017,0,8317,0,6879,0,801,2616416,630668,1712157,47089,11632,D3,P3,13483,29283,1544,2846790,463,46300,2007,2893090,4770.64,3739.02
|
482 |
+
8/9/2023,2689,910,4752031,8867,157343,302141,0,201772,0,8717,0,5684,0,1428,2705167,791338,1852090,43707,10493,D3,P3,13830,29726,1531,2806450,518,51800,2049,2858250,4807.58,3697.23
|
483 |
+
9/9/2023,2204,752,3975657,10022,227113,245700,0,201776,0,7299,0,4098,0,758,2929279,827015,2001938,50033,10082,D3,P3,12284,26212,1414,2674080,433,43300,1847,2717380,4310.87,3354.94
|
484 |
+
10/9/2023,2167,743,4243960,10399,270612,291468,0,201256,0,6099,0,8097,0,809,2352670,1241029,1966290,41767,10185,D3,P3,12594,26398,1498,2834900,435,43500,1933,2878400,4460.59,3531.69
|
485 |
+
11/9/2023,3381,1227,4492340,10684,1192346,154867,0,202476,0,8393,0,6493,0,838,2573007,1455728,1830559,39596,12910,D3,P3,15510,32142,1544,2881650,449,44900,1992,2923700,4715.59,3736.66
|
486 |
+
12/9/2023,2511,884,4936079,10015,199137,170680,0,50740,0,8506,0,26721,0,1085,2527461,1481401,1856155,40974,11883,D3,P3,22786,42733,2027,4286230,326,32600,2353,4318830,5172.4,4510.57
|
487 |
+
13/09/2023,2143,778,5115564,10338,292239,238162,0,2408,0,7172,0,36811,0,836,2621020,1580825,1962940,39948,11634,D3,P3,22084,41155,1880,3809460,281,28100,2161,3837560,4765.04,4181.98
|
488 |
+
14/09/2023,2307,798,4859067,12717,1181194,308251,0,948,0,7404,0,38152,0,1282,2677877,1397139,1251585,46129,10253,D3,P3,21377,40308,1959,3742130,550,55000,2509,3797130,5413.06,4301.68
|
489 |
+
15/09/2023,2467,882,4260164,9702,399193,291844,0,756,0,6932,0,16060,0,2982,2751748,1416780,1269521,57909,10048,D3,P3,16118,32895,1659,3149040,526,52600,2185,3201640,4920.59,3802.04
|
490 |
+
16/09/2023,2076,687,3350011,7707,620978,196303,0,663,0,6018,0,9889,0,1188,3083552,1564491,1439332,61159,9435,D3,P3,12830,26945,1488,2798420,446,44600,1934,2843020,4519.52,3564.8
|
491 |
+
17/09/2023,2467,802,4503316,11119,581720,236009,0,637,0,4814,0,10024,0,2464,2935930,1503370,1649587,48796,10073,D3,P3,12357,25262,1396,2560250,455,45500,1851,2605750,4246.67,3287.31
|
492 |
+
18/09/2023,2910,1024,5568066,14302,184276,143660,0,888,0,6922,0,10381,0,1767,2373681,1330212,1479501,51224,10488,D3,P3,16441,33582,1727,3152630,572,57200,2300,3209930,5491.87,4171.85
|
493 |
+
19/09/2023,3252,1309,6105220,12193,208312,187769,0,1464,0,5210,0,8092,0,1504,2373344,1285881,1407015,40642,10547,D3,P3,17770,36578,1743,3229930,653,65300,2395,3291230,5666.71,4236.34
|
494 |
+
20/09/2023,2796,1185,6055420,14003,291395,272928,0,1077,0,4246,0,10472,0,1830,2565110,1425196,1460886,48962,10318,D3,P3,16656,34188,1627,3048960,738,73800,2365,3121460,5577.7,3950.97
|
495 |
+
21/09/2023,2208,878,5225528,8679,697480,160425,0,1033,0,6726,0,13928,0,1357,2686089,1447330,1236533,49940,10259,D3,P3,17253,34210,1912,3553480,811,81100,2723,3634580,6248.63,4440.07
|
496 |
+
22/09/2023,1734,783,4373391,8141,2220006,88968,0,738,0,9534,0,8771,0,1690,2460283,1353647,1258771,45467,9910,D3,P3,14958,31389,1714,3084570,758,75800,2472,3160370,5984.05,4280.38
|
497 |
+
23/09/2023,1190,492,4948823,10035,2432739,154849,0,702,0,8285,0,4369,0,806,2740252,1531672,1407980,51747,8665,D3,P3,12641,27336,1443,2653190,652,65200,2095,2718390,5094.46,3633.56
|
498 |
+
24/09/2023,1124,496,6239124,10744,248085,231243,0,477,0,8032,0,8640,0,1449,2648532,1476875,1294436,36638,10410,D3,P3,12153,26113,1395,2618830,621,62100,2016,2680930,4558.91,3242.77
|
499 |
+
25/09/2023,2358,1041,5325249,9804,251517,447312,0,591,0,11299,0,21103,0,1135,2371891,1333464,1222194,36894,9191,D3,P3,18608,38878,2041,3740860,897,89700,2938,3830560,6554.2,4744.62
|
500 |
+
26/09/2023,2092,994,5361926,13223,90916,351820,0,910,0,10598,0,27697,0,2803,2612585,1502573,1256804,33211,8893,D3,P3,21214,41166,2128,3878240,935,93500,3063,3971740,6565.1,4696.86
|
501 |
+
27/09/2023,1835,792,4600061,14060,728920,347014,0,1111,0,8811,0,104094,0,1780,2488689,1390273,1203937,33935,8769,D3,P3,37289,65137,2933,5530540,1595,159500,4525,5686340,8073.74,5545.54
|
502 |
+
28/09/2023,1787,807,4114657,9434,84913,564139,0,279332,0,6975,0,51946,0,2516,2290090,1309586,1316086,32443,8606,D3,P3,25651,47307,2343,4257450,1199,119900,3542,4377350,7151.36,4963.98
|
503 |
+
29/09/2023,1513,641,4477584,8505,211297,372199,0,443,0,4039,0,4466,0,1774,2429135,1379398,1425850,31700,7184,D3,P3,12276,26946,1488,2459350,613,61300,2101,2520650,5148.56,3726.34
|
504 |
+
30/09/2023,1127,478,4089760,9316,222854,364180,0,517,0,3251,0,13297,0,1425,1049942,435407,548780,10869,4505,D3,P3,12905,27091,1533,2701900,640,64000,2173,2765900,5022.4,3685.32
|
505 |
+
1/10/2023,1021,436,748856,2639,301970,224135,0,846,0,2731,0,7574,0,962,935755,413098,1084400,13147,5335,D3,P3,9103,18479,1165,2022810,467,46700,1632,2069510,3823.3,2818.63
|
506 |
+
2/10/2023,1673,764,1692932,4211,387802,237932,0,1564,0,12820,0,9400,0,1463,877002,383352,1016934,14302,5965,D3,P3,12307,24110,1290,2265000,565,56500,1855,2321500,4314.73,3091.4
|
507 |
+
3/10/2023,1516,725,1757367,3947,568156,171003,0,1739,0,21454,0,5276,0,1640,833524,365270,973716,14227,5936,D3,P3,12568,24900,1344,2390760,645,64500,1989,2455260,4686.71,3259.46
|
508 |
+
4/10/2023,1786,763,1733340,3119,567654,129402,0,1726,0,15833,0,13543,0,2940,836392,368220,1029847,13931,5864,D3,P3,13780,26581,1383,2427230,695,69500,2078,2496730,4764.92,3278.39
|
509 |
+
5/10/2023,1986,861,1671129,3736,504268,159069,0,1747,0,24285,0,8234,0,3163,830805,380396,476125,13399,5529,D3,P3,12797,24819,1428,2572910,640,64050,2067,2626960,4940.4,3504.67
|
510 |
+
6/10/2023,1774,753,1348401,2784,702326,205479,0,1686,0,15228,0,12269,0,2107,817142,382879,504402,11840,5476,D3,P3,11345,22554,1268,2317850,601,60300,1869,2378150,4247.46,3014.11
|
511 |
+
7/10/2023,1150,416,1175733,2242,359848,180366,0,1446,0,19417,0,27951,0,2050,921412,418533,520370,11215,5083,D3,P3,14047,25738,1516,3012040,684,68550,2200,3080590,4256.92,3052.07
|
512 |
+
8/10/2023,999,337,1296701,2609,662748,293989,0,1415,0,14589,0,18476,0,1786,768086,352949,357821,12788,5550,D3,P3,11419,21977,1320,2426760,572,57400,1892,2484160,4025.59,2933.34
|
513 |
+
9/10/2023,772,289,1942734,4167,3096792,191352,0,1855,0,24331,0,21658,0,1757,653538,261410,590317,14449,6333,D3,P3,14624,27809,1367,2649310,715,73600,2082,2722910,4326.63,2956.14
|
514 |
+
10/10/2023,737,241,1911227,4238,565419,164827,0,2101,0,11526,0,9057,0,2720,734200,300476,568450,13952,6145,D3,P3,12640,24537,1376,2459930,653,68350,2029,2528280,4537.77,3219.59
|
515 |
+
11/10/2023,681,256,2171216,4714,503802,216630,0,1921,0,7255,0,7549,0,2025,958835,399349,595481,12432,5599,D3,P3,11486,22322,1319,2395980,638,66400,1958,2463820,4317.3,3006.02
|
516 |
+
12/10/2023,673,240,1820266,4067,233553,161215,0,8042,0,4686,0,5288,0,1408,861845,336598,557239,13130,5889,D3,P3,9536,18332,1167,1988790,536,56350,1702,2044540,3786.09,2688.23
|
517 |
+
13/10/2023,595,233,1529402,3094,68852,156834,0,7184,0,4986,0,14364,0,1924,801772,317596,563967,12222,5539,D3,P3,12220,23105,1373,2510340,641,66600,2014,2576940,4218.4,2949.55
|
518 |
+
14/10/2023,748,266,1013578,2156,48430,185877,0,3043,0,4287,0,14809,0,2117,929822,362662,603684,11533,5191,D3,P3,11280,21172,1275,2379750,592,62050,1867,2441800,3859.27,2715.54
|
519 |
+
15/10/2023,602,201,1596953,4098,55580,222305,0,12269,0,4366,0,15778,0,1639,891052,327915,425822,13301,6358,D3,P3,10476,19507,1178,2129330,587,60800,1765,2190130,3766.36,2609.81
|
520 |
+
16/10/2023,964,369,2144206,5169,31683,118393,0,6488,0,5537,0,65656,0,1254,842123,317951,810650,16455,7813,D3,P3,23493,39642,2233,4391770,1136,117850,3369,4509620,5998.13,4174.09
|
521 |
+
17/10/2023,1105,415,2112245,5363,69479,70676,0,4964,0,4816,0,18719,0,2353,816941,328053,766996,14912,7402,D3,P3,15733,28542,1531,2735230,779,81300,2310,2816530,5078.87,3496.45
|
522 |
+
18/10/2023,913,348,1892230,4633,451927,111742,0,4068,0,4855,0,32612,0,2028,957593,377866,689470,15228,7272,D3,P3,18694,32354,1918,3636660,883,91900,2801,3728560,5610.31,3986.54
|
523 |
+
19/10/2023,914,302,1550243,3817,100009,183549,0,4309,0,4468,0,68322,0,2169,846076,336810,775970,14394,6925,D3,P3,26120,43767,2170,4171580,1158,120800,3328,4292380,5891.41,4024.57
|
524 |
+
20/10/2023,663,208,1100622,2740,174916,181797,0,3695,0,4056,0,58835,0,1887,910115,366406,653096,15447,6572,D3,P3,22398,38504,2218,4385190,1035,108650,3253,4493840,5680.14,4012.57
|
525 |
+
21/10/2023,559,184,1405730,3216,207981,276329,0,2723,0,3213,0,44899,0,1893,1184901,485051,850250,14780,6181,D3,P3,17236,31207,1638,3121900,793,82100,2431,3204000,4493.8,3159.39
|
526 |
+
22/10/2023,545,198,1467468,3228,520836,253840,0,2213,0,2850,0,27411,0,1911,1154732,423852,1027954,10344,4893,D3,P3,13607,25217,1482,2893810,725,75700,2207,2969510,4332.98,3030.72
|
527 |
+
23/10/2023,625,231,2018062,5517,333114,436011,0,2839,0,3772,0,11121,0,1351,1208181,428535,1111507,11684,6220,D3,P3,12048,23419,1256,2226550,585,61300,1840,2287750,4042.32,2864.75
|
528 |
+
24/10/2023,574,226,1889784,5099,188275,228582,0,2709,0,2462,0,1109,0,1918,1083131,378488,1161439,11452,5728,D3,P3,10595,21221,1092,1909130,407,43350,1499,1952480,3725.66,2756.39
|
529 |
+
25/10/2023,536,184,2276229,5661,77308,332105,0,2708,0,2679,0,525,0,2402,905535,310989,865636,11200,5884,D3,P3,10143,20535,887,1832160,331,37050,1218,1869210,3037.38,2236.69
|
530 |
+
26/10/2023,609,200,1753696,4367,85971,236204,0,2136,0,2300,0,10,0,3842,968078,332008,771447,10098,5558,D3,P3,9900,19640,858,1671270,347,38950,1205,1710220,2995.78,2165.99
|
531 |
+
27/10/2023,563,209,1636932,3338,246909,285904,0,1992,0,2323,0,5,0,2851,1063329,352124,929257,9507,5001,D3,P3,8240,17233,780,1422510,309,35500,1089,1458010,2635.69,1927
|
532 |
+
28/10/2023,450,155,1588245,4276,235960,324079,0,2716,0,1753,0,1,0,2585,1191854,384343,1028724,8578,4958,D3,P3,7529,15744,725,1476840,300,33850,1025,1510690,2588.52,1884.51
|
533 |
+
29/10/2023,309,117,1731474,5065,70210,331208,0,2241,0,1708,0,5,0,3120,1137463,385520,764681,10186,5650,D3,P3,7535,14889,747,1514990,287,32300,1034,1547290,2594.6,1909.86
|
534 |
+
31/10/2023,486,182,2220653,5950,41641,213812,0,149,0,2404,0,15,0,1380,913362,318222,1020094,10416,3703,D3,P3,8678,18059,784,1613510,309,34550,1093,1648060,2844.9,2076.88
|
535 |
+
1/11/2023,296,123,1834772,4275,201158,313487,0,889,0,2485,0,33093,0,2287,862276,316545,798469,11740,3972,D3,P3,16341,28782,1292,2880920,542,58750,1834,2939670,3468.46,2536.62
|
536 |
+
2/11/2023,346,111,1697213,2987,1586296,64435,0,957,0,2130,0,16368,0,3586,840477,298617,830972,10008,3641,D3,P3,12216,22498,1071,2342490,402,43400,1473,2385890,3237.48,2396.17
|
537 |
+
3/11/2023,224,89,1759831,2940,93667,74522,0,962,0,2484,0,14150,0,953,952592,350909,800378,11090,3818,D3,P3,10460,20113,902,1897210,372,40600,1274,1937810,2883.8,2066.5
|
538 |
+
4/11/2023,214,76,1677064,2752,65182,61325,0,1796,0,3084,0,10438,0,1148,957265,344580,821570,11309,4380,D3,P3,8630,17741,757,1590600,290,31650,1047,1622250,2519.34,1826.6
|
Model_Results_Pretrained.py
ADDED
@@ -0,0 +1,349 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import plotly.express as px
|
3 |
+
import numpy as np
|
4 |
+
import plotly.graph_objects as go
|
5 |
+
from sklearn.metrics import r2_score
|
6 |
+
from collections import OrderedDict
|
7 |
+
import pickle
|
8 |
+
import json
|
9 |
+
import streamlit as st
|
10 |
+
import plotly.express as px
|
11 |
+
import numpy as np
|
12 |
+
import plotly.graph_objects as go
|
13 |
+
from sklearn.metrics import r2_score
|
14 |
+
import pickle
|
15 |
+
import json
|
16 |
+
import pandas as pd
|
17 |
+
import statsmodels.api as sm
|
18 |
+
from sklearn.metrics import mean_absolute_percentage_error
|
19 |
+
import sys
|
20 |
+
import os
|
21 |
+
from utilities import (set_header,
|
22 |
+
initialize_data,
|
23 |
+
load_local_css,
|
24 |
+
create_channel_summary,
|
25 |
+
create_contribution_pie,
|
26 |
+
create_contribuion_stacked_plot,
|
27 |
+
create_channel_spends_sales_plot,
|
28 |
+
format_numbers,
|
29 |
+
channel_name_formating,
|
30 |
+
load_authenticator)
|
31 |
+
import seaborn as sns
|
32 |
+
import matplotlib.pyplot as plt
|
33 |
+
import sweetviz as sv
|
34 |
+
import tempfile
|
35 |
+
|
36 |
+
original_stdout = sys.stdout
|
37 |
+
sys.stdout = open('temp_stdout.txt', 'w')
|
38 |
+
sys.stdout.close()
|
39 |
+
sys.stdout = original_stdout
|
40 |
+
|
41 |
+
st.set_page_config(layout='wide')
|
42 |
+
load_local_css('styles.css')
|
43 |
+
set_header()
|
44 |
+
|
45 |
+
for k, v in st.session_state.items():
|
46 |
+
if k not in ['logout', 'login','config'] and not k.startswith('FormSubmitter'):
|
47 |
+
st.session_state[k] = v
|
48 |
+
|
49 |
+
authenticator = st.session_state.get('authenticator')
|
50 |
+
if authenticator is None:
|
51 |
+
authenticator = load_authenticator()
|
52 |
+
|
53 |
+
name, authentication_status, username = authenticator.login('Login', 'main')
|
54 |
+
auth_status = st.session_state.get('authentication_status')
|
55 |
+
|
56 |
+
if auth_status == True:
|
57 |
+
is_state_initiaized = st.session_state.get('initialized',False)
|
58 |
+
if not is_state_initiaized:
|
59 |
+
a=1
|
60 |
+
|
61 |
+
|
62 |
+
def plot_residual_predicted(actual, predicted, df_):
|
63 |
+
df_['Residuals'] = actual - pd.Series(predicted)
|
64 |
+
df_['StdResidual'] = (df_['Residuals'] - df_['Residuals'].mean()) / df_['Residuals'].std()
|
65 |
+
|
66 |
+
# Create a Plotly scatter plot
|
67 |
+
fig = px.scatter(df_, x=predicted, y='StdResidual', opacity=0.5,color_discrete_sequence=["#11B6BD"])
|
68 |
+
|
69 |
+
# Add horizontal lines
|
70 |
+
fig.add_hline(y=0, line_dash="dash", line_color="darkorange")
|
71 |
+
fig.add_hline(y=2, line_color="red")
|
72 |
+
fig.add_hline(y=-2, line_color="red")
|
73 |
+
|
74 |
+
fig.update_xaxes(title='Predicted')
|
75 |
+
fig.update_yaxes(title='Standardized Residuals (Actual - Predicted)')
|
76 |
+
|
77 |
+
# Set the same width and height for both figures
|
78 |
+
fig.update_layout(title='Residuals over Predicted Values', autosize=False, width=600, height=400)
|
79 |
+
|
80 |
+
return fig
|
81 |
+
|
82 |
+
def residual_distribution(actual, predicted):
|
83 |
+
Residuals = actual - pd.Series(predicted)
|
84 |
+
|
85 |
+
# Create a Seaborn distribution plot
|
86 |
+
sns.set(style="whitegrid")
|
87 |
+
plt.figure(figsize=(6, 4))
|
88 |
+
sns.histplot(Residuals, kde=True, color="#11B6BD")
|
89 |
+
|
90 |
+
plt.title(' Distribution of Residuals')
|
91 |
+
plt.xlabel('Residuals')
|
92 |
+
plt.ylabel('Probability Density')
|
93 |
+
|
94 |
+
return plt
|
95 |
+
|
96 |
+
|
97 |
+
def qqplot(actual, predicted):
|
98 |
+
Residuals = actual - pd.Series(predicted)
|
99 |
+
Residuals = pd.Series(Residuals)
|
100 |
+
Resud_std = (Residuals - Residuals.mean()) / Residuals.std()
|
101 |
+
|
102 |
+
# Create a QQ plot using Plotly with custom colors
|
103 |
+
fig = go.Figure()
|
104 |
+
fig.add_trace(go.Scatter(x=sm.ProbPlot(Resud_std).theoretical_quantiles,
|
105 |
+
y=sm.ProbPlot(Resud_std).sample_quantiles,
|
106 |
+
mode='markers',
|
107 |
+
marker=dict(size=5, color="#11B6BD"),
|
108 |
+
name='QQ Plot'))
|
109 |
+
|
110 |
+
# Add the 45-degree reference line
|
111 |
+
diagonal_line = go.Scatter(
|
112 |
+
x=[-2, 2], # Adjust the x values as needed to fit the range of your data
|
113 |
+
y=[-2, 2], # Adjust the y values accordingly
|
114 |
+
mode='lines',
|
115 |
+
line=dict(color='red'), # Customize the line color and style
|
116 |
+
name=' '
|
117 |
+
)
|
118 |
+
fig.add_trace(diagonal_line)
|
119 |
+
|
120 |
+
# Customize the layout
|
121 |
+
fig.update_layout(title='QQ Plot of Residuals',title_x=0.5, autosize=False, width=600, height=400,
|
122 |
+
xaxis_title='Theoretical Quantiles', yaxis_title='Sample Quantiles')
|
123 |
+
|
124 |
+
return fig
|
125 |
+
|
126 |
+
|
127 |
+
def plot_actual_vs_predicted(date, y, predicted_values, model):
|
128 |
+
fig = go.Figure()
|
129 |
+
|
130 |
+
fig.add_trace(go.Scatter(x=date, y=y, mode='lines', name='Actual', line=dict(color='blue')))
|
131 |
+
fig.add_trace(go.Scatter(x=date, y=predicted_values, mode='lines', name='Predicted', line=dict(color='orange')))
|
132 |
+
|
133 |
+
# Calculate MAPE
|
134 |
+
mape = mean_absolute_percentage_error(y, predicted_values)*100
|
135 |
+
|
136 |
+
# Calculate R-squared
|
137 |
+
rss = np.sum((y - predicted_values) ** 2)
|
138 |
+
tss = np.sum((y - np.mean(y)) ** 2)
|
139 |
+
r_squared = 1 - (rss / tss)
|
140 |
+
|
141 |
+
# Get the number of predictors
|
142 |
+
num_predictors = model.df_model
|
143 |
+
|
144 |
+
# Get the number of samples
|
145 |
+
num_samples = len(y)
|
146 |
+
|
147 |
+
# Calculate Adjusted R-squared
|
148 |
+
adj_r_squared = 1 - ((1 - r_squared) * ((num_samples - 1) / (num_samples - num_predictors - 1)))
|
149 |
+
metrics_table = pd.DataFrame({
|
150 |
+
'Metric': ['MAPE', 'R-squared', 'AdjR-squared'],
|
151 |
+
'Value': [mape, r_squared, adj_r_squared]})
|
152 |
+
fig.update_layout(
|
153 |
+
xaxis=dict(title='Date'),
|
154 |
+
yaxis=dict(title='Value'),
|
155 |
+
title=f'MAPE : {mape:.2f}%, AdjR2: {adj_r_squared:.2f}',
|
156 |
+
xaxis_tickangle=-30
|
157 |
+
)
|
158 |
+
|
159 |
+
return metrics_table,fig
|
160 |
+
|
161 |
+
|
162 |
+
|
163 |
+
|
164 |
+
# # Perform linear regression
|
165 |
+
# model = sm.OLS(y, X).fit()
|
166 |
+
eda_columns=st.columns(3)
|
167 |
+
with eda_columns[0]:
|
168 |
+
tactic=st.checkbox('Tactic Level Model')
|
169 |
+
if tactic:
|
170 |
+
with open('mastercard_mmm_model.pkl', 'rb') as file:
|
171 |
+
model = pickle.load(file)
|
172 |
+
train=pd.read_csv('train_mastercard.csv')
|
173 |
+
test=pd.read_csv('test_mastercard.csv')
|
174 |
+
train['Date']=pd.to_datetime(train['Date'])
|
175 |
+
test['Date']=pd.to_datetime(test['Date'])
|
176 |
+
train.set_index('Date',inplace=True)
|
177 |
+
test.set_index('Date',inplace=True)
|
178 |
+
test.dropna(inplace=True)
|
179 |
+
X_train=train.drop(["total_approved_accounts_revenue"],axis=1)
|
180 |
+
y_train=train['total_approved_accounts_revenue']
|
181 |
+
X_test=test.drop(["total_approved_accounts_revenue"],axis=1)
|
182 |
+
X_train=sm.add_constant(X_train)
|
183 |
+
X_test=sm.add_constant(X_test)
|
184 |
+
y_test=test['total_approved_accounts_revenue']
|
185 |
+
|
186 |
+
# sys.stdout.close()
|
187 |
+
# sys.stdout = original_stdout
|
188 |
+
|
189 |
+
# st.set_page_config(layout='wide')
|
190 |
+
# load_local_css('styles.css')
|
191 |
+
# set_header()
|
192 |
+
|
193 |
+
channel_data=pd.read_excel("Channel_wise_imp_click_spends_new.xlsx",sheet_name='Sheet3')
|
194 |
+
target_column='Total Approved Accounts - Revenue'
|
195 |
+
|
196 |
+
|
197 |
+
with eda_columns[1]:
|
198 |
+
if st.button('Generate EDA Report'):
|
199 |
+
def generate_report_with_target(channel_data, target_feature):
|
200 |
+
report = sv.analyze([channel_data, "Dataset"], target_feat=target_feature,verbose=False)
|
201 |
+
temp_dir = tempfile.mkdtemp()
|
202 |
+
report_path = os.path.join(temp_dir, "report.html")
|
203 |
+
report.show_html(filepath=report_path, open_browser=False) # Generate the report as an HTML file
|
204 |
+
return report_path
|
205 |
+
|
206 |
+
report_file = generate_report_with_target(channel_data, target_column)
|
207 |
+
|
208 |
+
if os.path.exists(report_file):
|
209 |
+
with open(report_file, 'rb') as f:
|
210 |
+
st.download_button(
|
211 |
+
label="Download EDA Report",
|
212 |
+
data=f.read(),
|
213 |
+
file_name="report.html",
|
214 |
+
mime="text/html"
|
215 |
+
)
|
216 |
+
else:
|
217 |
+
st.warning("Report generation failed. Unable to find the report file.")
|
218 |
+
|
219 |
+
|
220 |
+
st.title('Analysis of Result')
|
221 |
+
|
222 |
+
st.write(model.summary(yname='Revenue'))
|
223 |
+
|
224 |
+
metrics_table_train,fig_train= plot_actual_vs_predicted(X_train.index, y_train, model.predict(X_train), model)
|
225 |
+
metrics_table_test,fig_test= plot_actual_vs_predicted(X_test.index, y_test, model.predict(X_test), model)
|
226 |
+
|
227 |
+
metrics_table_train=metrics_table_train.set_index('Metric').transpose()
|
228 |
+
metrics_table_train.index=['Train']
|
229 |
+
metrics_table_test=metrics_table_test.set_index('Metric').transpose()
|
230 |
+
metrics_table_test.index=['test']
|
231 |
+
metrics_table=np.round(pd.concat([metrics_table_train,metrics_table_test]),2)
|
232 |
+
|
233 |
+
st.markdown('Result Overview')
|
234 |
+
st.dataframe(np.round(metrics_table,2),use_container_width=True)
|
235 |
+
|
236 |
+
st.subheader('Actual vs Predicted Plot Train')
|
237 |
+
|
238 |
+
st.plotly_chart(fig_train,use_container_width=True)
|
239 |
+
st.subheader('Actual vs Predicted Plot Test')
|
240 |
+
st.plotly_chart(fig_test,use_container_width=True)
|
241 |
+
|
242 |
+
st.markdown('## Residual Analysis')
|
243 |
+
columns=st.columns(2)
|
244 |
+
Xtrain1=X_train.copy()
|
245 |
+
with columns[0]:
|
246 |
+
fig=plot_residual_predicted(y_train,model.predict(Xtrain1),Xtrain1)
|
247 |
+
st.plotly_chart(fig)
|
248 |
+
|
249 |
+
with columns[1]:
|
250 |
+
st.empty()
|
251 |
+
fig = qqplot(y_train,model.predict(X_train))
|
252 |
+
st.plotly_chart(fig)
|
253 |
+
|
254 |
+
with columns[0]:
|
255 |
+
fig=residual_distribution(y_train,model.predict(X_train))
|
256 |
+
st.pyplot(fig)
|
257 |
+
else:
|
258 |
+
with open('mastercard_mmm_model_channel.pkl', 'rb') as file:
|
259 |
+
model = pickle.load(file)
|
260 |
+
train=pd.read_csv('train_mastercard_channel.csv')
|
261 |
+
test=pd.read_csv('test_mastercard_channel.csv')
|
262 |
+
# train['Date']=pd.to_datetime(train['Date'])
|
263 |
+
# test['Date']=pd.to_datetime(test['Date'])
|
264 |
+
# train.set_index('Date',inplace=True)
|
265 |
+
# test.set_index('Date',inplace=True)
|
266 |
+
test.dropna(inplace=True)
|
267 |
+
X_train=train.drop(["total_approved_accounts_revenue"],axis=1)
|
268 |
+
y_train=train['total_approved_accounts_revenue']
|
269 |
+
X_test=test.drop(["total_approved_accounts_revenue"],axis=1)
|
270 |
+
X_train=sm.add_constant(X_train)
|
271 |
+
X_test=sm.add_constant(X_test)
|
272 |
+
y_test=test['total_approved_accounts_revenue']
|
273 |
+
|
274 |
+
|
275 |
+
|
276 |
+
channel_data=pd.read_excel("Channel_wise_imp_click_spends_new.xlsx",sheet_name='Sheet3')
|
277 |
+
target_column='Total Approved Accounts - Revenue'
|
278 |
+
with eda_columns[1]:
|
279 |
+
if st.button('Generate EDA Report'):
|
280 |
+
def generate_report_with_target(channel_data, target_feature):
|
281 |
+
report = sv.analyze([channel_data, "Dataset"], target_feat=target_feature)
|
282 |
+
temp_dir = tempfile.mkdtemp()
|
283 |
+
report_path = os.path.join(temp_dir, "report.html")
|
284 |
+
report.show_html(filepath=report_path, open_browser=False) # Generate the report as an HTML file
|
285 |
+
return report_path
|
286 |
+
|
287 |
+
report_file = generate_report_with_target(channel_data, target_column)
|
288 |
+
|
289 |
+
# Provide a link to download the generated report
|
290 |
+
with open(report_file, 'rb') as f:
|
291 |
+
st.download_button(
|
292 |
+
label="Download EDA Report",
|
293 |
+
data=f.read(),
|
294 |
+
file_name="report.html",
|
295 |
+
mime="text/html"
|
296 |
+
)
|
297 |
+
|
298 |
+
|
299 |
+
st.title('Analysis of Result')
|
300 |
+
|
301 |
+
st.write(model.summary(yname='Revenue'))
|
302 |
+
|
303 |
+
metrics_table_train,fig_train= plot_actual_vs_predicted(X_train.index, y_train, model.predict(X_train), model)
|
304 |
+
metrics_table_test,fig_test= plot_actual_vs_predicted(X_test.index, y_test, model.predict(X_test), model)
|
305 |
+
|
306 |
+
metrics_table_train=metrics_table_train.set_index('Metric').transpose()
|
307 |
+
metrics_table_train.index=['Train']
|
308 |
+
metrics_table_test=metrics_table_test.set_index('Metric').transpose()
|
309 |
+
metrics_table_test.index=['test']
|
310 |
+
metrics_table=np.round(pd.concat([metrics_table_train,metrics_table_test]),2)
|
311 |
+
|
312 |
+
st.markdown('Result Overview')
|
313 |
+
st.dataframe(np.round(metrics_table,2),use_container_width=True)
|
314 |
+
|
315 |
+
st.subheader('Actual vs Predicted Plot Train')
|
316 |
+
|
317 |
+
st.plotly_chart(fig_train,use_container_width=True)
|
318 |
+
st.subheader('Actual vs Predicted Plot Test')
|
319 |
+
st.plotly_chart(fig_test,use_container_width=True)
|
320 |
+
|
321 |
+
st.markdown('## Residual Analysis')
|
322 |
+
columns=st.columns(2)
|
323 |
+
Xtrain1=X_train.copy()
|
324 |
+
with columns[0]:
|
325 |
+
fig=plot_residual_predicted(y_train,model.predict(Xtrain1),Xtrain1)
|
326 |
+
st.plotly_chart(fig)
|
327 |
+
|
328 |
+
with columns[1]:
|
329 |
+
st.empty()
|
330 |
+
fig = qqplot(y_train,model.predict(X_train))
|
331 |
+
st.plotly_chart(fig)
|
332 |
+
|
333 |
+
with columns[0]:
|
334 |
+
fig=residual_distribution(y_train,model.predict(X_train))
|
335 |
+
st.pyplot(fig)
|
336 |
+
|
337 |
+
elif auth_status == False:
|
338 |
+
st.error('Username/Password is incorrect')
|
339 |
+
|
340 |
+
if auth_status != True:
|
341 |
+
try:
|
342 |
+
username_forgot_pw, email_forgot_password, random_password = authenticator.forgot_password('Forgot password')
|
343 |
+
if username_forgot_pw:
|
344 |
+
st.success('New password sent securely')
|
345 |
+
# Random password to be transferred to user securely
|
346 |
+
elif username_forgot_pw == False:
|
347 |
+
st.error('Username not found')
|
348 |
+
except Exception as e:
|
349 |
+
st.error(e)
|
Model_Results_Pretrained_copy.py
ADDED
@@ -0,0 +1,365 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import plotly.express as px
|
2 |
+
import numpy as np
|
3 |
+
import plotly.graph_objects as go
|
4 |
+
import streamlit as st
|
5 |
+
import pandas as pd
|
6 |
+
import statsmodels.api as sm
|
7 |
+
from sklearn.metrics import mean_absolute_percentage_error
|
8 |
+
import sys
|
9 |
+
import os
|
10 |
+
from utilities import (set_header,
|
11 |
+
load_local_css,
|
12 |
+
load_authenticator)
|
13 |
+
import seaborn as sns
|
14 |
+
import matplotlib.pyplot as plt
|
15 |
+
import sweetviz as sv
|
16 |
+
import tempfile
|
17 |
+
from sklearn.preprocessing import MinMaxScaler
|
18 |
+
from st_aggrid import AgGrid
|
19 |
+
from st_aggrid import GridOptionsBuilder,GridUpdateMode
|
20 |
+
from st_aggrid import GridOptionsBuilder
|
21 |
+
import sys
|
22 |
+
|
23 |
+
sys.setrecursionlimit(10**6)
|
24 |
+
|
25 |
+
original_stdout = sys.stdout
|
26 |
+
sys.stdout = open('temp_stdout.txt', 'w')
|
27 |
+
sys.stdout.close()
|
28 |
+
sys.stdout = original_stdout
|
29 |
+
|
30 |
+
st.set_page_config(layout='wide')
|
31 |
+
load_local_css('styles.css')
|
32 |
+
set_header()
|
33 |
+
|
34 |
+
for k, v in st.session_state.items():
|
35 |
+
if k not in ['logout', 'login','config'] and not k.startswith('FormSubmitter'):
|
36 |
+
st.session_state[k] = v
|
37 |
+
|
38 |
+
authenticator = st.session_state.get('authenticator')
|
39 |
+
if authenticator is None:
|
40 |
+
authenticator = load_authenticator()
|
41 |
+
|
42 |
+
name, authentication_status, username = authenticator.login('Login', 'main')
|
43 |
+
auth_status = st.session_state.get('authentication_status')
|
44 |
+
|
45 |
+
if auth_status == True:
|
46 |
+
is_state_initiaized = st.session_state.get('initialized',False)
|
47 |
+
if not is_state_initiaized:
|
48 |
+
a=1
|
49 |
+
|
50 |
+
|
51 |
+
def plot_residual_predicted(actual, predicted, df_):
|
52 |
+
df_['Residuals'] = actual - pd.Series(predicted)
|
53 |
+
df_['StdResidual'] = (df_['Residuals'] - df_['Residuals'].mean()) / df_['Residuals'].std()
|
54 |
+
|
55 |
+
# Create a Plotly scatter plot
|
56 |
+
fig = px.scatter(df_, x=predicted, y='StdResidual', opacity=0.5,color_discrete_sequence=["#11B6BD"])
|
57 |
+
|
58 |
+
# Add horizontal lines
|
59 |
+
fig.add_hline(y=0, line_dash="dash", line_color="darkorange")
|
60 |
+
fig.add_hline(y=2, line_color="red")
|
61 |
+
fig.add_hline(y=-2, line_color="red")
|
62 |
+
|
63 |
+
fig.update_xaxes(title='Predicted')
|
64 |
+
fig.update_yaxes(title='Standardized Residuals (Actual - Predicted)')
|
65 |
+
|
66 |
+
# Set the same width and height for both figures
|
67 |
+
fig.update_layout(title='Residuals over Predicted Values', autosize=False, width=600, height=400)
|
68 |
+
|
69 |
+
return fig
|
70 |
+
|
71 |
+
def residual_distribution(actual, predicted):
|
72 |
+
Residuals = actual - pd.Series(predicted)
|
73 |
+
|
74 |
+
# Create a Seaborn distribution plot
|
75 |
+
sns.set(style="whitegrid")
|
76 |
+
plt.figure(figsize=(6, 4))
|
77 |
+
sns.histplot(Residuals, kde=True, color="#11B6BD")
|
78 |
+
|
79 |
+
plt.title(' Distribution of Residuals')
|
80 |
+
plt.xlabel('Residuals')
|
81 |
+
plt.ylabel('Probability Density')
|
82 |
+
|
83 |
+
return plt
|
84 |
+
|
85 |
+
|
86 |
+
def qqplot(actual, predicted):
|
87 |
+
Residuals = actual - pd.Series(predicted)
|
88 |
+
Residuals = pd.Series(Residuals)
|
89 |
+
Resud_std = (Residuals - Residuals.mean()) / Residuals.std()
|
90 |
+
|
91 |
+
# Create a QQ plot using Plotly with custom colors
|
92 |
+
fig = go.Figure()
|
93 |
+
fig.add_trace(go.Scatter(x=sm.ProbPlot(Resud_std).theoretical_quantiles,
|
94 |
+
y=sm.ProbPlot(Resud_std).sample_quantiles,
|
95 |
+
mode='markers',
|
96 |
+
marker=dict(size=5, color="#11B6BD"),
|
97 |
+
name='QQ Plot'))
|
98 |
+
|
99 |
+
# Add the 45-degree reference line
|
100 |
+
diagonal_line = go.Scatter(
|
101 |
+
x=[-2, 2], # Adjust the x values as needed to fit the range of your data
|
102 |
+
y=[-2, 2], # Adjust the y values accordingly
|
103 |
+
mode='lines',
|
104 |
+
line=dict(color='red'), # Customize the line color and style
|
105 |
+
name=' '
|
106 |
+
)
|
107 |
+
fig.add_trace(diagonal_line)
|
108 |
+
|
109 |
+
# Customize the layout
|
110 |
+
fig.update_layout(title='QQ Plot of Residuals',title_x=0.5, autosize=False, width=600, height=400,
|
111 |
+
xaxis_title='Theoretical Quantiles', yaxis_title='Sample Quantiles')
|
112 |
+
|
113 |
+
return fig
|
114 |
+
|
115 |
+
|
116 |
+
def plot_actual_vs_predicted(date, y, predicted_values, model):
|
117 |
+
|
118 |
+
fig = go.Figure()
|
119 |
+
|
120 |
+
fig.add_trace(go.Scatter(x=date, y=y, mode='lines', name='Actual', line=dict(color='blue')))
|
121 |
+
fig.add_trace(go.Scatter(x=date, y=predicted_values, mode='lines', name='Predicted', line=dict(color='orange')))
|
122 |
+
|
123 |
+
# Calculate MAPE
|
124 |
+
mape = mean_absolute_percentage_error(y, predicted_values)*100
|
125 |
+
|
126 |
+
# Calculate R-squared
|
127 |
+
rss = np.sum((y - predicted_values) ** 2)
|
128 |
+
tss = np.sum((y - np.mean(y)) ** 2)
|
129 |
+
r_squared = 1 - (rss / tss)
|
130 |
+
|
131 |
+
# Get the number of predictors
|
132 |
+
num_predictors = model.df_model
|
133 |
+
|
134 |
+
# Get the number of samples
|
135 |
+
num_samples = len(y)
|
136 |
+
|
137 |
+
# Calculate Adjusted R-squared
|
138 |
+
adj_r_squared = 1 - ((1 - r_squared) * ((num_samples - 1) / (num_samples - num_predictors - 1)))
|
139 |
+
metrics_table = pd.DataFrame({
|
140 |
+
'Metric': ['MAPE', 'R-squared', 'AdjR-squared'],
|
141 |
+
'Value': [mape, r_squared, adj_r_squared]})
|
142 |
+
fig.update_layout(
|
143 |
+
xaxis=dict(title='Date'),
|
144 |
+
yaxis=dict(title='Value'),
|
145 |
+
title=f'MAPE : {mape:.2f}%, AdjR2: {adj_r_squared:.2f}',
|
146 |
+
xaxis_tickangle=-30
|
147 |
+
)
|
148 |
+
|
149 |
+
return metrics_table,fig
|
150 |
+
|
151 |
+
transformed_data=pd.read_csv('transformed_data.csv')
|
152 |
+
|
153 |
+
# hard coded for now, need to get features set from model
|
154 |
+
|
155 |
+
feature_set_dct={'app_installs_-_appsflyer':['paid_search_clicks',
|
156 |
+
'fb:_level_achieved_-_tier_1_impressions_lag2',
|
157 |
+
'fb:_level_achieved_-_tier_2_clicks_lag2',
|
158 |
+
'paid_social_others_impressions_adst.1',
|
159 |
+
'ga_app:_will_and_cid_pequena_baixo_risco_clicks_lag2',
|
160 |
+
'digital_tactic_others_clicks',
|
161 |
+
'kwai_clicks_adst.3',
|
162 |
+
'programmaticclicks',
|
163 |
+
'indicacao_clicks_adst.1',
|
164 |
+
'infleux_clicks_adst.4',
|
165 |
+
'influencer_clicks'],
|
166 |
+
|
167 |
+
'account_requests_-_appsflyer':['paid_search_impressions',
|
168 |
+
'fb:_level_achieved_-_tier_1_clicks_adst.1',
|
169 |
+
'fb:_level_achieved_-_tier_2_clicks_adst.1',
|
170 |
+
'paid_social_others_clicks_lag2',
|
171 |
+
'ga_app:_will_and_cid_pequena_baixo_risco_clicks_lag5_adst.1',
|
172 |
+
'digital_tactic_others_clicks_adst.1',
|
173 |
+
'kwai_clicks_adst.2',
|
174 |
+
'programmaticimpressions_lag4_adst.1',
|
175 |
+
'indicacao_clicks',
|
176 |
+
'infleux_clicks_adst.2',
|
177 |
+
'influencer_clicks'],
|
178 |
+
|
179 |
+
'total_approved_accounts_-_appsflyer':['paid_search_clicks',
|
180 |
+
'fb:_level_achieved_-_tier_1_impressions_lag2_adst.1',
|
181 |
+
'fb:_level_achieved_-_tier_2_impressions_lag2',
|
182 |
+
'paid_social_others_clicks_lag2_adst.2',
|
183 |
+
'ga_app:_will_and_cid_pequena_baixo_risco_impressions_lag4',
|
184 |
+
'digital_tactic_others_clicks',
|
185 |
+
'kwai_impressions_adst.2',
|
186 |
+
'programmaticclicks_adst.5',
|
187 |
+
'indicacao_clicks_adst.1',
|
188 |
+
'infleux_clicks_adst.3',
|
189 |
+
'influencer_clicks'],
|
190 |
+
|
191 |
+
'total_approved_accounts_-_revenue':['paid_search_impressions_adst.5',
|
192 |
+
'kwai_impressions_lag2_adst.3',
|
193 |
+
'indicacao_clicks_adst.3',
|
194 |
+
'infleux_clicks_adst.3',
|
195 |
+
'programmaticclicks_adst.4',
|
196 |
+
'influencer_clicks_adst.3',
|
197 |
+
'fb:_level_achieved_-_tier_1_impressions_adst.2',
|
198 |
+
'fb:_level_achieved_-_tier_2_impressions_lag3_adst.5',
|
199 |
+
'paid_social_others_impressions_adst.3',
|
200 |
+
'ga_app:_will_and_cid_pequena_baixo_risco_clicks_lag3_adst.5',
|
201 |
+
'digital_tactic_others_clicks_adst.2']
|
202 |
+
|
203 |
+
}
|
204 |
+
|
205 |
+
#""" the above part should be modified so that we are getting features set from the saved model"""
|
206 |
+
|
207 |
+
|
208 |
+
|
209 |
+
|
210 |
+
|
211 |
+
def model_fit(features_set,target):
|
212 |
+
X = transformed_data[features_set]
|
213 |
+
y= transformed_data[target]
|
214 |
+
ss = MinMaxScaler()
|
215 |
+
X = pd.DataFrame(ss.fit_transform(X), columns=X.columns)
|
216 |
+
X = sm.add_constant(X)
|
217 |
+
X_train=X.iloc[:150]
|
218 |
+
X_test=X.iloc[150:]
|
219 |
+
y_train=y.iloc[:150]
|
220 |
+
y_test=y.iloc[150:]
|
221 |
+
model = sm.OLS(y_train, X_train).fit()
|
222 |
+
predicted_values_train = model.predict(X_train)
|
223 |
+
r2 = model.rsquared
|
224 |
+
adjr2 = model.rsquared_adj
|
225 |
+
train_mape = mean_absolute_percentage_error(y_train, predicted_values_train)
|
226 |
+
test_mape=mean_absolute_percentage_error(y_test, model.predict(X_test))
|
227 |
+
summary=model.summary()
|
228 |
+
return pd.DataFrame({'Model':target,'R2':np.round(r2,2),'ADJr2':np.round(adjr2,2),'Train Mape':np.round(train_mape,2),
|
229 |
+
'Test Mape':np.round(test_mape,2),'Summary':summary,'Model_object':model
|
230 |
+
},index=[0])
|
231 |
+
|
232 |
+
metrics_table=pd.DataFrame()
|
233 |
+
|
234 |
+
for target,feature_set in feature_set_dct.items():
|
235 |
+
metrics_table= pd.concat([metrics_table,model_fit(features_set=feature_set,target=target)])
|
236 |
+
|
237 |
+
metrics_table.reset_index(drop=True,inplace=True)
|
238 |
+
|
239 |
+
eda_columns=st.columns(3)
|
240 |
+
with eda_columns[1]:
|
241 |
+
eda=st.button('Generate EDA Report',help="Click to generate a bivariate report for the selected response metric from the table below.")
|
242 |
+
|
243 |
+
st.title('Analysis of Model Results')
|
244 |
+
# st.markdown()
|
245 |
+
gd=GridOptionsBuilder.from_dataframe(metrics_table.iloc[:,:-2])
|
246 |
+
gd.configure_pagination(enabled=True)
|
247 |
+
gd.configure_selection(use_checkbox=True)
|
248 |
+
|
249 |
+
|
250 |
+
gridoptions=gd.build()
|
251 |
+
|
252 |
+
# st.markdown('Model Metrics')
|
253 |
+
table = AgGrid(metrics_table.iloc[:,:-2],gridOptions=gridoptions,update_mode=GridUpdateMode.SELECTION_CHANGED,fit_columns_on_grid_load=True,
|
254 |
+
columns_auto_size_mode='ColumnsAutoSizeMode.FIT_ALL_COLUMNS_TO_VIEW')
|
255 |
+
|
256 |
+
if len(table.selected_rows)==0:
|
257 |
+
st.warning("Click on the checkbox to view comprehensive results of the selected model.")
|
258 |
+
st.stop()
|
259 |
+
else:
|
260 |
+
target_column=table.selected_rows[0]['Model']
|
261 |
+
feature_set=feature_set_dct[target_column]
|
262 |
+
|
263 |
+
|
264 |
+
st.header('')
|
265 |
+
# st.write(feature_set)
|
266 |
+
# st.write(target_column)
|
267 |
+
|
268 |
+
|
269 |
+
|
270 |
+
|
271 |
+
# # Perform linear regression
|
272 |
+
# model = sm.OLS(y, X).fit()
|
273 |
+
|
274 |
+
|
275 |
+
with eda_columns[1]:
|
276 |
+
if eda:
|
277 |
+
def generate_report_with_target(channel_data, target_feature):
|
278 |
+
report = sv.analyze([channel_data, "Dataset"], target_feat=target_feature,verbose=False)
|
279 |
+
temp_dir = tempfile.mkdtemp()
|
280 |
+
report_path = os.path.join(temp_dir, "report.html")
|
281 |
+
report.show_html(filepath=report_path, open_browser=False) # Generate the report as an HTML file
|
282 |
+
return report_path
|
283 |
+
|
284 |
+
report_data=transformed_data[feature_set]
|
285 |
+
report_data[target_column]=transformed_data[target_column]
|
286 |
+
report_file = generate_report_with_target(report_data, target_column)
|
287 |
+
|
288 |
+
if os.path.exists(report_file):
|
289 |
+
with open(report_file, 'rb') as f:
|
290 |
+
st.download_button(
|
291 |
+
label="Download EDA Report",
|
292 |
+
data=f.read(),
|
293 |
+
file_name="report.html",
|
294 |
+
mime="text/html"
|
295 |
+
)
|
296 |
+
else:
|
297 |
+
st.warning("Report generation failed. Unable to find the report file.")
|
298 |
+
|
299 |
+
|
300 |
+
|
301 |
+
|
302 |
+
model=metrics_table[metrics_table['Model']==target_column]['Model_object'].iloc[0]
|
303 |
+
st.header('Model Summary')
|
304 |
+
st.write(model.summary())
|
305 |
+
X=transformed_data[feature_set]
|
306 |
+
ss=MinMaxScaler()
|
307 |
+
X=pd.DataFrame(ss.fit_transform(X),columns=X.columns)
|
308 |
+
X=sm.add_constant(X)
|
309 |
+
y=transformed_data[target_column]
|
310 |
+
X_train=X.iloc[:150]
|
311 |
+
X_test=X.iloc[150:]
|
312 |
+
y_train=y.iloc[:150]
|
313 |
+
y_test=y.iloc[150:]
|
314 |
+
X.index=transformed_data['date']
|
315 |
+
y.index=transformed_data['date']
|
316 |
+
|
317 |
+
metrics_table_train,fig_train= plot_actual_vs_predicted(X_train.index, y_train, model.predict(X_train), model)
|
318 |
+
metrics_table_test,fig_test= plot_actual_vs_predicted(X_test.index, y_test, model.predict(X_test), model)
|
319 |
+
|
320 |
+
metrics_table_train=metrics_table_train.set_index('Metric').transpose()
|
321 |
+
metrics_table_train.index=['Train']
|
322 |
+
metrics_table_test=metrics_table_test.set_index('Metric').transpose()
|
323 |
+
metrics_table_test.index=['test']
|
324 |
+
metrics_table=np.round(pd.concat([metrics_table_train,metrics_table_test]),2)
|
325 |
+
|
326 |
+
st.markdown('Result Overview')
|
327 |
+
st.dataframe(np.round(metrics_table,2),use_container_width=True)
|
328 |
+
|
329 |
+
st.subheader('Actual vs Predicted Plot Train')
|
330 |
+
|
331 |
+
st.plotly_chart(fig_train,use_container_width=True)
|
332 |
+
st.subheader('Actual vs Predicted Plot Test')
|
333 |
+
st.plotly_chart(fig_test,use_container_width=True)
|
334 |
+
|
335 |
+
st.markdown('## Residual Analysis')
|
336 |
+
columns=st.columns(2)
|
337 |
+
|
338 |
+
|
339 |
+
Xtrain1=X_train.copy()
|
340 |
+
with columns[0]:
|
341 |
+
fig=plot_residual_predicted(y_train,model.predict(Xtrain1),Xtrain1)
|
342 |
+
st.plotly_chart(fig)
|
343 |
+
|
344 |
+
with columns[1]:
|
345 |
+
st.empty()
|
346 |
+
fig = qqplot(y_train,model.predict(X_train))
|
347 |
+
st.plotly_chart(fig)
|
348 |
+
|
349 |
+
with columns[0]:
|
350 |
+
fig=residual_distribution(y_train,model.predict(X_train))
|
351 |
+
st.pyplot(fig)
|
352 |
+
|
353 |
+
|
354 |
+
|
355 |
+
elif auth_status == False:
|
356 |
+
st.error('Username/Password is incorrect')
|
357 |
+
try:
|
358 |
+
username_forgot_pw, email_forgot_password, random_password = authenticator.forgot_password('Forgot password')
|
359 |
+
if username_forgot_pw:
|
360 |
+
st.success('New password sent securely')
|
361 |
+
# Random password to be transferred to the user securely
|
362 |
+
elif username_forgot_pw == False:
|
363 |
+
st.error('Username not found')
|
364 |
+
except Exception as e:
|
365 |
+
st.error(e)
|
Overview1_data.xlsx
ADDED
Binary file (51.8 kB). View file
|
|
Overview_data - Copy.xlsx
ADDED
Binary file (51.7 kB). View file
|
|
Overview_data.xlsx
ADDED
Binary file (56.9 kB). View file
|
|
Overview_data_test.xlsx
ADDED
Binary file (27.4 kB). View file
|
|
Profile_Report.html
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:accff0a5fcd3b37dd6da7072d839ec1592866c3f3f8b479cc708e53a49abdb5a
|
3 |
+
size 57660752
|
SWEETVIZ_REPORT.html
ADDED
The diff for this file is too large to render.
See raw diff
|
|
Scenario.py
ADDED
@@ -0,0 +1,338 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
import plotly.express as px
|
4 |
+
import plotly.graph_objects as go
|
5 |
+
import numpy as np
|
6 |
+
import plotly.express as px
|
7 |
+
import plotly.graph_objects as go
|
8 |
+
import pandas as pd
|
9 |
+
import seaborn as sns
|
10 |
+
import matplotlib.pyplot as plt
|
11 |
+
import datetime
|
12 |
+
from utilities import set_header,initialize_data,load_local_css
|
13 |
+
from scipy.optimize import curve_fit
|
14 |
+
import statsmodels.api as sm
|
15 |
+
from plotly.subplots import make_subplots
|
16 |
+
|
17 |
+
st.set_page_config(
|
18 |
+
page_title="Data Validation",
|
19 |
+
page_icon=":shark:",
|
20 |
+
layout="wide",
|
21 |
+
initial_sidebar_state='collapsed'
|
22 |
+
)
|
23 |
+
load_local_css('styles.css')
|
24 |
+
set_header()
|
25 |
+
|
26 |
+
def format_numbers(x):
|
27 |
+
if abs(x) >= 1e6:
|
28 |
+
# Format as millions with one decimal place and commas
|
29 |
+
return f'{x/1e6:,.1f}M'
|
30 |
+
elif abs(x) >= 1e3:
|
31 |
+
# Format as thousands with one decimal place and commas
|
32 |
+
return f'{x/1e3:,.1f}K'
|
33 |
+
else:
|
34 |
+
# Format with one decimal place and commas for values less than 1000
|
35 |
+
return f'{x:,.1f}'
|
36 |
+
|
37 |
+
def format_axis(x):
|
38 |
+
if isinstance(x, tuple):
|
39 |
+
x = x[0] # Extract the numeric value from the tuple
|
40 |
+
if abs(x) >= 1e6:
|
41 |
+
return f'{x / 1e6:.0f}M'
|
42 |
+
elif abs(x) >= 1e3:
|
43 |
+
return f'{x / 1e3:.0f}k'
|
44 |
+
else:
|
45 |
+
return f'{x:.0f}'
|
46 |
+
|
47 |
+
|
48 |
+
attributred_app_installs=pd.read_csv("attributed_app_installs.csv")
|
49 |
+
attributred_app_installs_tactic=pd.read_excel('attributed_app_installs_tactic.xlsx')
|
50 |
+
data=pd.read_excel('Channel_wise_imp_click_spends.xlsx')
|
51 |
+
data['Date']=pd.to_datetime(data['Date'])
|
52 |
+
st.header('Saturation Curves')
|
53 |
+
|
54 |
+
# st.dataframe(data.head(2))
|
55 |
+
st.markdown('Data QC')
|
56 |
+
|
57 |
+
st.markdown('Channel wise summary')
|
58 |
+
summary_df=data.groupby(data['Date'].dt.strftime('%B %Y')).sum()
|
59 |
+
summary_df=summary_df.sort_index(key=lambda x: pd.to_datetime(x, format='%B %Y'))
|
60 |
+
st.dataframe(summary_df.applymap(format_numbers))
|
61 |
+
|
62 |
+
|
63 |
+
|
64 |
+
def line_plot_target(df,target,title):
|
65 |
+
df=df
|
66 |
+
df['Date_unix'] = df['Date'].apply(lambda x: x.timestamp())
|
67 |
+
|
68 |
+
# Perform polynomial fitting
|
69 |
+
coefficients = np.polyfit(df['Date_unix'], df[target], 1)
|
70 |
+
# st.dataframe(df)
|
71 |
+
coefficients = np.polyfit(df['Date'].view('int64'), df[target], 1)
|
72 |
+
trendline = np.poly1d(coefficients)
|
73 |
+
fig = go.Figure()
|
74 |
+
|
75 |
+
fig.add_trace(go.Scatter(x=df['Date'], y=df[target], mode='lines', name=target,line=dict(color='#11B6BD')))
|
76 |
+
trendline_x = df['Date']
|
77 |
+
trendline_y = trendline(df['Date'].view('int64'))
|
78 |
+
|
79 |
+
|
80 |
+
fig.add_trace(go.Scatter(x=trendline_x, y=trendline_y, mode='lines', name='Trendline', line=dict(color='#739FAE')))
|
81 |
+
|
82 |
+
fig.update_layout(
|
83 |
+
title=title,
|
84 |
+
xaxis=dict(type='date')
|
85 |
+
)
|
86 |
+
|
87 |
+
for year in df['Date'].dt.year.unique()[1:]:
|
88 |
+
|
89 |
+
january_1 = pd.Timestamp(year=year, month=1, day=1)
|
90 |
+
fig.add_shape(
|
91 |
+
go.layout.Shape(
|
92 |
+
type="line",
|
93 |
+
x0=january_1,
|
94 |
+
x1=january_1,
|
95 |
+
y0=0,
|
96 |
+
y1=1,
|
97 |
+
xref="x",
|
98 |
+
yref="paper",
|
99 |
+
line=dict(color="grey", width=1.5, dash="dash"),
|
100 |
+
)
|
101 |
+
)
|
102 |
+
|
103 |
+
return fig
|
104 |
+
channels_d= data.columns[:28]
|
105 |
+
channels=list(set([col.replace('_impressions','').replace('_clicks','').replace('_spend','') for col in channels_d if col.lower()!='date']))
|
106 |
+
channel= st.selectbox('Select Channel_name',channels)
|
107 |
+
target_column = st.selectbox('Select Channel)',[col for col in data.columns if col.startswith(channel)])
|
108 |
+
fig=line_plot_target(data, target=str(target_column), title=f'{str(target_column)} Over Time')
|
109 |
+
st.plotly_chart(fig, use_container_width=True)
|
110 |
+
|
111 |
+
# st.markdown('## Saturation Curve')
|
112 |
+
|
113 |
+
|
114 |
+
st.header('Build saturation curve')
|
115 |
+
|
116 |
+
# Your data
|
117 |
+
# st.write(len(attributred_app_installs))
|
118 |
+
# st.write(len(data))
|
119 |
+
# col=st.columns(3)
|
120 |
+
# with col[0]:
|
121 |
+
col=st.columns(2)
|
122 |
+
with col[0]:
|
123 |
+
if st.checkbox('Cap Outliers'):
|
124 |
+
x = data[target_column]
|
125 |
+
x.index=data['Date']
|
126 |
+
# st.write(x)
|
127 |
+
result = sm.tsa.seasonal_decompose(x, model='additive')
|
128 |
+
x_resid=result.resid
|
129 |
+
# fig = make_subplots(rows=1, cols=1, shared_xaxes=True, vertical_spacing=0.02)
|
130 |
+
# trace_x = go.Scatter(x=data['Date'], y=x, mode='lines', name='x')
|
131 |
+
# fig.add_trace(trace_x)
|
132 |
+
# trace_x_resid = go.Scatter(x=data['Date'], y=x_resid, mode='lines', name='x_resid', yaxis='y2',line=dict(color='orange'))
|
133 |
+
|
134 |
+
# fig.add_trace(trace_x_resid)
|
135 |
+
# fig.update_layout(title='',
|
136 |
+
# xaxis=dict(title='Date'),
|
137 |
+
# yaxis=dict(title='x', side='left'),
|
138 |
+
# yaxis2=dict(title='x_resid', side='right'))
|
139 |
+
# st.title('')
|
140 |
+
# st.plotly_chart(fig)
|
141 |
+
|
142 |
+
# x=result.resid
|
143 |
+
# x=x.fillna(0)
|
144 |
+
x_mean = np.mean(x)
|
145 |
+
x_std = np.std(x)
|
146 |
+
x_scaled = (x - x_mean) / x_std
|
147 |
+
lower_threshold = -2.0
|
148 |
+
upper_threshold = 2.0
|
149 |
+
x_scaled = np.clip(x_scaled, lower_threshold, upper_threshold)
|
150 |
+
else:
|
151 |
+
x = data[target_column]
|
152 |
+
x_mean = np.mean(x)
|
153 |
+
x_std = np.std(x)
|
154 |
+
x_scaled = (x - x_mean) / x_std
|
155 |
+
with col[1]:
|
156 |
+
if st.checkbox('Attributed'):
|
157 |
+
column=[col for col in attributred_app_installs.columns if col in target_column]
|
158 |
+
data['app_installs_appsflyer']=attributred_app_installs[column]
|
159 |
+
y=data['app_installs_appsflyer']
|
160 |
+
title='Attributed-App_installs_appsflyer'
|
161 |
+
# st.dataframe(y)
|
162 |
+
# st.dataframe(x)
|
163 |
+
# st.dataframe(x_scaled)
|
164 |
+
else:
|
165 |
+
y=data["app_installs_appsflyer"]
|
166 |
+
title='App_installs_appsflyer'
|
167 |
+
# st.write(len(y))
|
168 |
+
# Curve fitting function
|
169 |
+
def sigmoid(x, K, a, x0):
|
170 |
+
return K / (1 + np.exp(-a * (x - x0)))
|
171 |
+
|
172 |
+
initial_K = np.max(y)
|
173 |
+
initial_a = 1
|
174 |
+
initial_x0 = 0
|
175 |
+
columns=st.columns(3)
|
176 |
+
|
177 |
+
|
178 |
+
with columns[0]:
|
179 |
+
K = st.number_input('K (Amplitude)', min_value=0.01, max_value=2.0 * np.max(y), value=float(initial_K), step=5.0)
|
180 |
+
with columns[1]:
|
181 |
+
a = st.number_input('a (Slope)', min_value=0.01, max_value=5.0, value=float(initial_a), step=0.5)
|
182 |
+
with columns[2]:
|
183 |
+
x0 = st.number_input('x0 (Center)', min_value=float(min(x_scaled)), max_value=float(max(x_scaled)), value=float(initial_x0), step=2.0)
|
184 |
+
params, _ = curve_fit(sigmoid, x_scaled, y, p0=[K, a, x0], maxfev=20000)
|
185 |
+
|
186 |
+
|
187 |
+
x_slider = st.slider('X Value', min_value=float(min(x)), max_value=float(max(x))+1, value=float(x_mean), step=1.)
|
188 |
+
|
189 |
+
# Calculate the corresponding value on the fitted curve
|
190 |
+
x_slider_scaled = (x_slider - x_mean) / x_std
|
191 |
+
y_slider_fit = sigmoid(x_slider_scaled, *params)
|
192 |
+
|
193 |
+
# Display the corresponding value
|
194 |
+
st.write(f'{target_column}: {format_numbers(x_slider)}')
|
195 |
+
st.write(f'Corresponding App_installs: {format_numbers(y_slider_fit)}')
|
196 |
+
|
197 |
+
# Scatter plot of your data
|
198 |
+
fig = px.scatter(data_frame=data, x=x_scaled, y=y, labels={'x': f'{target_column}', 'y': 'App Installs'}, title=title)
|
199 |
+
|
200 |
+
# Add the fitted sigmoid curve to the plot
|
201 |
+
x_fit = np.linspace(min(x_scaled), max(x_scaled), 100) # Generate x values for the curve
|
202 |
+
y_fit = sigmoid(x_fit, *params)
|
203 |
+
fig.add_trace(px.line(x=x_fit, y=y_fit).data[0])
|
204 |
+
fig.data[1].update(line=dict(color='orange'))
|
205 |
+
fig.add_vline(x=x_slider_scaled, line_dash='dash', line_color='red', annotation_text=f'{format_numbers(x_slider)}')
|
206 |
+
|
207 |
+
x_tick_labels = {format_axis(x_scaled[i]): format_axis(x[i]) for i in range(len(x_scaled))}
|
208 |
+
num_points = 30 # Number of points you want to select
|
209 |
+
keys = list(x_tick_labels.keys())
|
210 |
+
values = list(x_tick_labels.values())
|
211 |
+
spacing = len(keys) // num_points # Calculate the spacing
|
212 |
+
if spacing==0:
|
213 |
+
spacing=15
|
214 |
+
selected_keys = keys[::spacing]
|
215 |
+
selected_values = values[::spacing]
|
216 |
+
else:
|
217 |
+
selected_keys = keys[::spacing]
|
218 |
+
selected_values = values[::spacing]
|
219 |
+
|
220 |
+
# Update the x-axis ticks with the selected keys and values
|
221 |
+
fig.update_xaxes(tickvals=selected_keys, ticktext=selected_values)
|
222 |
+
fig.update_xaxes(tickvals=list(x_tick_labels.keys()), ticktext=list(x_tick_labels.values()))
|
223 |
+
# Show the plot using st.plotly_chart
|
224 |
+
|
225 |
+
fig.update_xaxes(showgrid=False)
|
226 |
+
fig.update_yaxes(showgrid=False)
|
227 |
+
fig.update_layout(
|
228 |
+
width=600, # Adjust the width as needed
|
229 |
+
height=600 # Adjust the height as needed
|
230 |
+
)
|
231 |
+
st.plotly_chart(fig)
|
232 |
+
|
233 |
+
|
234 |
+
|
235 |
+
|
236 |
+
st.markdown('Tactic level')
|
237 |
+
if channel=='paid_social':
|
238 |
+
|
239 |
+
tactic_data=pd.read_excel("Tatcic_paid.xlsx",sheet_name='paid_social_impressions')
|
240 |
+
else:
|
241 |
+
tactic_data=pd.read_excel("Tatcic_paid.xlsx",sheet_name='digital_app_display_impressions')
|
242 |
+
target_column = st.selectbox('Select Channel)',[col for col in tactic_data.columns if col!='Date' and col!='app_installs_appsflyer'])
|
243 |
+
fig=line_plot_target(tactic_data, target=str(target_column), title=f'{str(target_column)} Over Time')
|
244 |
+
st.plotly_chart(fig, use_container_width=True)
|
245 |
+
|
246 |
+
if st.checkbox('Cap Outliers',key='tactic1'):
|
247 |
+
x = tactic_data[target_column]
|
248 |
+
x_mean = np.mean(x)
|
249 |
+
x_std = np.std(x)
|
250 |
+
x_scaled = (x - x_mean) / x_std
|
251 |
+
lower_threshold = -2.0
|
252 |
+
upper_threshold = 2.0
|
253 |
+
x_scaled = np.clip(x_scaled, lower_threshold, upper_threshold)
|
254 |
+
else:
|
255 |
+
x = tactic_data[target_column]
|
256 |
+
x_mean = np.mean(x)
|
257 |
+
x_std = np.std(x)
|
258 |
+
x_scaled = (x - x_mean) / x_std
|
259 |
+
|
260 |
+
if st.checkbox('Attributed',key='tactic2'):
|
261 |
+
column=[col for col in attributred_app_installs_tactic.columns if col in target_column]
|
262 |
+
tactic_data['app_installs_appsflyer']=attributred_app_installs_tactic[column]
|
263 |
+
y=tactic_data['app_installs_appsflyer']
|
264 |
+
title='Attributed-App_installs_appsflyer'
|
265 |
+
# st.dataframe(y)
|
266 |
+
# st.dataframe(x)
|
267 |
+
# st.dataframe(x_scaled)
|
268 |
+
else:
|
269 |
+
y=data["app_installs_appsflyer"]
|
270 |
+
title='App_installs_appsflyer'
|
271 |
+
# st.write(len(y))
|
272 |
+
# Curve fitting function
|
273 |
+
def sigmoid(x, K, a, x0):
|
274 |
+
return K / (1 + np.exp(-a * (x - x0)))
|
275 |
+
|
276 |
+
# Curve fitting
|
277 |
+
# st.dataframe(x_scaled.head(3))
|
278 |
+
# # y=y.astype(float)
|
279 |
+
# st.dataframe(y.head(3))
|
280 |
+
initial_K = np.max(y)
|
281 |
+
initial_a = 1
|
282 |
+
initial_x0 = 0
|
283 |
+
K = st.number_input('K (Amplitude)', min_value=0.01, max_value=2.0 * np.max(y), value=float(initial_K), step=5.0,key='tactic3')
|
284 |
+
a = st.number_input('a (Slope)', min_value=0.01, max_value=5.0, value=float(initial_a), step=2.0,key='tactic41')
|
285 |
+
x0 = st.number_input('x0 (Center)', min_value=float(min(x_scaled)), max_value=float(max(x_scaled)), value=float(initial_x0), step=2.0,key='tactic4')
|
286 |
+
params, _ = curve_fit(sigmoid, x_scaled, y, p0=[K, a, x0], maxfev=20000)
|
287 |
+
|
288 |
+
# Slider to vary x
|
289 |
+
x_slider = st.slider('X Value', min_value=float(min(x)), max_value=float(max(x)), value=float(x_mean), step=1.,key='tactic7')
|
290 |
+
|
291 |
+
# Calculate the corresponding value on the fitted curve
|
292 |
+
x_slider_scaled = (x_slider - x_mean) / x_std
|
293 |
+
y_slider_fit = sigmoid(x_slider_scaled, *params)
|
294 |
+
|
295 |
+
# Display the corresponding value
|
296 |
+
st.write(f'{target_column}: {format_axis(x_slider)}')
|
297 |
+
st.write(f'Corresponding App_installs: {format_axis(y_slider_fit)}')
|
298 |
+
|
299 |
+
# Scatter plot of your data
|
300 |
+
fig = px.scatter(data_frame=data, x=x_scaled, y=y, labels={'x': f'{target_column}', 'y': 'App Installs'}, title=title)
|
301 |
+
|
302 |
+
# Add the fitted sigmoid curve to the plot
|
303 |
+
x_fit = np.linspace(min(x_scaled), max(x_scaled), 100) # Generate x values for the curve
|
304 |
+
y_fit = sigmoid(x_fit, *params)
|
305 |
+
fig.add_trace(px.line(x=x_fit, y=y_fit).data[0])
|
306 |
+
fig.data[1].update(line=dict(color='orange'))
|
307 |
+
fig.add_vline(x=x_slider_scaled, line_dash='dash', line_color='red', annotation_text=f'{format_numbers(x_slider)}')
|
308 |
+
|
309 |
+
|
310 |
+
|
311 |
+
x_tick_labels = {format_axis((x_scaled[i],0)): format_axis(x[i]) for i in range(len(x_scaled))}
|
312 |
+
num_points = 50 # Number of points you want to select
|
313 |
+
keys = list(x_tick_labels.keys())
|
314 |
+
values = list(x_tick_labels.values())
|
315 |
+
spacing = len(keys) // num_points # Calculate the spacing
|
316 |
+
if spacing==0:
|
317 |
+
spacing=2
|
318 |
+
selected_keys = keys[::spacing]
|
319 |
+
selected_values = values[::spacing]
|
320 |
+
else:
|
321 |
+
selected_keys = keys[::spacing]
|
322 |
+
selected_values = values[::spacing]
|
323 |
+
|
324 |
+
# Update the x-axis ticks with the selected keys and values
|
325 |
+
fig.update_xaxes(tickvals=selected_keys, ticktext=selected_values)
|
326 |
+
|
327 |
+
# Round the x-axis and y-axis tick values to zero decimal places
|
328 |
+
fig.update_xaxes(tickformat=".f") # Format x-axis ticks to zero decimal places
|
329 |
+
fig.update_yaxes(tickformat=".f") # Format y-axis ticks to zero decimal places
|
330 |
+
|
331 |
+
# Show the plot using st.plotly_chart
|
332 |
+
fig.update_xaxes(showgrid=False)
|
333 |
+
fig.update_yaxes(showgrid=False)
|
334 |
+
fig.update_layout(
|
335 |
+
width=600, # Adjust the width as needed
|
336 |
+
height=600 # Adjust the height as needed
|
337 |
+
)
|
338 |
+
st.plotly_chart(fig)
|
Tatcic_paid.xlsx
ADDED
Binary file (21.5 kB). View file
|
|
Transformation_functions.py
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
import plotly.express as px
|
4 |
+
import plotly.graph_objects as go
|
5 |
+
from Eda_functions import format_numbers,line_plot,summary
|
6 |
+
import numpy as np
|
7 |
+
import re
|
8 |
+
|
9 |
+
def sanitize_key(key, prefix=""):
|
10 |
+
# Use regular expressions to remove non-alphanumeric characters and spaces
|
11 |
+
key = re.sub(r'[^a-zA-Z0-9]', '', key)
|
12 |
+
return f"{prefix}{key}"
|
13 |
+
|
14 |
+
|
15 |
+
def check_box(options, ad_stock_value,lag_value,num_columns=4, prefix=""):
|
16 |
+
num_rows = -(-len(options) // num_columns) # Ceiling division to calculate rows
|
17 |
+
|
18 |
+
selected_options = []
|
19 |
+
adstock_info = {} # Store adstock and lag info for each selected option
|
20 |
+
if ad_stock_value!=0:
|
21 |
+
for row in range(num_rows):
|
22 |
+
cols = st.columns(num_columns)
|
23 |
+
for col in cols:
|
24 |
+
if options:
|
25 |
+
option = options.pop(0)
|
26 |
+
key = sanitize_key(f"{option}_{row}", prefix=prefix)
|
27 |
+
selected = col.checkbox(option, key=key)
|
28 |
+
if selected:
|
29 |
+
selected_options.append(option)
|
30 |
+
|
31 |
+
# Input minimum and maximum adstock values
|
32 |
+
adstock = col.slider('Select Adstock Range', 0.0, 1.0, ad_stock_value, step=0.05, format="%.2f",key= f"adstock_{key}" )
|
33 |
+
|
34 |
+
# Input minimum and maximum lag values
|
35 |
+
lag = col.slider('Select Lag Range', 0, 7, lag_value, step=1,key=f"lag_{key}" )
|
36 |
+
|
37 |
+
# Create a dictionary to store adstock and lag info for the option
|
38 |
+
option_info = {
|
39 |
+
'adstock': adstock,
|
40 |
+
'lag': lag}
|
41 |
+
# Append the dictionary to the adstock_info list
|
42 |
+
adstock_info[option]=option_info
|
43 |
+
|
44 |
+
else:adstock_info[option]={
|
45 |
+
'adstock': ad_stock_value,
|
46 |
+
'lag': lag_value}
|
47 |
+
|
48 |
+
return selected_options, adstock_info
|
49 |
+
else:
|
50 |
+
for row in range(num_rows):
|
51 |
+
cols = st.columns(num_columns)
|
52 |
+
for col in cols:
|
53 |
+
if options:
|
54 |
+
option = options.pop(0)
|
55 |
+
key = sanitize_key(f"{option}_{row}", prefix=prefix)
|
56 |
+
selected = col.checkbox(option, key=key)
|
57 |
+
if selected:
|
58 |
+
selected_options.append(option)
|
59 |
+
|
60 |
+
# Input minimum and maximum lag values
|
61 |
+
lag = col.slider('Select Lag Range', 0, 7, lag_value, step=1,key=f"lag_{key}" )
|
62 |
+
|
63 |
+
# dictionary to store adstock and lag info for the option
|
64 |
+
option_info = {
|
65 |
+
'lag': lag}
|
66 |
+
# Append the dictionary to the adstock_info list
|
67 |
+
adstock_info[option]=option_info
|
68 |
+
|
69 |
+
else:adstock_info[option]={
|
70 |
+
'lag': lag_value}
|
71 |
+
|
72 |
+
return selected_options, adstock_info
|
73 |
+
|
74 |
+
def apply_lag(X, features,lag_dict):
|
75 |
+
#lag_data=pd.DataFrame()
|
76 |
+
for col in features:
|
77 |
+
for lag in range(lag_dict[col]['lag'][0], lag_dict[col]['lag'][1] + 1):
|
78 |
+
if lag>0:
|
79 |
+
X[f'{col}_lag{lag}'] = X[col].shift(periods=lag, fill_value=0)
|
80 |
+
return X
|
81 |
+
|
82 |
+
def apply_adstock(X, variable_name, decay):
|
83 |
+
values = X[variable_name].values
|
84 |
+
adstock = np.zeros(len(values))
|
85 |
+
|
86 |
+
for row in range(len(values)):
|
87 |
+
if row == 0:
|
88 |
+
adstock[row] = values[row]
|
89 |
+
else:
|
90 |
+
adstock[row] = values[row] + adstock[row - 1] * decay
|
91 |
+
|
92 |
+
return adstock
|
93 |
+
|
94 |
+
def top_correlated_features(df,target,media_data):
|
95 |
+
corr_df=df.drop(target,axis=1)
|
96 |
+
#corr_df[target]=df[target]
|
97 |
+
#st.dataframe(corr_df)
|
98 |
+
for i in media_data:
|
99 |
+
#st.write(media_data[2])
|
100 |
+
#st.dataframe(corr_df.filter(like=media_data[2]))
|
101 |
+
d=(pd.concat([corr_df.filter(like=i),df[target]],axis=1)).corr()[target]
|
102 |
+
d=d.sort_values(ascending=False)
|
103 |
+
d=d.drop(target,axis=0)
|
104 |
+
corr=pd.DataFrame({'Feature_name':d.index,"Correlation":d.values})
|
105 |
+
corr.columns = pd.MultiIndex.from_product([[i], ['Feature_name', 'Correlation']])
|
106 |
+
|
107 |
+
return corr
|
108 |
+
|
109 |
+
def top_correlated_features(df,variables,target):
|
110 |
+
correlation_df=pd.DataFrame()
|
111 |
+
for col in variables:
|
112 |
+
d=pd.concat([df.filter(like=col),df[target]],axis=1).corr()[target]
|
113 |
+
#st.dataframe(d)
|
114 |
+
d=d.sort_values(ascending=False).iloc[1:]
|
115 |
+
corr_df=pd.DataFrame({'Media_channel':d.index,'Correlation':d.values})
|
116 |
+
corr_df.columns=pd.MultiIndex.from_tuples([(col, 'Variable'), (col, 'Correlation')])
|
117 |
+
correlation_df=pd.concat([corr_df,correlation_df],axis=1)
|
118 |
+
return correlation_df
|
119 |
+
|
120 |
+
def top_correlated_feature(df,variable,target):
|
121 |
+
d=pd.concat([df.filter(like=variable),df[target]],axis=1).corr()[target]
|
122 |
+
# st.dataframe(d)
|
123 |
+
d=d.sort_values(ascending=False).iloc[1:]
|
124 |
+
# st.dataframe(d)
|
125 |
+
corr_df=pd.DataFrame({'Media_channel':d.index,'Correlation':d.values})
|
126 |
+
corr_df['Adstock']=corr_df['Media_channel'].map(lambda x:x.split('_adst')[1] if len(x.split('_adst'))>1 else '-')
|
127 |
+
corr_df['Lag']=corr_df['Media_channel'].map(lambda x:x.split('_lag')[1][0] if len(x.split('_lag'))>1 else '-' )
|
128 |
+
corr_df.drop(['Correlation'],axis=1,inplace=True)
|
129 |
+
corr_df['Correlation']=np.round(d.values,2)
|
130 |
+
sorted_corr_df= corr_df.loc[corr_df['Correlation'].abs().sort_values(ascending=False).index]
|
131 |
+
#corr_df.columns=pd.MultiIndex.from_tuples([(variable, 'Variable'), (variable, 'Correlation')])
|
132 |
+
#correlation_df=pd.concat([corr_df,correlation_df],axis=1)
|
133 |
+
return sorted_corr_df
|
Untitled.ipynb
ADDED
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": null,
|
6 |
+
"id": "def0e525",
|
7 |
+
"metadata": {},
|
8 |
+
"outputs": [],
|
9 |
+
"source": []
|
10 |
+
},
|
11 |
+
{
|
12 |
+
"cell_type": "code",
|
13 |
+
"execution_count": 1,
|
14 |
+
"id": "6f07a1fb",
|
15 |
+
"metadata": {},
|
16 |
+
"outputs": [
|
17 |
+
{
|
18 |
+
"ename": "ModuleNotFoundError",
|
19 |
+
"evalue": "No module named 'streamlit'",
|
20 |
+
"output_type": "error",
|
21 |
+
"traceback": [
|
22 |
+
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
23 |
+
"\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
|
24 |
+
"\u001b[1;32m~\\AppData\\Local\\Temp\\ipykernel_10272\\318308029.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mstreamlit\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mst\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;31m# Define the pages of your app\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mpage1\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mst\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"This is page 1\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
|
25 |
+
"\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'streamlit'"
|
26 |
+
]
|
27 |
+
}
|
28 |
+
],
|
29 |
+
"source": [
|
30 |
+
"import streamlit as st\n",
|
31 |
+
"\n",
|
32 |
+
"# Define the pages of your app\n",
|
33 |
+
"def page1():\n",
|
34 |
+
" st.write(\"This is page 1\")\n",
|
35 |
+
"\n",
|
36 |
+
"def page2():\n",
|
37 |
+
" st.write(\"This is page 2\")\n",
|
38 |
+
"\n",
|
39 |
+
"# Create a sidebar menu\n",
|
40 |
+
"st.sidebar.header(\"Menu\")\n",
|
41 |
+
"button1 = st.sidebar.button(\"Page 1\")\n",
|
42 |
+
"button2 = st.sidebar.button(\"Page 2\")\n",
|
43 |
+
"\n",
|
44 |
+
"# Display the selected page\n",
|
45 |
+
"if button1:\n",
|
46 |
+
" page1()\n",
|
47 |
+
"elif button2:\n",
|
48 |
+
" page2()"
|
49 |
+
]
|
50 |
+
},
|
51 |
+
{
|
52 |
+
"cell_type": "code",
|
53 |
+
"execution_count": null,
|
54 |
+
"id": "751f3256",
|
55 |
+
"metadata": {},
|
56 |
+
"outputs": [],
|
57 |
+
"source": []
|
58 |
+
}
|
59 |
+
],
|
60 |
+
"metadata": {
|
61 |
+
"kernelspec": {
|
62 |
+
"display_name": "Python 3 (ipykernel)",
|
63 |
+
"language": "python",
|
64 |
+
"name": "python3"
|
65 |
+
},
|
66 |
+
"language_info": {
|
67 |
+
"codemirror_mode": {
|
68 |
+
"name": "ipython",
|
69 |
+
"version": 3
|
70 |
+
},
|
71 |
+
"file_extension": ".py",
|
72 |
+
"mimetype": "text/x-python",
|
73 |
+
"name": "python",
|
74 |
+
"nbconvert_exporter": "python",
|
75 |
+
"pygments_lexer": "ipython3",
|
76 |
+
"version": "3.9.13"
|
77 |
+
}
|
78 |
+
},
|
79 |
+
"nbformat": 4,
|
80 |
+
"nbformat_minor": 5
|
81 |
+
}
|
Variables.csv
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Variable,Variable Bucket,Master Bucket,Base Bucket
|
2 |
+
Non Promo Price,Price,Price,Internal
|
3 |
+
Base Price,Price,Price,Internal
|
4 |
+
Promo Price,Price,Price,Internal
|
5 |
+
Average Price,Price,Price,Internal
|
6 |
+
Price,Price,Price,Internal
|
7 |
+
Distribution,Distribution,Distribution,Internal
|
8 |
+
Weighted Distribution,Distribution,Distribution,Internal
|
9 |
+
TDP,Distribution,Distribution,Internal
|
10 |
+
Promo,Promotion,Promotion,Internal
|
11 |
+
Depth of Deal,Promotion,Promotion,Internal
|
12 |
+
Discount,Promotion,Promotion,Internal
|
13 |
+
Volume�,Sales,Sales,Dependent
|
14 |
+
Value,Sales,Sales,Dependent
|
15 |
+
Sales,Sales,Sales,Dependent
|
16 |
+
Market Share,Sales,Sales,Dependent
|
17 |
+
TV,TV,Offline Media,Media
|
18 |
+
Display,Display,Online Media,Media
|
19 |
+
Video,Video,Online Media,Media
|
20 |
+
OLV,Video,Online Media,Media
|
21 |
+
Facebook,Facebook,Online Media,Media
|
22 |
+
Twitter,Twitter,Online Media,Media
|
23 |
+
Instagram,Instagram,Online Media,Media
|
24 |
+
Pintrest,Pintrest,Online Media,Media
|
25 |
+
YouTube,YouTube,Online Media,Media
|
26 |
+
Bing,Paid Search,Online Media,Media
|
27 |
+
Google,Paid Search,Online Media,Media
|
28 |
+
Paid Search,Paid Search,Online Media,Media
|
29 |
+
Search,Paid Search,Online Media,Media
|
30 |
+
OOH,OOH,Offline Media,Media
|
31 |
+
Radio,Radio,Offline Media,Media
|
32 |
+
Audio Streaming,Audio Streaming,Online Media,Media
|
33 |
+
Streaming,Audio Streaming,Online Media,Media
|
34 |
+
Podcasts,Audio Streaming,Online Media,Media
|
35 |
+
Pandora,Audio Streaming,Online Media,Media
|
36 |
+
Spotify,Audio Streaming,Online Media,Media
|
37 |
+
Mobility,COVID,COVID,External
|
38 |
+
Stringency,COVID,COVID,External
|
39 |
+
Cases,COVID,COVID,External
|
40 |
+
Deaths,COVID,COVID,External
|
41 |
+
CPI,Macroeconomic,Macroeconomic,External
|
42 |
+
Unemployment Rate,Macroeconomic,Macroeconomic,External
|
43 |
+
Fourier Waves,Seasonality,Seasonality,External
|
44 |
+
Trend,Market,Seasonality,External
|
45 |
+
Easter,Holiday,Seasonality,External
|
46 |
+
MLK Jr. Day,Holiday,Seasonality,External
|
47 |
+
Memorial Day,Holiday,Seasonality,External
|
48 |
+
Juneteenth,Holiday,Seasonality,External
|
49 |
+
Independence Day,Holiday,Seasonality,External
|
50 |
+
Labour Day,Holiday,Seasonality,External
|
51 |
+
Thanksgiving,Holiday,Seasonality,External
|
52 |
+
Christmas,Holiday,Seasonality,External
|
53 |
+
New Year's,Holiday,Seasonality,External
|
Variables.xlsx
ADDED
Binary file (12.9 kB). View file
|
|
actual_data.csv
ADDED
@@ -0,0 +1,158 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
,const,clicks_search_decay.2,impressions_tv_lag3,online_edu_trend_lag3,clicks_digital_lag2_decay.3,impressions_streaming_lag2_decay.4,covid_cases_lag3,unemployement_rate_lead4,season,flag_Aug_1,flag_Aug_2,flag_Aug_3,flag_dec_1,flag_dec_-1,flag_dec_-2,flag_dec_-3,flag_easter_-1,flag_easter_-2,flag_may_-1,flag_may_-2,flag_jun_-1,flag_jun_-2,covid_flag1,flag_june28,flag_aug13,flag_sep13,flag_mar_feb,date,total_prospect_id
|
2 |
+
0,1.0,0.03264506089026503,0.0,0.0,0.0,0.11920857922376585,0.0,0.2448979591836735,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2019-11-10,3106
|
3 |
+
1,1.0,0.1203178311529351,0.0,0.0,0.0,0.23575959332216032,0.0,0.2448979591836735,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2019-11-17,7809
|
4 |
+
2,1.0,0.037674240888288246,0.0,0.0,0.30427286753070926,0.14866425214344534,0.0,0.2448979591836735,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2019-11-24,5658
|
5 |
+
3,1.0,0.114056065999327,0.25459834519940233,0.5700000000000001,0.3210660307498862,0.06375317695001911,0.0,0.2448979591836735,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2019-12-01,7528
|
6 |
+
4,1.0,0.15091848146432302,0.04759636387261456,0.58,0.2652143429433443,0.02550166207848893,0.0,0.2380952380952381,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2019-12-08,8913
|
7 |
+
5,1.0,0.09691798534505919,0.0,0.41000000000000003,0.27398476053158455,0.22803554179688423,0.0,0.2380952380952381,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2019-12-15,7974
|
8 |
+
6,1.0,0.0,0.2185391903071715,0.53,0.3093665823461814,0.3016670242357716,0.0,0.2380952380952381,106,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2019-12-22,5034
|
9 |
+
7,1.0,0.06818143419410627,0.0645557652165116,0.6,0.35005256364095544,0.3915886857834677,0.0,0.2380952380952381,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2019-12-29,8296
|
10 |
+
8,1.0,0.19748095587743647,0.0,0.49,0.2866388037412839,0.4644891817948484,0.0,0.2380952380952381,108,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-01-05,10953
|
11 |
+
9,1.0,0.2718903484441833,0.31632836028874944,0.42,0.38339772931601046,0.4758788391710054,0.0,0.2380952380952381,109,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2020-01-12,11583
|
12 |
+
10,1.0,0.29329394272923165,0.710207473795361,0.56,0.4716341482535363,0.47415700741999534,0.0,0.2380952380952381,110,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2020-01-19,11650
|
13 |
+
11,1.0,0.3150710926081645,0.6225458397661645,0.66,0.5560651882029227,0.2282082561307921,0.0,0.2380952380952381,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-01-26,10086
|
14 |
+
12,1.0,0.23335326208386092,0.5093471390869946,0.65,0.5990392189890996,0.09128427138188955,0.0,0.2993197278911565,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-02-02,8454
|
15 |
+
13,1.0,0.18339704064539092,0.46920681970876166,0.66,0.5097387360461574,0.03651393215188798,0.0,0.2993197278911565,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-02-09,7842
|
16 |
+
14,1.0,0.1829206162885479,0.5702922924005152,0.64,0.3647117781342298,0.5333315970976881,0.0,0.2993197278911565,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-02-16,8528
|
17 |
+
15,1.0,0.17708137647064887,0.4762803199026322,0.62,0.2994390381863003,0.9999999999999999,0.0,0.2993197278911565,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-02-23,9230
|
18 |
+
16,1.0,0.2110785179466496,0.31643298954206356,0.65,0.318727924805625,0.5153399788387041,0.0,0.2993197278911565,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-03-01,8210
|
19 |
+
17,1.0,0.1922309642774856,0.35110354589746834,0.65,0.3435805763353255,0.20613623376787482,0.0,1.0,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-03-08,6573
|
20 |
+
18,1.0,0.1174971533357681,0.4397302099507956,0.64,0.37079693119819457,0.08245451214041095,0.0,1.0,118,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2020-03-15,4464
|
21 |
+
19,1.0,0.04487177585471158,0.5651604986093057,0.66,0.3797815418753292,0.032981804856164386,3.6661729553753427e-06,1.0,119,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2020-03-22,5498
|
22 |
+
20,1.0,0.04417426781579725,0.5142518574426083,0.77,0.3239901926717436,0.013192796475509808,0.00016497778299189042,1.0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-03-29,7134
|
23 |
+
21,1.0,0.09508966430933447,0.4246084040047787,1.0,0.22766051203571303,0.005277118590203924,0.01074555293220513,0.8979591836734694,121,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,2020-04-05,6507
|
24 |
+
22,1.0,0.1727148072921107,0.3306303340730278,0.92,0.2557126494916798,0.0021108474360815696,0.07506489126131015,0.8979591836734694,122,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,2020-04-12,6752
|
25 |
+
23,1.0,0.2757761792524949,0.9059477066272279,0.87,0.2910560761584964,0.0008443389744326279,0.11051311756683434,0.8979591836734694,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-04-19,7874
|
26 |
+
24,1.0,0.46164669127102737,1.0,0.8200000000000001,0.29288325042575475,0.0003377355897730512,0.1323451775160945,0.8979591836734694,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-04-26,8706
|
27 |
+
25,1.0,0.3631365926708698,0.8555262504044332,0.85,0.3143348639913703,0.00013509423590922048,0.12527679605813083,0.8979591836734694,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-05-03,9593
|
28 |
+
26,1.0,0.3556269301486625,0.5998066602658987,0.8,0.3573452157072908,5.4838924587260594e-05,0.08418266340132861,0.7482993197278912,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-05-10,9554
|
29 |
+
27,1.0,0.3898924329688705,0.31953123019194307,0.76,0.3492819601843694,0.08837696494340691,0.06699197841357364,0.7482993197278912,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-05-17,9461
|
30 |
+
28,1.0,0.3270785638817633,0.5040802333471541,0.88,0.37224504100306005,0.12944061135952373,0.04806352744497074,0.7482993197278912,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-05-24,8347
|
31 |
+
29,1.0,0.29596428185745655,0.6228739252579004,0.8300000000000001,0.3873711562094451,0.14079607140381442,0.028926104617911456,0.7482993197278912,129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-05-31,7926
|
32 |
+
30,1.0,0.23446621861142697,0.644779308361226,0.8,0.3519020717491842,0.15750706055823313,0.024482702995996537,0.6938775510204082,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-06-07,8606
|
33 |
+
31,1.0,0.2202508917985891,0.726916988225644,0.71,0.32726146750928653,0.0797309833640819,0.022000703905207433,0.6938775510204082,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-06-14,7573
|
34 |
+
32,1.0,0.18610614076735926,0.5963517592669729,0.73,0.31618831243754153,0.03501476889363339,0.015086301711369536,0.6938775510204082,132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2020-06-21,6983
|
35 |
+
33,1.0,0.1568177529621934,0.6764095796293655,0.75,0.2836099513597926,0.014005944823975384,0.011489786042146325,0.6938775510204082,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-06-28,6277
|
36 |
+
34,1.0,0.22774801916471138,0.6466210070345804,0.72,0.25409997289933184,0.006272411362367827,0.00871449311492719,0.5714285714285715,134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-07-05,7421
|
37 |
+
35,1.0,0.24542124594101095,0.6580063264819511,0.73,0.2516667689694555,0.05947462601462651,0.008318546435746652,0.5714285714285715,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-07-12,7852
|
38 |
+
36,1.0,0.24895270375190542,0.32749815383926373,0.68,0.2671053898526598,0.0888609058832765,0.008014254080450499,0.5714285714285715,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-07-19,7396
|
39 |
+
37,1.0,0.16285259960994197,0.3666961464656464,0.78,0.26077100654286645,0.12420199588573878,0.008058248155915004,0.5714285714285715,137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-07-26,7041
|
40 |
+
38,1.0,0.16864346155569104,0.39341698388602436,0.84,0.25893225300958655,0.10423952696584138,0.00920209411799211,0.5714285714285715,138,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-08-02,7470
|
41 |
+
39,1.0,0.22582910125625383,0.41507293852636135,0.8300000000000001,0.2528768986269057,0.08197739941078482,0.009315745479608745,0.5374149659863946,139,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-08-09,8725
|
42 |
+
40,1.0,0.2778946696783185,0.7857143231388266,0.8,0.2772125371796957,0.07178679747906064,0.007237025413910927,0.5374149659863946,140,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-08-16,9657
|
43 |
+
41,1.0,0.3062154076077969,0.434016630925742,0.87,0.33174759696083367,0.12078972986041582,0.006500124649880482,0.5374149659863946,141,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2020-08-23,10000
|
44 |
+
42,1.0,0.2851073700683267,0.4051792323256236,0.8200000000000001,0.3621387745268235,0.1539969659046611,0.006118842662521447,0.5374149659863946,142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-08-30,8941
|
45 |
+
43,1.0,0.25999778433367665,0.4113785668398346,0.77,0.3604714968693371,0.1462622685965232,0.006375474769397721,0.4693877551020409,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-09-06,8507
|
46 |
+
44,1.0,0.2947500457787596,0.43576671635701947,0.74,0.3084711376902622,0.1030893445960345,0.0060051913009048115,0.4693877551020409,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2020-09-13,9887
|
47 |
+
45,1.0,0.3239559328273078,0.40721834097732834,0.72,0.24061271129609485,0.08422768334333634,0.006456130574415978,0.4693877551020409,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-09-20,9627
|
48 |
+
46,1.0,0.3189849597494306,0.4831656702512836,0.68,0.28577062852640756,0.054400116894051116,0.006401137980085348,0.4693877551020409,146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-09-27,8735
|
49 |
+
47,1.0,0.2930673557404469,0.5423730023996388,0.62,0.32330756771945346,0.02176006539088146,0.007566980979894707,0.45578231292517013,147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-10-04,8138
|
50 |
+
48,1.0,0.27381401410957934,0.48862464971809444,0.59,0.33668984325037016,0.008704026156352586,0.009172764734349107,0.45578231292517013,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-10-11,7966
|
51 |
+
49,1.0,0.21658154029531146,0.5162854532967293,0.55,0.44481231480084876,0.003481610462541034,0.012223020633221393,0.45578231292517013,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-10-18,8109
|
52 |
+
50,1.0,0.21772903332032795,0.47368257634991157,0.6,0.46141705479304307,0.0013926441850164136,0.013601501664442522,0.45578231292517013,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-10-25,7848
|
53 |
+
51,1.0,0.16712357438522701,0.5132571164009214,0.5,0.38402389059771924,0.0005570576740065655,0.012915927321787332,0.45578231292517013,151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-11-01,6516
|
54 |
+
52,1.0,0.1814031347156822,0.5409537987241609,0.5,0.2968208337801042,0.00022282306960262618,0.013091903623645349,0.45578231292517013,152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-11-08,7233
|
55 |
+
53,1.0,0.16852532779394064,0.49490997931858044,0.5,0.22663075929954526,8.912922784105048e-05,0.014624363918992243,0.45578231292517013,153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-11-15,7409
|
56 |
+
54,1.0,0.10492104198879731,0.4086344123814518,0.41000000000000003,0.21669561761817938,3.565169113642019e-05,0.016127494830696133,0.45578231292517013,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-11-22,6232
|
57 |
+
55,1.0,0.16920169406380464,0.45151008168804235,0.49,0.21833619946593313,1.4260676454568076e-05,0.024849320291534072,0.45578231292517013,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-11-29,8170
|
58 |
+
56,1.0,0.1305885456099783,0.4543635808918873,0.47000000000000003,0.1596898931167178,5.704270581827231e-06,0.03519159419864792,0.435374149659864,156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-12-06,7075
|
59 |
+
57,1.0,0.1214984593864375,0.35070760971315756,0.4,0.15417676852356046,2.2817082327308923e-06,0.041732046751037526,0.435374149659864,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-12-13,7379
|
60 |
+
58,1.0,0.057042007816384965,0.32470890321593604,0.47000000000000003,0.15442387578570832,9.126832930923571e-07,0.049892947749703036,0.435374149659864,158,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-12-20,5442
|
61 |
+
59,1.0,0.12406882983279183,0.3135816516054531,0.45,0.1671308209739812,3.650733172369429e-07,0.0686930826648678,0.435374149659864,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2020-12-27,7735
|
62 |
+
60,1.0,0.24786523070013738,0.3102913429236421,0.42,0.16347790840061424,1.4602932689477716e-07,0.0732574679943101,0.435374149659864,160,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-01-03,9754
|
63 |
+
61,1.0,0.26083059672146286,0.2649240941306087,0.34,0.25327016920452516,5.841173075791087e-08,0.07444897420480709,0.4217687074829932,161,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2021-01-10,10641
|
64 |
+
62,1.0,0.24028847292133387,0.6513962629200784,0.38,0.3773812732234543,2.3364692303164347e-08,0.08318546435746653,0.4217687074829932,162,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2021-01-17,10230
|
65 |
+
63,1.0,0.31526302386797916,0.531674302460824,0.47000000000000003,0.3527386460097067,9.345876921265738e-09,0.10258685163731283,0.4217687074829932,163,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-01-24,10352
|
66 |
+
64,1.0,0.2966293410018717,0.44836670500794606,0.47000000000000003,0.3711695518795665,3.738350768506295e-09,0.13234151134313912,0.4217687074829932,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-01-31,9216
|
67 |
+
65,1.0,0.20088776123137192,0.3815806999416851,0.45,0.33580461662371014,1.4953403074025183e-09,0.12043744775703538,0.40816326530612246,165,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-02-07,8421
|
68 |
+
66,1.0,0.173394454128539,0.343687050600215,0.48,0.3277941002786073,5.981361229610074e-10,0.11271648751301491,0.40816326530612246,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-02-14,9281
|
69 |
+
67,1.0,0.1777198044422716,0.33051072402008147,0.5,0.31487397296804576,2.3925444918440296e-10,0.109699227170741,0.40816326530612246,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-02-21,8891
|
70 |
+
68,1.0,0.1850269016675808,0.30627520154343757,0.46,0.3133091660972597,9.570177967376119e-11,0.08255854878209734,0.40816326530612246,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-02-28,8169
|
71 |
+
69,1.0,0.2529549962208855,0.298123038215738,0.42,0.3358964981168952,3.828071186950448e-11,0.08351908609640568,0.40816326530612246,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-03-07,8724
|
72 |
+
70,1.0,0.213028120324469,0.3267901551549544,0.44,0.3038053348505854,1.531228474780179e-11,0.07285052279626343,0.40816326530612246,170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-03-14,8194
|
73 |
+
71,1.0,0.16441430466323353,0.25967469209260036,0.5,0.32087357753439977,6.124913899120717e-12,0.07822879852179906,0.40816326530612246,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-03-21,8254
|
74 |
+
72,1.0,0.11053130189212229,0.260168451958828,0.42,0.3279459500984871,2.449965559648287e-12,0.07333812379932836,0.40816326530612246,172,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-03-28,7026
|
75 |
+
73,1.0,0.06917021315146277,0.0,0.38,0.37411287881420296,9.799862238593149e-13,0.07465061371735272,0.39455782312925175,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-04-04,6412
|
76 |
+
74,1.0,0.06728264676731566,0.0,0.44,0.4347510050616973,3.9199448954372595e-13,0.0732721326861316,0.39455782312925175,174,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,2021-04-11,6297
|
77 |
+
75,1.0,0.10167805497311716,0.0,0.43,0.4574504815633023,1.5679779581749037e-13,0.07982724993034271,0.39455782312925175,175,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,2021-04-18,6687
|
78 |
+
76,1.0,0.1734619149834527,0.0,0.48,0.48912312446006045,6.271911832699615e-14,0.06941165256412136,0.39455782312925175,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-04-25,8430
|
79 |
+
77,1.0,0.2040432878056308,0.0,0.46,0.44466429049983563,2.5087647330798465e-14,0.06276854716898124,0.39455782312925175,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-05-02,8025
|
80 |
+
78,1.0,0.20788046814877387,0.0,0.48,0.5722675873212515,1.0035058932319387e-14,0.04882242524673344,0.40136054421768713,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-05-09,8242
|
81 |
+
79,1.0,0.14929264058846564,0.0,0.5,0.45913415146070335,4.014023572927755e-15,0.033618806000791895,0.40136054421768713,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-05-16,8280
|
82 |
+
80,1.0,0.11694210039888364,0.0,0.51,0.39528662679579885,1.6056094291711022e-15,0.025182942030473228,0.40136054421768713,180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-05-23,7909
|
83 |
+
81,1.0,0.055184035342337234,0.0,0.51,0.3880077087936407,6.422437716684409e-16,0.017652622780132275,0.40136054421768713,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-05-30,7574
|
84 |
+
82,1.0,0.04358787034563821,0.0,0.5,0.3863265622647678,2.568975086673764e-16,0.012651962869000308,0.3673469387755103,182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-06-06,7270
|
85 |
+
83,1.0,0.03833609653008979,0.0,0.46,0.3784495643657444,1.0275900346695056e-16,0.008835476822454577,0.3673469387755103,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-06-13,6716
|
86 |
+
84,1.0,0.06111263589867566,0.0,0.48,0.38862024435317233,4.1103601386780226e-17,0.005939200187708055,0.3673469387755103,184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-06-20,6944
|
87 |
+
85,1.0,0.07119833324643848,0.0,0.44,0.4039000969934476,1.644144055471209e-17,0.004967664354533589,0.3673469387755103,185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2021-06-27,6803
|
88 |
+
86,1.0,0.0659956847282599,0.0,0.45,0.4420872417106599,6.576576221884836e-18,0.004359079643941282,0.3537414965986395,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-07-04,7019
|
89 |
+
87,1.0,0.12577031397293442,0.0,0.45,0.4950177419852857,2.630630488753935e-18,0.003977797656582247,0.3537414965986395,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-07-11,8254
|
90 |
+
88,1.0,0.1502746019886232,0.0,0.45,0.5650602702260171,1.052252195501574e-18,0.0040621196345558795,0.3537414965986395,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-07-18,7804
|
91 |
+
89,1.0,0.21001397285486328,0.0,0.42,0.594015126140436,4.209008782006296e-19,0.004952999662712088,0.3537414965986395,189,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-07-25,8212
|
92 |
+
90,1.0,0.23464189851384848,0.0,0.46,0.5484130743981998,1.6836035128025183e-19,0.008076579020691881,0.3537414965986395,190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-08-01,8378
|
93 |
+
91,1.0,0.23496148203757855,0.0,0.47000000000000003,0.5324473242588711,6.734414051210074e-20,0.01220102359548914,0.3197278911564626,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-08-08,9496
|
94 |
+
92,1.0,0.23319893582092505,0.0,0.53,0.5532778727756644,2.6937656204840295e-20,0.020152952735698258,0.3197278911564626,192,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-08-15,9511
|
95 |
+
93,1.0,0.23262329847201318,0.0,0.49,0.7309984534528141,1.0775062481936118e-20,0.029028757460661962,0.3197278911564626,193,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-08-22,9569
|
96 |
+
94,1.0,0.18495638415853394,0.0,0.46,0.8724050615489382,4.310024992774448e-21,0.03698435277382646,0.3197278911564626,194,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-08-29,7928
|
97 |
+
95,1.0,0.2921700012245981,0.0,0.49,1.0,1.7240099971097793e-21,0.03982197064128697,0.3129251700680272,195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-09-05,7840
|
98 |
+
96,1.0,0.4172971677569805,0.0,0.48,0.8193686075762131,6.896039988439117e-22,0.03868179085216524,0.3129251700680272,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-09-12,9521
|
99 |
+
97,1.0,0.5004920981884484,0.0,0.53,0.4496097944711011,2.758415995375647e-22,0.03902274493701515,0.3129251700680272,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-09-19,9451
|
100 |
+
98,1.0,0.6383788968475093,0.0,0.47000000000000003,0.3701822126418114,1.1033663981502588e-22,0.03567186285580209,0.3129251700680272,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-09-26,8898
|
101 |
+
99,1.0,0.6501651617929107,0.0,0.51,0.34258196039636274,4.413465592601035e-23,0.0352539191388893,0.3129251700680272,199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-10-03,8441
|
102 |
+
100,1.0,0.6649283374522998,0.0,0.51,0.31355701111053985,1.7653862370404143e-23,0.03635010485254652,0.28571428571428575,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-10-10,8788
|
103 |
+
101,1.0,0.6097114754591861,0.0,0.51,0.32306971094469733,7.061544948161657e-24,0.031323781730726925,0.28571428571428575,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-10-17,9569
|
104 |
+
102,1.0,0.3964279757062242,0.0,0.51,0.33051520280988034,2.8246179792646632e-24,0.02719933715592967,0.28571428571428575,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-10-24,9008
|
105 |
+
103,1.0,0.33105364706311086,0.0,0.47000000000000003,0.3259978333423606,1.1298471917058652e-24,0.025967503042923553,0.28571428571428575,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-10-31,8495
|
106 |
+
104,1.0,0.31714045716637634,0.0,0.55,0.3045528431182349,4.519388766823461e-25,0.02263128565353199,0.2653061224489796,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-11-07,8807
|
107 |
+
105,1.0,0.28268319082761023,0.0,0.49,0.31370309424641213,1.8077555067293845e-25,0.01786159463858867,0.2653061224489796,205,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-11-14,8385
|
108 |
+
106,1.0,0.15774740707436136,0.0,0.51,0.37945364695975814,7.231022026917538e-26,0.016409790148260033,0.2653061224489796,206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-11-21,6964
|
109 |
+
107,1.0,0.2836203500514554,0.0,0.55,0.36793503370466,2.892408810767015e-26,0.01882946429880776,0.2653061224489796,207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-11-28,9340
|
110 |
+
108,1.0,0.33646919882766096,0.0,0.49,0.3299836196379579,1.1569635243068062e-26,0.023555161238286576,0.272108843537415,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-12-05,8632
|
111 |
+
109,1.0,0.361268166630245,0.0,0.38,0.3243428164088717,4.6278540972272255e-27,0.029421037966887126,0.272108843537415,209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-12-12,9271
|
112 |
+
110,1.0,0.21850759166298056,0.0,0.51,0.34100191273497404,1.8511416388908902e-27,0.029549354020325262,0.272108843537415,210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-12-19,7663
|
113 |
+
111,1.0,0.2156152088113536,0.0,0.43,0.3876459690915292,7.404566555563562e-28,0.04853646375621416,0.272108843537415,211,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2021-12-26,7888
|
114 |
+
112,1.0,0.4122692273972545,0.0,0.42,0.44121852053456856,2.961826622225425e-28,0.07303383144403221,0.272108843537415,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-01-02,11088
|
115 |
+
113,1.0,0.5580863257308297,0.0,0.42,0.33648328199770844,1.18473064889017e-28,0.2914790808171166,0.2585034013605442,213,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-01-09,12850
|
116 |
+
114,1.0,0.5441541455767391,0.0,0.45,0.5258301345263098,4.7389225955606806e-29,0.6228644542534939,0.2585034013605442,214,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2022-01-16,12768
|
117 |
+
115,1.0,0.37953926965668333,0.0,0.51,0.6191133700101356,1.8955690382242722e-29,1.0,0.2585034013605442,215,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2022-01-23,11023
|
118 |
+
116,1.0,0.3422525462363791,0.0,0.5,0.6600516747429145,7.582276152897087e-30,0.8603298089190655,0.2585034013605442,216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-01-30,10317
|
119 |
+
117,1.0,0.3679329127754763,0.0,0.49,0.6150147631969254,3.0329104611588346e-30,0.3851571321728674,0.2448979591836735,217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-02-06,10109
|
120 |
+
118,1.0,0.3530129569359208,0.0,0.49,0.5435710104633258,1.2131641844635335e-30,0.18207314748280565,0.2448979591836735,218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2022-02-13,10233
|
121 |
+
119,1.0,0.3628237688509028,0.0,0.48,0.5395383650448762,4.852656737854129e-31,0.08532284319045035,0.2448979591836735,219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2022-02-20,10660
|
122 |
+
120,1.0,0.3535562124344392,0.0,0.49,0.3713089856353334,1.941062695141646e-31,0.04778123212740684,0.2448979591836735,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2022-02-27,9862
|
123 |
+
121,1.0,0.35851767100446613,0.0,0.49,0.33021424233802193,7.764250780566529e-32,0.028365180155739026,0.2448979591836735,221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2022-03-06,10393
|
124 |
+
122,1.0,0.3648140365425708,0.0,0.53,0.29899648842829235,3.105700312226557e-32,0.019053100849085656,0.2448979591836735,222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2022-03-13,9914
|
125 |
+
123,1.0,0.417768904168966,0.0,0.46,0.30801461857263196,1.242280124890568e-32,0.014096435013418193,0.2448979591836735,223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2022-03-20,11027
|
126 |
+
124,1.0,0.45364666714531404,0.0,0.5,0.29874033139572204,4.9691204995617213e-33,0.013440190054406007,0.2448979591836735,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-03-27,10066
|
127 |
+
125,1.0,0.45997433293937545,0.0,0.45,0.3080341285301519,1.9876481998241388e-33,0.014672024167412121,0.2448979591836735,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-04-03,8722
|
128 |
+
126,1.0,0.4245480429075594,0.0,0.46,0.304189689538618,7.950592799291056e-34,0.01936472555029256,0.2448979591836735,226,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,2022-04-10,7805
|
129 |
+
127,1.0,0.4463068738641009,0.0,0.54,0.307818077305473,3.1802371197109226e-34,0.027822586558343475,0.2448979591836735,227,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,2022-04-17,8519
|
130 |
+
128,1.0,0.6012222981571669,0.0,0.53,0.29394180576819906,1.272094847878869e-34,0.033340176856183366,0.2448979591836735,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-04-24,10084
|
131 |
+
129,1.0,0.6804106164543928,0.0,0.5,0.28219281269675367,5.088379391460478e-35,0.04576117082899503,0.2448979591836735,229,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-05-01,10291
|
132 |
+
130,1.0,0.62805714350389,0.0,0.54,0.30839694661979145,2.035351756529193e-35,0.05172603422739071,0.2448979591836735,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-05-08,9743
|
133 |
+
131,1.0,0.7470007501508245,0.0,0.54,0.3120111152265925,8.141407025566787e-36,0.04952999662712088,0.2448979591836735,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-05-15,10759
|
134 |
+
132,1.0,0.6460736106378411,0.0,0.55,0.2905779236460707,3.25656280967673e-36,0.06457597043598129,0.2448979591836735,232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-05-22,9845
|
135 |
+
133,1.0,0.5732108245519132,0.0,0.52,0.38068837954927237,1.3026251233207076e-36,0.080201199571791,0.2448979591836735,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-05-29,9499
|
136 |
+
134,1.0,0.5996683384067256,0.0,0.5,0.3940488499594224,5.210500487782985e-37,0.09049581323048496,0.40680272108843546,234,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-06-05,10021
|
137 |
+
135,1.0,0.5630659455826548,0.0,0.54,0.4539755399873685,2.0842001896133483e-37,0.09128037424293528,0.40680272108843546,235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-06-12,10112
|
138 |
+
136,1.0,0.5482324249484887,0.0,0.45,0.48814019600803654,8.336800703454939e-38,0.08289217052103649,0.40680272108843546,236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-06-19,10034
|
139 |
+
137,1.0,0.5485743918729864,0.0,0.47000000000000003,0.475428506654356,3.3347202263835196e-38,0.06987359035649866,0.40680272108843546,237,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2022-06-26,9209
|
140 |
+
138,1.0,0.5559932625646005,0.0,0.43,0.510072176038165,1.333888035554951e-38,0.06264756346145385,0.40680272108843546,238,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-07-03,10265
|
141 |
+
139,1.0,0.6089718159266746,0.0,0.45,0.44215508529036335,5.33555159223524e-39,0.0627612148230705,0.40680272108843546,239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-07-10,10033
|
142 |
+
140,1.0,0.6101706458097598,0.0,0.48,0.41550269661979555,2.1342200869095313e-39,0.07072780865510112,0.40680272108843546,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-07-17,9790
|
143 |
+
141,1.0,0.6111403594460636,0.0,0.44,0.437146146258812,8.536874847792479e-40,0.07964760745552932,0.40680272108843546,241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-07-24,9629
|
144 |
+
142,1.0,0.6451477728019566,0.0,0.44,0.4975101423754845,3.4147444392713438e-40,0.0893739643061401,0.40680272108843546,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-07-31,10134
|
145 |
+
143,1.0,0.7267513590970145,0.0,0.44,0.5042632593424633,1.3658922758628901e-40,0.09389435556011791,0.40680272108843546,243,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-08-07,12029
|
146 |
+
144,1.0,0.832744074444703,0.0,0.46,0.5840915039533217,5.463514104995084e-41,0.08482790984147467,0.40680272108843546,244,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-08-14,12886
|
147 |
+
145,1.0,0.8546151893753493,0.0,0.49,0.6374603327364593,2.1853506435415578e-41,0.07962194424484169,0.40680272108843546,245,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-08-21,12027
|
148 |
+
146,1.0,0.9999999999999998,0.0,0.55,0.6022458246191313,8.740852589601472e-42,0.07178366646624922,0.40680272108843546,246,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-08-28,11375
|
149 |
+
147,1.0,0.860672618209781,0.0,0.48,0.5735957859704555,3.495791051275827e-42,0.05725095687114135,0.40680272108843546,247,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-09-04,10824
|
150 |
+
148,1.0,0.8622728019659036,0.0,0.54,0.5790428094946118,1.39776643594557e-42,0.050739833702394745,0.40680272108843546,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-09-11,12285
|
151 |
+
149,1.0,0.7774120906393625,0.0,0.55,0.7618650061054455,5.585565898134668e-43,0.0440857297883885,0.40680272108843546,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-09-18,12146
|
152 |
+
150,1.0,0.6580209603679659,0.0,0.52,0.8137272725878776,2.2287265136062566e-43,0.039975949905412735,0.40680272108843546,250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-09-25,10881
|
153 |
+
151,1.0,0.9480011027127861,0.0,0.52,0.7867690657367606,8.859907597948911e-44,0.03648941942485079,0.40680272108843546,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-10-02,11373
|
154 |
+
152,1.0,0.709096498806814,0.0,0.46,0.7292818780372798,3.4889645827034517e-44,0.04076784326377381,0.40680272108843546,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-10-09,10230
|
155 |
+
153,1.0,0.5414415970743589,0.0,0.45,0.6974583695681711,1.340587376605267e-44,0.04368978310920796,0.0,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-10-16,11557
|
156 |
+
154,1.0,0.6081525119323576,0.0,0.54,0.6240593695822464,4.812364941659934e-45,0.041156457597043596,0.0,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-10-23,10805
|
157 |
+
155,1.0,0.5960421531458853,0.0,0.45,0.5899287906913332,1.3749614119028383e-45,0.03843982343711047,0.0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-10-30,9709
|
158 |
+
156,1.0,0.848521629204434,0.0,0.47000000000000003,0.6201930426013046,0.0,0.040723849188309305,0.0,256,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2022-11-06,10098
|
attributed_app_installs.csv
ADDED
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Date,kwai,programmatic,infleux,affiliates,influencer,liftOff,indicacao,paid_social,paid_search,digital_app
|
2 |
+
5/8/2023,1288.00,40700.00,6487.00,334.00,292.00,,2328.00,6014.00,376.00,7809.00
|
3 |
+
5/9/2023,1142.00,49323.00,17330.00,369.00,95.00,,2786.00,6947.00,346.00,8572.00
|
4 |
+
5/10/2023,1102.00,55768.00,17065.00,381.00,151.00,,2331.00,6132.00,332.00,13655.00
|
5 |
+
5/11/2023,968.00,54028.00,2531.00,435.00,65.00,,2710.00,6448.00,277.00,10213.00
|
6 |
+
5/12/2023,1026.00,57084.00,2802.00,352.00,31.00,,1706.00,4688.00,368.00,7793.00
|
7 |
+
5/13/2023,947.00,49772.00,2618.00,410.00,39.00,,1005.00,3727.00,278.00,6496.00
|
8 |
+
5/14/2023,982.00,42586.00,1735.00,212.00,20.00,,606.00,4034.00,304.00,5933.00
|
9 |
+
5/15/2023,1229.00,44786.00,3993.00,363.00,142.00,,944.00,7368.00,492.00,8754.00
|
10 |
+
5/16/2023,1510.00,23624.00,4656.00,293.00,361.00,,1685.00,9297.00,685.00,12116.00
|
11 |
+
5/17/2023,1333.00,16330.00,2574.00,313.00,78.00,,1436.00,8341.00,580.00,10826.00
|
12 |
+
5/18/2023,1568.00,13638.00,3934.00,379.00,136.00,,1509.00,8253.00,663.00,11071.00
|
13 |
+
5/19/2023,1654.00,11303.00,6181.00,761.00,59.00,,1298.00,7020.00,452.00,10742.00
|
14 |
+
5/20/2023,1488.00,8442.00,6591.00,841.00,61.00,,1034.00,5369.00,388.00,9747.00
|
15 |
+
5/21/2023,1649.00,6554.00,3614.00,526.00,122.00,,932.00,5799.00,405.00,9750.00
|
16 |
+
5/22/2023,1970.00,7719.00,6489.00,585.00,260.00,,1724.00,9565.00,414.00,12472.00
|
17 |
+
5/23/2023,2009.00,6073.00,13353.00,1144.00,226.00,,3344.00,12431.00,423.00,13882.00
|
18 |
+
5/24/2023,1632.00,7326.00,29366.00,1099.00,353.00,,3058.00,12150.00,388.00,13386.00
|
19 |
+
5/25/2023,1552.00,6398.00,22134.00,1026.00,179.00,,1686.00,11246.00,438.00,12976.00
|
20 |
+
5/26/2023,1420.00,4885.00,8835.00,643.00,156.00,,1737.00,10253.00,301.00,12742.00
|
21 |
+
5/27/2023,1432.00,3330.00,837.00,694.00,305.00,,1043.00,8538.00,262.00,11130.00
|
22 |
+
5/28/2023,1469.00,2886.00,595.00,508.00,377.00,,852.00,8874.00,396.00,10421.00
|
23 |
+
5/29/2023,1912.00,3708.00,294.00,1037.00,430.00,,1140.00,9658.00,393.00,13118.00
|
24 |
+
5/30/2023,1885.00,3933.00,151.00,1285.00,290.00,,1484.00,10634.00,338.00,13613.00
|
25 |
+
5/31/2023,1788.00,4088.00,122.00,891.00,170.00,,1134.00,11050.00,308.00,12764.00
|
26 |
+
6/1/2023,1590.00,5903.00,2569.00,704.00,128.00,,1090.00,10741.00,352.00,12486.00
|
27 |
+
6/2/2023,1080.00,8770.00,12805.00,318.00,186.00,,2998.00,10287.00,373.00,11700.00
|
28 |
+
6/3/2023,1408.00,8642.00,7994.00,289.00,81.00,,1480.00,7418.00,308.00,10373.00
|
29 |
+
6/4/2023,1525.00,8564.00,1719.00,197.00,59.00,,1288.00,7261.00,388.00,9274.00
|
30 |
+
6/5/2023,2076.00,23087.00,6934.00,207.00,132.00,,3129.00,8344.00,414.00,11302.00
|
31 |
+
6/6/2023,2255.00,36438.00,9262.00,206.00,122.00,,2319.00,9198.00,347.00,11011.00
|
32 |
+
6/7/2023,1684.00,28492.00,4806.00,228.00,158.00,,1933.00,8926.00,327.00,11011.00
|
33 |
+
6/8/2023,1680.00,21198.00,5129.00,436.00,159.00,,3153.00,8018.00,327.00,10921.00
|
34 |
+
6/9/2023,1710.00,17539.00,9614.00,347.00,468.00,,2422.00,7554.00,312.00,11594.00
|
35 |
+
6/10/2023,1607.00,16781.00,10798.00,177.00,768.00,,1604.00,6771.00,265.00,10048.00
|
36 |
+
6/11/2023,1585.00,16103.00,9757.00,244.00,527.00,,2420.00,7142.00,351.00,8990.00
|
37 |
+
6/12/2023,2280.00,19985.00,32599.00,390.00,142.00,,2378.00,8370.00,355.00,11424.00
|
38 |
+
6/13/2023,2301.00,20032.00,18781.00,382.00,364.00,,2914.00,11230.00,231.00,11659.00
|
39 |
+
6/14/2023,2441.00,17781.00,5420.00,401.00,336.00,,6727.00,11677.00,243.00,12139.00
|
40 |
+
6/15/2023,2001.00,17475.00,3063.00,362.00,337.00,,4600.00,11042.00,205.00,11975.00
|
41 |
+
6/16/2023,1559.00,18589.00,6913.00,288.00,225.00,,2660.00,9589.00,197.00,10334.00
|
42 |
+
6/17/2023,1344.00,16684.00,14731.00,446.00,181.00,,1654.00,8078.00,247.00,10486.00
|
43 |
+
6/18/2023,1428.00,13121.00,4425.00,276.00,254.00,,1351.00,7665.00,254.00,8421.00
|
44 |
+
6/19/2023,3006.00,15667.00,8030.00,421.00,654.00,,2575.00,9870.00,222.00,11255.00
|
45 |
+
6/20/2023,3078.00,14867.00,9877.00,437.00,225.00,,2589.00,9765.00,177.00,11918.00
|
46 |
+
6/21/2023,2272.00,15676.00,13014.00,868.00,149.00,,2265.00,8808.00,242.00,11368.00
|
47 |
+
6/22/2023,1945.00,15265.00,23492.00,1141.00,130.00,,1647.00,8226.00,183.00,11004.00
|
48 |
+
6/23/2023,1387.00,12055.00,3871.00,843.00,185.00,,1607.00,6554.00,172.00,9504.00
|
49 |
+
6/24/2023,1214.00,11562.00,2595.00,738.00,156.00,,1140.00,5994.00,182.00,8598.00
|
50 |
+
6/25/2023,1284.00,10321.00,1698.00,720.00,143.00,,1083.00,6427.00,148.00,8928.00
|
51 |
+
6/26/2023,2875.00,18457.00,2964.00,965.00,176.00,,3393.00,9684.00,181.00,11725.00
|
52 |
+
6/27/2023,19196.00,20292.00,9721.00,1838.00,212.00,,2305.00,15145.00,163.00,13018.00
|
53 |
+
6/28/2023,8798.00,21042.00,10272.00,1758.00,217.00,,1903.00,13391.00,168.00,12053.00
|
54 |
+
6/29/2023,4154.00,20428.00,4701.00,2082.00,354.00,,1353.00,12793.00,181.00,10694.00
|
55 |
+
6/30/2023,3592.00,23386.00,16722.00,1472.00,223.00,,2577.00,11753.00,110.00,10481.00
|
56 |
+
7/1/2023,2228.00,22339.00,9384.00,643.00,187.00,,1707.00,9600.00,144.00,9286.00
|
57 |
+
7/2/2023,1987.00,20858.00,1703.00,385.00,135.00,,1383.00,9143.00,128.00,8862.00
|
58 |
+
7/3/2023,3915.00,25210.00,5633.00,463.00,238.00,,1939.00,9697.00,147.00,11153.00
|
59 |
+
7/4/2023,2724.00,26801.00,3450.00,765.00,362.00,,2221.00,10555.00,263.00,13861.00
|
60 |
+
7/5/2023,2266.00,30529.00,1968.00,1451.00,288.00,,3001.00,9884.00,261.00,12087.00
|
61 |
+
7/6/2023,1672.00,29553.00,4689.00,865.00,212.00,,2205.00,9597.00,306.00,11648.00
|
62 |
+
7/7/2023,1264.00,26246.00,6992.00,711.00,131.00,,2089.00,9069.00,264.00,11879.00
|
63 |
+
7/8/2023,779.00,31119.00,10085.00,354.00,147.00,,1603.00,7871.00,177.00,10482.00
|
64 |
+
7/9/2023,808.00,34519.00,12160.00,617.00,172.00,,1280.00,8256.00,199.00,11102.00
|
65 |
+
7/10/2023,1849.00,38974.00,8876.00,1359.00,187.00,,2806.00,10763.00,231.00,13778.00
|
66 |
+
7/11/2023,1395.00,39853.00,6306.00,812.00,233.00,,3194.00,11520.00,305.00,13638.00
|
67 |
+
7/12/2023,915.00,39488.00,5658.00,465.00,275.00,,2478.00,10513.00,265.00,13475.00
|
68 |
+
7/13/2023,784.00,38985.00,4748.00,416.00,198.00,,1718.00,9359.00,271.00,12806.00
|
69 |
+
7/14/2023,642.00,41370.00,3258.00,473.00,93.00,,1637.00,8356.00,226.00,11876.00
|
70 |
+
7/15/2023,1079.00,35785.00,7205.00,352.00,114.00,,1081.00,8391.00,193.00,9804.00
|
71 |
+
7/16/2023,1032.00,33732.00,6358.00,585.00,272.00,,992.00,8058.00,186.00,9582.00
|
72 |
+
7/17/2023,2221.00,38984.00,21064.00,1361.00,629.00,,1367.00,9374.00,291.00,14371.00
|
73 |
+
7/18/2023,2472.00,39646.00,14006.00,562.00,637.00,,1969.00,9739.00,313.00,14747.00
|
74 |
+
7/19/2023,2310.00,37678.00,3564.00,733.00,357.00,,1692.00,8863.00,278.00,13663.00
|
75 |
+
7/20/2023,1717.00,31168.00,4942.00,849.00,323.00,,1454.00,8634.00,253.00,14105.00
|
76 |
+
7/21/2023,1463.00,27594.00,3407.00,934.00,174.00,,2952.00,7685.00,285.00,13502.00
|
77 |
+
7/22/2023,1036.00,24110.00,4003.00,540.00,162.00,,1497.00,6960.00,181.00,11720.00
|
78 |
+
7/23/2023,1076.00,21429.00,15905.00,404.00,107.00,,1327.00,7049.00,209.00,10774.00
|
79 |
+
7/24/2023,19918.00,29327.00,16483.00,841.00,369.00,,1652.00,7879.00,283.00,14695.00
|
80 |
+
7/25/2023,5916.00,31067.00,4763.00,1823.00,216.00,,2741.00,9392.00,322.00,12746.00
|
81 |
+
7/26/2023,2539.00,26779.00,13059.00,938.00,339.00,,4440.00,8635.00,342.00,13402.00
|
82 |
+
7/27/2023,1988.00,22906.00,7033.00,709.00,308.00,,2393.00,7833.00,283.00,14259.00
|
83 |
+
7/28/2023,1694.00,17737.00,5687.00,811.00,394.00,,2196.00,8285.00,276.00,13903.00
|
84 |
+
7/29/2023,1307.00,15747.00,5040.00,581.00,231.00,,1452.00,5978.00,212.00,12056.00
|
85 |
+
7/30/2023,1087.00,14087.00,6960.00,361.00,264.00,,1183.00,8881.00,180.00,10473.00
|
86 |
+
7/31/2023,1698.00,16651.00,8138.00,978.00,554.00,,1892.00,8064.00,253.00,13298.00
|
87 |
+
8/1/2023,1584.00,19548.00,19096.00,1199.00,295.00,,2039.00,10193.00,246.00,13319.00
|
88 |
+
8/2/2023,1287.00,21316.00,25399.00,596.00,358.00,,1823.00,10449.00,256.00,12639.00
|
89 |
+
8/3/2023,789.00,24972.00,10283.00,1172.00,470.00,,1767.00,9557.00,295.00,13199.00
|
90 |
+
8/4/2023,599.00,28800.00,7615.00,1528.00,218.00,,1765.00,9335.00,265.00,12797.00
|
91 |
+
8/5/2023,509.00,30164.00,1635.00,607.00,146.00,,1423.00,7318.00,201.00,10992.00
|
92 |
+
8/6/2023,657.00,28744.00,8482.00,444.00,134.00,,1057.00,7068.00,209.00,10032.00
|
93 |
+
8/7/2023,655.00,31661.00,13393.00,690.00,277.00,,1712.00,9477.00,223.00,13492.00
|
94 |
+
8/8/2023,16724.00,27018.00,3826.00,644.00,642.00,,1825.00,9874.00,278.00,14869.00
|
95 |
+
8/9/2023,5052.00,22298.00,3987.00,1234.00,326.00,,1788.00,8164.00,249.00,13835.00
|
96 |
+
8/10/2023,2163.00,20758.00,7292.00,856.00,233.00,,1770.00,5483.00,314.00,14140.00
|
97 |
+
8/11/2023,1458.00,21989.00,1794.00,563.00,171.00,,3508.00,4514.00,289.00,12734.00
|
98 |
+
8/12/2023,1193.00,21976.00,2653.00,668.00,114.00,,2672.00,5526.00,260.00,11861.00
|
99 |
+
8/13/2023,1071.00,20555.00,5735.00,334.00,67.00,,1355.00,5250.00,171.00,9997.00
|
100 |
+
8/14/2023,981.00,18964.00,5567.00,766.00,154.00,,1918.00,7422.00,283.00,14346.00
|
101 |
+
8/15/2023,1742.00,11521.00,10914.00,692.00,164.00,,2544.00,6474.00,273.00,14606.00
|
102 |
+
8/16/2023,1844.00,10205.00,9543.00,563.00,201.00,,2155.00,6510.00,258.00,15722.00
|
103 |
+
8/17/2023,1441.00,8660.00,5135.00,1599.00,195.00,,2964.00,5975.00,331.00,15800.00
|
104 |
+
8/18/2023,1047.00,8049.00,9064.00,1005.00,206.00,,2433.00,4641.00,181.00,14757.00
|
105 |
+
8/19/2023,760.00,7624.00,3085.00,654.00,313.00,,1643.00,4040.00,146.00,12854.00
|
106 |
+
8/20/2023,948.00,7379.00,2100.00,622.00,104.00,,1530.00,4365.00,241.00,12268.00
|
107 |
+
8/21/2023,16826.00,8039.00,3604.00,798.00,106.00,,2219.00,6360.00,197.00,16239.00
|
108 |
+
8/22/2023,6593.00,6858.00,5907.00,1511.00,123.00,,2471.00,6934.00,178.00,17038.00
|
109 |
+
8/23/2023,2212.00,7890.00,1880.00,2324.00,136.00,,2077.00,6495.00,176.00,16713.00
|
110 |
+
8/24/2023,1924.00,7037.00,3201.00,2041.00,474.00,0.00,1785.00,5788.00,177.00,16546.00
|
111 |
+
8/25/2023,1514.00,6394.00,4675.00,3533.00,1066.00,,1555.00,3903.00,151.00,15247.00
|
112 |
+
8/26/2023,1386.00,5221.00,5288.00,2164.00,788.00,,1060.00,3533.00,77.00,13893.00
|
113 |
+
8/27/2023,1297.00,4894.00,4731.00,1954.00,508.00,,893.00,3280.00,106.00,13230.00
|
114 |
+
8/28/2023,1449.00,4716.00,5862.00,3798.00,1009.00,,1711.00,6600.00,147.00,17934.00
|
115 |
+
8/29/2023,1496.00,4342.00,11350.00,4918.00,749.00,,1898.00,8506.00,123.00,17837.00
|
116 |
+
8/30/2023,1555.00,4329.00,11220.00,3942.00,467.00,,1769.00,8095.00,103.00,16827.00
|
117 |
+
8/31/2023,1303.00,3517.00,4275.00,2163.00,453.00,,1711.00,6598.00,181.00,15673.00
|
118 |
+
9/1/2023,1147.00,3793.00,1566.00,1282.00,312.00,,1779.00,5612.00,153.00,14141.00
|
119 |
+
9/2/2023,842.00,3251.00,1541.00,1191.00,325.00,,1597.00,5272.00,189.00,13243.00
|
120 |
+
9/3/2023,857.00,2630.00,3518.00,860.00,274.00,,1405.00,5280.00,175.00,12029.00
|
121 |
+
9/4/2023,16898.00,3592.00,12863.00,1498.00,548.00,,1943.00,6044.00,256.00,17086.00
|
122 |
+
9/5/2023,7340.00,4304.00,6825.00,1573.00,361.00,,2098.00,6356.00,202.00,16723.00
|
123 |
+
9/6/2023,2525.00,3456.00,2212.00,945.00,195.00,,2214.00,5479.00,216.00,15336.00
|
124 |
+
9/7/2023,1612.00,3359.00,2113.00,659.00,162.00,,2288.00,5673.00,217.00,13811.00
|
125 |
+
9/8/2023,1491.00,3111.00,1529.00,791.00,361.00,,2294.00,4379.00,199.00,16072.00
|
126 |
+
9/9/2023,1404.00,2960.00,1124.00,869.00,161.00,,1894.00,4412.00,178.00,13661.00
|
127 |
+
9/10/2023,1237.00,3118.00,2495.00,723.00,166.00,,1596.00,4541.00,236.00,12630.00
|
128 |
+
9/11/2023,1476.00,3233.00,1968.00,1106.00,172.00,,2217.00,6446.00,246.00,15518.00
|
129 |
+
9/12/2023,1697.00,3012.00,9528.00,1414.00,228.00,,2187.00,7371.00,213.00,16968.00
|
130 |
+
9/13/2023,1548.00,2896.00,10313.00,909.00,179.00,,1834.00,6945.00,182.00,15771.00
|
attributed_app_installs_tactic.csv
ADDED
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Date,FB: Level Achieved - Tier 1,FB: Level Achieved - Tier 2,FB: Level Achieved - Tier 3,,FB: Test Campaigns,FB: Purchase Tier 3,FB: Purchase ,TikTok: Pangle Android Achieve Level,TikTok: Pangle Android Purchase,TikTok: Android Achieve Level,TikTok: Purchase Roas,TikTok: Pangle And Loanapply,TikTok: Bau,TikTok: Loanapply,TikTok: Spc Loan Apply
|
2 |
+
5/8/2023,2157,1008,1057,,1433,,2,0,0,,,356,1,0,
|
3 |
+
5/9/2023,2183,1108,1103,,2130,,,0,0,,,423,0,,
|
4 |
+
5/10/2023,2019,969,976,,1770,,1,0,0,,,397,0,0,
|
5 |
+
5/11/2023,2013,1033,999,,1983,,1,0,0,0,,419,0,0,
|
6 |
+
5/12/2023,1902,932,850,,644,,,0,0,,,360,0,0,
|
7 |
+
5/13/2023,1654,857,821,,75,,1,0,0,,0,319,0,0,
|
8 |
+
5/14/2023,1760,959,964,,62,,,0,0,0,,289,0,0,
|
9 |
+
5/15/2023,2777,1509,1350,,1306,,,0,0,,0,426,0,0,
|
10 |
+
5/16/2023,3458,1733,1447,,1864,,2,0,0,,,793,0,0,
|
11 |
+
5/17/2023,3190,1337,1264,,1566,,2,0,0,,,982,0,0,
|
12 |
+
5/18/2023,2946,1401,1251,,1553,,,0,0,0,0,1102,0,0,
|
13 |
+
5/19/2023,2861,1379,1147,,606,,3,0,0,,0,1024,0,0,0
|
14 |
+
5/20/2023,2341,1143,1017,,97,,,0,0,,,771,0,0,
|
15 |
+
5/21/2023,2519,1214,1108,,129,,3,0,0,0,0,826,0,0,
|
16 |
+
5/22/2023,3192,1481,1194,,2616,,2,0,0,,,1080,0,0,
|
17 |
+
5/23/2023,3829,1713,1377,,4161,,1,0,0,,,1350,0,0,
|
18 |
+
5/24/2023,3610,1881,1368,,3902,,,0,0,,,1389,0,0,
|
19 |
+
5/25/2023,3652,1663,1392,,3288,,1,0,0,,,1250,0,0,0
|
20 |
+
5/26/2023,3533,1739,1526,,2333,,,0,0,0,0,1122,0,0,
|
21 |
+
5/27/2023,3074,1474,1325,,1767,,,0,0,0,0,898,0,0,
|
22 |
+
5/28/2023,3031,1510,1515,,1639,,,0,0,,,1179,0,0,
|
23 |
+
5/29/2023,3533,1657,1638,,1529,,,0,0,,,1301,0,0,
|
24 |
+
5/30/2023,4003,1880,1650,,1831,,1,0,0,0,0,1269,0,0,
|
25 |
+
5/31/2023,4180,1986,1716,,1882,,,0,0,,,1286,0,0,
|
26 |
+
6/1/2023,4071,1963,1614,,1928,,1,0,0,,,1164,0,0,0
|
27 |
+
6/2/2023,4076,2053,1798,,1390,,1,0,0,,,969,0,0,
|
28 |
+
6/3/2023,3294,1600,1398,,397,,1,0,0,,,728,0,0,0
|
29 |
+
6/4/2023,3249,1608,1525,,143,,,0,0,0,0,736,0,0,
|
30 |
+
6/5/2023,3622,1940,1733,,184,,1,0,0,,,864,0,0,
|
31 |
+
6/6/2023,3934,1884,1929,,858,,1,0,0,0,0,592,,0,
|
32 |
+
6/7/2023,3217,1635,1546,,1848,,,0,0,0,0,680,0,0,
|
33 |
+
6/8/2023,3374,1685,1545,,727,,1,0,0,0,0,686,0,0,
|
34 |
+
6/9/2023,3368,1703,1556,,163,,1,0,0,0,0,763,,0,
|
35 |
+
6/10/2023,2936,1533,1440,,158,,1,0,0,0,0,703,0,0,
|
36 |
+
6/11/2023,3128,1591,1562,,132,,1,0,0,0,0,728,,0,
|
37 |
+
6/12/2023,3422,1990,1906,,174,,,0,0,0,0,878,,,
|
38 |
+
6/13/2023,3988,2176,1901,,1890,,,0,0,0,0,1275,0,0,
|
39 |
+
6/14/2023,4063,1917,1673,,2885,,1,0,0,0,0,1138,,0,
|
40 |
+
6/15/2023,3811,1862,1531,,2709,,4,0,0,0,0,1125,,0,
|
41 |
+
6/16/2023,3148,1621,1314,,2439,,,0,0,0,0,1067,,0,
|
42 |
+
6/17/2023,3091,1508,1367,,1142,,,0,0,0,0,970,0,0,
|
43 |
+
6/18/2023,3035,1640,1433,,589,,,0,0,0,0,968,,0,
|
44 |
+
6/19/2023,3400,1796,1590,,2014,,,0,0,0,0,1070,0,,
|
45 |
+
6/20/2023,3678,1847,1546,,1694,,3,0,0,0,,997,,0,
|
46 |
+
6/21/2023,3401,1696,1383,,1398,,1,0,0,,,929,0,0,
|
47 |
+
6/22/2023,3064,1564,1277,,1418,,1,0,0,,0,902,0,0,
|
48 |
+
6/23/2023,2697,1464,1252,,399,,,0,0,0,0,742,,,
|
49 |
+
6/24/2023,2601,1406,1231,,96,,2,0,0,,,658,,,
|
50 |
+
6/25/2023,2779,1477,1307,,100,,,0,0,0,0,764,0,0,
|
51 |
+
6/26/2023,4119,2082,1693,,839,,3,0,0,0,0,948,0,,
|
52 |
+
6/27/2023,5759,2618,1989,,3734,,6,0,0,0,0,1039,0,0,
|
53 |
+
6/28/2023,4519,2116,1677,,4252,,6,0,0,,,821,0,,
|
54 |
+
6/29/2023,4259,2131,1686,,4088,,1,0,0,0,0,628,0,0,
|
55 |
+
6/30/2023,3951,1933,1440,,3731,,1,0,0,,,697,,0,
|
56 |
+
7/1/2023,4124,1997,1729,,1049,,2,0,0,0,0,699,,0,
|
57 |
+
7/2/2023,4131,2183,1903,,224,,1,0,0,0,0,701,,0,
|
58 |
+
7/3/2023,4175,2312,1734,,654,,4,0,0,,,818,,,
|
59 |
+
7/4/2023,4255,2224,1516,,1759,,3,0,0,,,798,,,
|
60 |
+
7/5/2023,3907,2014,1249,,1897,,1,0,0,0,,816,,0,
|
61 |
+
7/6/2023,3636,1811,1250,,2232,,,0,0,0,0,668,,0,
|
62 |
+
7/7/2023,3616,1769,1216,,1779,,,0,0,0,0,689,,,
|
63 |
+
7/8/2023,3344,1811,1193,,856,,,0,0,0,,667,,,
|
64 |
+
7/9/2023,3583,1869,1425,,733,,1,0,0,,,645,,0,
|
65 |
+
7/10/2023,3986,2214,1452,,2416,,,0,0,,,695,0,0,
|
66 |
+
7/11/2023,4003,2072,1417,,3414,,,0,0,0,0,614,,,
|
67 |
+
7/12/2023,3776,1771,1317,,3062,,1,0,0,0,,586,,0,
|
68 |
+
7/13/2023,3271,1605,1108,,2837,,,0,0,,0,538,,0,
|
69 |
+
7/14/2023,3128,1695,1181,,1873,,1,0,0,,,478,0,0,
|
70 |
+
7/15/2023,3094,1860,1239,,1629,,,0,0,,,569,,0,
|
71 |
+
7/16/2023,2898,1848,1312,,1478,,,0,0,,,522,,0,
|
72 |
+
7/17/2023,3544,2136,1353,,1693,,2,0,0,,,646,,0,
|
73 |
+
7/18/2023,4029,2281,1230,,1621,,1,0,0,0,0,577,,,
|
74 |
+
7/19/2023,3707,2036,1152,,1432,,2,0,0,,0,534,,0,
|
75 |
+
7/20/2023,3499,2033,1187,,1430,,,0,0,,,485,,0,
|
76 |
+
7/21/2023,3288,1863,1084,,879,,,0,0,,,571,,0,
|
77 |
+
7/22/2023,3059,1805,1014,,583,,3,0,0,,0,496,0,0,
|
78 |
+
7/23/2023,3027,1838,1047,,581,,,0,0,0,,556,,,
|
79 |
+
7/24/2023,3517,1985,1059,,697,,4,0,0,,,617,,0,
|
80 |
+
7/25/2023,3928,2058,1232,,1579,,3,0,0,0,0,592,,0,
|
81 |
+
7/26/2023,3468,1967,1001,,1626,,1,0,0,0,0,572,,,
|
82 |
+
7/27/2023,3167,1699,966,,1437,,1,0,0,,,563,,,
|
83 |
+
7/28/2023,3220,1934,1184,,1433,,1,0,0,,,513,,0,
|
84 |
+
7/29/2023,2671,1339,866,,615,,1,0,0,,,486,,0,
|
85 |
+
7/30/2023,3488,2725,1488,,687,,,0,0,,,493,0,,
|
86 |
+
7/31/2023,3574,2173,1205,,631,,,0,0,,0,481,,,
|
87 |
+
8/1/2023,4020,2539,1227,,1659,90,1,0,0,,0,657,0,,
|
88 |
+
8/2/2023,3916,2541,799,,1947,496,1,0,0,0,0,749,,,
|
89 |
+
8/3/2023,3712,2265,683,,1811,420,,0,0,0,0,666,,0,
|
90 |
+
8/4/2023,3502,2346,662,,1824,491,,0,0,0,0,510,,0,
|
91 |
+
8/5/2023,3036,2163,660,,590,418,1,0,0,0,0,450,,0,
|
92 |
+
8/6/2023,3071,2180,683,,218,492,,0,0,0,0,424,0,0,
|
93 |
+
8/7/2023,3663,2321,700,,1669,580,1,0,0,0,0,543,,,
|
94 |
+
8/8/2023,3888,2108,718,,2073,547,4,0,0,0,0,536,,,
|
95 |
+
8/9/2023,3351,1614,559,,1746,410,3,0,0,,,481,,,
|
96 |
+
8/10/2023,2096,522,302,,1849,266,2,0,0,,,446,,0,
|
97 |
+
8/11/2023,1906,529,428,,842,316,2,0,0,,,491,,,
|
98 |
+
8/12/2023,2324,872,643,,716,491,,0,0,,0,480,,,
|
99 |
+
8/13/2023,2204,815,610,,709,506,1,0,0,,,405,,,0
|
100 |
+
8/14/2023,2693,965,666,,2008,539,1,0,0,0,,550,,,
|
101 |
+
8/15/2023,2338,645,559,,1947,447,,0,0,,,538,,,
|
102 |
+
8/16/2023,2372,676,529,,1870,463,,0,0,0,0,600,,0,
|
103 |
+
8/17/2023,2105,583,448,,1764,431,,0,0,0,0,644,,,
|
104 |
+
8/18/2023,1922,529,429,,815,349,,0,0,,0,597,,,
|
105 |
+
8/19/2023,1781,504,447,,440,337,,0,0,0,0,531,,0,
|
106 |
+
8/20/2023,1855,520,489,,510,421,,0,0,0,0,570,,,
|
107 |
+
8/21/2023,2034,606,543,,2095,498,6,0,0,0,,578,,,
|
108 |
+
8/22/2023,2307,644,572,,2313,577,1,0,0,0,0,520,,0,
|
109 |
+
8/23/2023,2184,603,549,,2139,499,,0,0,0,0,521,0,,
|
110 |
+
8/24/2023,1811,587,444,,2061,437,,0,0,,,448,,,
|
111 |
+
8/25/2023,1423,465,430,,790,360,,0,0,,,435,,,
|
112 |
+
8/26/2023,1406,468,422,,437,376,,0,0,0,,424,,,
|
113 |
+
8/27/2023,1226,455,391,,444,373,2,0,0,,,389,,0,0
|
114 |
+
8/28/2023,2074,728,655,,1990,662,,0,0,,,491,,,
|
115 |
+
8/29/2023,2885,1004,809,,2524,728,2,0,0,,,554,,,
|
116 |
+
8/30/2023,2728,1042,746,,2445,636,1,0,0,,,497,,0,
|
117 |
+
8/31/2023,2252,747,565,,2225,372,1,0,0,0,0,436,0,0,
|
118 |
+
9/1/2023,1968,756,614,,1187,630,,0,0,0,0,457,,,
|
119 |
+
9/2/2023,1935,791,610,,805,742,,0,0,0,0,389,,,
|
120 |
+
9/3/2023,1973,820,592,,801,715,1,0,0,0,0,378,,,
|
121 |
+
9/4/2023,2263,847,770,,922,712,3,0,0,0,0,527,,,
|
122 |
+
9/5/2023,2458,978,746,,983,728,3,0,0,0,0,460,,0,
|
123 |
+
9/6/2023,2151,848,797,,894,434,2,0,0,0,0,353,,,
|
124 |
+
9/7/2023,2334,872,1112,,871,61,,0,0,,,423,,0,
|
125 |
+
9/8/2023,1815,642,824,,615,25,,0,0,,,458,,,
|
126 |
+
9/9/2023,1877,693,903,,536,21,,0,0,0,0,382,,,
|
127 |
+
9/10/2023,1877,691,999,,586,19,,0,0,,,369,,,
|
128 |
+
9/11/2023,1876,1167,1063,,1843,18,1,0,0,,,478,,,
|
129 |
+
9/12/2023,2078,1477,1144,,2058,20,2,0,0,,,592,,,
|
130 |
+
9/13/2023,2156,1495,1018,,1687,18,,0,0,,,571,,0,
|
attributed_app_installs_tactic.xlsx
ADDED
Binary file (20.6 kB). View file
|
|
best_model.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:0e480110cbd1c42171bce8817f72439947d248219bb5ced0e812fc8fb8ae4ab0
|
3 |
+
size 42991
|
best_models.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:dff906988316f9b0e935e828d967162a5f23b402d69a1de1fcd884225cd6a349
|
3 |
+
size 3755214
|
bucket_data_VB.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:a9f69a244da265a73a960c323fb17b9e4d20170b051eed4dd34308ec69a5ae2f
|
3 |
+
size 656
|
classes.py
ADDED
@@ -0,0 +1,479 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
from scipy.optimize import minimize, LinearConstraint, NonlinearConstraint
|
3 |
+
from collections import OrderedDict
|
4 |
+
import pandas as pd
|
5 |
+
from numerize.numerize import numerize
|
6 |
+
|
7 |
+
|
8 |
+
def class_to_dict(class_instance):
|
9 |
+
attr_dict = {}
|
10 |
+
if isinstance(class_instance, Channel):
|
11 |
+
attr_dict["type"] = "Channel"
|
12 |
+
attr_dict["name"] = class_instance.name
|
13 |
+
attr_dict["dates"] = class_instance.dates
|
14 |
+
attr_dict["spends"] = class_instance.actual_spends
|
15 |
+
attr_dict["conversion_rate"] = class_instance.conversion_rate
|
16 |
+
attr_dict["modified_spends"] = class_instance.modified_spends
|
17 |
+
attr_dict["modified_sales"] = class_instance.modified_sales
|
18 |
+
attr_dict["response_curve_type"] = class_instance.response_curve_type
|
19 |
+
attr_dict["response_curve_params"] = (
|
20 |
+
class_instance.response_curve_params
|
21 |
+
)
|
22 |
+
attr_dict["penalty"] = class_instance.penalty
|
23 |
+
attr_dict["bounds"] = class_instance.bounds
|
24 |
+
attr_dict["actual_total_spends"] = class_instance.actual_total_spends
|
25 |
+
attr_dict["actual_total_sales"] = class_instance.actual_total_sales
|
26 |
+
attr_dict["modified_total_spends"] = (
|
27 |
+
class_instance.modified_total_spends
|
28 |
+
)
|
29 |
+
attr_dict["modified_total_sales"] = class_instance.modified_total_sales
|
30 |
+
attr_dict["actual_mroi"] = class_instance.get_marginal_roi("actual")
|
31 |
+
attr_dict["modified_mroi"] = class_instance.get_marginal_roi(
|
32 |
+
"modified"
|
33 |
+
)
|
34 |
+
|
35 |
+
elif isinstance(class_instance, Scenario):
|
36 |
+
attr_dict["type"] = "Scenario"
|
37 |
+
attr_dict["name"] = class_instance.name
|
38 |
+
channels = []
|
39 |
+
for channel in class_instance.channels.values():
|
40 |
+
channels.append(class_to_dict(channel))
|
41 |
+
attr_dict["channels"] = channels
|
42 |
+
attr_dict["constant"] = class_instance.constant
|
43 |
+
attr_dict["correction"] = class_instance.correction
|
44 |
+
attr_dict["actual_total_spends"] = class_instance.actual_total_spends
|
45 |
+
attr_dict["actual_total_sales"] = class_instance.actual_total_sales
|
46 |
+
attr_dict["modified_total_spends"] = (
|
47 |
+
class_instance.modified_total_spends
|
48 |
+
)
|
49 |
+
attr_dict["modified_total_sales"] = class_instance.modified_total_sales
|
50 |
+
|
51 |
+
return attr_dict
|
52 |
+
|
53 |
+
|
54 |
+
def class_from_dict(attr_dict):
|
55 |
+
if attr_dict["type"] == "Channel":
|
56 |
+
return Channel.from_dict(attr_dict)
|
57 |
+
elif attr_dict["type"] == "Scenario":
|
58 |
+
return Scenario.from_dict(attr_dict)
|
59 |
+
|
60 |
+
|
61 |
+
class Channel:
|
62 |
+
def __init__(
|
63 |
+
self,
|
64 |
+
name,
|
65 |
+
dates,
|
66 |
+
spends,
|
67 |
+
response_curve_type,
|
68 |
+
response_curve_params,
|
69 |
+
bounds,
|
70 |
+
conversion_rate=1,
|
71 |
+
modified_spends=None,
|
72 |
+
penalty=True,
|
73 |
+
):
|
74 |
+
self.name = name
|
75 |
+
self.dates = dates
|
76 |
+
self.conversion_rate = conversion_rate
|
77 |
+
self.actual_spends = spends.copy()
|
78 |
+
|
79 |
+
if modified_spends is None:
|
80 |
+
self.modified_spends = self.actual_spends.copy()
|
81 |
+
else:
|
82 |
+
self.modified_spends = modified_spends
|
83 |
+
|
84 |
+
self.response_curve_type = response_curve_type
|
85 |
+
self.response_curve_params = response_curve_params
|
86 |
+
self.bounds = bounds
|
87 |
+
self.penalty = penalty
|
88 |
+
|
89 |
+
self.upper_limit = self.actual_spends.max() + self.actual_spends.std()
|
90 |
+
self.power = np.ceil(np.log(self.actual_spends.max()) / np.log(10)) - 3
|
91 |
+
self.actual_sales = None
|
92 |
+
self.actual_sales = self.response_curve(self.actual_spends)
|
93 |
+
self.actual_total_spends = self.actual_spends.sum()
|
94 |
+
self.actual_total_sales = self.actual_sales.sum()
|
95 |
+
self.modified_sales = self.calculate_sales()
|
96 |
+
self.modified_total_spends = self.modified_spends.sum()
|
97 |
+
self.modified_total_sales = self.modified_sales.sum()
|
98 |
+
self.delta_spends = (
|
99 |
+
self.modified_total_spends - self.actual_total_spends
|
100 |
+
)
|
101 |
+
self.delta_sales = self.modified_total_sales - self.actual_total_sales
|
102 |
+
|
103 |
+
def update_penalty(self, penalty):
|
104 |
+
self.penalty = penalty
|
105 |
+
|
106 |
+
def _modify_spends(self, spends_array, total_spends):
|
107 |
+
return spends_array * total_spends / spends_array.sum()
|
108 |
+
|
109 |
+
def modify_spends(self, total_spends):
|
110 |
+
self.modified_spends = (
|
111 |
+
self.modified_spends * total_spends / self.modified_spends.sum()
|
112 |
+
)
|
113 |
+
|
114 |
+
def calculate_sales(self):
|
115 |
+
return self.response_curve(self.modified_spends)
|
116 |
+
|
117 |
+
def response_curve(self, x):
|
118 |
+
if self.penalty:
|
119 |
+
x = np.where(
|
120 |
+
x < self.upper_limit,
|
121 |
+
x,
|
122 |
+
self.upper_limit
|
123 |
+
+ (x - self.upper_limit) * self.upper_limit / x,
|
124 |
+
)
|
125 |
+
if self.response_curve_type == "s-curve":
|
126 |
+
if self.power >= 0:
|
127 |
+
x = x / 10**self.power
|
128 |
+
x = x.astype("float64")
|
129 |
+
K = self.response_curve_params["K"]
|
130 |
+
b = self.response_curve_params["b"]
|
131 |
+
a = self.response_curve_params["a"]
|
132 |
+
x0 = self.response_curve_params["x0"]
|
133 |
+
sales = K / (1 + b * np.exp(-a * (x - x0)))
|
134 |
+
if self.response_curve_type == "linear":
|
135 |
+
beta = self.response_curve_params["beta"]
|
136 |
+
sales = beta * x
|
137 |
+
|
138 |
+
return sales
|
139 |
+
|
140 |
+
def get_marginal_roi(self, flag):
|
141 |
+
K = self.response_curve_params["K"]
|
142 |
+
a = self.response_curve_params["a"]
|
143 |
+
# x = self.modified_total_spends
|
144 |
+
# if self.power >= 0 :
|
145 |
+
# x = x / 10**self.power
|
146 |
+
# x = x.astype('float64')
|
147 |
+
# return K*b*a*np.exp(-a*(x-x0)) / (1 + b * np.exp(-a*(x - x0)))**2
|
148 |
+
if flag == "actual":
|
149 |
+
y = self.response_curve(self.actual_spends)
|
150 |
+
# spends_array = self.actual_spends
|
151 |
+
# total_spends = self.actual_total_spends
|
152 |
+
# total_sales = self.actual_total_sales
|
153 |
+
|
154 |
+
else:
|
155 |
+
y = self.response_curve(self.modified_spends)
|
156 |
+
# spends_array = self.modified_spends
|
157 |
+
# total_spends = self.modified_total_spends
|
158 |
+
# total_sales = self.modified_total_sales
|
159 |
+
|
160 |
+
# spends_inc_1 = self._modify_spends(spends_array, total_spends+1)
|
161 |
+
mroi = a * (y) * (1 - y / K)
|
162 |
+
return mroi.sum() / len(self.modified_spends)
|
163 |
+
# spends_inc_1 = self.spends_array + 1
|
164 |
+
# new_total_sales = self.response_curve(spends_inc_1).sum()
|
165 |
+
# return (new_total_sales - total_sales) / len(self.modified_spends)
|
166 |
+
|
167 |
+
def update(self, total_spends):
|
168 |
+
self.modify_spends(total_spends)
|
169 |
+
self.modified_sales = self.calculate_sales()
|
170 |
+
self.modified_total_spends = self.modified_spends.sum()
|
171 |
+
self.modified_total_sales = self.modified_sales.sum()
|
172 |
+
self.delta_spends = (
|
173 |
+
self.modified_total_spends - self.actual_total_spends
|
174 |
+
)
|
175 |
+
self.delta_sales = self.modified_total_sales - self.actual_total_sales
|
176 |
+
|
177 |
+
def intialize(self):
|
178 |
+
self.new_spends = self.old_spends
|
179 |
+
|
180 |
+
def __str__(self):
|
181 |
+
return f"{self.name},{self.actual_total_sales}, {self.modified_total_spends}"
|
182 |
+
|
183 |
+
@classmethod
|
184 |
+
def from_dict(cls, attr_dict):
|
185 |
+
return Channel(
|
186 |
+
name=attr_dict["name"],
|
187 |
+
dates=attr_dict["dates"],
|
188 |
+
spends=attr_dict["spends"],
|
189 |
+
bounds=attr_dict["bounds"],
|
190 |
+
modified_spends=attr_dict["modified_spends"],
|
191 |
+
response_curve_type=attr_dict["response_curve_type"],
|
192 |
+
response_curve_params=attr_dict["response_curve_params"],
|
193 |
+
penalty=attr_dict["penalty"],
|
194 |
+
)
|
195 |
+
|
196 |
+
def update_response_curves(self, response_curve_params):
|
197 |
+
self.response_curve_params = response_curve_params
|
198 |
+
|
199 |
+
|
200 |
+
class Scenario:
|
201 |
+
def __init__(self, name, channels, constant, correction):
|
202 |
+
self.name = name
|
203 |
+
self.channels = channels
|
204 |
+
self.constant = constant
|
205 |
+
self.correction = correction
|
206 |
+
|
207 |
+
self.actual_total_spends = self.calculate_modified_total_spends()
|
208 |
+
self.actual_total_sales = self.calculate_actual_total_sales()
|
209 |
+
self.modified_total_sales = self.calculate_modified_total_sales()
|
210 |
+
self.modified_total_spends = self.calculate_modified_total_spends()
|
211 |
+
self.delta_spends = (
|
212 |
+
self.modified_total_spends - self.actual_total_spends
|
213 |
+
)
|
214 |
+
self.delta_sales = self.modified_total_sales - self.actual_total_sales
|
215 |
+
|
216 |
+
def update_penalty(self, value):
|
217 |
+
for channel in self.channels.values():
|
218 |
+
channel.update_penalty(value)
|
219 |
+
|
220 |
+
def calculate_modified_total_spends(self):
|
221 |
+
total_actual_spends = 0.0
|
222 |
+
for channel in self.channels.values():
|
223 |
+
total_actual_spends += (
|
224 |
+
channel.actual_total_spends * channel.conversion_rate
|
225 |
+
)
|
226 |
+
return total_actual_spends
|
227 |
+
|
228 |
+
def calculate_modified_total_spends(self):
|
229 |
+
total_modified_spends = 0.0
|
230 |
+
for channel in self.channels.values():
|
231 |
+
# import streamlit as st
|
232 |
+
# st.write(channel.modified_total_spends )
|
233 |
+
total_modified_spends += (
|
234 |
+
channel.modified_total_spends * channel.conversion_rate
|
235 |
+
)
|
236 |
+
return total_modified_spends
|
237 |
+
|
238 |
+
def calculate_actual_total_sales(self):
|
239 |
+
total_actual_sales = self.constant.sum() + self.correction.sum()
|
240 |
+
for channel in self.channels.values():
|
241 |
+
total_actual_sales += channel.actual_total_sales
|
242 |
+
return total_actual_sales
|
243 |
+
|
244 |
+
def calculate_modified_total_sales(self):
|
245 |
+
total_modified_sales = self.constant.sum() + self.correction.sum()
|
246 |
+
for channel in self.channels.values():
|
247 |
+
total_modified_sales += channel.modified_total_sales
|
248 |
+
return total_modified_sales
|
249 |
+
|
250 |
+
def update(self, channel_name, modified_spends):
|
251 |
+
self.channels[channel_name].update(modified_spends)
|
252 |
+
self.modified_total_sales = self.calculate_modified_total_sales()
|
253 |
+
self.modified_total_spends = self.calculate_modified_total_spends()
|
254 |
+
self.delta_spends = (
|
255 |
+
self.modified_total_spends - self.actual_total_spends
|
256 |
+
)
|
257 |
+
self.delta_sales = self.modified_total_sales - self.actual_total_sales
|
258 |
+
|
259 |
+
def optimize_spends(self, sales_percent, channels_list, algo="COBYLA"):
|
260 |
+
desired_sales = self.actual_total_sales * (1 + sales_percent / 100.0)
|
261 |
+
|
262 |
+
def constraint(x):
|
263 |
+
for ch, spends in zip(channels_list, x):
|
264 |
+
self.update(ch, spends)
|
265 |
+
return self.modified_total_sales - desired_sales
|
266 |
+
|
267 |
+
bounds = []
|
268 |
+
for ch in channels_list:
|
269 |
+
bounds.append(
|
270 |
+
(1 + np.array([-50.0, 100.0]) / 100.0)
|
271 |
+
* self.channels[ch].actual_total_spends
|
272 |
+
)
|
273 |
+
|
274 |
+
initial_point = []
|
275 |
+
for bound in bounds:
|
276 |
+
initial_point.append(bound[0])
|
277 |
+
|
278 |
+
power = np.ceil(np.log(sum(initial_point)) / np.log(10))
|
279 |
+
|
280 |
+
constraints = [NonlinearConstraint(constraint, -1.0, 1.0)]
|
281 |
+
|
282 |
+
res = minimize(
|
283 |
+
lambda x: sum(x) / 10 ** (power),
|
284 |
+
bounds=bounds,
|
285 |
+
x0=initial_point,
|
286 |
+
constraints=constraints,
|
287 |
+
method=algo,
|
288 |
+
options={"maxiter": int(2e7), "catol": 1},
|
289 |
+
)
|
290 |
+
|
291 |
+
for channel_name, modified_spends in zip(channels_list, res.x):
|
292 |
+
self.update(channel_name, modified_spends)
|
293 |
+
|
294 |
+
return zip(channels_list, res.x)
|
295 |
+
|
296 |
+
def optimize(self, spends_percent, channels_list):
|
297 |
+
# channels_list = self.channels.keys()
|
298 |
+
num_channels = len(channels_list)
|
299 |
+
spends_constant = []
|
300 |
+
spends_constraint = 0.0
|
301 |
+
for channel_name in channels_list:
|
302 |
+
# spends_constraint += self.channels[channel_name].modified_total_spends
|
303 |
+
spends_constant.append(self.channels[channel_name].conversion_rate)
|
304 |
+
spends_constraint += (
|
305 |
+
self.channels[channel_name].actual_total_spends
|
306 |
+
* self.channels[channel_name].conversion_rate
|
307 |
+
)
|
308 |
+
spends_constraint = spends_constraint * (1 + spends_percent / 100)
|
309 |
+
# constraint= LinearConstraint(np.ones((num_channels,)), lb = spends_constraint, ub = spends_constraint)
|
310 |
+
constraint = LinearConstraint(
|
311 |
+
np.array(spends_constant),
|
312 |
+
lb=spends_constraint,
|
313 |
+
ub=spends_constraint,
|
314 |
+
)
|
315 |
+
bounds = []
|
316 |
+
old_spends = []
|
317 |
+
for channel_name in channels_list:
|
318 |
+
_channel_class = self.channels[channel_name]
|
319 |
+
channel_bounds = _channel_class.bounds
|
320 |
+
channel_actual_total_spends = (
|
321 |
+
_channel_class.actual_total_spends
|
322 |
+
* ((1 + spends_percent / 100))
|
323 |
+
)
|
324 |
+
old_spends.append(channel_actual_total_spends)
|
325 |
+
bounds.append(
|
326 |
+
(1 + channel_bounds / 100) * channel_actual_total_spends
|
327 |
+
)
|
328 |
+
|
329 |
+
def objective_function(x):
|
330 |
+
for channel_name, modified_spends in zip(channels_list, x):
|
331 |
+
self.update(channel_name, modified_spends)
|
332 |
+
return -1 * self.modified_total_sales
|
333 |
+
|
334 |
+
res = minimize(
|
335 |
+
objective_function,
|
336 |
+
# method="trust-constr",
|
337 |
+
method="SLSQP",
|
338 |
+
x0=old_spends,
|
339 |
+
constraints=constraint,
|
340 |
+
bounds=bounds,
|
341 |
+
options={"maxiter": 2000},
|
342 |
+
)
|
343 |
+
# res = dual_annealing(
|
344 |
+
# objective_function,
|
345 |
+
# x0=old_spends,
|
346 |
+
# mi
|
347 |
+
# constraints=constraint,
|
348 |
+
# bounds=bounds,
|
349 |
+
# tol=1e-16
|
350 |
+
# )
|
351 |
+
print(res)
|
352 |
+
for channel_name, modified_spends in zip(channels_list, res.x):
|
353 |
+
self.update(channel_name, modified_spends)
|
354 |
+
|
355 |
+
return zip(channels_list, res.x)
|
356 |
+
|
357 |
+
def save(self):
|
358 |
+
details = {}
|
359 |
+
actual_list = []
|
360 |
+
modified_list = []
|
361 |
+
data = {}
|
362 |
+
channel_data = []
|
363 |
+
|
364 |
+
summary_rows = []
|
365 |
+
actual_list.append({
|
366 |
+
"name": "Total",
|
367 |
+
"Spends": self.actual_total_spends,
|
368 |
+
"Sales": self.actual_total_sales,
|
369 |
+
})
|
370 |
+
modified_list.append({
|
371 |
+
"name": "Total",
|
372 |
+
"Spends": self.modified_total_spends,
|
373 |
+
"Sales": self.modified_total_sales,
|
374 |
+
})
|
375 |
+
for channel in self.channels.values():
|
376 |
+
name_mod = channel.name.replace("_", " ")
|
377 |
+
if name_mod.lower().endswith(" imp"):
|
378 |
+
name_mod = name_mod.replace("Imp", " Impressions")
|
379 |
+
summary_rows.append([
|
380 |
+
name_mod,
|
381 |
+
channel.actual_total_spends,
|
382 |
+
channel.modified_total_spends,
|
383 |
+
channel.actual_total_sales,
|
384 |
+
channel.modified_total_sales,
|
385 |
+
round(
|
386 |
+
channel.actual_total_sales / channel.actual_total_spends, 2
|
387 |
+
),
|
388 |
+
round(
|
389 |
+
channel.modified_total_sales
|
390 |
+
/ channel.modified_total_spends,
|
391 |
+
2,
|
392 |
+
),
|
393 |
+
channel.get_marginal_roi("actual"),
|
394 |
+
channel.get_marginal_roi("modified"),
|
395 |
+
])
|
396 |
+
data[channel.name] = channel.modified_spends
|
397 |
+
data["Date"] = channel.dates
|
398 |
+
data["Sales"] = (
|
399 |
+
data.get("Sales", np.zeros((len(channel.dates),)))
|
400 |
+
+ channel.modified_sales
|
401 |
+
)
|
402 |
+
actual_list.append({
|
403 |
+
"name": channel.name,
|
404 |
+
"Spends": channel.actual_total_spends,
|
405 |
+
"Sales": channel.actual_total_sales,
|
406 |
+
"ROI": round(
|
407 |
+
channel.actual_total_sales / channel.actual_total_spends, 2
|
408 |
+
),
|
409 |
+
})
|
410 |
+
modified_list.append({
|
411 |
+
"name": channel.name,
|
412 |
+
"Spends": channel.modified_total_spends,
|
413 |
+
"Sales": channel.modified_total_sales,
|
414 |
+
"ROI": round(
|
415 |
+
channel.modified_total_sales
|
416 |
+
/ channel.modified_total_spends,
|
417 |
+
2,
|
418 |
+
),
|
419 |
+
"Marginal ROI": channel.get_marginal_roi("modified"),
|
420 |
+
})
|
421 |
+
|
422 |
+
channel_data.append({
|
423 |
+
"channel": channel.name,
|
424 |
+
"spends_act": channel.actual_total_spends,
|
425 |
+
"spends_mod": channel.modified_total_spends,
|
426 |
+
"sales_act": channel.actual_total_sales,
|
427 |
+
"sales_mod": channel.modified_total_sales,
|
428 |
+
})
|
429 |
+
summary_rows.append([
|
430 |
+
"Total",
|
431 |
+
self.actual_total_spends,
|
432 |
+
self.modified_total_spends,
|
433 |
+
self.actual_total_sales,
|
434 |
+
self.modified_total_sales,
|
435 |
+
round(self.actual_total_sales / self.actual_total_spends, 2),
|
436 |
+
round(self.modified_total_sales / self.modified_total_spends, 2),
|
437 |
+
0.0,
|
438 |
+
0.0,
|
439 |
+
])
|
440 |
+
details["Actual"] = actual_list
|
441 |
+
details["Modified"] = modified_list
|
442 |
+
columns_index = pd.MultiIndex.from_product(
|
443 |
+
[[""], ["Channel"]], names=["first", "second"]
|
444 |
+
)
|
445 |
+
columns_index = columns_index.append(
|
446 |
+
pd.MultiIndex.from_product(
|
447 |
+
[["Spends", "NRPU", "ROI", "MROI"], ["Actual", "Simulated"]],
|
448 |
+
names=["first", "second"],
|
449 |
+
)
|
450 |
+
)
|
451 |
+
details["Summary"] = pd.DataFrame(summary_rows, columns=columns_index)
|
452 |
+
data_df = pd.DataFrame(data)
|
453 |
+
channel_list = list(self.channels.keys())
|
454 |
+
data_df = data_df[["Date", *channel_list, "Sales"]]
|
455 |
+
|
456 |
+
details["download"] = {
|
457 |
+
"data_df": data_df,
|
458 |
+
"channels_df": pd.DataFrame(channel_data),
|
459 |
+
"total_spends_act": self.actual_total_spends,
|
460 |
+
"total_sales_act": self.actual_total_sales,
|
461 |
+
"total_spends_mod": self.modified_total_spends,
|
462 |
+
"total_sales_mod": self.modified_total_sales,
|
463 |
+
}
|
464 |
+
|
465 |
+
return details
|
466 |
+
|
467 |
+
@classmethod
|
468 |
+
def from_dict(cls, attr_dict):
|
469 |
+
channels_list = attr_dict["channels"]
|
470 |
+
channels = {
|
471 |
+
channel["name"]: class_from_dict(channel)
|
472 |
+
for channel in channels_list
|
473 |
+
}
|
474 |
+
return Scenario(
|
475 |
+
name=attr_dict["name"],
|
476 |
+
channels=channels,
|
477 |
+
constant=attr_dict["constant"],
|
478 |
+
correction=attr_dict["correction"],
|
479 |
+
)
|
config.yaml
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
credentials:
|
2 |
+
usernames:
|
3 |
+
willbankmmm:
|
4 |
+
email: geethu4444@gmail.com
|
5 |
+
name: Geetakrishna
|
6 |
+
password: '$2b$12$r.KJDzrp6kFErWwh/n7vh.eSvXNU60HBDjrQrNQqkqOH8KSlVacMu'
|
7 |
+
cookie:
|
8 |
+
expiry_days: 1
|
9 |
+
key: some_signature_key
|
10 |
+
name: some_cookie_name
|
11 |
+
preauthorized:
|
12 |
+
emails:
|
13 |
+
- geethu4444@gmail.com
|
data.xlsx
ADDED
Binary file (63.8 kB). View file
|
|
data_overview - Copy.xlsx
ADDED
Binary file (57 kB). View file
|
|
data_overview.xlsx
ADDED
Binary file (57 kB). View file
|
|
df.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6856d367359d8442572ca05dcb03a7ba27f5fd108cb1b6a52a19cae936c0db15
|
3 |
+
size 23782
|
edited_dataframe.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:94f49243e7dbf2e2e647f2399d5d0a3126f89b0edf067c29635c1a68efe26d7d
|
3 |
+
size 2315
|
filtered_variables.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:9071c5d5af0dcb3f1f79f5d7a736caeadeb68a3e3da309bc27b3aaa8ea17b0f4
|
3 |
+
size 1264
|