ad_thompson_param_update.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import traceback
  2. import datetime
  3. import json
  4. import time
  5. from odps import ODPS
  6. from db_helper import RedisHelper
  7. from utils import send_msg_to_feishu
  8. from config import set_config
  9. from log import Log
  10. config_ = set_config()
  11. log_ = Log()
  12. def main(project, table):
  13. try:
  14. view_pv_sum = 0
  15. click_pv_sum = 0
  16. # 获取广告ad_idea_id对应的曝光次数和点击次数
  17. odps = ODPS(
  18. access_id=config_.ODPS_CONFIG['ACCESSID'],
  19. secret_access_key=config_.ODPS_CONFIG['ACCESSKEY'],
  20. project=project,
  21. endpoint=config_.ODPS_CONFIG['ENDPOINT'],
  22. )
  23. records = odps.read_table(name=table)
  24. ad_idea_data = []
  25. for item in records:
  26. ad_idea_id = item['ad_idea_id']
  27. view_pv = item['view_pv']
  28. click_pv = item['click_pv']
  29. if ad_idea_id is None or ad_idea_id == '':
  30. continue
  31. try:
  32. view_pv = int(view_pv)
  33. except:
  34. view_pv = 0
  35. try:
  36. click_pv = int(click_pv)
  37. except:
  38. click_pv = 0
  39. if view_pv < click_pv:
  40. continue
  41. param_alpha = click_pv
  42. param_beta = view_pv - click_pv
  43. ad_idea_data.append({'ad_idea_id': ad_idea_id, 'param': [param_alpha, param_beta]})
  44. view_pv_sum += view_pv
  45. click_pv_sum += click_pv
  46. log_.info(f"ad_idea_data count: {len(ad_idea_data)}")
  47. log_.info(f"ad_idea_data: {ad_idea_data}")
  48. # 更新redis
  49. redis_helper = RedisHelper()
  50. i = 0
  51. for ad_idea in ad_idea_data:
  52. try:
  53. key_name = f"{config_.THOMPSON_PARAM_KEY_PREFIX}{ad_idea['ad_idea_id']}"
  54. value = json.dumps(ad_idea['param'])
  55. redis_helper.set_data_to_redis(key_name=key_name, value=value, expire_time=24 * 3600)
  56. i += 1
  57. except:
  58. continue
  59. # 更新均值
  60. key_name = f"{config_.THOMPSON_PARAM_KEY_PREFIX}-1"
  61. click_pv_avg = click_pv_sum / len(ad_idea_data)
  62. view_pv_avg = view_pv_sum / len(ad_idea_data)
  63. param1 = int(click_pv_avg * 1.2)
  64. param2 = int(view_pv_avg) - int(click_pv_avg)
  65. value = json.dumps([param1, param2])
  66. redis_helper.set_data_to_redis(key_name=key_name, value=value, expire_time=24 * 3600)
  67. i += 1
  68. log_.info(f"to redis count: {i}")
  69. log_.info(f"mean: {value}")
  70. except Exception as e:
  71. log_.error(f"广告Thompson参数更新失败, exception: {e}, traceback: {traceback.format_exc()}")
  72. send_msg_to_feishu(
  73. webhook=config_.FEISHU_ROBOT['server_robot'].get('webhook'),
  74. key_word=config_.FEISHU_ROBOT['server_robot'].get('key_word'),
  75. msg_text=f"rov-offline{config_.ENV_TEXT} - 广告Thompson参数更新失败\n"
  76. f"exception: {e}\n"
  77. f"traceback: {traceback.format_exc()}"
  78. )
  79. if __name__ == '__main__':
  80. project = 'loghubods'
  81. table = 'ad_own_data_vc'
  82. now_date = datetime.datetime.today()
  83. dt = datetime.datetime.strftime(now_date, '%Y%m%d %H:%M:%S')
  84. log_.info(f"dt: {dt}")
  85. start_time = time.time()
  86. main(project=project, table=table)
  87. log_.info(f"excuteTime: {(time.time() - start_time) * 1000}ms")