Script 889: Budget Capped Campaigns

Purpose

The script identifies campaigns where the previous day’s spending was at least 90% of the daily budget and flags them as “Budget Capped” if certain conditions are met.

To Elaborate

The Python script is designed to monitor advertising campaigns by analyzing their spending relative to their allocated daily budgets. Specifically, it identifies campaigns where the publisher’s cost for the previous day reaches or exceeds 90% of the daily budget. If these campaigns also have an “iDNE” value below 1.5 and a “Lost Impression Share” greater than 10%, they are flagged with a “Budget Capped” alert. This alert helps in identifying campaigns that are at risk of exceeding their budget, allowing for timely adjustments to avoid overspending. The script processes input data, performs calculations, and outputs a modified dataset highlighting campaigns that meet these criteria.

Walking Through the Code

  1. Data Preparation
    • The script begins by converting the ‘iDNE’ column in the input DataFrame to numeric values, handling any errors by coercing them into NaN. This ensures that subsequent calculations involving ‘iDNE’ are performed correctly.
  2. Calculation of Ratios and Conditions
    • It calculates the ratio of ‘Pub. Cost ₹’ to ‘Daily Budget’ for each campaign, storing this in a new column ‘Pub Cost / Budget’.
    • The script also retains the ‘iDNE’ and ‘Lost Impr. Share (Budget) %’ columns for further analysis.
  3. Budget Cap Alert Logic
    • A threshold of 0.90 is set, which can be adjusted by the user if needed.
    • Campaigns are checked against this threshold: if the ‘Pub Cost / Budget’ is below 0.90, no alert is set.
    • If the ‘Pub Cost / Budget’ is 0.90 or higher, and ‘iDNE’ is less than 1.5, and ‘Lost Imp Share’ is greater than 10, the campaign is flagged with a “Budget Capped” alert.
  4. Output
    • The script prints the modified DataFrame and extracts specific columns (‘Account’, ‘Campaign’, ‘Budget Alert’) to create an output DataFrame, which highlights the campaigns that have been flagged.

Vitals

  • Script ID : 889
  • Client ID / Customer ID: 1306912249 / 13095968
  • Action Type: Bulk Upload
  • Item Changed: Campaign
  • Output Columns: Account, Campaign, Budget Alert
  • Linked Datasource: M1 Report
  • Reference Datasource: None
  • Owner: smalina@marinsoftware.com (smalina@marinsoftware.com)
  • Created by Stephen Malina on 2024-03-29 17:42
  • Last Updated by Stephen Malina on 2024-04-23 20:57
> 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
#
# Tag campaign if Pub Cost for prior day is 90% of Daily Budget
#
#
# Author: Stephen Malina
# Date: 2024-03-27

RPT_COL_CAMPAIGN = 'Campaign'
RPT_COL_PUBLISHER = 'Publisher'
RPT_COL_PUB_COST = 'Pub. Cost ₹'
RPT_COL_ACCOUNT = 'Account'
RPT_COL_DAILY_BUDGET = 'Daily Budget'
RPT_COL_CAMPAIGN_STATUS = 'Campaign Status'
RPT_COL_BUDGET_ALERT = 'Budget Alert'
RPT_COL_iDNE = 'iDNE'
RPT_COL_LOST_IMP_SHARE = 'Lost Impr. Share (Budget) %'
BULK_COL_ACCOUNT = 'Account'
BULK_COL_CAMPAIGN = 'Campaign'
BULK_COL_BUDGET_ALERT = 'Budget Alert'

# Convert the 'iDNE' column to numeric values
inputDf[RPT_COL_iDNE] = pd.to_numeric(inputDf[RPT_COL_iDNE], errors='coerce')

# Calculate the difference between daily budget and pub cost, include iDNE for consideration
inputDf['Pub Cost / Budget'] = inputDf[RPT_COL_PUB_COST] / inputDf[RPT_COL_DAILY_BUDGET]
inputDf['iDNE'] = inputDf[RPT_COL_iDNE]
inputDf['Lost Imp Share'] = inputDf[RPT_COL_LOST_IMP_SHARE]

# Output a "Budget Cap Alert" where daily spend is greater than 90% of daily budget and iDNE is less than 1.5
threshold = 0.90  # Adjust this threshold as needed
inputDf.loc[inputDf['Pub Cost / Budget'] < threshold, BULK_COL_BUDGET_ALERT] = ""
inputDf.loc[(inputDf['Pub Cost / Budget'] >= threshold) & (inputDf['iDNE'] < 1.5) & (inputDf['Lost Imp Share'] > 10), BULK_COL_BUDGET_ALERT] = "Budget Capped"

# Print the modified inputDf
print(inputDf)
cols = [RPT_COL_ACCOUNT, RPT_COL_CAMPAIGN, BULK_COL_BUDGET_ALERT]
outputDf = inputDf[cols]

Post generated on 2024-11-27 06:58:46 GMT

comments powered by Disqus