Script 119: Strategy Assignment

Purpose:

The Python script assigns marketing campaigns to specific strategies based on campaign name, creation date, and accumulated clicks.

To Elaborate

The Python script is designed to automate the assignment of marketing campaigns to predefined strategies. This assignment is based on specific criteria, including the campaign’s name, its creation date, and the number of accumulated clicks. The script uses these criteria to determine the most appropriate strategy for each campaign, ensuring that campaigns are aligned with the business’s marketing objectives. The strategies are categorized into exclusive, non-exclusive, business-as-usual (BAU), and evergreen strategies. The script applies a set of rules to decide which strategy a campaign should be assigned to, thereby streamlining the process of campaign management and ensuring consistency in strategy application.

Walking Through the Code

  1. Initialization and Setup
    • The script begins by defining constants for column names and strategies. These constants are used throughout the script to reference specific data fields and strategy values.
    • User changeable parameters include the strategy values and campaign name tokens, which can be adjusted to fit different business needs.
  2. Strategy Assignment Rules
    • Rule 1: Campaigns are initially assigned to either an exclusive or non-exclusive strategy based on tokens found in their names. This is done using a case-insensitive search for specific substrings within the campaign names.
    • Rule 2: If a campaign, identified as exclusive or non-exclusive, was created more than 14 days ago and has accumulated at least 100 clicks, it is reassigned to the CPA BAU strategy.
    • Rule 3: Any campaign created more than 60 days ago is assigned to the CPA Evergreen strategy, regardless of its name or click count.
  3. Output Preparation
    • The script identifies campaigns whose strategies have changed based on the rules applied. It then prepares an output DataFrame containing only these changed campaigns, ensuring that only relevant updates are processed further. If no changes are detected, an empty DataFrame is prepared.

Vitals

  • Script ID : 119
  • Client ID / Customer ID: 1306924347 / 69058
  • Action Type: Bulk Upload
  • Item Changed: Campaign
  • Output Columns: Account, Campaign, Strategy
  • Linked Datasource: M1 Report
  • Reference Datasource: None
  • Owner: Jeremy Brown (jbrown@marinsoftware.com)
  • Created by Jeremy Brown on 2023-05-19 11:12
  • Last Updated by Jonathan Reichl on 2023-12-13 11:21
> See it in Action

Python Code

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
#
# Assign Campaign to Strategy according to:
#  - Campaign Name
#  - Campaign Creation Date
#  - accumulated clicks
#
# Author: Michael S. Huang
# Date: 2023-05-18
#


RPT_COL_CAMPAIGN = 'Campaign'
RPT_COL_ACCOUNT = 'Account'
RPT_COL_STRATEGY = 'Strategy'
RPT_COL_CAMPAIGN_CREATIONDATE = 'Campaign Creation Date'
RPT_COL_CLICKS = 'Clicks'
BULK_COL_ACCOUNT = 'Account'
BULK_COL_CAMPAIGN = 'Campaign'
BULK_COL_STRATEGY = 'Strategy'

outputDf[BULK_COL_STRATEGY] = "<<YOUR VALUE>>"

# define Strategies to map to
VAL_STRATEGY_IS_EXC = "SVOD - TH - Title_Exc-Launch - TIS"
VAL_STRATEGY_IS_NON_EXC = "SVOD - TH - Title_NonExc-Launch - TIS"
VAL_STRATEGY_CPA_BAU = "SVOD - TH - Title-BAU - CPS"
VAL_STRATEGY_CPA_EVERGREEN = "SVOD - TH - Title-Evergreen - CPS"

# define campaign tokens to match
VAL_CAMPAIGN_NAME_TOKEN_EXC = "_ Exc"
VAL_CAMPAIGN_NAME_TOKEN_NON_EXC = "_ NonExc"

# defines dates to check
print("timezone", CLIENT_TIMEZONE)
today = datetime.datetime.now(CLIENT_TIMEZONE).date()
date_14_days_ago = pd.to_datetime(today - datetime.timedelta(days=14))
date_60_days_ago = pd.to_datetime(today - datetime.timedelta(days=60))
print(today, date_14_days_ago, date_60_days_ago)

# define tmp column for new Strategy and set to empty
TMP_STRATEGY = RPT_COL_STRATEGY + '_'
inputDf[TMP_STRATEGY] = np.nan

### Rule 1: Assign to Exc/NonExc Strategy based on token in campaign name
###  case insensitive

inputDf.loc[ inputDf[RPT_COL_CAMPAIGN].str.contains(VAL_CAMPAIGN_NAME_TOKEN_EXC, case=False), \
             TMP_STRATEGY \
           ] = VAL_STRATEGY_IS_EXC

inputDf.loc[ inputDf[RPT_COL_CAMPAIGN].str.contains(VAL_CAMPAIGN_NAME_TOKEN_NON_EXC, case=False), \
             TMP_STRATEGY \
           ] = VAL_STRATEGY_IS_NON_EXC

### Rule 2: if Exc/NonExc campaign created more than 14 days ago and clicks >= 100,
###    assign to CPA BAU

inputDf.loc[ ( inputDf[RPT_COL_CAMPAIGN].str.contains(VAL_CAMPAIGN_NAME_TOKEN_EXC, case=False) | \
               inputDf[RPT_COL_CAMPAIGN].str.contains(VAL_CAMPAIGN_NAME_TOKEN_NON_EXC, case=False) ) & \
             (inputDf[RPT_COL_CAMPAIGN_CREATIONDATE] <= date_14_days_ago) & \
             (inputDf[RPT_COL_CLICKS] >= 100), \
             TMP_STRATEGY \
           ] = VAL_STRATEGY_CPA_BAU

### Rule 3: if campaign created more than 60 days ago,
###    assign to CPA Evergreen

inputDf.loc[ (inputDf[RPT_COL_CAMPAIGN_CREATIONDATE] <= date_60_days_ago), \
             TMP_STRATEGY \
           ] = VAL_STRATEGY_CPA_EVERGREEN

# find changed campaigns
changed = inputDf[TMP_STRATEGY].notnull() & (inputDf[RPT_COL_STRATEGY] != inputDf[TMP_STRATEGY])

# put changed campaigns into outputDf; if none, prepare empty outputDf
if sum(changed) > 0:
  print("== Campaigns with Changed Strategy ==", tableize(inputDf.loc[changed]))

  # only select changed rows
  cols = [RPT_COL_ACCOUNT, RPT_COL_CAMPAIGN, TMP_STRATEGY]
  outputDf = inputDf.loc[ changed, cols ].copy() \
                    .rename(columns = { \
                      TMP_STRATEGY: BULK_COL_STRATEGY \
                    })
  print("outputDf", tableize(outputDf))

else:
  print("Empty outputDf")
  outputDf = outputDf.iloc[0:0]

Post generated on 2025-03-11 01:25:51 GMT

comments powered by Disqus