|
@@ -0,0 +1,88 @@
|
|
|
+from .DataStream import EChPosmap as pos_map
|
|
|
+from .ChannelReader import ChannelReader
|
|
|
+from .ChannelPainter import ChannelPainter, ratio_pathes
|
|
|
+from matplotlib.figure import Figure
|
|
|
+from matplotlib import ticker
|
|
|
+from io import BytesIO
|
|
|
+import numpy as np
|
|
|
+from .algorithm import calc_cov_chsuccs
|
|
|
+import time as time
|
|
|
+
|
|
|
+import logging
|
|
|
+logger = logging.getLogger('ChannelCumPainter')
|
|
|
+
|
|
|
+class ChannelCovSuccPainter(ChannelPainter):
|
|
|
+ def __init__(self, start_time: int, end_time: int, chnames: set = None, card_types: set = None, spec: int = None, filter_wave: int = None):
|
|
|
+ self._reader = ChannelReader()
|
|
|
+ if filter_wave is None:
|
|
|
+ filter_wave = 3600
|
|
|
+ self._chnames, self._card_types, self._spec, self._filter_wave = chnames, card_types, spec, filter_wave
|
|
|
+ _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
|
|
|
+ self._days, _start_time, _end_time, _interval = self.calc_time(self._reader, self._start_time - self._filter_wave, self._end_time)
|
|
|
+
|
|
|
+ tuple_pathes = reader.many_tuple_path(self._days, self._chnames, self._card_types, self._spec)
|
|
|
+ gen = ratio_pathes(reader, tuple_pathes, self._days, self._spec)
|
|
|
+ if len(self._days) == 0:
|
|
|
+ return BytesIO()
|
|
|
+
|
|
|
+ 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) / self._filter_wave
|
|
|
+
|
|
|
+ left_len = self._start_time - _start_time
|
|
|
+ right_len = _end_time - self._end_time
|
|
|
+
|
|
|
+ stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
|
|
|
+ logger.debug("near_stamp start_time %d, %s end_time=%s left_len=%d right_len=%d",
|
|
|
+ self._start_time, stime(self._start_time), stime(self._end_time),left_len,right_len)
|
|
|
+
|
|
|
+ chname_ratios = []
|
|
|
+ for _chname, _card_type, _spec, _data in gen:
|
|
|
+ succ, commit = calc_cov_chsuccs(_data, pos_map, _start_time - day_stamp, _end_time - day_stamp, window, left_len,right_len)
|
|
|
+ label, ratio = self._label(chname=_chname, succ=succ, count=commit, card_type=_card_type, spec=_spec)
|
|
|
+ ax.plot(x, succ, ls='-', label=label)
|
|
|
+ ax.plot(x, commit, ls='--', label=label)
|
|
|
+
|
|
|
+ if _card_type is None and _spec is None and _chname != 'all':
|
|
|
+ chname_ratios.append((_chname, ratio))
|
|
|
+
|
|
|
+ ticks = [d - self._start_time for d in range(self._start_time, self._end_time + 1, self._interval)]
|
|
|
+ xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in ticks]
|
|
|
+ buf = fig_flush(ax, fig, ticks, 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
|
|
|
+
|
|
|
+ def _label(self, chname, succ, count, card_type=None, spec=None):
|
|
|
+ _card_type = None
|
|
|
+ if card_type == 1:
|
|
|
+ _card_type = 'SY'
|
|
|
+ elif card_type == 2:
|
|
|
+ _card_type = 'SH'
|
|
|
+ elif card_type == 4:
|
|
|
+ _card_type = 'YD'
|
|
|
+ elif card_type == 5:
|
|
|
+ _card_type = 'LT'
|
|
|
+ elif card_type == 6:
|
|
|
+ _card_type = 'DX'
|
|
|
+ elif card_type == 7:
|
|
|
+ _card_type = 'TH'
|
|
|
+
|
|
|
+ lable = f"{chname}"
|
|
|
+ if _card_type is not None:
|
|
|
+ lable += f"-{_card_type}"
|
|
|
+
|
|
|
+ if spec is not None:
|
|
|
+ lable += f"-{spec}"
|
|
|
+
|
|
|
+ return lable, 0.0
|