ChannelCovSuccPainter.py 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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_cov_chsuccs
  9. import time as time
  10. import logging
  11. logger = logging.getLogger('ChannelCumPainter')
  12. class ChannelCovSuccPainter(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. self._reader = ChannelReader()
  15. if filter_wave is None:
  16. filter_wave = 3600
  17. self._chnames, self._card_types, self._spec, self._filter_wave = chnames, 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 = reader.many_tuple_path(self._days, self._chnames, self._card_types, self._spec)
  24. gen = ratio_pathes(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. stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
  35. logger.debug("near_stamp start_time %d, %s end_time=%s left_len=%d right_len=%d",
  36. self._start_time, stime(self._start_time), stime(self._end_time),left_len,right_len)
  37. chname_ratios = []
  38. for _chname, _card_type, _spec, _data in gen:
  39. succ, commit,succs,counts = calc_cov_chsuccs(_data, pos_map, _start_time - day_stamp, _end_time - day_stamp, window, left_len,right_len)
  40. label, ratio = self._label(chname=_chname, succ=succs, count=counts, card_type=_card_type, spec=_spec)
  41. ax.plot(x, succ, ls='-', label=label)
  42. ax.plot(x, commit / 100, ls='--', label=label)
  43. if _card_type is None and _spec is None and _chname != 'all':
  44. chname_ratios.append((_chname, ratio))
  45. ticks = [d - self._start_time for d in range(self._start_time, self._end_time + 1, self._interval)]
  46. xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in ticks]
  47. buf = fig_flush(ax, fig, ticks, xlables)
  48. chname_ratios = sorted(chname_ratios, key=lambda x: (x[1], x[0]), reverse=True)
  49. result = []
  50. for name, ratio in chname_ratios:
  51. result.append(f'{name}:{ratio}')
  52. return buf, result
  53. def _fig_funs(self):
  54. def create():
  55. fig = Figure(figsize=(19, 8))
  56. ax = fig.subplots()
  57. ax.set_title('success count')
  58. ax.set(xlabel='time', ylabel='count')
  59. return ax, fig
  60. def flush(ax, fig, ticks, lables):
  61. ax.set_xticks(ticks=ticks)
  62. ax.set_xticklabels(lables)
  63. fig.autofmt_xdate()
  64. ax.grid()
  65. fig.subplots_adjust(left=0.1, right=0.8, top=0.95, bottom=0.1)
  66. ax.legend(bbox_to_anchor=(1, 1), loc='upper left')
  67. buf = BytesIO()
  68. fig.savefig(buf, format="png")
  69. return buf
  70. return create, flush