ad_creative_cvr_update.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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, dt):
  13. try:
  14. # 获取广告ad_idea_id对应的点击次数、转化次数 和 cvr
  15. odps = ODPS(
  16. access_id=config_.ODPS_CONFIG['ACCESSID'],
  17. secret_access_key=config_.ODPS_CONFIG['ACCESSKEY'],
  18. project=project,
  19. endpoint=config_.ODPS_CONFIG['ENDPOINT'],
  20. )
  21. t = odps.get_table(name=table)
  22. if not t.exist_partition(partition_spec=f'dt={dt}'):
  23. log_.info(f"广告Thompson-cvr数据更新失败, 分区dt={dt}数据未准备好")
  24. send_msg_to_feishu(
  25. webhook=config_.FEISHU_ROBOT['server_robot'].get('webhook'),
  26. key_word=config_.FEISHU_ROBOT['server_robot'].get('key_word'),
  27. msg_text=f"rov-offline{config_.ENV_TEXT} - 广告Thompson-cvr数据更新失败\n"
  28. f"分区dt={dt}数据未准备好"
  29. )
  30. return
  31. records = odps.read_table(name=table, partition='dt=%s' % dt)
  32. ad_creative_data = []
  33. for item in records:
  34. creative_id = item['creative_id']
  35. click_pv = item['click_pv']
  36. conversion_pv = item['conversion_pv']
  37. cvr = item['cvr']
  38. if creative_id is None or creative_id == '':
  39. continue
  40. try:
  41. cvr = float(cvr)
  42. except:
  43. continue
  44. if cvr == 0:
  45. continue
  46. ad_creative_data.append(
  47. {'creative_id': creative_id, 'click_pv': click_pv, 'conversion_pv': conversion_pv, 'cvr': cvr}
  48. )
  49. log_.info(f"ad_creative_data count: {len(ad_creative_data)}")
  50. log_.info(f"ad_creative_data: {ad_creative_data}")
  51. # 更新redis
  52. redis_helper = RedisHelper()
  53. i = 0
  54. for ad_creative in ad_creative_data:
  55. try:
  56. key_name = f"{config_.CREATIVE_CVR_KEY_PREFIX}{ad_creative['creative_id']}"
  57. value = json.dumps(ad_creative['cvr'])
  58. redis_helper.set_data_to_redis(key_name=key_name, value=value, expire_time=24 * 3600)
  59. i += 1
  60. except:
  61. continue
  62. log_.info(f"to redis count: {i}")
  63. except Exception as e:
  64. log_.error(f"广告Thompson-cvr数据更新失败, exception: {e}, traceback: {traceback.format_exc()}")
  65. send_msg_to_feishu(
  66. webhook=config_.FEISHU_ROBOT['server_robot'].get('webhook'),
  67. key_word=config_.FEISHU_ROBOT['server_robot'].get('key_word'),
  68. msg_text=f"rov-offline{config_.ENV_TEXT} - 广告Thompson-cvr数据更新失败\n"
  69. f"exception: {e}\n"
  70. f"traceback: {traceback.format_exc()}"
  71. )
  72. if __name__ == '__main__':
  73. project = 'loghubods'
  74. table = 'ad_own_creative_cvr'
  75. now_date = datetime.datetime.today()
  76. log_.info(f"now: {datetime.datetime.strftime(now_date, '%Y%m%d %H:%M:%S')}")
  77. dt = datetime.datetime.strftime(now_date - datetime.timedelta(hours=1), '%Y%m%d%H')
  78. start_time = time.time()
  79. main(project=project, table=table, dt=dt)
  80. log_.info(f"excuteTime: {(time.time() - start_time) * 1000}ms")