Quellcode durchsuchen

Merge branch 'feature_2023072513_liqian_add_ad_abtest' into dev

liqian vor 1 Jahr
Ursprung
Commit
03f7960d2e
6 geänderte Dateien mit 774 neuen und 437 gelöschten Zeilen
  1. 75 7
      app.py
  2. 393 312
      config.py
  3. 142 68
      rank_service.py
  4. 70 21
      recommend.py
  5. 27 0
      utils.py
  6. 67 29
      video_rank.py

+ 75 - 7
app.py

@@ -49,13 +49,44 @@ def homepage_recommend():
         uid = request_data.get('uid')
         category_id = request_data.get('categoryId')
         size = request_data.get('size', 4)
-        app_type = request_data.get('appType')
+        app_type = request_data.get('appType', 4)
         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)
         version_audit_status = request_data.get('versionAuditStatus', 2)  # 小程序版本审核参数:1-审核中,2-审核通过,默认:2
-
+        machineinfoBrand = request_data.get('machineinfoBrand', '')
+        machineinfoModel = request_data.get('machineinfoModel', '')
+        machineinfoPlatform = request_data.get('machineinfoPlatform', '')
+        pagesource = request_data.get('pageSource', '')
+        versioncode = request_data.get('versionCode', 0)
+        recommendsource = request_data.get('recommendSource', '0')
+        sencetype = request_data.get('senceType', 0)
+        recomTraceId=request_data.get('recomTraceId', "")
+        env_dict = {}
+        try:
+            env_dict['app_type'] = int(app_type)
+            env_dict['pagesource'] = str(pagesource)
+            env_dict['versioncode'] = int(versioncode)
+            env_dict['machineinfo_brand'] = str(machineinfoBrand)
+            env_dict['machineinfo_model'] = str(machineinfoModel)
+            env_dict['machineinfo_platform'] = str(machineinfoPlatform)
+            env_dict['recommendsource'] = str(recommendsource)
+            env_dict['sencetype'] = int(sencetype)
+            env_dict['recomTraceId'] = recomTraceId
+            env_dict['recomInterface'] = "homepage"
+        except:
+            env_dict['app_type'] = 4
+            env_dict['pagesource'] = str(pagesource)
+            env_dict['versioncode'] = 0
+            env_dict['machineinfo_brand'] = str(machineinfoBrand)
+            env_dict['machineinfo_model'] = str(machineinfoModel)
+            env_dict['machineinfo_platform'] = str(machineinfoPlatform)
+            env_dict['recommendsource'] = str(recommendsource)
+            env_dict['sencetype'] = sencetype
+            env_dict['recomTraceId'] = recomTraceId
+            env_dict['recomInterface'] = "homepage"
+            log_.error("feature error",env_dict)
         params = Params(request_id=request_id)
         # size默认为10
         if not size:
@@ -73,7 +104,8 @@ def homepage_recommend():
                 ab_exp_info=ab_exp_info,
                 params=params,
                 ab_info_data=ab_info_data,
-                version_audit_status=version_audit_status
+                version_audit_status=version_audit_status,
+                env_dict = env_dict
             )
 
             result = {'code': 200, 'message': 'success', 'data': {'videos': recommend_result['videos']}}
@@ -94,7 +126,8 @@ def homepage_recommend():
                 'updateRedisDataTime': recommend_result.get('updateRedisDataTime', ''),
                 'recommendOperation': recommend_result.get('recommendOperation', ''),
                 'result': result,
-                'executeTime': (time.time() - start_time) * 1000
+                'executeTime': (time.time() - start_time) * 1000,
+                'fea_info': recommend_result.get('fea_info', {})
             }
             log_.info(log_message)
             # log_.info('category_id: {}, mid: {}, uid: {}, result: {}, execute time = {}ms'.format(
@@ -149,7 +182,40 @@ def relevant_recommend():
         page_type = request_data.get('pageType')  # 1:详情页;2:分享页
         ab_info_data = request_data.get('abInfoData', None)
         version_audit_status = request_data.get('versionAuditStatus', 2)  # 小程序版本审核参数:1-审核中,2-审核通过,默认:2
-
+        machineinfoBrand = request_data.get('machineinfoBrand', '')
+        machineinfoModel = request_data.get('machineinfoModel', '')
+        machineinfoPlatform = request_data.get('machineinfoPlatform', '')
+        pagesource = request_data.get('pageSource', '')
+        versioncode = request_data.get('versionCode', 0)
+        recommendsource = request_data.get('recommendSource', '0')
+        sencetype =  request_data.get('senceType', 0)
+        recomTraceId = request_data.get('recomTraceId', "")
+        env_dict = {}
+        try:
+            env_dict['app_type'] = int(app_type)
+            env_dict['pagesource'] = str(pagesource)
+            env_dict['versioncode'] = int(versioncode)
+            env_dict['machineinfo_brand'] = str(machineinfoBrand)
+            env_dict['machineinfo_model'] = str(machineinfoModel)
+            env_dict['machineinfo_platform'] = str(machineinfoPlatform)
+            env_dict['recommendsource'] = str(recommendsource)
+            env_dict['sencetype'] = int(sencetype)
+            env_dict['recomInterface'] = "relevant_recommend"
+            env_dict['recomTraceId'] = recomTraceId
+            env_dict['relevant_video_id'] = video_id
+        except:
+            env_dict['app_type'] = 4
+            env_dict['pagesource'] = str(pagesource)
+            env_dict['versioncode'] = 0
+            env_dict['machineinfo_brand'] = str(machineinfoBrand)
+            env_dict['machineinfo_model'] = str(machineinfoModel)
+            env_dict['machineinfo_platform'] = str(machineinfoPlatform)
+            env_dict['recommendsource'] = str(recommendsource)
+            env_dict['sencetype'] = sencetype
+            env_dict['recomInterface'] = "relevant_recommend"
+            env_dict['relevant_video_id'] = video_id
+            env_dict['recomTraceId'] = recomTraceId
+            log_.error("feature error", env_dict)
         params = Params(request_id=request_id)
         recommend_result = video_relevant_recommend(
             request_id=request_id,
@@ -163,7 +229,8 @@ def relevant_recommend():
             page_type=page_type,
             params=params,
             ab_info_data=ab_info_data,
-            version_audit_status=version_audit_status
+            version_audit_status=version_audit_status,
+            env_dict = env_dict
         )
 
         result = {'code': 200, 'message': 'success', 'data': {'videos': recommend_result['videos']}}
@@ -183,7 +250,8 @@ def relevant_recommend():
             'updateRedisDataTime': recommend_result.get('updateRedisDataTime', ''),
             'recommendOperation': recommend_result.get('recommendOperation', ''),
             'result': result,
-            'executeTime': (time.time() - start_time) * 1000
+            'executeTime': (time.time() - start_time) * 1000,
+            'fea_info': recommend_result.get('fea_info', {})
         }
         log_.info(log_message)
 

+ 393 - 312
config.py

@@ -834,64 +834,64 @@ class BaseConfig(object):
     # 广告模型abtest配置
     AD_ABTEST_CONFIG = {
         # 票圈vlog
-        '173-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '173-b': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 调整未分组用户的阈值(去除不出广告的用户组)
-        '173-c': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule3'},
-            'group_class_key': 'class2',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
-        },  # 细化分组 return25_29, return30+, 且return30+ 不出广告
-        '173-d': {
-            'video': {'data': 'data1:7days'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 视频使用7天内有曝光的
-        '173-e': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
-            'care_model_status_param': 2,
-            'care_model_ab_mid_group': ['mean_group'],
-        },  # 开启关怀模式人群多出广告
-        '173-f': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
-            'care_model_status_param': 1,
-            'care_model_ab_mid_group': ['mean_group'],
-        },  # 未开启关怀模式人群多出广告
-        '173-g': {
-            'video': {'data': 'data1:7days'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 调整未分组用户的阈值(去除不出广告的用户组) + 视频使用7天内有曝光的
-        '173-h': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
-        },  # else人群多出广告,阈值比例参数:0.8
-        '173-i': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
-        },  # else人群多出广告,阈值比例参数:0.9
+        # '173-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '173-b': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 调整未分组用户的阈值(去除不出广告的用户组)
+        # '173-c': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule3'},
+        #     'group_class_key': 'class2',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
+        # },  # 细化分组 return25_29, return30+, 且return30+ 不出广告
+        # '173-d': {
+        #     'video': {'data': 'data1:7days'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 视频使用7天内有曝光的
+        # '173-e': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+        #     'care_model_status_param': 2,
+        #     'care_model_ab_mid_group': ['mean_group'],
+        # },  # 开启关怀模式人群多出广告
+        # '173-f': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+        #     'care_model_status_param': 1,
+        #     'care_model_ab_mid_group': ['mean_group'],
+        # },  # 未开启关怀模式人群多出广告
+        # '173-g': {
+        #     'video': {'data': 'data1:7days'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 调整未分组用户的阈值(去除不出广告的用户组) + 视频使用7天内有曝光的
+        # '173-h': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+        # },  # else人群多出广告,阈值比例参数:0.8
+        # '173-i': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+        # },  # else人群多出广告,阈值比例参数:0.9
         '173-j': {
             'video': {'data': 'videos0'},
             'user': {'data': 'user0', 'rule': 'rule2'},
@@ -900,14 +900,14 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 所有广告类型数据 + 优化阈值计算方式 + else未开启关怀模式人群多出广告
-        '173-k': {
-            'video': {'data': 'videos0:adtype1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
-            'care_model_status_param': 1,
-            'care_model_ab_mid_group': ['mean_group'],
-        },  # else未开启关怀模式人群多出广告 + 模板插屏类型广告视频数据
+        # '173-k': {
+        #     'video': {'data': 'videos0:adtype1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+        #     'care_model_status_param': 1,
+        #     'care_model_ab_mid_group': ['mean_group'],
+        # },  # else未开启关怀模式人群多出广告 + 模板插屏类型广告视频数据
         '173-l': {
             'video': {'data': 'videos0'},
             'user': {'data': 'user0', 'rule': 'rule2'},
@@ -916,54 +916,62 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
         },  # 所有广告类型数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告
-        '173-m': {
-            'video': {'data': 'videos0new'},
-            'user': {'data': 'user0new', 'rule': 'rule2'},
+        # '173-m': {
+        #     'video': {'data': 'videos0new'},
+        #     'user': {'data': 'user0new', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+        #     'care_model_status_param': 1,
+        #     'care_model_ab_mid_group': ['mean_group'],
+        # },  # 所有广告类型数据 + 优化阈值计算方式 + else未开启关怀模式人群多出广告 + 调整计算公式(标准贝叶斯公式)
+        '173-n': {
+            'video': {'data': 'videos0out'},
+            'user': {'data': 'user0out', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型数据 + 优化阈值计算方式 + else未开启关怀模式人群多出广告 + 调整计算公式(标准贝叶斯公式)
-        '173-n': {
+        },  # 所有广告类型数据 + 优化阈值计算方式 + else未开启关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
+        '173-o': {
             'video': {'data': 'videos0out'},
             'user': {'data': 'user0out', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
-            'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型数据 + 优化阈值计算方式 + else未开启关怀模式人群多出广告
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 票圈视频+
-        '190-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '190-b': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '190-c': {
-            'video': {'data': 'data21'},
-            'user': {'data': 'user21', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '190-d': {
-            'video': {'data': 'data21'},
-            'user': {'data': 'user21', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '190-e': {
-            'video': {'data': 'videos21'},
-            'user': {'data': 'user21', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端视频数据 + 优化1
+        # '190-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '190-b': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '190-c': {
+        #     'video': {'data': 'data21'},
+        #     'user': {'data': 'user21', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '190-d': {
+        #     'video': {'data': 'data21'},
+        #     'user': {'data': 'user21', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '190-e': {
+        #     'video': {'data': 'videos21'},
+        #     'user': {'data': 'user21', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 所有广告类型本端视频数据 + 优化1
         '190-f': {
             'video': {'data': 'videos21'},
             'user': {'data': 'user21', 'rule': 'rule2'},
@@ -972,44 +980,52 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + 未开启关怀模式人群多出广告
+        '190-g': {
+            'video': {'data': 'videos21out'},
+            'user': {'data': 'user21out', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 票圈视频
-        '194-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '194-b': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 调整未分组用户的阈值(去除不出广告的用户组)
-        '194-c': {
-            'video': {'data': 'data2'},
-            'user': {'data': 'user4', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据
-        '194-d': {
-            'video': {'data': 'data2'},
-            'user': {'data': 'user4', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化阈值计算方式
-        '194-e': {
-            'video': {'data': 'videos4'},
-            'user': {'data': 'user4', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据 + 优化阈值计算方式
-        '194-f': {
-            'video': {'data': 'videos4:adtype1'},
-            'user': {'data': 'user4', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 模板插屏广告视频本端数据 + 优化阈值计算方式
+        # '194-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '194-b': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 调整未分组用户的阈值(去除不出广告的用户组)
+        # '194-c': {
+        #     'video': {'data': 'data2'},
+        #     'user': {'data': 'user4', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 本端数据
+        # '194-d': {
+        #     'video': {'data': 'data2'},
+        #     'user': {'data': 'user4', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 本端数据 + 优化阈值计算方式
+        # '194-e': {
+        #     'video': {'data': 'videos4'},
+        #     'user': {'data': 'user4', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 所有广告类型本端数据 + 优化阈值计算方式
+        # '194-f': {
+        #     'video': {'data': 'videos4:adtype1'},
+        #     'user': {'data': 'user4', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 模板插屏广告视频本端数据 + 优化阈值计算方式
         '194-g': {
             'video': {'data': 'videos4'},
             'user': {'data': 'user4', 'rule': 'rule2'},
@@ -1018,46 +1034,54 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
-        '194-h': {
-            'video': {'data': 'videos4new'},
-            'user': {'data': 'user4new', 'rule': 'rule2'},
+        # '194-h': {
+        #     'video': {'data': 'videos4new'},
+        #     'user': {'data': 'user4new', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+        #     'care_model_status_param': 1,
+        #     'care_model_ab_mid_group': ['mean_group'],
+        # },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 调整计算公式
+        '194-i': {
+            'video': {'data': 'videos4out'},
+            'user': {'data': 'user4out', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
-            'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 调整计算公式
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 内容精选
-        '195-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '195-b': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 调整未分组用户的阈值(去除不出广告的用户组)
-        '195-c': {
-            'video': {'data': 'data3'},
-            'user': {'data': 'user5', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据
-        '195-d': {
-            'video': {'data': 'data3'},
-            'user': {'data': 'user5', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化阈值计算方式
-        '195-e': {
-            'video': {'data': 'videos5'},
-            'user': {'data': 'user5', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据 + 优化阈值计算方式
+        # '195-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '195-b': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 调整未分组用户的阈值(去除不出广告的用户组)
+        # '195-c': {
+        #     'video': {'data': 'data3'},
+        #     'user': {'data': 'user5', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 本端数据
+        # '195-d': {
+        #     'video': {'data': 'data3'},
+        #     'user': {'data': 'user5', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 本端数据 + 优化阈值计算方式
+        # '195-e': {
+        #     'video': {'data': 'videos5'},
+        #     'user': {'data': 'user5', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 所有广告类型本端数据 + 优化阈值计算方式
         '195-f': {
             'video': {'data': 'videos5'},
             'user': {'data': 'user5', 'rule': 'rule2'},
@@ -1066,54 +1090,62 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
-        '195-g': {
-            'video': {'data': 'videos5new'},
-            'user': {'data': 'user5new', 'rule': 'rule2'},
+        # '195-g': {
+        #     'video': {'data': 'videos5new'},
+        #     'user': {'data': 'user5new', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+        #     'care_model_status_param': 1,
+        #     'care_model_ab_mid_group': ['mean_group'],
+        # },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 调整计算公式
+        '195-h': {
+            'video': {'data': 'videos5out'},
+            'user': {'data': 'user5out', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 调整计算公式
-        '195-h': {
+        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
+        '195-i': {
             'video': {'data': 'videos5out'},
             'user': {'data': 'user5out', 'rule': 'rule2'},
             'group_class_key': 'class1',
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
-            'care_model_ab_mid_group': ['mean_group'],
-        },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 票圈短视频
-        '196-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '196-b': {
-            'video': {'data': 'data4'},
-            'user': {'data': 'user6', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '196-c': {
-            'video': {'data': 'data4'},
-            'user': {'data': 'user6', 'rule': 'rule3'},
-            'group_class_key': 'class2',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
-        },  # 本端数据 + 优化阈值计算方式 + 优化2
-        '196-d': {
-            'video': {'data': 'data4:7days'},
-            'user': {'data': 'user6', 'rule': 'rule3'},
-            'group_class_key': 'class2',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
-        },  # 本端数据 + 优化阈值计算方式 + 优化2 + 优化4
-        '196-e': {
-            'video': {'data': 'videos6'},
-            'user': {'data': 'user6', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据
+        # '196-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '196-b': {
+        #     'video': {'data': 'data4'},
+        #     'user': {'data': 'user6', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '196-c': {
+        #     'video': {'data': 'data4'},
+        #     'user': {'data': 'user6', 'rule': 'rule3'},
+        #     'group_class_key': 'class2',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
+        # },  # 本端数据 + 优化阈值计算方式 + 优化2
+        # '196-d': {
+        #     'video': {'data': 'data4:7days'},
+        #     'user': {'data': 'user6', 'rule': 'rule3'},
+        #     'group_class_key': 'class2',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
+        # },  # 本端数据 + 优化阈值计算方式 + 优化2 + 优化4
+        # '196-e': {
+        #     'video': {'data': 'videos6'},
+        #     'user': {'data': 'user6', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 所有广告类型本端数据
         '196-f': {
             'video': {'data': 'videos6'},
             'user': {'data': 'user6', 'rule': 'rule1'},
@@ -1122,38 +1154,46 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 所有广告类型本端数据 + else非关怀模式人群多出广告
+        '196-g': {
+            'video': {'data': 'videos6out'},
+            'user': {'data': 'user6out', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 老好看视频
-        '197-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '197-b': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 优化阈值计算方式 调整未分组用户的阈值(去除不出广告的用户组)
-        '197-c': {
-            'video': {'data': 'data5'},
-            'user': {'data': 'user18', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化阈值计算方式
-        '197-d': {
-            'video': {'data': 'data5:7days'},
-            'user': {'data': 'user18', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化阈值计算方式 + 优化4
-        '197-e': {
-            'video': {'data': 'videos18'},
-            'user': {'data': 'user18', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据 + 优化阈值计算方式
+        # '197-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '197-b': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 优化阈值计算方式 调整未分组用户的阈值(去除不出广告的用户组)
+        # '197-c': {
+        #     'video': {'data': 'data5'},
+        #     'user': {'data': 'user18', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 本端数据 + 优化阈值计算方式
+        # '197-d': {
+        #     'video': {'data': 'data5:7days'},
+        #     'user': {'data': 'user18', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 本端数据 + 优化阈值计算方式 + 优化4
+        # '197-e': {
+        #     'video': {'data': 'videos18'},
+        #     'user': {'data': 'user18', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 所有广告类型本端数据 + 优化阈值计算方式
         '197-f': {
             'video': {'data': 'data5'},
             'user': {'data': 'user18', 'rule': 'rule2'},
@@ -1162,38 +1202,46 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
+        '197-g': {
+            'video': {'data': 'videos18out'},
+            'user': {'data': 'user18out', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 票圈最惊奇
-        '198-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },
-        '198-b': {
-            'video': {'data': 'data6'},
-            'user': {'data': 'user19', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据
-        '198-c': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 优化阈值计算方式
-        '198-d': {
-            'video': {'data': 'data6'},
-            'user': {'data': 'user19', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 本端数据 + 优化阈值计算方式
-        '198-e': {
-            'video': {'data': 'videos19'},
-            'user': {'data': 'user19', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据 + 优化阈值计算方式
+        # '198-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },
+        # '198-b': {
+        #     'video': {'data': 'data6'},
+        #     'user': {'data': 'user19', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 本端数据
+        # '198-c': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 优化阈值计算方式
+        # '198-d': {
+        #     'video': {'data': 'data6'},
+        #     'user': {'data': 'user19', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 本端数据 + 优化阈值计算方式
+        # '198-e': {
+        #     'video': {'data': 'videos19'},
+        #     'user': {'data': 'user19', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 所有广告类型本端数据 + 优化阈值计算方式
         '198-f': {
             'video': {'data': 'videos19'},
             'user': {'data': 'user19', 'rule': 'rule2'},
@@ -1202,26 +1250,34 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
+        '198-g': {
+            'video': {'data': 'videos19out'},
+            'user': {'data': 'user19out', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 票圈足迹
-        '242-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # vlog数据
-        '242-b': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # vlog数据 + 优化阈值计算方式
-        '242-c': {
-            'video': {'data': 'videos22'},
-            'user': {'data': 'user22', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据 + 优化阈值计算方式
+        # '242-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # vlog数据
+        # '242-b': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # vlog数据 + 优化阈值计算方式
+        # '242-c': {
+        #     'video': {'data': 'videos22'},
+        #     'user': {'data': 'user22', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 所有广告类型本端数据 + 优化阈值计算方式
         '242-d': {
             'video': {'data': 'videos22'},
             'user': {'data': 'user22', 'rule': 'rule2'},
@@ -1230,26 +1286,34 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 所有广告类型本端数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
+        '242-e': {
+            'video': {'data': 'videos22out'},
+            'user': {'data': 'user22out', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 票圈福年
-        '243-a': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # vlog数据
-        '243-b': {
-            'video': {'data': 'data1'},
-            'user': {'data': 'user0', 'rule': 'rule2'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # vlog数据 + 优化阈值计算方式
-        '243-c': {
-            'video': {'data': 'videos3'},
-            'user': {'data': 'user3', 'rule': 'rule1'},
-            'group_class_key': 'class1',
-            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
-        },  # 所有广告类型本端数据
+        # '243-a': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # vlog数据
+        # '243-b': {
+        #     'video': {'data': 'data1'},
+        #     'user': {'data': 'user0', 'rule': 'rule2'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # vlog数据 + 优化阈值计算方式
+        # '243-c': {
+        #     'video': {'data': 'videos3'},
+        #     'user': {'data': 'user3', 'rule': 'rule1'},
+        #     'group_class_key': 'class1',
+        #     'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        # },  # 所有广告类型本端数据
         '243-d': {
             'video': {'data': 'videos3'},
             'user': {'data': 'user3', 'rule': 'rule1'},
@@ -1258,6 +1322,14 @@ class BaseConfig(object):
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
         },  # 所有广告类型本端数据 + else非关怀模式人群多出广告
+        '243-e': {
+            'video': {'data': 'videos3out'},
+            'user': {'data': 'user3out', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
 
         # 票圈|信仰之路
         '324-a': {
@@ -1267,7 +1339,16 @@ class BaseConfig(object):
             'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
             'care_model_status_param': 1,
             'care_model_ab_mid_group': ['mean_group'],
-        },  # vlog所有广告类型数据 + 所有广告类型数据 + 未开启关怀模式人群多出广告
+        },  # vlog端所有广告类型数据 + 优化阈值计算方式 + else非关怀模式人群多出广告
+        '324-b': {
+            'video': {'data': 'videos0out'},
+            'user': {'data': 'user0out', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
+            'care_model_status_param': 1,
+            'care_model_ab_mid_group': ['mean_group', 'return0share1mids'],
+        },  # vlog端所有广告类型数据 + 优化阈值计算方式 + [else, return0share1mids]非关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据
+
     }
 
     # 用户组有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:users:group:predict:share:rate:{user_data_key}:{date}
@@ -1326,7 +1407,7 @@ class DevelopmentConfig(BaseConfig):
     GET_USER_30DayReturnCnt_URL = 'http://videotest-internal.yishihui.com/longvideoapi/openapi/user/has30DayReturnCnt?mid='
 
     #tf serving url
-    TF_SERVING_URL = 'http://localhost:8501/v1/models/deepfm:predict'
+    TF_SERVING_URL = 'http://reco-rank-internal.piaoquantv.com/v1/models/deepfm:predict'
 
     # 日志服务配置
     ALIYUN_LOG = {
@@ -1384,7 +1465,7 @@ class TestConfig(BaseConfig):
     GET_USER_30DayReturnCnt_URL = 'http://videotest-internal.yishihui.com/longvideoapi/openapi/user/has30DayReturnCnt?mid='
 
     # tf serving url
-    TF_SERVING_URL = 'http://localhost:8501/v1/models/deepfm:predict'
+    TF_SERVING_URL = 'http://reco-rank-internal.piaoquantv.com/v1/models/deepfm:predict'
 
     # 日志服务配置
     ALIYUN_LOG = {
@@ -1442,7 +1523,7 @@ class PreProductionConfig(BaseConfig):
     GET_USER_30DayReturnCnt_URL = 'http://videopre-internal.piaoquantv.com/longvideoapi/openapi/user/has30DayReturnCnt?mid='
 
     # tf serving url
-    TF_SERVING_URL = 'http://localhost:8501/v1/models/deepfm:predict'
+    TF_SERVING_URL = 'http://192.168.203.102:8501/v1/models/deepfm:predict'
 
     # 日志服务配置
     ALIYUN_LOG = {
@@ -1500,7 +1581,7 @@ class ProductionConfig(BaseConfig):
     GET_USER_30DayReturnCnt_URL = 'http://longvideoapi-internal.piaoquantv.com/longvideoapi/openapi/user/has30DayReturnCnt?mid='
 
     # tf serving url
-    TF_SERVING_URL = 'http://localhost:8501/v1/models/deepfm:predict'
+    TF_SERVING_URL = 'http://reco-rank-internal.piaoquantv.com/v1/models/deepfm:predict'
 
     # 日志服务配置
     ALIYUN_LOG = {

+ 142 - 68
rank_service.py

@@ -1,34 +1,39 @@
 #coding utf-8
 from db_helper import RedisHelper
 from config import set_config
-from  utils import request_post
+from  utils import  request_post_data
 import json
+from log import Log
+log_ = Log()
+
 
 config_ = set_config()
-def get_featurs(data, size, top_K, flow_pool_P, env_dict):
+def get_featurs(mid, data, size, top_K, flow_pool_P, env_dict=None):
     recall_list = []
     vidKeys = []
     feature_dict = {}
     # defult value
-    apptype = 0
+    apptype = 4
     pagesource = ""
-    versioncode = ""
-    machineinfo_brand=""
-    recommendsource = ""
-    machineinfo_platform = ''
-    sencetype = ''
-    mid = ''
-    if env_dict:
-        apptype = env_dict.get('app_type','')
-        pagesource = env_dict.get('versioncode', '')
-        versioncode = env_dict.get('versioncode', '')
+    versioncode = "580"
+    machineinfo_brand="HUAWEI"
+    recommendsource = "0"
+    machineinfo_platform = 'android'
+    sencetype = 100078
+    machineinfo_model ='M2006C3LC'
+    if env_dict and len(env_dict)>0:
+        apptype = env_dict.get('app_type',4)
+        pagesource = env_dict.get('pagesource', '')
+        versioncode = env_dict.get('versioncode', 0)
         machineinfo_brand = env_dict.get('machineinfo_brand', '')
         machineinfo_model = env_dict.get('machineinfo_model', '')
-        recommendsource = env_dict.get('recommendsource', '')
+        recommendsource = env_dict.get('recommendsource', '0')
         machineinfo_platform = env_dict.get('machineinfo_platform', '')
         sencetype = env_dict.get('sencetype', '')
     redisObj = RedisHelper()
     pre_str = "v_ctr:"
+    hour_pre_str = "v_hour_ctr:"
+    hour_vidKeys = []
     mid_list = []
     videoid_list = []
     apptype_list = []
@@ -56,7 +61,7 @@ def get_featurs(data, size, top_K, flow_pool_P, env_dict):
             continue
         vid = recall_item.get("videoId",0)
         mid_list.append(mid)
-        videoid_list.append(vid)
+        videoid_list.append(int(vid))
         apptype_list.append(apptype)
         pagesource_list.append(pagesource)
         versioncode_list.append(versioncode)
@@ -66,8 +71,12 @@ def get_featurs(data, size, top_K, flow_pool_P, env_dict):
         machineinfo_platform_list.append(machineinfo_platform)
         sencetype_list.append(sencetype)
         vidKeys.append(pre_str + str(vid))
+        hour_vidKeys.append(hour_pre_str+str(vid))
         recall_list.append(recall_item)
+    #print("vidKeys:", vidKeys)
     video_static_info = redisObj.get_batch_key(vidKeys)
+    video_hour_static_info = redisObj.get_batch_key(hour_vidKeys)
+    #print("video_static_info:",video_static_info)
     if video_static_info:
         for i in range(len(video_static_info)):
             try:
@@ -75,33 +84,71 @@ def get_featurs(data, size, top_K, flow_pool_P, env_dict):
                 vid = vidKeys[i].replace(pre_str,"")
                 if video_static_info[i] :
                     per_video_staic = json.loads(video_static_info[i])
-                    if vid in feature_dict:
-                        vid_fea_info = feature_dict[vid]
-                        day_rov_list.append(per_video_staic[0])
-                        day_share_return_score_list.append(per_video_staic[1])
-                        day_share_score_list.append(per_video_staic[2])
-                        day_return_rate_list.append(per_video_staic[3])
-                        day_ctr_score_list.append(per_video_staic[4])
-                        day_view_users_list.append(per_video_staic[5])
-                        day_view_pv_list.append(per_video_staic[6])
-                        day_play_users_list.append(per_video_staic[7])
-                        day_play_pv_list.append(per_video_staic[8])
-                        day_share_users.append(per_video_staic[9])
-                        day_share_pv_list.append(per_video_staic[10])
-                        day_return_users_list.append(per_video_staic[11])
+                    day_rov_list.append(float(per_video_staic[0]))
+                    day_share_return_score_list.append(float(per_video_staic[1]))
+                    day_share_score_list.append(float(per_video_staic[2]))
+                    day_return_rate_list.append(float(per_video_staic[3]))
+                    day_ctr_score_list.append(float(per_video_staic[4]))
+                    # day_view_users_list.append(int(per_video_staic[5]))
+                    # day_view_pv_list.append(int(per_video_staic[6]))
+                    # day_play_users_list.append(int(per_video_staic[7]))
+                    # day_play_pv_list.append(int(per_video_staic[8]))
+                    # day_share_users.append(int(per_video_staic[9]))
+                    # day_share_pv_list.append(int(per_video_staic[10]))
+                    # day_return_users_list.append(int(per_video_staic[11]))
+                else:
+                    insert_static_default_fea(day_ctr_score_list, day_play_pv_list, day_play_users_list,
+                                              day_return_rate_list, day_return_users_list, day_rov_list,
+                                              day_share_pv_list, day_share_return_score_list, day_share_score_list,
+                                              day_share_users, day_view_pv_list, day_view_users_list)
+            except Exception:
+                insert_static_default_fea(day_ctr_score_list, day_play_pv_list, day_play_users_list,
+                                          day_return_rate_list, day_return_users_list, day_rov_list,
+                                          day_share_pv_list, day_share_return_score_list, day_share_score_list,
+                                          day_share_users, day_view_pv_list, day_view_users_list)
+    else:
+        for i in range(len(recall_list)):
+            insert_static_default_fea(day_ctr_score_list, day_play_pv_list, day_play_users_list,
+                                      day_return_rate_list, day_return_users_list, day_rov_list,
+                                      day_share_pv_list, day_share_return_score_list, day_share_score_list,
+                                      day_share_users, day_view_pv_list, day_view_users_list)
+    hour_rov_list = []
+    hour_share_return_score_list =[]
+    hour_share_score_list =[]
+    hour_return_rate_list = []
+    hour_ctr_score_list = []
+
+    if video_hour_static_info:
+        for i in range(len(video_hour_static_info)):
+            try:
+                # print(video_scores[i])
+                vid = hour_vidKeys[i].replace(hour_pre_str,"")
+                if video_hour_static_info[i] :
+                    per_hour_video_staic = json.loads(video_hour_static_info[i])
+                    hour_rov_list.append(float(per_hour_video_staic[0]))
+                    hour_share_return_score_list.append(float(per_hour_video_staic[1]))
+                    hour_share_score_list.append(float(per_hour_video_staic[2]))
+                    hour_return_rate_list.append(float(per_hour_video_staic[3]))
+                    hour_ctr_score_list.append(float(per_hour_video_staic[4]))
+                else:
+                    hour_rov_list.append(0.0)
+                    hour_share_return_score_list.append(0.0)
+                    hour_share_score_list.append(0.0)
+                    hour_return_rate_list.append(0.0)
+                    hour_ctr_score_list.append(0.0)
             except Exception:
-                day_rov_list.append(0.0)
-                day_share_return_score_list.append(0.0)
-                day_share_score_list.append(0.0)
-                day_return_rate_list.append(0.0)
-                day_ctr_score_list.append(0.0)
-                day_view_users_list.append(0)
-                day_view_pv_list.append(0)
-                day_play_users_list.append(0)
-                day_play_pv_list.append(0)
-                day_share_users.append(0)
-                day_share_pv_list.append(0)
-                day_return_users_list.append(0)
+                    hour_rov_list.append(0.0)
+                    hour_share_return_score_list.append(0.0)
+                    hour_share_score_list.append(0.0)
+                    hour_return_rate_list.append(0.0)
+                    hour_ctr_score_list.append(0.0)
+    else:
+        for i in range(len(recall_list)):
+            hour_rov_list.append(0.0)
+            hour_share_return_score_list.append(0.0)
+            hour_share_score_list.append(0.0)
+            hour_return_rate_list.append(0.0)
+            hour_ctr_score_list.append(0.0)
     feature_dict["mid_list"] = mid_list
     feature_dict["videoid_list"] = videoid_list
     feature_dict["apptype_list"]  = apptype_list
@@ -112,21 +159,43 @@ def get_featurs(data, size, top_K, flow_pool_P, env_dict):
     feature_dict["recommendsource_list"] = recommendsource_list
     feature_dict["machineinfo_model_list"] = machineinfo_model_list
     feature_dict["machineinfo_platform_list"] = machineinfo_platform_list
-    feature_dict["sencetype_lis"] = sencetype_list
+    feature_dict["sencetype_list"] = sencetype_list
     feature_dict["day_rov_list"] = day_rov_list
     feature_dict["day_share_return_score_list"] = day_share_return_score_list
     feature_dict["day_share_score_list"] = day_share_score_list
     feature_dict["day_return_rate_list"] = day_return_rate_list
     feature_dict["day_ctr_score_list"] = day_ctr_score_list
-    feature_dict["day_ctr_score_list"] = day_ctr_score_list
-    feature_dict["day_play_pv_list"] = day_play_pv_list
-    feature_dict["day_play_users_list"] = day_play_users_list
-    feature_dict["day_return_users_list"] = day_return_users_list
-    feature_dict["day_share_pv_list"] = day_share_pv_list
-    feature_dict["day_view_pv_list"] = day_view_pv_list
-    feature_dict["day_view_users_list"] = day_view_users_list
-    feature_dict["day_share_users_list"] = day_share_users
-    return feature_dict
+    # feature_dict["day_play_pv_list"] = day_play_pv_list
+    # feature_dict["day_play_users_list"] = day_play_users_list
+    # feature_dict["day_return_users_list"] = day_return_users_list
+    # feature_dict["day_share_pv_list"] = day_share_pv_list
+    # feature_dict["day_view_pv_list"] = day_view_pv_list
+    # feature_dict["day_view_users_list"] = day_view_users_list
+    # feature_dict["day_share_users_list"] = day_share_users
+    feature_dict["hour_rov_list"] = hour_rov_list
+    feature_dict["hour_share_return_score_list"] = hour_share_return_score_list
+    feature_dict["hour_share_score_list"] = hour_share_score_list
+    feature_dict["hour_return_rate_list"] = hour_return_rate_list
+    feature_dict["hour_ctr_score_list"] = hour_ctr_score_list
+    return feature_dict, recall_list
+
+
+def insert_static_default_fea(day_ctr_score_list, day_play_pv_list, day_play_users_list, day_return_rate_list,
+                              day_return_users_list, day_rov_list, day_share_pv_list, day_share_return_score_list,
+                              day_share_score_list, day_share_users, day_view_pv_list, day_view_users_list):
+    day_rov_list.append(0.0)
+    day_share_return_score_list.append(0.0)
+    day_share_score_list.append(0.0)
+    day_return_rate_list.append(0.0)
+    day_ctr_score_list.append(0.0)
+    # day_view_users_list.append(0)
+    # day_view_pv_list.append(0)
+    # day_play_users_list.append(0)
+    # day_play_pv_list.append(0)
+    # day_share_users.append(0)
+    # day_share_pv_list.append(0)
+    # day_return_users_list.append(0)
+
 
 def get_tf_serving_sores(feature_dict):
     #for k, v in feature_dict:
@@ -146,26 +215,31 @@ def get_tf_serving_sores(feature_dict):
                     "day_share_score": feature_dict["day_share_score_list"],
                     "day_return_rate": feature_dict["day_return_rate_list"],
                     "day_ctr_score": feature_dict["day_ctr_score_list"],
-                    "day_play_pv": feature_dict["day_play_pv_list"],
-                    "day_play_users": feature_dict["day_play_users_list"],
-                    "day_share_pv": feature_dict["day_share_pv_list"],
-                    "day_return_users": feature_dict["day_return_users_list"],
-                    "day_share_users": feature_dict["day_share_users_list"],
-                    "day_view_pv": feature_dict["day_view_pv_list"],
-                    "day_view_users":feature_dict["day_view_users_list"]
+                    # "day_play_pv": feature_dict["day_play_pv_list"],
+                    # "day_play_users": feature_dict["day_play_users_list"],
+                    # "day_share_pv": feature_dict["day_share_pv_list"],
+                    # "day_return_users": feature_dict["day_return_users_list"],
+                    # "day_share_users": feature_dict["day_share_users_list"],
+                    # "day_view_pv": feature_dict["day_view_pv_list"],
+                    # "day_view_users":feature_dict["day_view_users_list"],
+                    "hour_rov": feature_dict["hour_rov_list"],
+                    "hour_share_score": feature_dict["hour_share_score_list"],
+                    "hour_share_return_score": feature_dict["hour_share_return_score_list"],
+                    "hour_return_rate": feature_dict["hour_return_rate_list"],
+                    "hour_ctr_score": feature_dict["hour_ctr_score_list"]
     }
-    request_data= {}
-    request_data["inputs"] = inputs_data
-    print(request_data)
+    request_data_dict= {}
+    request_data_dict["inputs"] = inputs_data
+    #print(request_data_dict)
+    request_data= json.dumps(request_data_dict)
+    #print(request_data)
     # 调用http接口
-    result = request_post(request_url=config_.TF_SERVING_URL, request_data=request_data, timeout=(0.1, 1))
+    result = request_post_data(config_.TF_SERVING_URL,request_data, timeout=(0.1, 1))
 
     # print("result:", result)
     if result is None:
-        # print("result is None")
-        # log_.info('过滤失败,types: {}'.format(types))
+        print("result is None")
+        log_.info('call tf serving error,types: {}')
         return []
-
-    print(result)
-
-    filtered_videos = result['data']
+    #print(result)
+    return result

+ 70 - 21
recommend.py

@@ -411,7 +411,7 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
 def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, algo_type, client_info,
                     expire_time=24*3600, ab_code=config_.AB_CODE['initial'], rule_key='', data_key='',
                     no_op_flag=False, old_video_index=-1, video_id=None, params=None, rule_key_30day=None,
-                    shield_config=None):
+                    shield_config=None, env_dict = None):
     """
     首页线上推荐逻辑
     :param request_id: request_id
@@ -452,11 +452,12 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
 
     if app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
         t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time, ab_code, exp_config)]
-        if ab_code ==60054 :
+        if ab_code ==60054 or ab_code==60066:
             t.append(gevent.spawn(pool_recall.get_sim_hot_item_reall_filter, exp_config))
         if ab_code == 60055:
             t.append(gevent.spawn(pool_recall.get_return_video_reall, exp_config))
         if ab_code == 60056:
+            t.append(gevent.spawn(pool_recall.get_sim_hot_item_reall_filter, exp_config))
             t.append(gevent.spawn(pool_recall.get_U2I_reall, mid , exp_config))
         if ab_code == 60065 :
             t.append(gevent.spawn(pool_recall.get_return_video_reall, exp_config, 'rv2:'))
@@ -470,11 +471,12 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
         t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time, ab_code, exp_config),
              gevent.spawn(pool_recall.flow_pool_recall, size, config_.QUICK_FLOW_POOL_ID),
              gevent.spawn(pool_recall.flow_pool_recall, size)]
-        if  ab_code == 60054:
+        if  ab_code == 60054 or ab_code==60066:
             t.append(gevent.spawn(pool_recall.get_sim_hot_item_reall_filter))
         if ab_code == 60055:
             t.append(gevent.spawn(pool_recall.get_return_video_reall, exp_config))
         if ab_code == 60056:
+            t.append(gevent.spawn(pool_recall.get_sim_hot_item_reall_filter, exp_config))
             t.append(gevent.spawn(pool_recall.get_U2I_reall, mid , exp_config))
         if ab_code == 60065:
             t.append(gevent.spawn(pool_recall.get_return_video_reall, exp_config, 'rv2:'))
@@ -494,7 +496,7 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
         result['rankResult'] = []
         return result
     #1. merge simrecall
-    if ab_code == 60054:
+    if ab_code == 60054 or ab_code==60066:
         rov_pool_recall = []
         if len(recall_result_list) >= 2:
             region_recall = recall_result_list[0]
@@ -547,17 +549,22 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
                         now_video_ids.add(video_id)
             if len(rov_pool_recall)>0:
                 recall_result_list[0] = rov_pool_recall
-    # merge u2i title recall
+    # merge simrecall, merge u2i title recall
     if ab_code == 60056:
         rov_pool_recall = []
         if len(recall_result_list)>=2:
             region_recall = recall_result_list[0]
+            sim_recall = []
             u2i_title_recall = []
             if app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
-                u2i_title_recall = recall_result_list[1]
-            else:
+                sim_recall = recall_result_list[1]
                 if len(recall_result_list) >= 3:
-                    u2i_title_recall = recall_result_list[3]
+                    u2i_title_recall = recall_result_list[2]
+            else:
+                if len(recall_result_list) >= 4:
+                    sim_recall = recall_result_list[3]
+                if len(recall_result_list) >= 5:
+                    u2i_title_recall = recall_result_list[4]
             now_video_ids = set('')
             if len(region_recall)>0:
                 for video in region_recall:
@@ -565,6 +572,12 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
                     if video_id not in now_video_ids:
                         rov_pool_recall.append(video)
                         now_video_ids.add(video_id)
+            if len(sim_recall) > 0:
+                for video in sim_recall:
+                    video_id = video.get('videoId')
+                    if video_id not in now_video_ids:
+                        rov_pool_recall.append(video)
+                        now_video_ids.add(video_id)
             if len(u2i_title_recall)>0:
                 for video in u2i_title_recall:
                     video_id = video.get('videoId')
@@ -651,9 +664,41 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
                 'rov_pool_recall': recall_result_list[0],
                 'flow_pool_recall': recall_result_list[2]
             }
-    #if ab_code=="ab_new_test":
-    #print("before data:", data)
-    rank_result, flow_num  = video_new_rank2(data=data, size=size, top_K=top_K, flow_pool_P=float(flow_pool_P), ab_code=ab_code, exp_config=exp_config)
+    # 3. 特征回流
+    #print(env_dict)
+    if env_dict:
+        province_code = client_info.get('provinceCode', '-1')
+        city_code = client_info.get('cityCode', '-1')
+        env_dict['mid'] = mid
+        env_dict['province_code'] = province_code
+        env_dict['city_code'] = city_code
+        rec_recall_list = []
+        vidKeys = []
+        hour_vidKeys = []
+        pre_str = "v_ctr:"
+        pre_hour_str = "v_hour_ctr:"
+        for recall_item in data['rov_pool_recall']:
+            if len(recall_item) <= 0:
+                continue
+            vid = recall_item.get("videoId", 0)
+            rec_recall_list.append(vid)
+            vidKeys.append(pre_str + str(vid))
+            hour_vidKeys.append(pre_hour_str + str(vid))
+        redisObj = RedisHelper()
+        video_static_info = redisObj.get_batch_key(vidKeys)
+        video_hour_static_info = redisObj.get_batch_key(hour_vidKeys)
+        vid_day_fea_list = []
+        vid_hour_fea_list = []
+        if video_static_info:
+            vid_day_fea_list = video_static_info
+        if video_hour_static_info:
+            vid_hour_fea_list = video_hour_static_info
+        env_dict['recall_list'] = rec_recall_list
+        env_dict['vid_day_fea_list'] = vid_day_fea_list
+        env_dict['vid_hour_fea_list'] = vid_hour_fea_list
+        env_json = env_dict
+    #4.
+    rank_result, flow_num  = video_new_rank2(data=data, size=size, top_K=top_K, flow_pool_P=float(flow_pool_P), ab_code=ab_code, mid=mid, exp_config=exp_config, env_dict=env_dict)
     #print(rank_result)
     if rank_result:
         result['rank_num'] = len(rank_result)
@@ -662,7 +707,7 @@ def video_old_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type
     result['rankTime'] = (time.time() - start_rank) * 1000
 
 
-    return result
+    return result, env_json
     # return rank_result, last_rov_recall_key
 
 def new_video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, algo_type, client_info,
@@ -1583,7 +1628,7 @@ def get_recommend_params(recommend_type, ab_exp_info, ab_info_data, mid, app_typ
 
 
 def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type,
-                             client_info, ab_exp_info, params, ab_info_data, version_audit_status):
+                             client_info, ab_exp_info, params, ab_info_data, version_audit_status, env_dict):
     """
     首页线上推荐逻辑
     :param request_id: request_id
@@ -1638,6 +1683,7 @@ def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type,
     # else:
     recommend_result = {}
     param_st = time.time()
+    recommend_result['fea_info'] = env_dict
     # 特殊mid 和 小程序审核版本推荐处理
     if mid in get_special_mid_list() or version_audit_status == 1:
         rank_result = special_mid_recommend(request_id=request_id, mid=mid, uid=uid, app_type=app_type, size=size)
@@ -1679,15 +1725,17 @@ def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type,
     # old video: 60056, test2
     elif ab_code == 60052 or ab_code == 60053 or ab_code == 60054 \
             or ab_code == 60055 or ab_code == 60056 or ab_code==60057  \
-            or ab_code==60065 or ab_code == 60067 or ab_code==60068 :
-        result = video_old_recommend(request_id=request_id,
+            or ab_code==60065 or ab_code == 60067 or ab_code==60068 \
+            or ab_code==60066:
+        result, fea_info = video_old_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='', client_info=client_info,
                                      ab_code=ab_code, expire_time=expire_time,
                                      rule_key=rule_key, data_key=data_key, no_op_flag=no_op_flag,
                                      old_video_index=old_video_index, video_id= None,
-                                     params=params, rule_key_30day=rule_key_30day, shield_config=shield_config)
+                                     params=params, rule_key_30day=rule_key_30day, shield_config=shield_config, env_dict=env_dict)
+        recommend_result['fea_info'] = fea_info
     else:
         result = video_recommend(request_id=request_id,
                              mid=mid, uid=uid, app_type=app_type,
@@ -1742,7 +1790,7 @@ def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type,
 
 
 def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_exp_info, client_info,
-                             page_type, params, ab_info_data, version_audit_status):
+                             page_type, params, ab_info_data, version_audit_status, env_dict):
     """
     相关推荐逻辑
     :param request_id: request_id
@@ -1761,6 +1809,7 @@ def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_
     """
     recommend_result = {}
     param_st = time.time()
+    recommend_result['fea_info'] = env_dict
     # 特殊mid 和 小程序审核版本推荐处理
     if mid in get_special_mid_list() or version_audit_status == 1:
         rank_result = special_mid_recommend(request_id=request_id, mid=mid, uid=uid, app_type=app_type, size=size)
@@ -1783,7 +1832,6 @@ def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_
     #     'executeTime': (time.time() - param_st) * 1000
     # })
     recommend_result['getRecommendParamsTime'] = (time.time() - param_st) * 1000
-
     # 简单召回 - 排序 - 兜底
     get_result_st = time.time()
     #print("ab_code:", ab_code)
@@ -1798,15 +1846,16 @@ def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_
                                  params=params, rule_key_30day=rule_key_30day, shield_config=shield_config)
     elif ab_code == 60052 or ab_code == 60053 or ab_code == 60054 or ab_code == 60055 or \
             ab_code == 60056 or ab_code==60057 or ab_code ==60065 or ab_code ==60067 \
-            or ab_code ==60068:
-        result = video_old_recommend(request_id=request_id,
+            or ab_code ==60068 or ab_code==60066:
+        result, fea_info = video_old_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='', client_info=client_info,
                                  ab_code=ab_code, expire_time=expire_time,
                                  rule_key=rule_key, data_key=data_key, no_op_flag=no_op_flag,
                                  old_video_index=old_video_index, video_id=video_id,
-                                 params=params, rule_key_30day=rule_key_30day, shield_config=shield_config)
+                                 params=params, rule_key_30day=rule_key_30day, shield_config=shield_config, env_dict = env_dict)
+        recommend_result['fea_info'] = fea_info
     else:
         result = video_recommend(request_id=request_id,
                              mid=mid, uid=uid, app_type=app_type,

+ 27 - 0
utils.py

@@ -44,13 +44,40 @@ def request_post(request_url, request_data, timeout):
     """
     try:
         headers = {"Connection": "close"}
+        #print(request_url)
+        #print(headers)
         response = requests.post(url=request_url, json=request_data, timeout=timeout, headers=headers)
+        #print("response:", response)
         if response.status_code == 200:
             res_data = json.loads(response.text)
             return res_data
         else:
             return None
     except Exception as e:
+        #print(e)
+        log_.error('url: {}, exception: {}, traceback: {}'.format(request_url, e, traceback.format_exc()))
+        return None
+
+
+def request_post_data(request_url, request_data, timeout):
+    """
+    post 请求 HTTP接口
+    :param request_url: 接口URL
+    :param request_data: 请求参数
+    :param timeout: 超时时间,单位为秒,type-float or tuple(connect_timeout, read_timeout)
+    :return: res_data json格式
+    """
+    try:
+        headers = {'content-type': 'application/json'}
+        response = requests.post(url=request_url, data=request_data, timeout=timeout, headers=headers)
+        #print("response:", response)
+        if response.status_code == 200:
+            res_data = json.loads(response.text)
+            return res_data['outputs']
+        else:
+            return None
+    except Exception as e:
+        #print(e)
         log_.error('url: {}, exception: {}, traceback: {}'.format(request_url, e, traceback.format_exc()))
         return None
 

+ 67 - 29
video_rank.py

@@ -593,7 +593,7 @@ def video_rank_with_old_video(rank_result, old_video_recall, size, top_K, old_vi
     return new_rank_result[:size]
 
 
-def video_new_rank2(data, size, top_K, flow_pool_P, ab_code, exp_config=None):
+def video_new_rank2(data, size, top_K, flow_pool_P, ab_code, mid, exp_config=None, env_dict=None):
     """
         视频分发排序
         :param data: 各路召回的视频 type-dict {'rov_pool_recall': [], 'flow_pool_recall': []}
@@ -626,35 +626,41 @@ def video_new_rank2(data, size, top_K, flow_pool_P, ab_code, exp_config=None):
         pre_str = "k_p7:"
     #print("pre_str:", pre_str)
     recall_list = []
+    rov_recall_rank = data['rov_pool_recall']
     #call rank service
-    # if ab_code == 60066:
-    #     get_featurs()
-    #
-    # else:
-    redisObj = RedisHelper()
-    vidKeys = []
-    for recall_item in data['rov_pool_recall']:
-        if len(recall_item) <= 0:
-            continue
-        vid = recall_item.get("videoId", 0)
-        vidKeys.append(pre_str + str(vid))
-        recall_list.append(recall_item)
-    # print("vidKeys:", vidKeys)
-    video_scores = redisObj.get_batch_key(vidKeys)
-    # print("video_score:",video_scores)
-    for i in range(len(video_scores)):
-        try:
-            # print(video_scores[i])
-            if video_scores[i] is None:
-                recall_list[i]['sort_score'] = 0.0
-            else:
-                video_score_str = json.loads(video_scores[i])
-                # print("video_score_str:", video_score_str)
-                recall_list[i]['sort_score'] = video_score_str[0]
-        except Exception:
-            recall_list[i]['sort_score'] = 0.0
-    #sort_items = sorted(video_items, key=lambda k: k[1], reverse=True)
-    rov_recall_rank =sorted(recall_list, key=lambda k: k.get('sort_score', 0), reverse=True)
+    #flag_call_service = 0
+    if ab_code == 60066:
+        feature_dict, recall_list = get_featurs(mid, data, size, top_K, flow_pool_P, env_dict)
+        score_result = get_tf_serving_sores(feature_dict)
+        if score_result and len(score_result) > 0 and len(score_result) == len(recall_list):
+            for i in range(len(score_result)):
+                recall_list[i]['sort_score'] = score_result[i][0]
+                recall_list[i]['flag_call_service'] = 1
+            rov_recall_rank = sorted(recall_list, key=lambda k: k.get('sort_score', 0), reverse=True)
+        else:
+            rov_recall_rank = sup_rank(data, pre_str, recall_list, rov_recall_rank)
+    else:
+        redisObj = RedisHelper()
+        vidKeys = []
+        for recall_item in data['rov_pool_recall']:
+            if len(recall_item) <= 0:
+                continue
+            vid = recall_item.get("videoId", 0)
+            vidKeys.append(pre_str + str(vid))
+            recall_list.append(recall_item)
+        video_scores = redisObj.get_batch_key(vidKeys)
+        if video_scores and len(recall_list) > 0:
+            for i in range(len(video_scores)):
+                try:
+                    if video_scores[i] is None:
+                        recall_list[i]['sort_score'] = 0.0
+                    else:
+                        video_score_str = json.loads(video_scores[i])
+                        # print("video_score_str:", video_score_str)
+                        recall_list[i]['sort_score'] = video_score_str[0]
+                except Exception:
+                    recall_list[i]['sort_score'] = 0.0
+            rov_recall_rank = sorted(recall_list, key=lambda k: k.get('sort_score', 0), reverse=True)
     #print(rov_recall_rank)
     flow_recall_rank = sorted(data['flow_pool_recall'], key=lambda k: k.get('rovScore', 0), reverse=True)
     rov_recall_rank, flow_recall_rank = remove_duplicate(rov_recall=rov_recall_rank, flow_recall=flow_recall_rank,
@@ -726,6 +732,38 @@ def video_new_rank2(data, size, top_K, flow_pool_P, ab_code, exp_config=None):
             i += 1
         return rank_result[:size], flow_num
 
+
+# 排序服务兜底
+def sup_rank(data, pre_str, recall_list, rov_recall_rank):
+    redisObj = RedisHelper()
+    vidKeys = []
+    for recall_item in data['rov_pool_recall']:
+        if len(recall_item) <= 0:
+            continue
+        vid = recall_item.get("videoId", 0)
+        vidKeys.append(pre_str + str(vid))
+        recall_list.append(recall_item)
+    video_scores = redisObj.get_batch_key(vidKeys)
+    #print("vidKeys:", video_scores, "\t", vidKeys)
+    #print(len(video_scores), len(recall_list))
+    if video_scores and len(recall_list) > 0:
+        for i in range(len(video_scores)):
+            try:
+                if video_scores[i] is None:
+                    recall_list[i]['sort_score'] = 0.0
+                else:
+                    video_score_str = json.loads(video_scores[i])
+                    recall_list[i]['flag_call_service'] = 0
+                    recall_list[i]['sort_score'] = video_score_str[0]
+            except Exception:
+                recall_list[i]['sort_score'] = 0.0
+        rov_recall_rank = sorted(recall_list, key=lambda k: k.get('sort_score', 0), reverse=True)
+        #print("rov_recall_rank:", rov_recall_rank)
+    else:
+        rov_recall_rank = recall_list
+    return rov_recall_rank
+
+
 def video_sanke_rank(data, size, top_K, flow_pool_P, ab_Code='', exp_config=None):
     """
     视频分发排序