ad_recommend.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import datetime
  2. from utils import RedisHelper
  3. from config import set_config
  4. config_ = set_config()
  5. redis_helper = RedisHelper()
  6. def ad_recommend_predict(app_type, mid, video_id):
  7. """
  8. 广告推荐预测
  9. :param app_type: app_type
  10. :param mid: mid
  11. :param video_id: video_id
  12. :return: ad_predict, type-int, 1-不发放广告,2-发放广告
  13. """
  14. now_date = datetime.datetime.today()
  15. now_dt = datetime.datetime.strftime(now_date, '%Y%m%d')
  16. # 判断mid所属分组
  17. mid_group_key_name = f"{config_.KEY_NAME_PREFIX_MID_GROUP}{mid}"
  18. mid_group = redis_helper.get_data_from_redis(key_name=mid_group_key_name)
  19. if mid_group is None:
  20. mid_group = 'mean_group'
  21. # 判断用户是否在免广告用户组列表中
  22. if mid_group in config_.NO_AD_MID_GROUP_LIST:
  23. # 在免广告用户组列表中,则不出广告
  24. ad_predict = 1
  25. result = {
  26. 'mid_group': mid_group,
  27. 'ad_predict': ad_predict
  28. }
  29. else:
  30. # 获取用户组分享率
  31. group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{now_dt}"
  32. if not redis_helper.key_exists(group_share_rate_key):
  33. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  34. group_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_GROUP}{redis_dt}"
  35. group_share_rate = redis_helper.get_score_with_value(key_name=group_share_rate_key, value=mid_group)
  36. # 获取视频分享率
  37. video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{now_dt}"
  38. if not redis_helper.key_exists(video_share_rate_key):
  39. redis_dt = datetime.datetime.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  40. video_share_rate_key = f"{config_.KEY_NAME_PREFIX_AD_VIDEO}{redis_dt}"
  41. video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=int(video_id))
  42. if video_share_rate is None:
  43. video_share_rate = redis_helper.get_score_with_value(key_name=video_share_rate_key, value=-1)
  44. # 计算 mid-video 分享率
  45. mid_video_share_rate = float(group_share_rate) * float(video_share_rate)
  46. # 获取对应的阈值
  47. threshold_key_name = f"{config_.KEY_NAME_PREFIX_AD_THRESHOLD}{app_type}:{mid_group}"
  48. threshold = redis_helper.get_data_from_redis(key_name=threshold_key_name)
  49. if threshold is None:
  50. threshold = 0
  51. else:
  52. threshold = float(threshold)
  53. # 阈值判断
  54. if mid_video_share_rate > threshold:
  55. # 大于阈值,出广告
  56. ad_predict = 2
  57. else:
  58. # 否则,不出广告
  59. ad_predict = 1
  60. result = {
  61. 'mid_group': mid_group,
  62. 'group_share_rate': group_share_rate,
  63. 'video_share_rate': video_share_rate,
  64. 'mid_video_share_rate': mid_video_share_rate,
  65. 'threshold': threshold,
  66. 'ad_predict': ad_predict}
  67. return result