ad_recommend.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. import traceback
  2. import datetime
  3. from utils import RedisHelper
  4. from ad_xgboost_predict import xgboost_predict
  5. from config import set_config
  6. from log import Log
  7. log_ = Log()
  8. config_ = set_config()
  9. redis_helper = RedisHelper()
  10. def get_params(ab_exp_info, ab_test_code):
  11. """
  12. 根据实验分组给定对应的参数
  13. :param ab_exp_info: AB实验组参数
  14. :param ab_test_code: 用户对应的ab组
  15. :return:
  16. """
  17. abtest_id, abtest_config_tag = None, None
  18. ad_abtest_id_list = [key.split('-')[0] for key in config_.AD_ABTEST_CONFIG]
  19. # 获取广告实验配置
  20. config_value_dict = {}
  21. if ab_exp_info:
  22. ab_exp_list = ab_exp_info.get('ab_test002', None)
  23. if ab_exp_list:
  24. for ab_item in ab_exp_list:
  25. ab_exp_code = ab_item.get('abExpCode', None)
  26. if not ab_exp_code:
  27. continue
  28. if ab_exp_code in ad_abtest_id_list:
  29. config_value = ab_item.get('configValue', None)
  30. if config_value:
  31. config_value_dict[str(ab_exp_code)] = eval(str(config_value))
  32. if len(config_value_dict) > 0:
  33. for ab_exp_code, config_value in config_value_dict.items():
  34. for tag, value in config_value.items():
  35. if ab_test_code in value:
  36. abtest_id = ab_exp_code
  37. abtest_config_tag = tag
  38. break
  39. return abtest_id, abtest_config_tag
  40. def get_threshold(abtest_id, abtest_config_tag, ab_test_code, mid_group, care_model_status, abtest_param):
  41. """获取对应的阈值"""
  42. # 判断是否是关怀模式实验
  43. care_model_status_param = abtest_param.get('care_model_status_param', None)
  44. care_model_ab_mid_group = abtest_param.get('care_model_ab_mid_group', [])
  45. if care_model_status_param is None:
  46. # 无关怀模式实验
  47. threshold_key_name_prefix = config_.KEY_NAME_PREFIX_AD_THRESHOLD
  48. else:
  49. # 关怀模式实验
  50. if care_model_status is None or len(care_model_ab_mid_group) == 0 or care_model_status == 'null':
  51. # 参数缺失,走默认
  52. threshold_key_name_prefix = config_.KEY_NAME_PREFIX_AD_THRESHOLD
  53. elif int(care_model_status) == int(care_model_status_param) and mid_group in care_model_ab_mid_group:
  54. # 实验匹配,获取对应的阈值
  55. threshold_key_name_prefix = config_.KEY_NAME_PREFIX_AD_THRESHOLD_CARE_MODEL
  56. else:
  57. threshold_key_name_prefix = config_.KEY_NAME_PREFIX_AD_THRESHOLD
  58. threshold_key_name = f"{threshold_key_name_prefix}{abtest_id}:{abtest_config_tag}:{ab_test_code}:{mid_group}"
  59. threshold = redis_helper.get_data_from_redis(key_name=threshold_key_name)
  60. if threshold is None:
  61. threshold = 0
  62. else:
  63. threshold = float(threshold)
  64. return threshold
  65. def predict_mid_video_res(now_date, mid, video_id, abtest_param, abtest_id, abtest_config_tag, ab_test_code, care_model_status):
  66. now_dt = datetime.datetime.strftime(now_date, '%Y%m%d')
  67. user_data_key = abtest_param['user'].get('data')
  68. user_rule_key = abtest_param['user'].get('rule')
  69. video_data_key = abtest_param['video'].get('data')
  70. group_class_key = abtest_param.get('group_class_key')
  71. no_ad_mid_group_list = abtest_param.get('no_ad_mid_group_list', [])
  72. # 判断mid所属分组
  73. mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{group_class_key}:{mid}"
  74. mid_group = redis_helper.get_data_from_redis(key_name=mid_group_key_name)
  75. if mid_group is None:
  76. mid_group = 'mean_group'
  77. # 判断用户是否在免广告用户组列表中
  78. if mid_group in no_ad_mid_group_list:
  79. # 在免广告用户组列表中,则不出广告
  80. ad_predict = 1
  81. result = {
  82. 'mid_group': mid_group,
  83. 'ad_predict': ad_predict
  84. }
  85. else:
  86. # 获取用户组分享率
  87. group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{user_data_key}:{user_rule_key}:{now_dt}"
  88. if not redis_helper.key_exists(group_share_rate_key):
  89. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  90. group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{user_data_key}:{user_rule_key}:{redis_dt}"
  91. group_share_rate = redis_helper.get_score_with_value(key_name=group_share_rate_key, value=mid_group)
  92. # 获取视频分享率
  93. video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{video_data_key}:{now_dt}"
  94. if not redis_helper.key_exists(video_share_rate_key):
  95. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  96. video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{video_data_key}:{redis_dt}"
  97. video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=int(video_id))
  98. if video_share_rate is None:
  99. video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=-1)
  100. # 计算 mid-video 分享率
  101. if group_share_rate is None or video_share_rate is None:
  102. return None
  103. mid_video_predict_res = float(group_share_rate) * float(video_share_rate)
  104. # 获取对应的阈值
  105. threshold = get_threshold(
  106. abtest_id=abtest_id,
  107. abtest_config_tag=abtest_config_tag,
  108. ab_test_code=ab_test_code,
  109. mid_group=mid_group,
  110. care_model_status=care_model_status,
  111. abtest_param=abtest_param
  112. )
  113. # 阈值判断
  114. if mid_video_predict_res > threshold:
  115. # 大于阈值,出广告
  116. ad_predict = 2
  117. else:
  118. # 否则,不出广告
  119. ad_predict = 1
  120. result = {
  121. 'mid_group': mid_group,
  122. 'group_share_rate': group_share_rate,
  123. 'video_share_rate': video_share_rate,
  124. 'mid_video_predict_res': mid_video_predict_res,
  125. 'threshold': threshold,
  126. 'ad_predict': ad_predict}
  127. return result
  128. def predict_mid_video_res_with_add(now_date, mid, video_id, abtest_param, abtest_id, abtest_config_tag, ab_test_code, care_model_status):
  129. now_dt = datetime.datetime.strftime(now_date, '%Y%m%d')
  130. # 判断mid所属分组
  131. group_class_key = abtest_param.get('group_class_key')
  132. mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{group_class_key}:{mid}"
  133. mid_group = redis_helper.get_data_from_redis(key_name=mid_group_key_name)
  134. if mid_group is None:
  135. mid_group = 'mean_group'
  136. # 判断用户是否在免广告用户组列表中
  137. no_ad_mid_group_list = abtest_param.get('no_ad_mid_group_list', [])
  138. if mid_group in no_ad_mid_group_list:
  139. # 在免广告用户组列表中,则不出广告
  140. ad_predict = 1
  141. result = {
  142. 'mid_group': mid_group,
  143. 'ad_predict': ad_predict
  144. }
  145. else:
  146. # 获取用户组出广告后分享的概率
  147. share_user_data_key = abtest_param['share']['user'].get('data')
  148. share_user_rule_key = abtest_param['share']['user'].get('rule')
  149. group_share_rate_key = \
  150. f"{config_.KEY_NAME_PREFIX_AD_GROUP}{share_user_data_key}:{share_user_rule_key}:{now_dt}"
  151. if not redis_helper.key_exists(group_share_rate_key):
  152. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  153. group_share_rate_key = \
  154. f"{config_.KEY_NAME_PREFIX_AD_GROUP}{share_user_data_key}:{share_user_rule_key}:{redis_dt}"
  155. group_share_rate = redis_helper.get_score_with_value(key_name=group_share_rate_key, value=mid_group)
  156. # 获取视频出广告后分享的概率
  157. share_video_data_key = abtest_param['share']['video'].get('data')
  158. video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{share_video_data_key}:{now_dt}"
  159. if not redis_helper.key_exists(video_share_rate_key):
  160. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  161. video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{share_video_data_key}:{redis_dt}"
  162. video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=int(video_id))
  163. if video_share_rate is None:
  164. video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=-1)
  165. # 获取用户组出广告后不直接跳出的概率
  166. out_user_data_key = abtest_param['out']['user'].get('data')
  167. out_user_rule_key = abtest_param['out']['user'].get('rule')
  168. group_out_rate_key = \
  169. f"{config_.KEY_NAME_PREFIX_AD_GROUP}{out_user_data_key}:{out_user_rule_key}:{now_dt}"
  170. if not redis_helper.key_exists(group_out_rate_key):
  171. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  172. group_out_rate_key = \
  173. f"{config_.KEY_NAME_PREFIX_AD_GROUP}{out_user_data_key}:{out_user_rule_key}:{redis_dt}"
  174. group_out_rate = redis_helper.get_score_with_value(key_name=group_out_rate_key, value=mid_group)
  175. # 获取视频出广告后不直接跳出的概率
  176. out_video_data_key = abtest_param['out']['video'].get('data')
  177. video_out_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{out_video_data_key}:{now_dt}"
  178. if not redis_helper.key_exists(video_out_rate_key):
  179. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  180. video_out_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{out_video_data_key}:{redis_dt}"
  181. video_out_rate = redis_helper.get_score_with_value(key_name=video_out_rate_key, value=int(video_id))
  182. if video_out_rate is None:
  183. video_out_rate = redis_helper.get_score_with_value(key_name=video_out_rate_key, value=-1)
  184. # 计算 mid-video 预测值
  185. if group_share_rate is None or video_share_rate is None or group_out_rate is None or video_out_rate is None:
  186. return None
  187. # 加权融合
  188. share_weight = abtest_param['mix_param']['share_weight']
  189. out_weight = abtest_param['mix_param']['out_weight']
  190. group_rate = share_weight * float(group_share_rate) + out_weight * float(group_out_rate)
  191. video_rate = share_weight * float(video_share_rate) + out_weight * float(video_out_rate)
  192. mid_video_predict_res = group_rate * video_rate
  193. # 获取对应的阈值
  194. threshold = get_threshold(
  195. abtest_id=abtest_id,
  196. abtest_config_tag=abtest_config_tag,
  197. ab_test_code=ab_test_code,
  198. mid_group=mid_group,
  199. care_model_status=care_model_status,
  200. abtest_param=abtest_param
  201. )
  202. # 阈值判断
  203. if mid_video_predict_res > threshold:
  204. # 大于阈值,出广告
  205. ad_predict = 2
  206. else:
  207. # 否则,不出广告
  208. ad_predict = 1
  209. result = {
  210. 'mid_group': mid_group,
  211. 'group_share_rate': group_share_rate,
  212. 'video_share_rate': video_share_rate,
  213. 'group_out_rate': group_out_rate,
  214. 'video_out_rate': video_out_rate,
  215. 'group_rate': group_rate,
  216. 'video_rate': video_rate,
  217. 'mid_video_predict_res': mid_video_predict_res,
  218. 'threshold': threshold,
  219. 'ad_predict': ad_predict}
  220. return result
  221. 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):
  222. now_dt = datetime.datetime.strftime(now_date, '%Y%m%d')
  223. # 判断mid所属分组
  224. group_class_key = abtest_param.get('group_class_key')
  225. mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{group_class_key}:{mid}"
  226. mid_group = redis_helper.get_data_from_redis(key_name=mid_group_key_name)
  227. if mid_group is None:
  228. mid_group = 'mean_group'
  229. # 判断用户是否在免广告用户组列表中
  230. no_ad_mid_group_list = abtest_param.get('no_ad_mid_group_list', [])
  231. if mid_group in no_ad_mid_group_list:
  232. # 在免广告用户组列表中,则不出广告
  233. ad_predict = 1
  234. result = {
  235. 'mid_group': mid_group,
  236. 'ad_predict': ad_predict
  237. }
  238. else:
  239. # 获取用户组出广告后分享的概率
  240. share_user_data_key = abtest_param['share']['user'].get('data')
  241. share_user_rule_key = abtest_param['share']['user'].get('rule')
  242. group_share_rate_key = \
  243. f"{config_.KEY_NAME_PREFIX_AD_GROUP}{share_user_data_key}:{share_user_rule_key}:{now_dt}"
  244. if not redis_helper.key_exists(group_share_rate_key):
  245. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  246. group_share_rate_key = \
  247. f"{config_.KEY_NAME_PREFIX_AD_GROUP}{share_user_data_key}:{share_user_rule_key}:{redis_dt}"
  248. group_share_rate = redis_helper.get_score_with_value(key_name=group_share_rate_key, value=mid_group)
  249. # 获取视频出广告后分享的概率
  250. share_video_data_key = abtest_param['share']['video'].get('data')
  251. video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{share_video_data_key}:{now_dt}"
  252. if not redis_helper.key_exists(video_share_rate_key):
  253. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  254. video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{share_video_data_key}:{redis_dt}"
  255. video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=int(video_id))
  256. if video_share_rate is None:
  257. video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=-1)
  258. # 获取用户组出广告后不直接跳出的概率
  259. out_user_data_key = abtest_param['out']['user'].get('data')
  260. out_user_rule_key = abtest_param['out']['user'].get('rule')
  261. group_out_rate_key = \
  262. f"{config_.KEY_NAME_PREFIX_AD_GROUP}{out_user_data_key}:{out_user_rule_key}:{now_dt}"
  263. if not redis_helper.key_exists(group_out_rate_key):
  264. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  265. group_out_rate_key = \
  266. f"{config_.KEY_NAME_PREFIX_AD_GROUP}{out_user_data_key}:{out_user_rule_key}:{redis_dt}"
  267. group_out_rate = redis_helper.get_score_with_value(key_name=group_out_rate_key, value=mid_group)
  268. # 获取视频出广告后不直接跳出的概率
  269. out_video_data_key = abtest_param['out']['video'].get('data')
  270. video_out_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{out_video_data_key}:{now_dt}"
  271. if not redis_helper.key_exists(video_out_rate_key):
  272. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  273. video_out_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{out_video_data_key}:{redis_dt}"
  274. video_out_rate = redis_helper.get_score_with_value(key_name=video_out_rate_key, value=int(video_id))
  275. if video_out_rate is None:
  276. video_out_rate = redis_helper.get_score_with_value(key_name=video_out_rate_key, value=-1)
  277. # 计算 mid-video 预测值
  278. if group_share_rate is None or video_share_rate is None or group_out_rate is None or video_out_rate is None:
  279. return None
  280. # 乘积融合
  281. group_rate = float(group_share_rate) * float(group_out_rate)
  282. video_rate = float(video_share_rate) * float(video_out_rate)
  283. mid_video_predict_res = group_rate * video_rate
  284. # 获取对应的阈值
  285. threshold = get_threshold(
  286. abtest_id=abtest_id,
  287. abtest_config_tag=abtest_config_tag,
  288. ab_test_code=ab_test_code,
  289. mid_group=mid_group,
  290. care_model_status=care_model_status,
  291. abtest_param=abtest_param
  292. )
  293. # 阈值判断
  294. if mid_video_predict_res > threshold:
  295. # 大于阈值,出广告
  296. ad_predict = 2
  297. else:
  298. # 否则,不出广告
  299. ad_predict = 1
  300. result = {
  301. 'mid_group': mid_group,
  302. 'group_share_rate': group_share_rate,
  303. 'video_share_rate': video_share_rate,
  304. 'group_out_rate': group_out_rate,
  305. 'video_out_rate': video_out_rate,
  306. 'group_rate': group_rate,
  307. 'video_rate': video_rate,
  308. 'mid_video_predict_res': mid_video_predict_res,
  309. 'threshold': threshold,
  310. 'ad_predict': ad_predict}
  311. return result
  312. def ad_recommend_predict(model, app_type, mid, video_id, ab_exp_info, ab_test_code, care_model_status):
  313. """
  314. 广告推荐预测
  315. :param app_type: app_type
  316. :param mid: mid
  317. :param video_id: video_id
  318. :param ab_exp_info: AB实验组参数
  319. :param ab_test_code: 用户对应的ab组
  320. :param care_model_status: 用户关怀模式状态 1-未开启,2-开启
  321. :return: ad_predict, type-int, 1-不发放广告,2-发放广告
  322. """
  323. try:
  324. now_date = datetime.datetime.today()
  325. # now_dt = datetime.datetime.strftime(now_date, '%Y%m%d')
  326. # 获取实验参数
  327. abtest_id, abtest_config_tag = get_params(ab_exp_info=ab_exp_info, ab_test_code=ab_test_code)
  328. if abtest_id is None or abtest_config_tag is None:
  329. return None
  330. abtest_param = config_.AD_ABTEST_CONFIG.get(f'{abtest_id}-{abtest_config_tag}')
  331. if abtest_param is None:
  332. return None
  333. predict_model = abtest_param.get('predict_model', None)
  334. threshold_mix_func = abtest_param.get('threshold_mix_func', None)
  335. if predict_model == 'xgb':
  336. result = xgboost_predict(
  337. model=model,
  338. app_type=app_type,
  339. mid=mid,
  340. video_id=video_id,
  341. abtest_id=abtest_id,
  342. ab_test_code=ab_test_code
  343. )
  344. elif threshold_mix_func == 'add':
  345. result = predict_mid_video_res_with_add(
  346. now_date=now_date,
  347. mid=mid,
  348. video_id=video_id,
  349. abtest_param=abtest_param,
  350. abtest_id=abtest_id,
  351. abtest_config_tag=abtest_config_tag,
  352. ab_test_code=ab_test_code,
  353. care_model_status=care_model_status
  354. )
  355. elif threshold_mix_func == 'multiply':
  356. result = predict_mid_video_res_with_multiply(
  357. now_date=now_date,
  358. mid=mid,
  359. video_id=video_id,
  360. abtest_param=abtest_param,
  361. abtest_id=abtest_id,
  362. abtest_config_tag=abtest_config_tag,
  363. ab_test_code=ab_test_code,
  364. care_model_status=care_model_status
  365. )
  366. else:
  367. result = predict_mid_video_res(
  368. now_date=now_date,
  369. mid=mid,
  370. video_id=video_id,
  371. abtest_param=abtest_param,
  372. abtest_id=abtest_id,
  373. abtest_config_tag=abtest_config_tag,
  374. ab_test_code=ab_test_code,
  375. care_model_status=care_model_status
  376. )
  377. # user_data_key = abtest_param['user'].get('data')
  378. # user_rule_key = abtest_param['user'].get('rule')
  379. # video_data_key = abtest_param['video'].get('data')
  380. # group_class_key = abtest_param.get('group_class_key')
  381. # no_ad_mid_group_list = abtest_param.get('no_ad_mid_group_list', [])
  382. #
  383. # # 判断mid所属分组
  384. # mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{group_class_key}:{mid}"
  385. # mid_group = redis_helper.get_data_from_redis(key_name=mid_group_key_name)
  386. # if mid_group is None:
  387. # mid_group = 'mean_group'
  388. #
  389. # # 判断用户是否在免广告用户组列表中
  390. # if mid_group in no_ad_mid_group_list:
  391. # # 在免广告用户组列表中,则不出广告
  392. # ad_predict = 1
  393. # result = {
  394. # 'mid_group': mid_group,
  395. # 'ad_predict': ad_predict
  396. # }
  397. # else:
  398. # # 获取用户组分享率
  399. # group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{user_data_key}:{user_rule_key}:{now_dt}"
  400. # if not redis_helper.key_exists(group_share_rate_key):
  401. # redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  402. # group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{user_data_key}:{user_rule_key}:{redis_dt}"
  403. # group_share_rate = redis_helper.get_score_with_value(key_name=group_share_rate_key, value=mid_group)
  404. # # 获取视频分享率
  405. # video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{video_data_key}:{now_dt}"
  406. # if not redis_helper.key_exists(video_share_rate_key):
  407. # redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  408. # video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{video_data_key}:{redis_dt}"
  409. # video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=int(video_id))
  410. # if video_share_rate is None:
  411. # video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=-1)
  412. #
  413. # # 计算 mid-video 分享率
  414. # if group_share_rate is None or video_share_rate is None:
  415. # return None
  416. # mid_video_share_rate = float(group_share_rate) * float(video_share_rate)
  417. #
  418. # # 获取对应的阈值
  419. # threshold = get_threshold(
  420. # abtest_id=abtest_id,
  421. # abtest_config_tag=abtest_config_tag,
  422. # ab_test_code=ab_test_code,
  423. # mid_group=mid_group,
  424. # care_model_status=care_model_status,
  425. # abtest_param=abtest_param
  426. # )
  427. # # 阈值判断
  428. # if mid_video_share_rate > threshold:
  429. # # 大于阈值,出广告
  430. # ad_predict = 2
  431. # else:
  432. # # 否则,不出广告
  433. # ad_predict = 1
  434. # result = {
  435. # 'mid_group': mid_group,
  436. # 'group_share_rate': group_share_rate,
  437. # 'video_share_rate': video_share_rate,
  438. # 'mid_video_share_rate': mid_video_share_rate,
  439. # 'threshold': threshold,
  440. # 'ad_predict': ad_predict}
  441. return result
  442. except Exception as e:
  443. log_.error(traceback.format_exc())
  444. return None