修正: revenue/cost 改为按 adping_id 从 postback 表逐条加总

This commit is contained in:
2026-09-10 18:14:27 +08:00
parent 94d711c8c8
commit 648eb822b3
2 changed files with 48 additions and 35 deletions
+47 -34
View File
@@ -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