MerchantCumRatioPainter.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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_mchratios
  9. import time as time
  10. import logging
  11. logger = logging.getLogger('MerchantCumRatioPainter')
  12. class MerchantCumRatioPainter(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 0
  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 = 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. if self._filter_wave is not None and self._filter_wave > 1:
  31. window = np.ones(self._filter_wave) / self._filter_wave
  32. else:
  33. window = None
  34. left_len = self._start_time - _start_time
  35. right_len = _end_time - self._end_time
  36. mchid_ratios = []
  37. for _mchid, _card_type, _spec, _data in gen:
  38. succ, count, y = calc_mchratios(_data, pos_map, _start_time - day_stamp, _end_time - day_stamp, window, left_len, right_len)
  39. label, ratio = self._label(chname=_mchid, succ=succ, count=count, card_type=_card_type, spec=_spec)
  40. ax.plot(x, y, ls='-', label=label)
  41. if _card_type is None and _spec is None and type(_mchid) is int:
  42. mchid_ratios.append((_mchid, ratio))
  43. xticks = self.calc_xticks(self._start_time, self._end_time, self._interval)
  44. xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in xticks]
  45. buf = fig_flush(ax, fig, xticks=xticks, xlables=xlables)
  46. mchid_ratios = sorted(mchid_ratios, key=lambda x: (x[1], x[0]), reverse=True)
  47. result = []
  48. for mchid,ratio in mchid_ratios:
  49. result.append(f'{mchid}:{ratio}')
  50. return buf, result