def prize_control(): if mongo.stats_trigger() and bb.stats_trigger_date != tool.get_today(): bb.stats_trigger_date = tool.get_today() effect_data = mongo.get_yesterday_effect(os.environ["name"]) if len(effect_data) > 0: log.logger.info("触发奖励....") log.logger.info(effect_data) for effect in effect_data: install = effect['daily_install_count'] roi = effect['roi'] effect_ad_id = effect['ad_id'] # 判断当前广告状态,只有active或paused的广告才能更改出价,调整血量 out = fb.get_ads_status([effect_ad_id]) if effect_ad_id in out: cur_status = out[effect_ad_id] if cur_status == 'ACTIVE': if not mongo.check_prize(effect_ad_id): coef = math.sqrt(bb.install_stats.cdf(install) * bb.roi_stats.cdf(roi)) # 奖励回血 back_blood = round(100 * coef) bb.set_blood(effect_ad_id, back_blood, 0) log.logger.info("奖励回血 -> ad_id(" + effect_ad_id + ") add blood:" + str(back_blood)) # 分析是否调整为VALUE模式 # 0.如果满足条件,则进入1,否则进入出价控制 # 1.判断广告名称中是否包含[VALUE yyyy-mm-dd],如果满足条件,则进入2,否则不用调整 # 2.调用优化调整服务,修改当前广告为VALUE优化模式 # 出价控制 effect_adset = mongo.get_adset_id(effect_ad_id) cur_bid = bsc.get_bid([effect_adset])[0][effect_adset] new_bid = cur_bid + 2000 * coef bsc.update_bid(new_bid, cur_bid, effect_adset, effect_ad_id) mongo.blood_return(effect_ad_id, back_blood, 'prize')
def get_ads_insights(ads_id, since=tool.get_today(), until=tool.get_today()): ads_data = {x: compose_insights(x, 'spend,actions', since, until) for x in ads_id} bp_obj = BatchProcess(ads_data) out = bp_obj.run() result = dict() for key in out: tuple_tmp = (0, 0, 0) if 'body' in out[key]: if 'data' in out[key]['body']: if len(out[key]['body']['data']) != 0: tuple_tmp = tool.get_insights_by_json(out[key]['body']) result[key] = tuple_tmp return result
def compose(prefix, since=tool.get_today(), until=tool.get_today(), set_time_range=True): time_range = "&time_range={since:'" + since + "',until:'" + until + "'}" if not set_time_range: time_range = "" body = { 'token': os.environ["access_token"], 'request': { 'apiVersion': tool.FB_API_VERSION, 'path': prefix + time_range }, 'account': os.environ["account_id"], 'priority': 1, 'noRetry': True } return json.dumps(body)
def get(self, request, pk=None, year=None, month=None, format=None): if pk: user = User.objects.get(pk=pk) else: user = request.user pass my_teams = TeamMember.objects.filter(member=user).values('team') teams = Team.objects.filter(id__in=my_teams) today = get_today() year = today.year if year is None else year month = today.month if month is None else month months = get_month_range(datetime.datetime(year, month, 1)) meets = Meet.objects.filter(team__in=teams).filter(starttime__gte=months[0]).filter(starttime__lt=months[1]).order_by("starttime") events = [] for meet in meets: events.append( { "id": meet.id, "name": meet.name, "date": meet.starttime, "type": "meet", "startdate": meet.starttime, "enddate": meet.starttime + meet.duration, "color": "tomato", "url": "meets/{}".format(meet.slug), } ) pass return Response({"monthly": events})
def blood_return(ad_id, blood, ret_type): client = MongoClient(mongo_server_uri) # 连接所需数据库,test为数据库名 db = client.get_database(os.environ['mongo_dbname']) db.blood_return.insert_one({ 'type': ret_type, 'ad_id': ad_id, 'blood': blood, 'apply_date': tool.get_today(), 'update': tool.get_time_now() }) client.close()
def check_prize(ad_id): client = MongoClient(mongo_server_uri) db = client.get_database(os.environ['mongo_dbname']) out = db.blood_return.find({ 'ad_id': ad_id, 'apply_date': tool.get_today(), 'type': 'prize' }) res_len = len(list(out)) client.close() if res_len > 0: return True else: return False
def record_bid_trace(ad_id, spend, install, pay, cur_bid): client = MongoClient(mongo_server_uri) # 连接所需数据库,test为数据库名 db = client.get_database(os.environ['mongo_dbname']) db.bid_trace.insert_one({ 'delt_name': os.environ["name"], 'ad_id': ad_id, 'spend': spend, 'install': install, 'pay': pay, 'bid_amount': cur_bid, 'date': tool.get_today(), 'update': tool.get_time_now() }) client.close()
def get_bid_trace_tuple(ad_id): client = MongoClient(mongo_server_uri) db = client.get_database(os.environ['mongo_dbname']) out = db.bid_trace.find({'ad_id': ad_id, 'date': tool.get_today()}) records = list(out) client.close() max_spend = 0 install = 0 pay = 0 for row in records: if row['spend'] > max_spend: max_spend = row['spend'] install = row['install'] pay = row['pay'] return max_spend, install, pay
def monitor(): env_init() import blood.blood_control as bc import common.logger as log import common.utils as tool import data_center.snapshot as ds import blood.blood_base as bb import bid_rank.bid_control as bid cur_minutes = time.strftime('%M', time.localtime(time.time())) log.logger.info('cur_minutes:' + cur_minutes) while True: if time.strftime('%M', time.localtime(time.time())) == cur_minutes: log.logger.info("......meet......") bc.cur_index['today'] = tool.get_today() # 更新数据 ds.snap_data.update(bc.cur_index['today']) # 更新控制系数、投放状态信息 bb.update_args() if bb.delivery_status == "on": # 获取效果指标,处理血量,关闭血量为0的广告 log.logger.info("//handler") bc.handler() # 检查广告数据,根据init_size创建一定数量的广告 log.logger.info("//online_check") bc.online_check() log.logger.info("//dead_check") bc.dead_check() # 奖励回血+提高出价 log.logger.info("//prize_control") bc.prize_control() # 周期回血 log.logger.info("//period_control") bc.period_control() # 出价跟踪 log.logger.info("//bid_trace") bid.bid_trace() log.logger.info("//waiting next period") else: log.logger.info("current delivery is off.") # 等待1分钟 time.sleep(60) else: time.sleep(1)
def compose_insights(ad_id, fields, since=tool.get_today(), until=tool.get_today()): return compose(ad_id+"/insights?fields="+fields, since, until)