修正: revenue/cost 改为按 adping_id 从 postback 表逐条加总
This commit is contained in:
@@ -108,55 +108,68 @@ flt=[{'term':{'is_routing':1}},{'range':{'@timestamp':{'gte':frm,'lt':to}}}]
|
||||
r=es_post(CLICK,{'size':0,'query':{'bool':{'filter':flt}},'aggs':{'rc':{'cardinality':{'field':'routing_campaign_id.keyword','precision_threshold':40000}}}})
|
||||
has_click_orders=r['aggregations']['rc']['value']
|
||||
|
||||
# 明细: 按 adping_id 聚合 (click表) -> clicks, revenue(sum payin), cost(sum deliver_price), 及维度
|
||||
# advertiser_payin/deliver_price 是字符串,用 script 转 double 求和
|
||||
agg={
|
||||
'by_adp':{'terms':{'field':'adping_id','size':100000},
|
||||
'aggs':{
|
||||
'rev':{'sum':{'script':{'source':"try{return Double.parseDouble(doc['advertiser_payin.keyword'].value)}catch(Exception e){return 0.0}"}}},
|
||||
'cost':{'sum':{'script':{'source':"try{return Double.parseDouble(doc['deliver_price.keyword'].value)}catch(Exception e){return 0.0}"}}},
|
||||
PAYIN_SRC="try{return Double.parseDouble(doc['advertiser_payin.keyword'].value)}catch(Exception e){return 0.0}"
|
||||
PRICE_SRC="try{return Double.parseDouble(doc['deliver_price.keyword'].value)}catch(Exception e){return 0.0}"
|
||||
|
||||
def dims_aggs():
|
||||
return {
|
||||
'rc':{'terms':{'field':'routing_campaign_id.keyword','size':1}},
|
||||
'cid':{'terms':{'field':'campaign_id.keyword','size':1}},
|
||||
'sc':{'terms':{'field':'second_channel.keyword','size':1}},
|
||||
'acc':{'terms':{'field':'advertiser_account_id','size':1}},
|
||||
'pkg':{'terms':{'field':'pkg_name.keyword','size':1}},
|
||||
}}
|
||||
}
|
||||
r=es_post(CLICK,{'size':0,'query':{'bool':{'filter':flt}},'aggs':agg})
|
||||
buckets=r['aggregations']['by_adp']['buckets']
|
||||
|
||||
# conversion: postback表 按 adping_id 计数
|
||||
r2=es_post(PB,{'size':0,'query':{'bool':{'filter':flt}},'aggs':{'by_adp':{'terms':{'field':'adping_id','size':100000}}}})
|
||||
conv_map={b['key']:b['doc_count'] for b in r2['aggregations']['by_adp']['buckets']}
|
||||
|
||||
}
|
||||
def first(agg_obj):
|
||||
b=agg_obj.get('buckets',[])
|
||||
return b[0]['key'] if b else ''
|
||||
|
||||
detail=[]
|
||||
routing_ids_with_conv=set() # 有转化的 routing_campaign_id
|
||||
for b in buckets:
|
||||
adp=b['key']
|
||||
clicks=b['doc_count']
|
||||
rev=round(b['rev']['value'],6)
|
||||
cost=round(b['cost']['value'],6)
|
||||
conv=conv_map.get(adp,0)
|
||||
rc=str(first(b['rc']))
|
||||
cid=str(first(b['cid']))
|
||||
sc=str(first(b['sc']))
|
||||
accid=first(b['acc'])
|
||||
# click表: 按 adping_id -> clicks(计数) + 维度(优先来源)
|
||||
rc1=es_post(CLICK,{'size':0,'query':{'bool':{'filter':flt}},
|
||||
'aggs':{'by_adp':{'terms':{'field':'adping_id','size':100000},'aggs':dims_aggs()}}})
|
||||
click_buckets=rc1['aggregations']['by_adp']['buckets']
|
||||
|
||||
# postback表: 按 adping_id -> conversion(计数) + revenue(sum payin) + cost(sum price) + 维度(备用)
|
||||
rp=es_post(PB,{'size':0,'query':{'bool':{'filter':flt}},
|
||||
'aggs':{'by_adp':{'terms':{'field':'adping_id','size':100000},
|
||||
'aggs':dict(dims_aggs(), **{
|
||||
'rev':{'sum':{'script':{'source':PAYIN_SRC}}},
|
||||
'cost':{'sum':{'script':{'source':PRICE_SRC}}},
|
||||
})}}})
|
||||
pb_buckets=rp['aggregations']['by_adp']['buckets']
|
||||
|
||||
# 汇总各 adping_id
|
||||
click_map={b['key']:b for b in click_buckets}
|
||||
pb_map={b['key']:b for b in pb_buckets}
|
||||
|
||||
def acc_name(accid):
|
||||
acc=ACCOUNT_MAP.get(accid,'')
|
||||
if not acc:
|
||||
acc = f'未知({accid})' if accid not in ('',None) else '未知'
|
||||
pkg=str(first(b['pkg']))
|
||||
return acc
|
||||
|
||||
def dims_from(b):
|
||||
return {'rc':str(first(b['rc'])),'cid':str(first(b['cid'])),'sc':str(first(b['sc'])),
|
||||
'acc':acc_name(first(b['acc'])),'pkg':str(first(b['pkg']))}
|
||||
|
||||
all_adp=set(click_map)|set(pb_map)
|
||||
detail=[]
|
||||
routing_ids_with_conv=set() # 有转化(postback出现)的 routing_campaign_id
|
||||
for adp in all_adp:
|
||||
cb=click_map.get(adp); pb=pb_map.get(adp)
|
||||
clicks=cb['doc_count'] if cb else 0
|
||||
conv=pb['doc_count'] if pb else 0
|
||||
rev=round(pb['rev']['value'],6) if pb else 0.0 # revenue: postback逐条sum payin
|
||||
cost=round(pb['cost']['value'],6) if pb else 0.0 # cost: postback逐条sum price
|
||||
# 维度优先取 click表,缺则取 postback表
|
||||
dm=dims_from(cb) if cb else dims_from(pb)
|
||||
cvr=round(conv/clicks,6) if clicks else 0
|
||||
gp=round(1-cost/rev,6) if rev else 0
|
||||
ecpc=round(rev/clicks,6) if clicks else 0
|
||||
detail.append({'dt':dt,'routing_campaign_id':rc,'campaign_id':cid,'adping_id':adp,
|
||||
'second_channel':sc,'account':acc,'pkg':pkg,'clicks':clicks,'conversion':conv,
|
||||
'cvr':cvr,'revenue':rev,'cost':cost,'gp':gp,'ecpc':ecpc})
|
||||
if conv>0 and rc:
|
||||
routing_ids_with_conv.add(rc)
|
||||
detail.append({'dt':dt,'routing_campaign_id':dm['rc'],'campaign_id':dm['cid'],'adping_id':adp,
|
||||
'second_channel':dm['sc'],'account':dm['acc'],'pkg':dm['pkg'],
|
||||
'clicks':clicks,'conversion':conv,'cvr':cvr,'revenue':rev,'cost':cost,'gp':gp,'ecpc':ecpc})
|
||||
if conv>0 and dm['rc']:
|
||||
routing_ids_with_conv.add(dm['rc'])
|
||||
|
||||
# 无转化订单 = conversion=0 的 routing_campaign_id 个数
|
||||
# = 总(有点击的routing_campaign_id) - 有转化的routing_campaign_id
|
||||
|
||||
Reference in New Issue
Block a user