修正: 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}}}})
|
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']
|
has_click_orders=r['aggregations']['rc']['value']
|
||||||
|
|
||||||
# 明细: 按 adping_id 聚合 (click表) -> clicks, revenue(sum payin), cost(sum deliver_price), 及维度
|
PAYIN_SRC="try{return Double.parseDouble(doc['advertiser_payin.keyword'].value)}catch(Exception e){return 0.0}"
|
||||||
# advertiser_payin/deliver_price 是字符串,用 script 转 double 求和
|
PRICE_SRC="try{return Double.parseDouble(doc['deliver_price.keyword'].value)}catch(Exception e){return 0.0}"
|
||||||
agg={
|
|
||||||
'by_adp':{'terms':{'field':'adping_id','size':100000},
|
def dims_aggs():
|
||||||
'aggs':{
|
return {
|
||||||
'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}"}}},
|
|
||||||
'rc':{'terms':{'field':'routing_campaign_id.keyword','size':1}},
|
'rc':{'terms':{'field':'routing_campaign_id.keyword','size':1}},
|
||||||
'cid':{'terms':{'field':'campaign_id.keyword','size':1}},
|
'cid':{'terms':{'field':'campaign_id.keyword','size':1}},
|
||||||
'sc':{'terms':{'field':'second_channel.keyword','size':1}},
|
'sc':{'terms':{'field':'second_channel.keyword','size':1}},
|
||||||
'acc':{'terms':{'field':'advertiser_account_id','size':1}},
|
'acc':{'terms':{'field':'advertiser_account_id','size':1}},
|
||||||
'pkg':{'terms':{'field':'pkg_name.keyword','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):
|
def first(agg_obj):
|
||||||
b=agg_obj.get('buckets',[])
|
b=agg_obj.get('buckets',[])
|
||||||
return b[0]['key'] if b else ''
|
return b[0]['key'] if b else ''
|
||||||
|
|
||||||
detail=[]
|
# click表: 按 adping_id -> clicks(计数) + 维度(优先来源)
|
||||||
routing_ids_with_conv=set() # 有转化的 routing_campaign_id
|
rc1=es_post(CLICK,{'size':0,'query':{'bool':{'filter':flt}},
|
||||||
for b in buckets:
|
'aggs':{'by_adp':{'terms':{'field':'adping_id','size':100000},'aggs':dims_aggs()}}})
|
||||||
adp=b['key']
|
click_buckets=rc1['aggregations']['by_adp']['buckets']
|
||||||
clicks=b['doc_count']
|
|
||||||
rev=round(b['rev']['value'],6)
|
# postback表: 按 adping_id -> conversion(计数) + revenue(sum payin) + cost(sum price) + 维度(备用)
|
||||||
cost=round(b['cost']['value'],6)
|
rp=es_post(PB,{'size':0,'query':{'bool':{'filter':flt}},
|
||||||
conv=conv_map.get(adp,0)
|
'aggs':{'by_adp':{'terms':{'field':'adping_id','size':100000},
|
||||||
rc=str(first(b['rc']))
|
'aggs':dict(dims_aggs(), **{
|
||||||
cid=str(first(b['cid']))
|
'rev':{'sum':{'script':{'source':PAYIN_SRC}}},
|
||||||
sc=str(first(b['sc']))
|
'cost':{'sum':{'script':{'source':PRICE_SRC}}},
|
||||||
accid=first(b['acc'])
|
})}}})
|
||||||
|
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,'')
|
acc=ACCOUNT_MAP.get(accid,'')
|
||||||
if not acc:
|
if not acc:
|
||||||
acc = f'未知({accid})' if accid not in ('',None) else '未知'
|
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
|
cvr=round(conv/clicks,6) if clicks else 0
|
||||||
gp=round(1-cost/rev,6) if rev else 0
|
gp=round(1-cost/rev,6) if rev else 0
|
||||||
ecpc=round(rev/clicks,6) if clicks 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,
|
detail.append({'dt':dt,'routing_campaign_id':dm['rc'],'campaign_id':dm['cid'],'adping_id':adp,
|
||||||
'second_channel':sc,'account':acc,'pkg':pkg,'clicks':clicks,'conversion':conv,
|
'second_channel':dm['sc'],'account':dm['acc'],'pkg':dm['pkg'],
|
||||||
'cvr':cvr,'revenue':rev,'cost':cost,'gp':gp,'ecpc':ecpc})
|
'clicks':clicks,'conversion':conv,'cvr':cvr,'revenue':rev,'cost':cost,'gp':gp,'ecpc':ecpc})
|
||||||
if conv>0 and rc:
|
if conv>0 and dm['rc']:
|
||||||
routing_ids_with_conv.add(rc)
|
routing_ids_with_conv.add(dm['rc'])
|
||||||
|
|
||||||
# 无转化订单 = conversion=0 的 routing_campaign_id 个数
|
# 无转化订单 = conversion=0 的 routing_campaign_id 个数
|
||||||
# = 总(有点击的routing_campaign_id) - 有转化的routing_campaign_id
|
# = 总(有点击的routing_campaign_id) - 有转化的routing_campaign_id
|
||||||
|
|||||||
Reference in New Issue
Block a user