瀏覽代碼

add app ab test

liqian 2 年之前
父節點
當前提交
123c21ffb4
共有 4 個文件被更改,包括 147 次插入108 次删除
  1. 5 2
      app.py
  2. 6 0
      config.py
  3. 107 76
      recommend.py
  4. 29 30
      video_recall.py

+ 5 - 2
app.py

@@ -74,6 +74,7 @@ def homepage_recommend():
         algo_type = request_data.get('algoType')
         client_info = request_data.get('clientInfo')
         ab_exp_info = request_data.get('abExpInfo', None)
+        ab_info_data = request_data.get('abInfoData', None)
         # log_.info({'requestUri': '/applet/video/homepage/recommend', 'requestData': request_data})
         # log_.info('homepage_recommend request data: {}'.format(request_data))
         params = Params(request_id=request_id)
@@ -85,7 +86,8 @@ def homepage_recommend():
             videos = video_homepage_recommend(request_id=request_id,
                                               mid=mid, uid=uid, size=size, app_type=app_type,
                                               algo_type=algo_type, client_info=client_info,
-                                              ab_exp_info=ab_exp_info, params=params)
+                                              ab_exp_info=ab_exp_info, params=params,
+                                              ab_info_data=ab_info_data)
             result = {'code': 200, 'message': 'success', 'data': {'videos': videos}}
             log_.info({
                 'requestUri': '/applet/video/homepage/recommend',
@@ -149,6 +151,7 @@ def relevant_recommend():
         client_info = request_data.get('clientInfo')
         ab_exp_info = request_data.get('abExpInfo', None)
         page_type = request_data.get('pageType')  # 1:详情页;2:分享页
+        ab_info_data = request_data.get('abInfoData', None)
         # log_.info({'requestUri': '/applet/video/relevant/recommend', 'requestData': request_data})
         # log_.info('requestUri = "{}", requestData = "{}"'.format('/applet/video/relevant/recommend', request_data))
         # log_.info('relevant_recommend request data: {}'.format(request_data))
@@ -158,7 +161,7 @@ def relevant_recommend():
         videos = video_relevant_recommend(request_id=request_id,
                                           video_id=video_id, mid=mid, uid=uid, size=page_size, app_type=app_type,
                                           ab_exp_info=ab_exp_info, client_info=client_info, page_type=page_type,
-                                          params=params)
+                                          params=params, ab_info_data=ab_info_data)
 
         result = {'code': 200, 'message': 'success', 'data': {'videos': videos}}
         log_.info({

+ 6 - 0
config.py

@@ -17,6 +17,12 @@ class BaseConfig(object):
         'PIAO_QUAN_VIDEO_PLUS': 21,  # 票圈视频+
     }
 
+    # APP ab实验配置
+    APP_AB_CODE = {
+        '10003': '110154',  # 首页, 小程序地域分组小时级数据
+        '10037': '100373',  # 相关推荐, 小程序地域分组小时级数据
+    }
+
     # AB实验配置
     AB_EXP_CODE = {
         'rec_size_home': '003',

+ 107 - 76
recommend.py

@@ -426,10 +426,12 @@ def update_local_distribute_count(videos):
         log_.error(traceback.format_exc())
 
 
-def get_recommend_params(ab_exp_info, page_type=0):
+def get_recommend_params(recommend_type, ab_exp_info, ab_info_data, page_type=0):
     """
     根据实验分组给定对应的推荐参数
+    :param recommend_type: 首页推荐和相关推荐区分参数(0-首页推荐,1-相关推荐)
     :param ab_exp_info: AB实验组参数
+    :param ab_info_data: app实验组参数
     :param page_type: 页面区分参数,默认:0(首页)
     :return:
     """
@@ -605,10 +607,36 @@ def get_recommend_params(ab_exp_info, page_type=0):
         # else:
         #     old_video_index = -1
 
+    # APP实验组
+    if ab_info_data:
+        ab_info_app = {}
+        for page_code, item in ab_info_data.items():
+            if not item:
+                continue
+            ab_info_code = item.get('eventId', None)
+            if ab_info_code:
+                ab_info_app[page_code] = ab_info_code
+        print(f"======{ab_info_app}")
+        # 首页推荐
+        if recommend_type == 0:
+            if config_.APP_AB_CODE['10003'] == ab_info_app.get('10003', None):
+                ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank3')
+                expire_time = 3600
+                rule_key = config_.RULE_KEY_REGION['region_rule_rank3']
+                no_op_flag = True
+        # 相关推荐
+        elif recommend_type == 1:
+            if config_.APP_AB_CODE['10037'] == ab_info_app.get('10037', None):
+                ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank3')
+                expire_time = 3600
+                rule_key = config_.RULE_KEY_REGION['region_rule_rank3']
+                no_op_flag = True
+
     return top_K, flow_pool_P, ab_code, rule_key, expire_time, no_op_flag, old_video_index
 
 
-def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type, client_info, ab_exp_info, params):
+def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type,
+                             client_info, ab_exp_info, params, ab_info_data):
     """
     首页线上推荐逻辑
     :param request_id: request_id
@@ -620,6 +648,7 @@ def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type, cl
     :param client_info: 用户位置信息 {"country": "国家",  "province": "省份",  "city": "城市"}
     :param ab_exp_info: ab实验分组参数 [{"expItemId":1, "configValue":{"size":4, "K":3, ...}}, ...]
     :param params:
+    :param ab_info_data: app实验分组参数
     :return:
     """
 
@@ -640,86 +669,87 @@ def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type, cl
     #     update_redis_data(result=result, app_type=app_type, mid=mid, last_rov_recall_key=last_rov_recall_key,
     #                       expire_time=3600)
 
-    if app_type == config_.APP_TYPE['APP']:
-        # 票圈视频APP
-        top_K = config_.K
-        flow_pool_P = config_.P
-        # 简单召回 - 排序 - 兜底
-        rank_result, last_rov_recall_key = video_recommend(request_id=request_id,
-                                                           mid=mid, uid=uid, app_type=app_type,
-                                                           size=size, top_K=top_K, flow_pool_P=flow_pool_P,
-                                                           algo_type=algo_type, client_info=client_info,
-                                                           expire_time=12 * 3600, params=params)
-        # ab-test
-        # result = ab_test_op(rank_result=rank_result,
-        #                     ab_code_list=[config_.AB_CODE['position_insert']],
-        #                     app_type=app_type, mid=mid, uid=uid)
-        # redis数据刷新
-        update_redis_data(result=rank_result, app_type=app_type, mid=mid, last_rov_recall_key=last_rov_recall_key,
-                          top_K=top_K, expire_time=12 * 3600)
+    # if app_type == config_.APP_TYPE['APP']:
+    #     # 票圈视频APP
+    #     top_K = config_.K
+    #     flow_pool_P = config_.P
+    #     # 简单召回 - 排序 - 兜底
+    #     rank_result, last_rov_recall_key = video_recommend(request_id=request_id,
+    #                                                        mid=mid, uid=uid, app_type=app_type,
+    #                                                        size=size, top_K=top_K, flow_pool_P=flow_pool_P,
+    #                                                        algo_type=algo_type, client_info=client_info,
+    #                                                        expire_time=12 * 3600, params=params)
+    #     # ab-test
+    #     # result = ab_test_op(rank_result=rank_result,
+    #     #                     ab_code_list=[config_.AB_CODE['position_insert']],
+    #     #                     app_type=app_type, mid=mid, uid=uid)
+    #     # redis数据刷新
+    #     update_redis_data(result=rank_result, app_type=app_type, mid=mid, last_rov_recall_key=last_rov_recall_key,
+    #                       top_K=top_K, expire_time=12 * 3600)
+    #
+    # else:
+    param_st = time.time()
+    # 特殊mid推荐处理
+    if mid in get_special_mid_list() or app_type == config_.APP_TYPE['PIAO_QUAN_VIDEO_PLUS']:
+        rank_result = special_mid_recommend(request_id=request_id, mid=mid, uid=uid, app_type=app_type, size=size)
+        return rank_result
 
-    else:
-        param_st = time.time()
-        # 特殊mid推荐处理
-        if mid in get_special_mid_list() or app_type == config_.APP_TYPE['PIAO_QUAN_VIDEO_PLUS']:
-            rank_result = special_mid_recommend(request_id=request_id, mid=mid, uid=uid, app_type=app_type, size=size)
-            return rank_result
-
-        # 普通mid推荐处理
-        top_K, flow_pool_P, ab_code, rule_key, expire_time, no_op_flag, old_video_index = \
-            get_recommend_params(ab_exp_info=ab_exp_info)
-        log_.info({
-            'logTimestamp': int(time.time() * 1000),
-            'request_id': request_id,
-            'app_type': app_type,
-            'mid': mid,
-            'uid': uid,
-            'operation': 'get_recommend_params',
-            'executeTime': (time.time() - param_st) * 1000
-        })
+    # 普通mid推荐处理
+    top_K, flow_pool_P, ab_code, rule_key, expire_time, no_op_flag, old_video_index = \
+        get_recommend_params(recommend_type=0, ab_exp_info=ab_exp_info, ab_info_data=ab_info_data)
+    log_.info({
+        'logTimestamp': int(time.time() * 1000),
+        'request_id': request_id,
+        'app_type': app_type,
+        'mid': mid,
+        'uid': uid,
+        'operation': 'get_recommend_params',
+        'executeTime': (time.time() - param_st) * 1000
+    })
 
-        # 简单召回 - 排序 - 兜底
-        get_result_st = time.time()
-        rank_result, last_rov_recall_key = video_recommend(request_id=request_id,
-                                                           mid=mid, uid=uid, app_type=app_type,
-                                                           size=size, top_K=top_K, flow_pool_P=flow_pool_P,
-                                                           algo_type=algo_type, client_info=client_info,
-                                                           ab_code=ab_code, expire_time=expire_time,
-                                                           rule_key=rule_key, no_op_flag=no_op_flag,
-                                                           old_video_index=old_video_index,
-                                                           params=params)
-        log_.info({
-            'logTimestamp': int(time.time() * 1000),
-            'request_id': request_id,
-            'app_type': app_type,
-            'mid': mid,
-            'uid': uid,
-            'operation': 'get_recommend_result',
-            'executeTime': (time.time() - get_result_st) * 1000
-        })
+    # 简单召回 - 排序 - 兜底
+    get_result_st = time.time()
+    rank_result, last_rov_recall_key = video_recommend(request_id=request_id,
+                                                       mid=mid, uid=uid, app_type=app_type,
+                                                       size=size, top_K=top_K, flow_pool_P=flow_pool_P,
+                                                       algo_type=algo_type, client_info=client_info,
+                                                       ab_code=ab_code, expire_time=expire_time,
+                                                       rule_key=rule_key, no_op_flag=no_op_flag,
+                                                       old_video_index=old_video_index,
+                                                       params=params)
+    log_.info({
+        'logTimestamp': int(time.time() * 1000),
+        'request_id': request_id,
+        'app_type': app_type,
+        'mid': mid,
+        'uid': uid,
+        'operation': 'get_recommend_result',
+        'executeTime': (time.time() - get_result_st) * 1000
+    })
 
-        # ab-test
-        # result = ab_test_op(rank_result=rank_result,
-        #                     ab_code_list=[config_.AB_CODE['position_insert']],
-        #                     app_type=app_type, mid=mid, uid=uid)
-        # redis数据刷新
-        update_redis_st = time.time()
-        update_redis_data(result=rank_result, app_type=app_type, mid=mid, last_rov_recall_key=last_rov_recall_key,
-                          top_K=top_K)
-        log_.info({
-            'logTimestamp': int(time.time() * 1000),
-            'request_id': request_id,
-            'app_type': app_type,
-            'mid': mid,
-            'uid': uid,
-            'operation': 'update_redis_data',
-            'executeTime': (time.time() - update_redis_st) * 1000
-        })
+    # ab-test
+    # result = ab_test_op(rank_result=rank_result,
+    #                     ab_code_list=[config_.AB_CODE['position_insert']],
+    #                     app_type=app_type, mid=mid, uid=uid)
+    # redis数据刷新
+    update_redis_st = time.time()
+    update_redis_data(result=rank_result, app_type=app_type, mid=mid, last_rov_recall_key=last_rov_recall_key,
+                      top_K=top_K)
+    log_.info({
+        'logTimestamp': int(time.time() * 1000),
+        'request_id': request_id,
+        'app_type': app_type,
+        'mid': mid,
+        'uid': uid,
+        'operation': 'update_redis_data',
+        'executeTime': (time.time() - update_redis_st) * 1000
+    })
 
     return rank_result
 
 
-def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_exp_info, client_info, page_type, params):
+def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_exp_info, client_info,
+                             page_type, params, ab_info_data):
     """
     相关推荐逻辑
     :param request_id: request_id
@@ -732,6 +762,7 @@ def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_
     :param client_info: 地域参数
     :param page_type: 页面区分参数  1:详情页;2:分享页
     :param params:
+    :param ab_info_data: app实验分组参数
     :return: videos type-list
     """
     param_st = time.time()
@@ -742,7 +773,7 @@ def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_
 
     # 普通mid推荐处理
     top_K, flow_pool_P, ab_code, rule_key, expire_time, no_op_flag, old_video_index = \
-        get_recommend_params(ab_exp_info=ab_exp_info, page_type=page_type)
+        get_recommend_params(recommend_type=1, ab_exp_info=ab_exp_info, ab_info_data=ab_info_data, page_type=page_type)
     log_.info({
         'logTimestamp': int(time.time() * 1000),
         'request_id': request_id,

+ 29 - 30
video_recall.py

@@ -682,7 +682,6 @@ class PoolRecall(object):
                 [config_.AB_CODE['rov_rank_appType_18_19'], config_.AB_CODE['rov_rank_appType_19'],
                  config_.AB_CODE['top_video_relevant_appType_19']] + \
                 [code for _, code in config_.AB_CODE['rank_by_24h'].items()] or \
-                self.app_type == config_.APP_TYPE['APP'] or \
                 video_type == 'whole_movies':
             rov_pool_key, redis_date = self.get_pool_redis_key_with_h('rov', video_type=video_type)
 
@@ -845,38 +844,38 @@ class PoolRecall(object):
 
             # appType = 13, 票圈视频APP
             # 数据更新周期:每天07:00-21:00, 2h/次
-            if self.app_type == config_.APP_TYPE['APP']:
-                if h < 7:
-                    key_h = 21
-                    key_date = (date.today() - timedelta(days=1)).strftime('%Y%m%d')
-                elif h > 21:
-                    key_h = 21
-                    key_date = now_date
-                else:
-                    if h % 2 == 0:
-                        key_h = h - 1
-                        key_date = now_date
-                    else:
-                        key_h = h
-                        key_date = now_date
-                # print(key_date, key_h)
-                key_name = f'{config_.APP_FINAL_RECALL_KEY_NAME_PREFIX}{key_date}.{key_h}'
-                if self.redis_helper.key_exists(key_name):
-                    return key_name, key_h
-                else:
-                    if key_h == 7:
-                        redis_h = 21
-                        redis_date = (date.today() - timedelta(days=1)).strftime('%Y%m%d')
-                    else:
-                        redis_h = key_h - 2
-                        redis_date = key_date
-                    # print(redis_date, redis_h)
-                    key_name = f'{config_.APP_FINAL_RECALL_KEY_NAME_PREFIX}{redis_date}.{redis_h}'
-                    return key_name, redis_h
+            # if self.app_type == config_.APP_TYPE['APP']:
+            #     if h < 7:
+            #         key_h = 21
+            #         key_date = (date.today() - timedelta(days=1)).strftime('%Y%m%d')
+            #     elif h > 21:
+            #         key_h = 21
+            #         key_date = now_date
+            #     else:
+            #         if h % 2 == 0:
+            #             key_h = h - 1
+            #             key_date = now_date
+            #         else:
+            #             key_h = h
+            #             key_date = now_date
+            #     # print(key_date, key_h)
+            #     key_name = f'{config_.APP_FINAL_RECALL_KEY_NAME_PREFIX}{key_date}.{key_h}'
+            #     if self.redis_helper.key_exists(key_name):
+            #         return key_name, key_h
+            #     else:
+            #         if key_h == 7:
+            #             redis_h = 21
+            #             redis_date = (date.today() - timedelta(days=1)).strftime('%Y%m%d')
+            #         else:
+            #             redis_h = key_h - 2
+            #             redis_date = key_date
+            #         # print(redis_date, redis_h)
+            #         key_name = f'{config_.APP_FINAL_RECALL_KEY_NAME_PREFIX}{redis_date}.{redis_h}'
+            #         return key_name, redis_h
 
             # elif self.app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
             # abCode = 30001   # 老好看视频 / 票圈最惊奇 首页/相关推荐逻辑更新实验
-            elif self.ab_code in [
+            if self.ab_code in [
                 config_.AB_CODE['rov_rank_appType_18_19'], config_.AB_CODE['rov_rank_appType_19'],
                 config_.AB_CODE['top_video_relevant_appType_19']
             ]: