如何遍历CSV数据集将值传入Google DFP API的line_item字典?
解决方案:遍历CSV数据创建DFP Line Items
嘿,我来帮你搞定这个遍历CSV创建DFP Line Item的问题!你当前代码的核心问题是把整列数据的列表传给了函数,而不是逐行处理单个条目,另外还存在字段名不匹配的小问题。下面是最优的实现方式:
核心思路
- 用Pandas高效遍历CSV的每一行数据
- 确保DFP API要求的字段格式(比如
targetedPlacementIds必须是列表) - 修正字段名匹配问题(你的DataFrame列名是
order_id,但原代码用了order) - 可选:批量创建Line Item以减少API请求次数(提升效率)
方式一:逐行处理(适合小数据量)
这种方式逻辑清晰,每处理一行就调用一次API:
from googleads import dfp import pandas as pd def create_single_line_item(client, order_id, targeted_placement_id, campaign_name): line_item_service = client.GetService('LineItemService') # 注意:DFP创建Line Item需要必填字段,这里补充了基础必填项,你需要根据实际需求调整 line_item = { 'orderId': order_id, 'name': campaign_name, 'targeting': { 'inventoryTargeting': {'targetedPlacementIds': [targeted_placement_id]} }, 'lineItemType': 'STANDARD', 'costType': 'CPM', 'costPerUnit': {'microAmount': 1000000}, # 示例:1 USD 'endDateTime': {'date': {'year': 2024, 'month': 12, 'day': 31}, 'hour': 23, 'minute': 59} } # 创建单个Line Item created_item = line_item_service.createLineItems([line_item])[0] # 从返回结果中提取目标Placement ID(DFP返回值里没有直接的targetedPlacementId字段) targeted_id = created_item['targeting']['inventoryTargeting']['targetedPlacementIds'][0] print(f'Target id "{targeted_id}", in order id "{created_item["orderId"]}", named "{created_item["name"]}" was created') if __name__ == '__main__': dfp_client = dfp.DfpClient.LoadFromStorage() df = pd.read_csv('ad_data.csv') # 遍历DataFrame的每一行 for _, row in df.iterrows(): # 严格对应CSV里的列名 order_id = row['order_id'] targeted_placement_id = row['targeted_placement_id'] campaign_name = row['campaign'] create_single_line_item(dfp_client, order_id, targeted_placement_id, campaign_name)
方式二:批量创建(适合大数据量)
如果你的CSV数据较多,批量创建能减少API请求次数,提升效率:
from googleads import dfp import pandas as pd def bulk_create_line_items(client, line_items_data): line_item_service = client.GetService('LineItemService') line_items_list = [] for data in line_items_data: line_item = { 'orderId': data['order_id'], 'name': data['campaign'], 'targeting': { 'inventoryTargeting': {'targetedPlacementIds': [data['targeted_placement_id']]} }, 'lineItemType': 'STANDARD', 'costType': 'CPM', 'costPerUnit': {'microAmount': 1000000}, 'endDateTime': {'date': {'year': 2024, 'month': 12, 'day': 31}, 'hour': 23, 'minute': 59} } line_items_list.append(line_item) # 一次性创建所有Line Item created_items = line_item_service.createLineItems(line_items_list) # 遍历打印结果 for item in created_items: targeted_id = item['targeting']['inventoryTargeting']['targetedPlacementIds'][0] print(f'Target id "{targeted_id}", in order id "{item["orderId"]}", named "{item["name"]}" was created') if __name__ == '__main__': dfp_client = dfp.DfpClient.LoadFromStorage() df = pd.read_csv('ad_data.csv') # 把DataFrame转成字典列表,方便批量处理 line_items_data = df.to_dict('records') bulk_create_line_items(dfp_client, line_items_data)
关键注意点
- 字段名匹配:一定要确保代码里的列名和CSV里的完全一致(比如你的CSV列是
order_id,就不能写成order) - API必填字段:DFP的Line Item创建接口需要很多必填参数(比如
lineItemType、costType),你之前硬编码能运行是因为可能隐含了这些字段,现在必须显式补充 - 格式要求:
targetedPlacementIds必须是列表类型,哪怕只有一个ID也要用[]包裹
内容的提问来源于stack exchange,提问作者Cam Shan
相关产品推荐
相关产品推荐

