浏览代码

add ad_no_ad_videos_update.py & add ad abtest: 173-t

liqian 1 年之前
父节点
当前提交
6ba9bf6478
共有 2 个文件被更改,包括 121 次插入19 次删除
  1. 87 0
      ad_no_ad_videos_update.py
  2. 34 19
      config.py

+ 87 - 0
ad_no_ad_videos_update.py

@@ -0,0 +1,87 @@
+import datetime
+import json
+import traceback
+from utils import RedisHelper, data_check, get_feature_data, send_msg_to_feishu_new
+from config import set_config
+from log import Log
+config_, _ = set_config()
+log_ = Log()
+
+
+def top_n_videos_update(dt):
+    """更新各端的topN视频"""
+    top_n_videos = {}
+    # 获取topN数据
+    top_n_videos_project = config_.no_ad_videos['topN'].get('project')
+    top_n_videos_table = config_.no_ad_videos['topN'].get('table')
+    n_list = config_.no_ad_videos['topN'].get('n_list')
+    top_n_videos_features = [
+        'apptype', 'videoid', 'rank'
+    ]
+    data_count = data_check(project=top_n_videos_project, table=top_n_videos_table, dt=dt)
+    if data_count > 0:
+        top_n_videos_df = get_feature_data(project=top_n_videos_project, table=top_n_videos_table,
+                                           features=top_n_videos_features, dt=dt)
+        top_n_videos_df['videoid'] = top_n_videos_df['videoid'].astype(int)
+        top_n_videos_df['rank'] = top_n_videos_df['rank'].astype(int)
+        app_type_list = list(set(top_n_videos_df['apptype'].tolist()))
+        for app_type in app_type_list:
+            app_type_df = top_n_videos_df[top_n_videos_df['apptype'] == app_type]
+            app_type_item = {}
+            for n in n_list:
+                n_df = app_type_df[app_type_df['rank'] <= n]
+                n_videos = list(n_df['videoid'].tolist())
+                app_type_item[f'top{n}'] = n_videos
+            top_n_videos[app_type] = app_type_item
+    return top_n_videos
+
+
+def update_to_redis(no_ad_videos_mapping_list):
+    """分端合并数据,更新到redis"""
+    redis_data = {}
+    for no_ad_videos_mapping in no_ad_videos_mapping_list:
+        for app_type, item in no_ad_videos_mapping.items():
+            if app_type not in redis_data:
+                redis_data[app_type] = item
+            else:
+                for k, val in item.items():
+                    redis_data[app_type][k] = val
+    # to redis
+    redis_helper = RedisHelper()
+    for app_type, data in redis_data.items():
+        key_name = f"{config_.KEY_NAME_PREFIX_NO_AD_VIDEOS}{app_type}"
+        redis_helper.set_data_to_redis(key_name=key_name, value=json.dumps(data), expire_time=int(24*3600))
+        log_.info(f"to redis: app_type={app_type}, data={data}, key_name={key_name}")
+
+
+def main():
+    try:
+        now_date = datetime.datetime.today()
+        dt = datetime.datetime.strftime(now_date, '%Y%m%d%H')
+        log_.info(f"now_date: {dt}")
+        # 当小时分享当小时回流topN视频更新
+        top_n_videos = top_n_videos_update(dt=dt)
+        log_.info(f"topN: {top_n_videos}")
+        # 数据更新至redis
+        no_ad_videos_mapping_list = [top_n_videos]
+        update_to_redis(no_ad_videos_mapping_list=no_ad_videos_mapping_list)
+        log_.info(f"to redis finished!")
+
+    except Exception as e:
+        log_.error(f"特定视频不出广告数据更新失败, exception: {e}, traceback: {traceback.format_exc()}")
+        msg_list = [
+            f"env: rov-offline {config_.ENV_TEXT}",
+            f"now time: {datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d %H:%M:%S')}",
+            f"exception: {e}",
+            f"traceback: {traceback.format_exc()}",
+        ]
+        send_msg_to_feishu_new(
+            webhook=config_.FEISHU_ROBOT['ad_video_update_robot'].get('webhook'),
+            key_word=config_.FEISHU_ROBOT['ad_video_update_robot'].get('key_word'),
+            title='特定视频不出广告数据更新失败',
+            msg_list=msg_list
+        )
+
+
+if __name__ == '__main__':
+    main()

+ 34 - 19
config.py

@@ -1257,29 +1257,33 @@ class BaseConfig(object):
                   'user': {'data': 'user0out', 'rule': 'rule2'},
                   'care_model': True, 'threshold_rate': 0.7,
                   },  # else非关怀模式人群多出广告 + 所有广告类型数据 + 优化阈值计算方式 + 使用以是否直接跳出为目标的数据
-        '173-o': {'video': {'data': 'videos0out'},
-                  'user': {'data': 'user0out', 'rule': 'rule2'},
-                  'care_model': True, 'threshold_rate': 0.7,
-                  },  # [else, return0share1mids]非关怀模式人群多出广告 + 所有广告类型数据 + 优化阈值计算方式 + 使用以是否直接跳出为目标的数据
-        '173-p': {'share': {'video': {'data': 'videos0'}, 'user': {'data': 'user0', 'rule': 'rule2'}},
-                  'out': {'video': {'data': 'videos0out'}, 'user': {'data': 'user0out', 'rule': 'rule2'}},
-                  'care_model': True, 'threshold_rate': 0.7,
-                  'threshold_mix_func': 'add', 'mix_param': {'share_weight': 0.2, 'out_weight': 0.8}
-                  },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 分享与不直接跳出融合方案一(加权融合: k1*p(不直接跳出|出广告) + k2*p(分享|出广告))
-        '173-q': {'share': {'video': {'data': 'videos0'}, 'user': {'data': 'user0', 'rule': 'rule2'}},
-                  'out': {'video': {'data': 'videos0out'}, 'user': {'data': 'user0out', 'rule': 'rule2'}},
-                  'care_model': True, 'threshold_rate': 0.7,
-                  'threshold_mix_func': 'multiply',
-                  },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 分享与不直接跳出融合方案二(乘积融合: p(不直接跳出|出广告) * p(分享|出广告))
-        '173-r': {'share': {'video': {'data': 'videos0new'}, 'user': {'data': 'user0new', 'rule': 'rule2'}},
-                  'out': {'video': {'data': 'videos0out'}, 'user': {'data': 'user0out', 'rule': 'rule2'}},
-                  'care_model': True, 'threshold_rate': 0.7,
-                  'threshold_mix_func': 'multiply',
-                  },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 分享与不直接跳出融合方案三(乘积融合: p(不直接跳出|出广告) * p(分享|出广告), 标准贝叶斯公式)
+        # '173-o': {'video': {'data': 'videos0out'},
+        #           'user': {'data': 'user0out', 'rule': 'rule2'},
+        #           'care_model': True, 'threshold_rate': 0.7,
+        #           },  # [else, return0share1mids]非关怀模式人群多出广告 + 所有广告类型数据 + 优化阈值计算方式 + 使用以是否直接跳出为目标的数据
+        # '173-p': {'share': {'video': {'data': 'videos0'}, 'user': {'data': 'user0', 'rule': 'rule2'}},
+        #           'out': {'video': {'data': 'videos0out'}, 'user': {'data': 'user0out', 'rule': 'rule2'}},
+        #           'care_model': True, 'threshold_rate': 0.7,
+        #           'threshold_mix_func': 'add', 'mix_param': {'share_weight': 0.2, 'out_weight': 0.8}
+        #           },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 分享与不直接跳出融合方案一(加权融合: k1*p(不直接跳出|出广告) + k2*p(分享|出广告))
+        # '173-q': {'share': {'video': {'data': 'videos0'}, 'user': {'data': 'user0', 'rule': 'rule2'}},
+        #           'out': {'video': {'data': 'videos0out'}, 'user': {'data': 'user0out', 'rule': 'rule2'}},
+        #           'care_model': True, 'threshold_rate': 0.7,
+        #           'threshold_mix_func': 'multiply',
+        #           },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 分享与不直接跳出融合方案二(乘积融合: p(不直接跳出|出广告) * p(分享|出广告))
+        # '173-r': {'share': {'video': {'data': 'videos0new'}, 'user': {'data': 'user0new', 'rule': 'rule2'}},
+        #           'out': {'video': {'data': 'videos0out'}, 'user': {'data': 'user0out', 'rule': 'rule2'}},
+        #           'care_model': True, 'threshold_rate': 0.7,
+        #           'threshold_mix_func': 'multiply',
+        #           },  # 所有广告类型本端视频数据 + 优化阈值计算方式 + else非关怀模式人群多出广告 + 分享与不直接跳出融合方案三(乘积融合: p(不直接跳出|出广告) * p(分享|出广告), 标准贝叶斯公式)
         '173-s': {'video': {'data': 'videos0out'},
                   'user': {'data': 'user0out', 'rule': 'rule3'},
                   'care_model': True, 'threshold_rate': 0.7,
                   },  # else非关怀模式人群多出广告 + 所有广告类型数据 + 优化阈值计算方式 + 使用以是否直接跳出为目标的数据 + ['return25_nmids', 'return9_24mids']用户不出广告
+        '173-t': {'video': {'data': 'videos0out'},
+                  'user': {'data': 'user0out', 'rule': 'rule2'},
+                  'care_model': True, 'threshold_rate': 0.7,
+                  },  # 所有广告类型数据 + 优化阈值计算方式 + else未开启关怀模式人群多出广告 + 使用以是否直接跳出为目标的数据 + return25_nmids用户不出广告 + mean_group & top2不出广告
 
         # 票圈视频+
         # '190-a': {'video': {'data': 'data1'},
@@ -2351,6 +2355,17 @@ class BaseConfig(object):
     # 广告推荐自动调整阈值参数记录存放 redis key,完整格式:ad:threshold:param:record
     KEY_NAME_PREFIX_AD_THRESHOLD_PARAM_RECORD = 'ad:threshold:param:record'
 
+    # 特定视频不出广告配置
+    no_ad_videos = {
+        'topN': {
+            'project': 'loghubods',
+            'table': 'top_return_videolist_hh',
+            'n_list': [3]
+        }
+    }
+    # 特定视频不出广告视频列表存放 redis key 前缀,完整格式:no:ad:videos:{appType}
+    KEY_NAME_PREFIX_NO_AD_VIDEOS = 'no:ad:videos:'
+
     # 新策略使用
     # 视频有广告时的分享率预测结果存放 redis key 前缀,完整格式:video:predict:share:rate:with:ad:{video_data_key}:{date}
     KEY_NAME_PREFIX_VIDEO_WITH_AD = 'video:predict:share:rate:with:ad:'