|
@@ -1,9 +1,11 @@
|
|
|
import json
|
|
|
+import time
|
|
|
import traceback
|
|
|
import datetime
|
|
|
from utils import RedisHelper
|
|
|
from config import set_config
|
|
|
from log import Log
|
|
|
+from lr_model import get_final_score
|
|
|
log_ = Log()
|
|
|
config_ = set_config()
|
|
|
redis_helper = RedisHelper()
|
|
@@ -294,6 +296,59 @@ def predict_mid_video_res_with_add(now_date, mid, video_id, abtest_param, abtest
|
|
|
'ad_predict': ad_predict}
|
|
|
return result
|
|
|
|
|
|
+def predict_mid_video_res_with_model(now_date, mid, video_id, abtest_param, abtest_id, abtest_config_tag, ab_test_code, care_model_status, app_type):
|
|
|
+
|
|
|
+ model_key = abtest_param.get('model_key', 'ad_out_v1')
|
|
|
+ user_key_name = f"{config_.KEY_NAME_PREFIX_AD_OUT_MODEL_SCORE_USER}{model_key}:{mid}"
|
|
|
+ item_key_name = f"{config_.KEY_NAME_PREFIX_AD_OUT_MODEL_SCORE_ITEM}{model_key}:{video_id}"
|
|
|
+ config_key_prefix = f"{config_.KEY_NAME_PREFIX_AD_OUT_MODEL_CONFIG}{model_key}:{abtest_id}:{abtest_config_tag}"
|
|
|
+ threshold_key = f"{config_key_prefix}:threshold"
|
|
|
+
|
|
|
+ user_score = redis_helper.get_data_from_redis(key_name=user_key_name)
|
|
|
+ item_score = redis_helper.get_data_from_redis(key_name=item_key_name)
|
|
|
+
|
|
|
+ # 如果离线分数为空,则走基线逻辑
|
|
|
+ if user_score is None or item_score is None:
|
|
|
+ result = predict_mid_video_res(
|
|
|
+ now_date=now_date,
|
|
|
+ mid=mid,
|
|
|
+ video_id=video_id,
|
|
|
+ abtest_param=abtest_param,
|
|
|
+ abtest_id=abtest_id,
|
|
|
+ abtest_config_tag=abtest_config_tag,
|
|
|
+ ab_test_code=ab_test_code,
|
|
|
+ care_model_status=care_model_status,
|
|
|
+ app_type=app_type
|
|
|
+ )
|
|
|
+ return result
|
|
|
+
|
|
|
+ offline_score = float(user_score) + float(item_score)
|
|
|
+ online_features = {
|
|
|
+ 'ctx_apptype': str(app_type),
|
|
|
+ 'ctx_week': time.strftime('%w', time.localtime()),
|
|
|
+ 'ctx_hour': time.strftime('%H', time.localtime()),
|
|
|
+ }
|
|
|
+
|
|
|
+ final_score, online_score = get_final_score(online_features, offline_score)
|
|
|
+ threshold = float(redis_helper.get_data_from_redis(key_name=threshold_key))
|
|
|
+
|
|
|
+ # 跳出率阈值判断
|
|
|
+ if final_score < threshold:
|
|
|
+ # 小于阈值,出广告
|
|
|
+ ad_predict = 2
|
|
|
+ else:
|
|
|
+ # 否则,不出广告
|
|
|
+ ad_predict = 1
|
|
|
+ result = {
|
|
|
+ 'user_score': user_score,
|
|
|
+ 'item_score': item_score,
|
|
|
+ 'final_score': final_score,
|
|
|
+ 'online_score': online_score,
|
|
|
+ 'threshold': threshold,
|
|
|
+ 'ad_predict': ad_predict,
|
|
|
+ 'online_features': online_features,
|
|
|
+ }
|
|
|
+ return result
|
|
|
|
|
|
def predict_mid_video_res_with_multiply(now_date, mid, video_id, abtest_param, abtest_id, abtest_config_tag, ab_test_code, care_model_status):
|
|
|
now_dt = datetime.datetime.strftime(now_date, '%Y%m%d')
|
|
@@ -449,6 +504,18 @@ def ad_recommend_predict(app_type, mid, video_id, ab_exp_info, ab_test_code, car
|
|
|
ab_test_code=ab_test_code,
|
|
|
care_model_status=care_model_status
|
|
|
)
|
|
|
+ elif threshold_mix_func == 'model':
|
|
|
+ result = predict_mid_video_res_with_model(
|
|
|
+ now_date=now_date,
|
|
|
+ mid=mid,
|
|
|
+ video_id=video_id,
|
|
|
+ abtest_param=abtest_param,
|
|
|
+ abtest_id=abtest_id,
|
|
|
+ abtest_config_tag=abtest_config_tag,
|
|
|
+ ab_test_code=ab_test_code,
|
|
|
+ care_model_status=care_model_status,
|
|
|
+ app_type=app_type
|
|
|
+ )
|
|
|
else:
|
|
|
result = predict_mid_video_res(
|
|
|
now_date=now_date,
|