NetcheckCovPainter.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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('NetcheckCovPainter')
  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. filter_wave = filter_wave or 3600
  16. self._chnames, self._filter_wave = chnames, filter_wave
  17. self._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. if len(self._days) == 0:
  22. return BytesIO()
  23. tuple_pathes = reader.many_tuple_path(self._days, self._chnames)
  24. gen = net_pathes(reader, tuple_pathes, self._days)
  25. day_stamp = self._days[0]
  26. fig_create, fig_flush = self._fig_funs()
  27. ax, fig = fig_create()
  28. x = np.array([d - self._start_time for d in range(self._start_time, self._end_time)])
  29. window = np.ones(self._filter_wave)
  30. stime = lambda t: time.strftime('%y-%m-%d %H:%M:%S', time.localtime(t))
  31. logger.debug("start_time %d, %s end_time=%s", self._start_time, stime(self._start_time), stime(self._end_time))
  32. chname_ratios = []
  33. for _chname, _data in gen:
  34. fail, fails, count = calc_cov_netfail(_data, pos_map, self._start_time - day_stamp, self._end_time - day_stamp, window)
  35. label, ratio = self._label(chname=_chname, succ=fails, count=count)
  36. ax.plot(x, fail, ls='-', label=label)
  37. if _chname != 'all':
  38. chname_ratios.append((_chname, ratio))
  39. xticks = self.calc_xticks(self._start_time, self._end_time, self._interval)
  40. xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in xticks]
  41. buf = fig_flush(ax, fig, xticks, xlables)
  42. chname_ratios = sorted(chname_ratios, key=lambda x: (x[1], x[0]), reverse=True)
  43. result = []
  44. for name, ratio in chname_ratios:
  45. result.append(f'{name}:{ratio}')
  46. return buf, result