Browse Source

update ad_recommend & ad abtest config

liqian 2 years ago
parent
commit
443ffc9fb6
2 changed files with 106 additions and 21 deletions
  1. 9 6
      ad_recommend.py
  2. 97 15
      config.py

+ 9 - 6
ad_recommend.py

@@ -63,17 +63,20 @@ def ad_recommend_predict(app_type, mid, video_id, ab_exp_info, ab_test_code):
         if abtest_param is None:
             return None
 
-        user_data_key = abtest_param.get('user')
-        video_data_key = abtest_param.get('video')
+        user_data_key = abtest_param['user'].get('data')
+        user_rule_key = abtest_param['user'].get('rule')
+        video_data_key = abtest_param['video'].get('data')
+        group_class_key = abtest_param.get('group_class_key')
+        no_ad_mid_group_list = abtest_param.get('no_ad_mid_group_list', [])
 
         # 判断mid所属分组
-        mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{mid}"
+        mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{group_class_key}:{mid}"
         mid_group = redis_helper.get_data_from_redis(key_name=mid_group_key_name)
         if mid_group is None:
             mid_group = 'mean_group'
 
         # 判断用户是否在免广告用户组列表中
-        if mid_group in config_.NO_AD_MID_GROUP_LIST:
+        if mid_group in no_ad_mid_group_list:
             # 在免广告用户组列表中,则不出广告
             ad_predict = 1
             result = {
@@ -82,10 +85,10 @@ def ad_recommend_predict(app_type, mid, video_id, ab_exp_info, ab_test_code):
             }
         else:
             # 获取用户组分享率
-            group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{user_data_key}:{now_dt}"
+            group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{user_data_key}:{user_rule_key}:{now_dt}"
             if not redis_helper.key_exists(group_share_rate_key):
                 redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
-                group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{user_data_key}:{redis_dt}"
+                group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{user_data_key}:{user_rule_key}:{redis_dt}"
             group_share_rate = redis_helper.get_score_with_value(key_name=group_share_rate_key, value=mid_group)
             # 获取视频分享率
             video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{video_data_key}:{now_dt}"

+ 97 - 15
config.py

@@ -636,36 +636,118 @@ class BaseConfig(object):
         APP_TYPE['APP'],  # 票圈视频APP
     ]
 
+    # 免广告用户组列表
+    NO_AD_MID_GROUP_LIST = {
+        'class1': ['return25_nmids'],
+        'class2': ['return30_nmids'],
+    }
+
     # 广告模型abtest配置
     AD_ABTEST_CONFIG = {
         # 票圈vlog
-        '173-a': {'video': 'data1', 'user': 'data1'},
-        '173-b': {'video': 'data1', 'user': 'data1:1'},  # 调整未分组用户的阈值(去除不出广告的用户组)
+        '173-a': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+        '173-b': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },  # 调整未分组用户的阈值(去除不出广告的用户组)
+
         # 票圈视频+
-        '190-a': {'video': 'data1', 'user': 'data1'},
-        '190-b': {'video': 'data1', 'user': 'data1'},
+        '190-a': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+        '190-b': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+
         # 票圈视频
-        '194-a': {'video': 'data1', 'user': 'data1'},
-        '194-b': {'video': 'data1', 'user': 'data1:1'},
+        '194-a': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+        '194-b': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },  # 调整未分组用户的阈值(去除不出广告的用户组)
+
         # 内容精选
-        '195-a': {'video': 'data1', 'user': 'data1'},
-        '195-b': {'video': 'data1', 'user': 'data1:1'},
+        '195-a': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+        '195-b': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },  # 调整未分组用户的阈值(去除不出广告的用户组)
+
         # 票圈短视频
-        '196-a': {'video': 'data1', 'user': 'data1'},
-        '196-b': {'video': 'data4', 'user': 'data4'},
+        '196-a': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+        '196-b': {
+            'video': {'data': 'data4'},
+            'user': {'data': 'data4', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+
         # 老好看视频
-        '197-a': {'video': 'data1', 'user': 'data1'},
-        '197-b': {'video': 'data1', 'user': 'data1:1'},
+        '197-a': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+        '197-b': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule2'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },  # 调整未分组用户的阈值(去除不出广告的用户组)
+
         # 票圈最惊奇
-        '198-a': {'video': 'data1', 'user': 'data1'},
-        '198-b': {'video': 'data1', 'user': 'data1'},
+        '198-a': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
+        '198-b': {
+            'video': {'data': 'data1'},
+            'user': {'data': 'data1', 'rule': 'rule1'},
+            'group_class_key': 'class1',
+            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
+        },
     }
 
     # 用户组有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:users:group:predict:share:rate:{user_data_key}:{date}
     KEY_NAME_PREFIX_AD_GROUP = 'ad:users:group:predict:share:rate:'
     # 视频有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:video:predict:share:rate:{video_data_key}:{date}
     KEY_NAME_PREFIX_AD_VIDEO = 'ad:video:predict:share:rate:'
-    # 用户分组结果存放 redis key 前缀,完整格式:mid:group:{mid}
+    # 用户分组结果存放 redis key 前缀,完整格式:mid:group:{class_key}:{mid}
     KEY_NAME_PREFIX_MID_GROUP = 'mid:group:'
     # 广告推荐阈值结果存放 redis key 前缀,完整格式:ad:threshold:{abtestId}:{abtestConfigTag}:{group}
     KEY_NAME_PREFIX_AD_THRESHOLD = 'ad:threshold:'