ChannelCumPainter.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from .DataStream import EChPosmap as pos_map
  2. from .ChannelReader import ChannelReader
  3. from .ChannelPainter import ChannelPainter, ratio_pathes
  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_chratios
  9. import time as time
  10. import logging
  11. logger = logging.getLogger('ChannelCumPainter')
  12. class ChannelCumPainter(ChannelPainter):
  13. def __init__(self, start_time: int, end_time: int, chnames: set = None, card_types: set = None, spec: int = None, filter_wave: int = None,
  14. only_all: bool = False):
  15. self._reader = ChannelReader()
  16. filter_wave = filter_wave or 0
  17. self._chnames, self._card_types, self._spec, self._filter_wave,self._only_all = chnames, card_types, spec, filter_wave,only_all
  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 = ChannelReader()
  22. days, _start_time, _end_time, _interval = self.calc_time(self._reader, self._start_time - self._filter_wave, self._end_time)
  23. tuple_pathes = reader.many_tuple_path(days, self._chnames, self._card_types, self._spec)
  24. gen = ratio_pathes(reader, tuple_pathes, days, self._spec)
  25. if len(days) == 0:
  26. return BytesIO()
  27. day_stamp = 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. if self._filter_wave is not None and self._filter_wave > 1:
  32. window = np.ones(self._filter_wave) / self._filter_wave
  33. else:
  34. window = None
  35. left_len = self._start_time - _start_time
  36. right_len = 0
  37. stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
  38. logger.debug("start_time %d , %s end_time=%s", self._start_time, stime(self._start_time), stime(self._end_time))
  39. chname_ratios = []
  40. for _chname, _card_type, _spec, _data in gen:
  41. _succ, count, y = calc_chratios(_data, pos_map, _start_time - day_stamp, _end_time - day_stamp, window, left_len, right_len)
  42. label, ratio = self._label(chname=_chname, succ=_succ, count=count, card_type=_card_type, spec=_spec)
  43. ax.plot(x, y, ls='-', label=label)
  44. if _card_type is None and _spec is None and _chname != 'all':
  45. chname_ratios.append((_chname, ratio, _succ, count))
  46. ticks = [d - self._start_time for d in range(self._start_time, self._end_time + 1, self._interval)]
  47. ticks = self.calc_xticks(self._start_time, self._end_time, self._interval)
  48. xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in ticks]
  49. buf = fig_flush(ax, fig, ticks, xlables)
  50. chname_ratios = sorted(chname_ratios, key=lambda x: x[1], reverse=True)
  51. result = {}
  52. ratios = {}
  53. for _chname, ratio, _succ, count in chname_ratios:
  54. ratios[name] = [ratio,_succ,count]
  55. result['detail'] = ratios
  56. return buf, result