algorithm.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from .DataStream import EMchPosmap
  2. import numpy as np
  3. import logging
  4. logger = logging.getLogger('calcer')
  5. def calc_chratios(data, pos_map, start, end):
  6. view = data[[pos_map.succ_count, pos_map.fail_count, pos_map.commit_count], :]
  7. view = view[:, start:end]
  8. all = np.cumsum(view, axis=1)
  9. succ = all[0, :]
  10. commit = all[0, :] + all[1, :]
  11. commit += 0.0000001
  12. y = succ / commit
  13. y = y.ravel()
  14. return int(all[0, -1]), int(all[0, -1] + all[1, -1]), y
  15. def calc_chspeed(data, pos_map, start, end):
  16. view = data[[pos_map.commit_count], :]
  17. view = view[:, start:end]
  18. speed = np.sum(view, axis=1)
  19. return int(speed[0])
  20. def calc_chratio(data, pos_map, start, end):
  21. view = data[[pos_map.succ_count, pos_map.fail_count, pos_map.succ_periods, pos_map.fail_periods, pos_map.commit_count], :]
  22. view = view[:, start:end]
  23. sums = np.sum(view, axis=1)
  24. succs = sums[0]
  25. fails = sums[1]
  26. succ_periods = sums[2]
  27. fail_periods = sums[3]
  28. commit_count = int(sums[4])
  29. all = int(succs + fails)
  30. ratio = succs / (all + 0.00001)
  31. back_time = (succ_periods + fail_periods) / (succs + fails + 0.00001)
  32. return round(ratio, 5), commit_count, round(back_time, 5)
  33. def calc_commit(data, pos_map, start, end):
  34. view = data[[pos_map.commit_count], :]
  35. view = view[:, start:end]
  36. sums = np.sum(view, axis=1)
  37. commit_count = int(sums[0])
  38. return commit_count
  39. def calc_mchratios(data, pos_map, start, end):
  40. view = data[[pos_map.succ_count, pos_map.fail_count, pos_map.submit_count], :]
  41. view = view[:, start:end]
  42. all = np.cumsum(view, axis=1)
  43. succ = all[0, :]
  44. commit = all[0, :] + all[1, :]
  45. commit += 0.0000001
  46. y = succ / commit
  47. y = y.ravel()
  48. return int(all[0, -1]), int(all[0, -1] + all[1, -1]), y
  49. def calc_morder_send(data, pos_map: type(EMchPosmap), start: int, end: int):
  50. view = data[:, start:end]
  51. sums = np.sum(view, axis=1)
  52. all_return = sums[pos_map.succ_mch_amounts] + sums[pos_map.fail_mch_amounts] + 0.0000001
  53. ratio = sums[pos_map.succ_mch_amounts] / all_return
  54. send_count = sums[pos_map.submit_count] - sums[pos_map.succ_count] - sums[pos_map.fail_count]
  55. send_amounts = sums[pos_map.submit_amounts] - sums[pos_map.succ_mch_amounts] - sums[pos_map.fail_mch_amounts]
  56. lack_amounts = send_amounts * ratio
  57. return send_count, sums[pos_map.submit_count], sums[pos_map.succ_count], sums[pos_map.fail_count], sums[pos_map.submit_amounts], \
  58. sums[pos_map.succ_mch_amounts], sums[pos_map.fail_mch_amounts], send_amounts, lack_amounts
  59. def calc_morder_lack(data, pos_map: type(EMchPosmap), start: int, end: int):
  60. view = data[:, start:end]
  61. sums = np.sum(view, axis=1)
  62. all_return = sums[pos_map.succ_count] + sums[pos_map.fail_count] + 0.0000001
  63. ratio = sums[pos_map.succ_count] / all_return
  64. send_count = sums[pos_map.submit_count] - sums[pos_map.succ_count] - sums[pos_map.fail_count]
  65. send_amounts = sums[pos_map.submit_amounts] - sums[pos_map.succ_mch_amounts] - sums[pos_map.fail_mch_amounts]
  66. lack_amounts = send_amounts * ratio
  67. logger.info("send_count=%d send_amounts=%.4f ratio=%.4f lack_amounts=%.4f", send_count, send_amounts, ratio, lack_amounts)
  68. return send_amounts, lack_amounts
  69. # 用于计算成功率及利润率
  70. # succ_count, fail_count, succ_ratio, profit,profit_ratio
  71. def calc_mch_profit(data, pos_map: type(EMchPosmap), start: int, end: int):
  72. view = data[:, start:end]
  73. sums = np.sum(view, axis=1)
  74. submit_count = sums[pos_map.submit_count]
  75. succ_count = sums[pos_map.succ_count]
  76. fail_count = sums[pos_map.fail_count]
  77. succ_ratio = succ_count / (succ_count + fail_count + 0.0000001)
  78. ch_amounts = sums[pos_map.succ_ch_amounts]
  79. mch_amounts = sums[pos_map.succ_mch_amounts]
  80. profit = mch_amounts - ch_amounts
  81. return int(submit_count), int(succ_count), int(fail_count), round(succ_ratio, 5), round(profit, 3)