Forráskód Böngészése

add route: /applet/ad/predict

liqian 2 éve
szülő
commit
eff82dd5a9
3 módosított fájl, 76 hozzáadás és 0 törlés
  1. 42 0
      ad_recommend.py
  2. 27 0
      app.py
  3. 7 0
      config.py

+ 42 - 0
ad_recommend.py

@@ -0,0 +1,42 @@
+import datetime
+from utils import RedisHelper
+from config import set_config
+config_ = set_config()
+redis_helper = RedisHelper()
+
+
+def ad_recommend_predict(mid, video_id):
+    """
+    广告推荐预测
+    :param mid: mid
+    :param video_id: video_id
+    :return: ad_predict, type-int, 1-发放广告,0-不发放广告
+    """
+    now_date = datetime.datetime.today()
+    now_dt = datetime.datetime.strftime(now_date, '%Y%m%d')
+    # 判断mid所属分组
+    mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{mid}"
+    mid_group = redis_helper.get_data_from_redis(key_name=mid_group_key_name)
+    if mid_group is None:
+        mid_group = 'mean_group'
+    # 获取用户组分享率
+    group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{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}{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}{now_dt}"
+    if not redis_helper.key_exists(video_share_rate_key):
+        redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
+        video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{redis_dt}"
+    video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=int(video_id))
+    # 计算 mid-video 分享率
+    mid_video_share_rate = float(group_share_rate) * float(video_share_rate)
+    # 阈值判断
+    threshold = 0.05
+    if mid_video_share_rate > threshold:
+        ad_predict = 1
+    else:
+        ad_predict = 0
+    return ad_predict

+ 27 - 0
app.py

@@ -21,6 +21,7 @@ from utils import update_video_w_h_rate
 from user2new import user2new
 from params_helper import Params
 from manager_op import get_video_list, search_video
+from ad_recommend import ad_recommend_predict
 # from werkzeug.middleware.profiler import ProfilerMiddleware
 # from geventwebsocket.handler import WebSocketHandler
 
@@ -289,6 +290,32 @@ def get_video_online_list():
         return json.dumps(result)
 
 
+# 广告推荐
+@app.route('/applet/ad/predict', methods=['GET', 'POST'])
+def ad_predict():
+    start_time = time.time()
+    try:
+        request_data = json.loads(request.get_data())
+        mid = request_data.get('mid')
+        video_id = request_data.get('videoId')
+        ad_predict = ad_recommend_predict(mid=mid, video_id=video_id)
+        result = {'code': 200, 'message': 'success', 'data': ad_predict}
+        log_message = {
+            'requestUri': '/applet/ad/predict',
+            'logTimestamp': int(time.time() * 1000),
+            'mid': mid,
+            'video_id': video_id,
+            'result': result,
+            'executeTime': (time.time() - start_time) * 1000
+        }
+        log_.info(log_message)
+        return json.dumps(result)
+    except Exception as e:
+        log_.error(traceback.format_exc())
+        result = {'code': -1, 'message': 'fail'}
+        return json.dumps(result)
+
+
 # app热榜
 @app.route('/app/video/hot_list', methods=['GET', 'POST'])
 def app_video_hot_list():

+ 7 - 0
config.py

@@ -610,6 +610,13 @@ class BaseConfig(object):
         CITY_CODE['成都']: [SPECIAL_AREA_LIMIT_KEY_NAME, ],
     }
 
+    # 用户组有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:users:group:predict:share:rate:{date}
+    KEY_NAME_PREFIX_AD_GROUP = 'ad:users:group:predict:share:rate:'
+    # 视频有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:video:predict:share:rate:{date}
+    KEY_NAME_PREFIX_AD_VIDEO = 'ad:video:predict:share:rate:'
+    # 用户分组结果存放 redis key 前缀,完整格式:mid:group:{mid}
+    KEY_NAME_PREFIX_MID_GROUP = 'mid:group:'
+
 
 class DevelopmentConfig(BaseConfig):
     """开发环境配置"""