Script 1681: pause inactive groups
Purpose:
The Python script pauses ad groups that have received fewer than 10 clicks in the last 60 days, provided they have been active for at least 60 days.
To Elaborate
The script is designed to manage ad group performance by identifying and pausing those that are underperforming. Specifically, it targets ad groups that have been active for at least 60 days but have received fewer than 10 clicks in the last 60 days. This helps in optimizing ad spend by ensuring that only effective ad groups remain active. The script processes input data to identify these groups and updates their status to “PAUSED” in the output data. This automation aids in maintaining a streamlined and efficient advertising strategy by focusing resources on more successful ad groups.
Walking Through the Code
- Data Preparation
- The script begins by defining constants for column names that are used to identify key data fields such as ‘Campaign’, ‘Group’, and ‘Account’.
- It retrieves the primary data source from a dictionary, which is expected to be a DataFrame containing ad group information.
- Header Adjustment
- The script includes a commented-out section intended to adjust the DataFrame headers by shifting them to the correct row if necessary. This ensures that the data is correctly aligned for processing.
- Data Validation and Output Preparation
- It checks if the necessary columns (‘Account’, ‘Campaign’, ‘Group’) exist in the DataFrame after any adjustments.
- If the columns are present, it creates a new DataFrame (
outputDf
) with these columns and sets the ‘Status’ and ‘Group Status’ to “PAUSED” for each ad group, indicating they should be paused. - If the columns are not found, it raises a ValueError to alert the user of the missing data.
- User Changeable Parameters
- Users can modify the logic for header adjustment if the input data structure changes.
- The script allows for customization of the output status values if different statuses are required.
Vitals
- Script ID : 1681
- Client ID / Customer ID: 1306912115 / 69058
- Action Type: Bulk Upload
- Item Changed: AdGroup
- Output Columns: Account, Campaign, Group, Status, Group Status
- Linked Datasource: FTP/Email Feed
- Reference Datasource: None
- Owner: Chris Jetton (cjetton@marinsoftware.com)
- Created by Chris Jetton on 2025-02-04 20:23
- Last Updated by Chris Jetton on 2025-02-07 16:32
> 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
##
## name: pause_inactive_groups
## description:
## Pause ad groups who have seen <10 clicks in the last 60 days (must have been live for 60 days)
##
## author:
## created: 2025-02-04
##
today = datetime.datetime.now(CLIENT_TIMEZONE).date()
RPT_COL_CAMPAIGN = 'Campaign'
RPT_COL_GROUP = 'Group'
RPT_COL_ACCOUNT = 'Account'
# primary data source and columns
inputDf = dataSourceDict["1"]
# Shift the header row to the correct position
#if len(inputDf) > 5: # Ensure there are at least 6 rows
#inputDf.columns = inputDf.iloc[5] # Set the 6th row as headers
#inputDf = inputDf[6:].reset_index(drop=True) # Drop previous rows and reset index
#else:
#raise ValueError("Input CSV file does not have enough rows to shift headers correctly.")
print("Headers after shifting:", inputDf.columns)
# output columns and initial values
BULK_COL_ACCOUNT = 'Account'
BULK_COL_CAMPAIGN = 'Campaign'
BULK_COL_GROUP = 'Group'
BULK_COL_STATUS = 'Status'
BULK_COL_GROUP_STATUS = 'Group Status'
#outputDf[BULK_COL_STATUS] = "<<YOUR VALUE>>"
# user code start here
print(tableize(inputDf.head()))
# Check if the necessary columns exist after the adjustment
if all(col in inputDf.columns for col in [RPT_COL_ACCOUNT, RPT_COL_CAMPAIGN, RPT_COL_GROUP]):
# Output DataFrame
outputDf = pd.DataFrame({
'Account': inputDf[RPT_COL_ACCOUNT],
'Campaign': inputDf[RPT_COL_CAMPAIGN],
'Group': inputDf[RPT_COL_GROUP],
'Status': "PAUSED",
'Group Status': "PAUSED"
})
print(outputDf)
else:
raise ValueError("The expected columns are not found in the adjusted DataFrame.")
Post generated on 2025-03-11 01:25:51 GMT