0、前言
前段时间写了个简单的人群计算程序数坊自动人群计算1.0,最近时间比较充裕,所以决定完善一下,增加了多标签的人群计算,增加了广告、已有人群、属性等常用标签,虽然BUG百出,但亲测勉强能用
其实计算逻辑很简单,上传人群逻辑到接口就会返回人群大小,比较复杂的地方主要在于人群逻辑表格的搭建与表格转为可上传的JSON数据,自动圈包也类似只不过接口不同而已
源码下载在最后
1、搭建逻辑
每一行表示一个标签,每一列表示一个参数,不需要或不限就不填
人群名称相同则视为一个人群包,多标签间运算逻辑通过运算列控制
品牌为不填时会默认为三级类目,品牌不为空时(可任意写,只要不为空值)则默认为品牌*三级类目
人群名称 | 运算 | 卡片名称 | 品牌 | 类目 | 开始时间 | 结束时间 | 频次 | 价格 | 渠道 | 行为 | 身份 | 已有人群 | 属性 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
人群1 | 空 | 浏览行为 | XX | 家用电器-大家电-平板电视 | 2022-04-01 | 2022-04-15 | |||||||
人群1 | 交集 | 购买行为 | 家用电器-大家电-平板电视 | 2022-04-01 | 2022-04-15 | ||||||||
人群1 | 差集 | 购买行为 | XX | 家用电器-大家电-平板电视 | 2022-04-01 | 2022-04-15 | |||||||
人群2 | 空 | 浏览行为 | XX | 家用电器-大家电-平板电视 | 2022-04-01 | 2022-04-15 | |||||||
人群3 | 空 | 购买行为 | 家用电器-大家电-平板电视 | 2022-04-01 | 2022-04-15 |
2、构建卡片DATA
2.0 获取所需ID
需要的ID有用户行为中品牌ID,类目ID,与广告行为中的广告ID
2.0.1 获取品牌&类目ID
通过输入账号cookie自动获取品牌ID,因此逻辑表中可以随便写,但类目要按格式写
def get_core_id(cookie, cate_name): # 拿品牌三级类目id
cate1 = list(cate_name.split('-'))[0]
cate2 = list(cate_name.split('-'))[1]
cate3 = list(cate_name.split('-'))[2]
url = 'https://4a.jd.com/datamill/api/accountManagement/mainAccountInfoOuter/brandInfo?pageNum=0&pageSize=10'
headers = {
'user-agent': 'PostmanRuntime/7.28.4',
"accept": "*/*",
'cookie': cookie
}
txt = requests.get(url, headers=headers).text
data = json.loads(txt)["result"]["data"][0]
brand_id = data['brandCode']
cate_list = data["category"]
for i in range(30):
if cate_list[i]["name"] == cate1:
cate_id1 = cate_list[i]["categoryCode"]
cate_children = cate_list[i]["children"]
break
for j in range(30):
if cate_children[j]["name"] == cate2:
cate_id2 = cate_children[j]["categoryCode"]
cate_grandson = cate_children[j]["children"]
break
for k in range(30):
if cate_grandson[k]["name"] == cate3:
cate_id3 = cate_grandson[k]["categoryCode"]
break
cate_id = str(cate_id1) + "_" + str(cate_id2) + "_" + str(cate_id3)
id_data = {
"brand_id": brand_id,
"cate_id": cate_id
}
return id_data
2.0.2 获取广告ID
进入人群圈选点击广告行为卡片时后台会弹出一条lineList请求,其中包含数坊权限内全部的广告触点与对应ID,使用EXCEL表中名称全部匹配为ID后组合为一条ID来实现渠道多选
def get_ad_id(cookie, ad_name): # 拿广告id
name_list = ad_name.split(",")
ad_id = ''
url = 'https://4a.jd.com/datamill/api/audienceManagement/newCustomAudienceEditInner/lineList'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
'cookie': cookie
}
txt = requests.get(url, headers=headers).text
data_list = json.loads(txt)["result"]["data"]
for data in data_list:
if data["name"] in name_list:
ad_id += str(data["id"])
ad_id += ','
return ad_id.rstrip(",")
2.1 购买行为
购买行为设定传入品牌ID、类目ID、时间段(开始时间与结束时间)、频次、价格,
当频次或价格为"不限"时输入为空
def get_order_data(cookie, brand_name, cate_name, start_time, end_time, frequency, price): # 购买行为
brand_id = get_core_id(cookie, cate_name)["brand_id"]
cate_id = get_core_id(cookie, cate_name)["cate_id"]
data = {
"cardType": "order",
"cardCode": "300662",
"type": "behaviorV2",
"key": "order",
"screen": "all",
"dimension": "3" if pd.isnull(brand_name) else "2",
"brandCode": '' if pd.isnull(brand_name) else str(brand_id),
"cateList": str(cate_id) if pd.isnull(brand_name