|
@@ -1,3 +1,4 @@
|
|
|
+import json
|
|
|
import traceback
|
|
|
import datetime
|
|
|
from utils import RedisHelper
|
|
@@ -70,13 +71,66 @@ def get_threshold(abtest_id, abtest_config_tag, ab_test_code, mid_group, care_mo
|
|
|
return threshold
|
|
|
|
|
|
|
|
|
-def predict_mid_video_res(now_date, mid, video_id, abtest_param, abtest_id, abtest_config_tag, ab_test_code, care_model_status):
|
|
|
+def predict_with_rate_process(now_date, video_id, abtest_param, abtest_id, abtest_config_tag, ab_test_code, care_model_status, mid_group):
|
|
|
now_dt = datetime.datetime.strftime(now_date, '%Y%m%d')
|
|
|
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_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}:{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}"
|
|
|
+ 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}{video_data_key}:{redis_dt}"
|
|
|
+ video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=int(video_id))
|
|
|
+ if video_share_rate is None:
|
|
|
+ video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=-1)
|
|
|
+
|
|
|
+
|
|
|
+ if group_share_rate is None or video_share_rate is None:
|
|
|
+ return None
|
|
|
+ mid_video_predict_res = float(group_share_rate) * float(video_share_rate)
|
|
|
+
|
|
|
+
|
|
|
+ threshold = get_threshold(
|
|
|
+ abtest_id=abtest_id,
|
|
|
+ abtest_config_tag=abtest_config_tag,
|
|
|
+ ab_test_code=ab_test_code,
|
|
|
+ mid_group=mid_group,
|
|
|
+ care_model_status=care_model_status,
|
|
|
+ abtest_param=abtest_param
|
|
|
+ )
|
|
|
+
|
|
|
+ if mid_video_predict_res > threshold:
|
|
|
+
|
|
|
+ ad_predict = 2
|
|
|
+ else:
|
|
|
+
|
|
|
+ ad_predict = 1
|
|
|
+ result = {
|
|
|
+ 'mid_group': mid_group,
|
|
|
+ 'group_share_rate': group_share_rate,
|
|
|
+ 'video_share_rate': video_share_rate,
|
|
|
+ 'mid_video_predict_res': mid_video_predict_res,
|
|
|
+ 'threshold': threshold,
|
|
|
+ 'ad_predict': ad_predict
|
|
|
+ }
|
|
|
+ return result
|
|
|
+
|
|
|
+
|
|
|
+def predict_mid_video_res(now_date, mid, video_id, abtest_param, abtest_id, abtest_config_tag, ab_test_code, care_model_status, app_type):
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
group_class_key = abtest_param.get('group_class_key')
|
|
|
no_ad_mid_group_list = abtest_param.get('no_ad_mid_group_list', [])
|
|
|
+ no_ad_group_with_video_mapping = abtest_param.get('no_ad_group_with_video_mapping', {})
|
|
|
|
|
|
|
|
|
mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{group_class_key}:{mid}"
|
|
@@ -90,52 +144,49 @@ def predict_mid_video_res(now_date, mid, video_id, abtest_param, abtest_id, abte
|
|
|
ad_predict = 1
|
|
|
result = {
|
|
|
'mid_group': mid_group,
|
|
|
- 'ad_predict': ad_predict
|
|
|
+ 'ad_predict': ad_predict,
|
|
|
+ 'no_ad_strategy': 'no_ad_mid_group'
|
|
|
}
|
|
|
- else:
|
|
|
-
|
|
|
- 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}:{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}"
|
|
|
- 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}{video_data_key}:{redis_dt}"
|
|
|
- video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=int(video_id))
|
|
|
- if video_share_rate is None:
|
|
|
- video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=-1)
|
|
|
-
|
|
|
-
|
|
|
- if group_share_rate is None or video_share_rate is None:
|
|
|
- return None
|
|
|
- mid_video_predict_res = float(group_share_rate) * float(video_share_rate)
|
|
|
+ elif mid_group in no_ad_group_with_video_mapping:
|
|
|
+
|
|
|
+
|
|
|
+ video_mapping_key_list = no_ad_group_with_video_mapping.get(mid_group, [])
|
|
|
+ no_ad_videos = redis_helper.get_data_from_redis(key_name=f"{config_.KEY_NAME_PREFIX_NO_AD_VIDEOS}{app_type}")
|
|
|
+ no_ad_videos = json.loads(no_ad_videos)
|
|
|
+ no_ad_video_list = []
|
|
|
+ for video_mapping_key in video_mapping_key_list:
|
|
|
+ no_ad_video_list.extend(no_ad_videos.get(video_mapping_key, []))
|
|
|
+
|
|
|
+ if video_id in no_ad_video_list:
|
|
|
+
|
|
|
+ ad_predict = 1
|
|
|
+ result = {
|
|
|
+ 'mid_group': mid_group,
|
|
|
+ 'ad_predict': ad_predict,
|
|
|
+ 'no_ad_strategy': 'no_ad_mid_group_with_video'
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ result = predict_with_rate_process(
|
|
|
+ now_date=now_date,
|
|
|
+ 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,
|
|
|
+ mid_group=mid_group)
|
|
|
|
|
|
-
|
|
|
- threshold = get_threshold(
|
|
|
+ else:
|
|
|
+ result = predict_with_rate_process(
|
|
|
+ now_date=now_date,
|
|
|
+ video_id=video_id,
|
|
|
+ abtest_param=abtest_param,
|
|
|
abtest_id=abtest_id,
|
|
|
abtest_config_tag=abtest_config_tag,
|
|
|
ab_test_code=ab_test_code,
|
|
|
- mid_group=mid_group,
|
|
|
care_model_status=care_model_status,
|
|
|
- abtest_param=abtest_param
|
|
|
- )
|
|
|
-
|
|
|
- if mid_video_predict_res > threshold:
|
|
|
-
|
|
|
- ad_predict = 2
|
|
|
- else:
|
|
|
-
|
|
|
- ad_predict = 1
|
|
|
- result = {
|
|
|
- 'mid_group': mid_group,
|
|
|
- 'group_share_rate': group_share_rate,
|
|
|
- 'video_share_rate': video_share_rate,
|
|
|
- 'mid_video_predict_res': mid_video_predict_res,
|
|
|
- 'threshold': threshold,
|
|
|
- 'ad_predict': ad_predict}
|
|
|
+ mid_group=mid_group)
|
|
|
+
|
|
|
return result
|
|
|
|
|
|
|
|
@@ -404,7 +455,8 @@ def ad_recommend_predict(app_type, mid, video_id, ab_exp_info, ab_test_code, car
|
|
|
abtest_id=abtest_id,
|
|
|
abtest_config_tag=abtest_config_tag,
|
|
|
ab_test_code=ab_test_code,
|
|
|
- care_model_status=care_model_status
|
|
|
+ care_model_status=care_model_status,
|
|
|
+ app_type=app_type
|
|
|
)
|
|
|
|
|
|
|