File size: 6,008 Bytes
3bd8465
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import streamlit as st
from PIL import Image
from marginal_cpc_calculator import *

st.set_page_config(
    page_title="mCPC dashboard",
    page_icon="socks",
    layout="wide",
    initial_sidebar_state="auto",
)

# dataframe operations first time
def impute_sub_channel(campaign):
    if any([x in campaign for x in ['| Prospecting','| CPA','| Traffic','| CRM','Lead acquisition']]):
        return 'TRAFFIC_DRIVING'
    elif any([x in campaign for x in ['| Conversion','| Advantage+','| ASC+','Sales |','-Conversions']]):
        return 'CONVERSION'
    elif any([x in campaign for x in ['| Brand Awareness','| Reach']]):
        return 'REACH'
    else:
        return 'OTHER'
df = pd.read_csv('meta_daily_ads_level_data/meta_ad_day_level_raw_data.csv.gz',compression='gzip',parse_dates=['Date'])
df.rename(columns={'Ad Set Name':'ad_set_name', 'Campaign Name':'campaign', 'Country':'country',
                   'Date':'date', 'Amount Spent (SEK)':'cost', 'Clicks (all)':'clicks','Impressions':'impressions',
                   'Purchases Conversion Value (SEK)':'platform_revenue','Ad Set Name':'ad_name',},inplace=True)
df.set_index('date',inplace=True) 
df['cpc']=df['cost']/df['clicks']
df['platform']='meta'
df['sub_channel']=df.campaign.apply(impute_sub_channel)

# dashboard operations
def add_logo(logo_path, width, height):
    """Read and return a resized logo"""
    logo = Image.open(logo_path)
    modified_logo = logo.resize((width, height))
    return modified_logo

def get_date(input_min_date_month,input_min_date_year,input_max_date_month,input_max_date_year):
    month_converter = {'Jun':'06','Jul':'07','Aug':'08','Sep':'09',
                       'Oct':'10','Nov':'11','Dec':'12','Jan':'01','Feb':'02',
                       'Mar':'03','Apr':'04','May':'05'}
    min_date = input_min_date_year+'-'+month_converter[input_min_date_month]+'-01'
    max_date = input_max_date_year+'-'+month_converter[input_max_date_month]+'-01'
    return min_date,max_date

my_logo = add_logo(logo_path="hs_logo.png", width=180, height=60)
st.sidebar.image(my_logo)

st.title("mCPC & ad spend insights ✨")

# INLCUDE SECTION FOR INPUTS AND BUTTON TO GENERATE INSIGHTS
with st.sidebar:
    st.write("Enter  selections for mCPC spend profile")
    input_country = st.selectbox('Country:',
                                ('','DE', 'US', 'UK','NL','SE','AU','CH','FR','BE'))
    input_platform = st.selectbox('Platform:',
                                ('','meta'))
    input_sub_channel = st.selectbox('Tactic / Sub channel:',
                                ('','CONVERSION','TRAFFIC_DRIVING','REACH'))
    col1, col2 = st.columns(2)
    with col1:
        input_min_date_month = st.selectbox('From Month:',
                                ('','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May'))
    with col2:
        input_min_date_year = st.selectbox('From Year:',
                                ('','2022','2023'))
    col3, col4 = st.columns(2)
    with col3:
        input_max_date_month = st.selectbox('To Month:',
                                ('','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan','Feb','Mar','Apr','May'))
    with col4:
        input_max_date_year = st.selectbox('To Year:',
                                ('','2022','2023'))   
    start = st.button("Generate mCPC curves", type='primary') 
    text_error_value = ''
    if start:
        for var,varname in [(input_country,'Country'),
                    (input_platform,'Platform'),
                    (input_min_date_month,'From Date'),
                    (input_min_date_year,'From Date'),
                    (input_max_date_month,'To Date'),
                    (input_max_date_year,'To Date')]:
            if var=='':
                text_error_value = f'{varname} cant be empty'
                st.error(text_error_value)
                break    

# CHECKS TO ENSURE INPUTS ARE CLEAN BEFORE CALLING FUNCTIONS
if start:
    if text_error_value=='':
        min_date, max_date = get_date(input_min_date_month,
                                      input_min_date_year,
                                      input_max_date_month,
                                      input_max_date_year)
        st.markdown("""---""")
        mid, mad = get_comparison_dates(min_date,max_date,period='previous_period')
        st.subheader(f"Calculating for dates between {mid} & {mad}")
        fig,output_msg = calculate_max_spend(df,mid,mad,
                                            revenue_or_ebitda='revenue',
                                            country=input_country,
                                            platform=input_platform,
                                            sub_channel=input_sub_channel,
                                            pprint=True)
        st.write(fig)
        for l in output_msg:
            st.write(l)
        st.markdown("""---""")
        mid, mad = get_comparison_dates(min_date,max_date,period='LY')
        st.subheader(f"Calculating for dates between {mid} & {mad}")
        fig,output_msg = calculate_max_spend(df,mid,mad,
                                            revenue_or_ebitda='revenue',
                                            country=input_country,
                                            platform=input_platform,
                                            sub_channel=input_sub_channel,
                                            pprint=True)
        st.write(fig)
        for l in output_msg:
            st.write(l)

    else:
        st.write(f'Text error value is {text_error_value}')
# DISPLAY INSIGHTS FOR PREVIOUS PERIOD AND LAST YEAR
# TEST FUNCTIONALITY OF APP
# DEPLOY TO HUGGINGFACE
# INCORPORATE GOOGLE
# INCORPORATE TIKTOK

st.markdown("<br><hr><center>Made with ❤️ for Happy Socks by <a href='mailto:vivekbharadwaj.ca@gmail.com?subject=mCPC dashboard queries&body=Please specify the issue you are facing with the dashboard.'><strong>Vivek</strong></a> ✨</center><hr>", unsafe_allow_html=True)