from .DataStream import ENetPosmap as pos_map from .NetcheckPainter import NetcheckPainter, net_pathes from .NetchkReader import NetchkReader from matplotlib.figure import Figure from matplotlib import ticker from io import BytesIO import numpy as np from .algorithm import calc_cov_netfail import time as time import logging logger = logging.getLogger('NetcheckCovPainter') class NetcheckCovPainter(NetcheckPainter): def __init__(self, start_time: int, end_time: int, chnames: set = None, filter_wave: int = None): self._reader = NetchkReader() filter_wave = filter_wave or 3600 self._chnames, self._filter_wave = chnames, filter_wave self._days, self._start_time, self._end_time, self._interval = self.calc_time(self._reader, start_time, end_time) pass def paint(self): reader = self._reader if len(self._days) == 0: return BytesIO() tuple_pathes = reader.many_tuple_path(self._days, self._chnames) gen = net_pathes(reader, tuple_pathes, self._days) day_stamp = self._days[0] fig_create, fig_flush = self._fig_funs() ax, fig = fig_create() x = np.array([d - self._start_time for d in range(self._start_time, self._end_time)]) window = np.ones(self._filter_wave) stime = lambda t: time.strftime('%y-%m-%d %H:%M:%S', time.localtime(t)) logger.debug("start_time %d, %s end_time=%s", self._start_time, stime(self._start_time), stime(self._end_time)) chname_ratios = [] for _chname, _data in gen: fail, fails, count = calc_cov_netfail(_data, pos_map, self._start_time - day_stamp, self._end_time - day_stamp, window) label, ratio = self._label(chname=_chname, succ=fails, count=count) ax.plot(x, fail, ls='-', label=label) if _chname != 'all': chname_ratios.append((_chname, ratio)) xticks = self.calc_xticks(self._start_time, self._end_time, self._interval) xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in xticks] buf = fig_flush(ax, fig, xticks, xlables) chname_ratios = sorted(chname_ratios, key=lambda x: (x[1], x[0]), reverse=True) result = [] for name, ratio in chname_ratios: result.append(f'{name}:{ratio}') return buf, result