NetcheckCovPainter.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from .DataStream import ENetPosmap as pos_map
  2. from .NetcheckPainter import NetcheckPainter, net_pathes
  3. from .NetchkReader import NetchkReader
  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_netfail
  9. import time as time
  10. import logging
  11. logger = logging.getLogger('ChannelCumPainter')
  12. class NetcheckCovPainter(NetcheckPainter):
  13. def __init__(self, start_time: int, end_time: int, chnames: set = None, filter_wave: int = None):
  14. self._reader = NetchkReader()
  15. if filter_wave is None:
  16. filter_wave = 3600
  17. self._chnames, self._filter_wave = chnames, 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)
  24. gen = net_pathes(reader, tuple_pathes, self._days)
  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, _data in gen:
  39. fail, fails, count = calc_cov_netfail(_data, pos_map, _start_time - day_stamp, _end_time - day_stamp, window, left_len,right_len)
  40. label, ratio = self._label(chname=_chname, succ=fails, count=count)
  41. ax.plot(x, fail, ls='-', label=label)
  42. if _chname != 'all':
  43. chname_ratios.append((_chname, ratio))
  44. ticks = [d - self._start_time for d in range(self._start_time, self._end_time + 1, self._interval)]
  45. xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in ticks]
  46. buf = fig_flush(ax, fig, ticks, xlables)
  47. chname_ratios = sorted(chname_ratios, key=lambda x: (x[1], x[0]), reverse=True)
  48. result = []
  49. for name, ratio in chname_ratios:
  50. result.append(f'{name}:{ratio}')
  51. return buf, result