Exemple #1
0
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')
Exemple #2
0
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
Exemple #3
0
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)
Exemple #4
0
    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})
Exemple #5
0
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()
Exemple #6
0
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
Exemple #7
0
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()
Exemple #8
0
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
Exemple #9
0
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)
Exemple #10
0
def compose_insights(ad_id, fields, since=tool.get_today(), until=tool.get_today()):
    return compose(ad_id+"/insights?fields="+fields, since, until)