MerchantCovRatioPainter.py 2.6 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. filter_wave = filter_wave or 3600
  16. self._mchids, self._card_types, self._spec, self._filter_wave = mchids, card_types, spec, filter_wave
  17. days, self._start_time, self._end_time, self._interval = self.calc_time(self._reader, start_time, end_time)
  18. pass
  19. def paint(self):
  20. reader = self._reader
  21. days, _start_time, _end_time, _interval = self.calc_time(self._reader, self._start_time - self._filter_wave, self._end_time)
  22. if len(days) == 0:
  23. return BytesIO()
  24. tuple_pathes = self._reader.many_tuple_path(days, self._mchids, self._card_types, self._spec)
  25. gen = allpathes(reader, tuple_pathes, days, self._spec)
  26. day_stamp = days[0]
  27. fig_create, fig_flush = self._fig_funs()
  28. ax, fig = fig_create()
  29. x = np.array([d - self._start_time for d in range(self._start_time, self._end_time)])
  30. window = np.ones(self._filter_wave)
  31. left_len = self._start_time - _start_time
  32. right_len = _end_time - self._end_time
  33. mchid_ratios = []
  34. for _mchid, _card_type, _spec, _data in gen:
  35. succ, count, y = calc_cov_mchratios(_data, pos_map, _start_time - day_stamp, _end_time - day_stamp, window, left_len, right_len)
  36. label, ratio = self._label(chname=_mchid, succ=succ, count=count, card_type=_card_type, spec=_spec)
  37. ax.plot(x, y, ls='-', label=label)
  38. if _card_type is None and _spec is None and type(_mchid) is int:
  39. mchid_ratios.append((_mchid, ratio))
  40. xticks = self.calc_xticks(self._start_time, self._end_time, self._interval)
  41. xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in xticks]
  42. buf = fig_flush(ax, fig, xticks=xticks, xlables=xlables)
  43. mchid_ratios = sorted(mchid_ratios, key=lambda x: (x[1], x[0]), reverse=True)
  44. result = []
  45. for mchid,ratio in mchid_ratios:
  46. result.append(f'{mchid}:{ratio}')
  47. return buf, result