channel_use_time.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #-*- coding: utf-8 -*-
  2. #__author__ = "dukun"
  3. import time
  4. import pymysql
  5. import logging
  6. import datetime
  7. import numpy as np
  8. import pandas as pd
  9. from celery_tasks import cel
  10. #from DBUtils.PooledDB import PooledDB
  11. from dbutils.pooled_db import PooledDB
  12. #配置输出日志格式
  13. LOG_FORMAT = "%(asctime)s %(filename)s[line:%(lineno)d] %(name)s %(levelname)s %(pathname)s %(message)s "
  14. #配置输出时间的格式,注意月份和天数不要搞乱了
  15. DATE_FORMAT = '%Y-%m-%d %H:%M:%S %a '
  16. logging.basicConfig(level=logging.INFO,
  17. format=LOG_FORMAT,
  18. datefmt = DATE_FORMAT ,
  19. filename=r"./logs/channel.log" #有了filename参数就不会直接输出显示到控制台,而是直接写入文件
  20. )
  21. #数据库连接信息
  22. channel_db_config = {
  23. 'host' : '47.95.217.180',
  24. 'port' : 3306,
  25. 'user' : 'root',
  26. 'password' : '93DkChZMgZRyCbWh',
  27. 'db' : 'fmp',
  28. 'charset' : 'utf8',
  29. 'autocommit' : 1
  30. }
  31. stat_db_config = {
  32. 'host' : '127.0.0.1',
  33. 'port' : 3306,
  34. 'user' : 'root',
  35. 'password' : 'nibuzhidaowozhidao',
  36. 'db' : 'statistical',
  37. 'charset' : 'utf8',
  38. 'autocommit' : 1
  39. }
  40. #创建数据库连接池
  41. def createPool(db_config):
  42. spool = PooledDB(pymysql, 5, **db_config)
  43. return spool
  44. @cel.task
  45. def get_channel_use_time():
  46. conn = createPool(channel_db_config).connection()
  47. stat_conn = createPool(stat_db_config).connection()
  48. channel_sql = """SELECT trans_id,channel_name,use_time,status,cnt
  49. FROM
  50. (SELECT trans_id, SUM(UNIX_TIMESTAMP(modify_date) - UNIX_TIMESTAMP(create_date)) use_time,send_status status,
  51. COUNT(*) cnt
  52. FROM
  53. mobile_flow_dispatch_rec
  54. WHERE UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(create_date) <= (2 * 3600)
  55. GROUP BY trans_id,status) t1 LEFT JOIN access_channel_info
  56. ON access_channel_info.channel_seq_id = t1.trans_id
  57. ORDER BY channel_name ; """
  58. ins_sql = """ INSERT INTO channel_use_time VALUES(0,%s,%s,%s,%s,%s) """
  59. df = pd.read_sql(channel_sql,conn)
  60. #print(df)
  61. channel_ids = ['83','84','85','89','90','91','95','104','105','116','117','118','119','120',
  62. '121','122','123','124','125','126','127','128']
  63. ins_list = []
  64. date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
  65. for channel_id in channel_ids:
  66. channel_df = df[df['trans_id'] == channel_id]
  67. if channel_df.empty is True:
  68. continue
  69. channel_name = channel_df['channel_name'].iloc[0]
  70. succ_df = channel_df[channel_df['status'] == '2']
  71. fail_df = channel_df[channel_df['status'] == '4']
  72. #成功平均时长
  73. if succ_df.empty is False:
  74. succ_time = succ_df['use_time'].iloc[0]
  75. #print(succ_time)
  76. succ_count = succ_df['cnt'].iloc[0]
  77. succ_avg_time = float(succ_time/succ_count)
  78. else:
  79. succ_avg_time = 0
  80. if fail_df.empty is False:
  81. fail_time = fail_df['use_time'].iloc[0]
  82. fail_count = fail_df['cnt'].iloc[0]
  83. fail_avg_time = float(fail_time/fail_count)
  84. else:
  85. fail_avg_time = 0
  86. total_df = channel_df.groupby('trans_id').agg({'use_time' : 'sum','cnt' : 'sum'})
  87. total_time = total_df['use_time'].iloc[0]
  88. total_count = total_df['cnt'].iloc[0]
  89. total_avg_time = float(total_time / total_count)
  90. #print(total_avg_time)
  91. #print(succ_avg_time)
  92. #print(fail_avg_time)
  93. ins_list.append((date,channel_id,channel_name,1,total_avg_time)) #合计平均时长
  94. ins_list.append((date,channel_id,channel_name,2,succ_avg_time)) #成功平均时长
  95. ins_list.append((date,channel_id,channel_name,3,fail_avg_time)) #失败平均时长
  96. stat_cursor = stat_conn.cursor()
  97. stat_cursor.executemany(ins_sql,ins_list)
  98. stat_conn.rollback()
  99. #print('数据回滚')
  100. conn.close()
  101. stat_conn.close()
  102. print(3333333333333333)
  103. #get_channel_use_time()