MerchantCovRatioPainter.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from .DataStream import EMchPosmap as pos_map, span_days, time_border, calc_interval
  2. from .MerchantReader import MerchantReader
  3. from .MerchantPainter import MerchantPainter, allpathes
  4. from matplotlib.figure import Figure
  5. from matplotlib import ticker
  6. from io import BytesIO
  7. import numpy as np
  8. from .algorithm import calc_cov_mchratios
  9. import time as time
  10. import logging
  11. logger = logging.getLogger('MerchantCovRatioPainter')
  12. class MerchantCovRatioPainter(MerchantPainter):
  13. def __init__(self, start_time: int, end_time: int, mchids: set = None, card_types: set = None, spec: int = None, filter_wave: int = None):
  14. self._reader = MerchantReader()
  15. if filter_wave is None:
  16. filter_wave = 3600
  17. self._mchids, self._card_types, self._spec, self._filter_wave = mchids, card_types, spec, filter_wave
  18. _days, self._start_time, self._end_time, self._interval = self.calc_time(self._reader, start_time, end_time)
  19. pass
  20. def paint(self):
  21. reader = self._reader
  22. self._days, _start_time, _end_time, _interval = self.calc_time(self._reader, self._start_time - self._filter_wave, self._end_time)
  23. tuple_pathes = self._reader.many_tuple_path(self._days, self._mchids, self._card_types, self._spec)
  24. gen = allpathes(self._reader, tuple_pathes, self._days, self._spec)
  25. if len(self._days) == 0:
  26. return BytesIO()
  27. day_stamp = self._days[0]
  28. fig_create, fig_flush = self._fig_funs()
  29. ax, fig = fig_create()
  30. x = np.array([d - self._start_time for d in range(self._start_time, self._end_time)])
  31. window = np.ones(self._filter_wave)
  32. left_len = self._start_time - _start_time
  33. right_len = _end_time - self._end_time
  34. mchid_ratios = []
  35. for _mchid, _card_type, _spec, _data in gen:
  36. succ, count, y = calc_cov_mchratios(_data, pos_map, _start_time - day_stamp, _end_time - day_stamp, window, left_len, right_len)
  37. label, ratio = self._label(chname=_mchid, succ=succ, count=count, card_type=_card_type, spec=_spec)
  38. ax.plot(x, y, ls='-', label=label)
  39. if _card_type is None and _spec is None and type(_mchid) is int:
  40. mchid_ratios.append((_mchid, ratio))
  41. xticks = [d - self._start_time for d in range(self._start_time, self._end_time + 1, self._interval)]
  42. xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in xticks]
  43. buf = fig_flush(ax, fig, xticks=xticks, xlables=xlables)
  44. mchid_ratios = sorted(mchid_ratios, key=lambda x: (x[1], x[0]), reverse=True)
  45. result = []
  46. for mchid,ratio in mchid_ratios:
  47. result.append(f'{mchid}:{ratio}')
  48. return buf, result