Script 863: Budget Capped Campaigns

Purpose

The Python 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 script is designed to monitor advertising campaigns by analyzing their daily spending relative to their allocated budget. Specifically, it checks if the spending for the previous day reaches or exceeds 90% of the daily budget. If this condition is met, and additional criteria such as a specific metric (‘iDNE’) being less than 1.5 and a ‘Lost Impression Share’ exceeding 10% are also satisfied, the campaign is flagged with a “Budget Capped” alert. This helps in identifying campaigns that are at risk of exceeding their budget, allowing for timely adjustments to prevent overspending and optimize budget allocation.

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 values. This ensures that the data is in a suitable format for numerical operations.
  2. Calculation of Ratios
    • It calculates the ratio of ‘Pub Cost’ to ‘Daily Budget’ for each campaign and stores this in a new column ‘Pub Cost / Budget’. This ratio is crucial for determining how close the spending is to the budget limit.
  3. Applying Business Rules
    • A threshold of 90% is set, which can be adjusted by the user if needed. The script then checks each campaign to see if the ‘Pub Cost / Budget’ ratio is at least 90%, the ‘iDNE’ value is less than 1.5, and the ‘Lost Impression Share’ is greater than 10%. If all these conditions are met, the campaign is tagged with a “Budget Capped” alert.
  4. Output Preparation
    • Finally, the script selects relevant columns (‘Account’, ‘Campaign’, and ‘Budget Alert’) from the modified DataFrame and prepares them for output, providing a concise view of which campaigns have been flagged.

Vitals

  • Script ID : 863
  • Client ID / Customer ID: 247648668 / 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 16:32
  • Last Updated by Stephen Malina on 2024-04-29 14:12
> 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