|
@@ -1,4 +1,4 @@
|
|
|
-from .DataStream import EChPosmap as pos_map,day_stamp,span_days,time_border
|
|
|
+from .DataStream import EChPosmap as pos_map, day_stamp, span_days, time_border, calc_interval
|
|
|
from .ChannelReader import ChannelReader
|
|
|
from collections import defaultdict
|
|
|
from matplotlib.figure import Figure
|
|
@@ -8,23 +8,71 @@ import numpy as np
|
|
|
from .algorithm import calc_chratios
|
|
|
import time as time
|
|
|
|
|
|
+
|
|
|
+def allpathes(reader: ChannelReader, tuple_pathes: dict, days: list, spec=None):
|
|
|
+ count = len(days)
|
|
|
+ show_detail = True if len(list(tuple_pathes.keys())) == 1 else False
|
|
|
+ if show_detail == False:
|
|
|
+ all_datas = reader.init_data(count)
|
|
|
+ else:
|
|
|
+ all_datas = None
|
|
|
+
|
|
|
+ for name, tup in tuple_pathes.items():
|
|
|
+ ch_datas = reader.init_data(count)
|
|
|
+ for _card_type, _spec in tup:
|
|
|
+ if spec is not None and _spec != spec:
|
|
|
+ continue
|
|
|
+
|
|
|
+ if show_detail:
|
|
|
+ detail_datas = reader.init_data(count)
|
|
|
+ else:
|
|
|
+ detail_datas = None
|
|
|
+
|
|
|
+ for i, day in enumerate(days):
|
|
|
+ data = reader.read(day, name, _card_type, _spec)
|
|
|
+ if data is not None:
|
|
|
+ column_pos = i * 86400
|
|
|
+ view = ch_datas[:, column_pos:column_pos + 86400]
|
|
|
+ view += data
|
|
|
+
|
|
|
+ if show_detail:
|
|
|
+ view = detail_datas[:, column_pos:column_pos + 86400]
|
|
|
+ view += data
|
|
|
+ if show_detail:
|
|
|
+ yield name, _card_type, _spec, detail_datas
|
|
|
+ if all_datas is not None:
|
|
|
+ all_datas += ch_datas
|
|
|
+ yield name, None, None, ch_datas
|
|
|
+
|
|
|
+ if show_detail == False:
|
|
|
+ yield 'all', None, None, all_datas
|
|
|
+
|
|
|
+
|
|
|
class ChannelPainter(object):
|
|
|
- def __init__(self, start_time: int, end_time: int, interval: int, chnames: set = None, card_types: set = None, spec: int = None):
|
|
|
- start_time = time_border(interval,start_time,True)
|
|
|
- end_time = time_border(interval,end_time,False)
|
|
|
- self._start_time, self._end_time, self._interval, self._chnames, self._card_types, self._spec = start_time, end_time, interval, chnames, card_types, spec
|
|
|
- self._days = span_days(start_time,end_time)
|
|
|
+ def __init__(self, start_time: int, end_time: int, chnames: set = None, card_types: set = None, spec: int = None):
|
|
|
self._reader = ChannelReader()
|
|
|
+ _start_time, _end_time, self._chnames, self._card_types, self._spec = start_time, end_time, chnames, card_types, spec
|
|
|
+
|
|
|
+ start_time = self._reader.near_stamp(_start_time,True)
|
|
|
+ end_time = self._reader.near_stamp(_end_time,False)
|
|
|
+
|
|
|
+ interval = calc_interval(start_time, end_time)
|
|
|
+ start_time = time_border(interval, start_time, True)
|
|
|
+ end_time = time_border(interval, end_time, False)
|
|
|
+ self._days = span_days(start_time, end_time)
|
|
|
+ self._start_time = start_time
|
|
|
+ self._end_time = end_time
|
|
|
+ self._interval = interval
|
|
|
|
|
|
pass
|
|
|
|
|
|
def _fig_funs(self):
|
|
|
def create():
|
|
|
- fig = Figure(figsize=(20, 10))
|
|
|
+ fig = Figure(figsize=(19, 8))
|
|
|
ax = fig.subplots()
|
|
|
ax.set_title('success ratio')
|
|
|
ax.set(xlabel='time', ylabel='ratio')
|
|
|
- return ax,fig
|
|
|
+ return ax, fig
|
|
|
|
|
|
def flush(ax, fig, ticks, lables):
|
|
|
ax.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=4))
|
|
@@ -41,45 +89,29 @@ class ChannelPainter(object):
|
|
|
|
|
|
return create, flush
|
|
|
|
|
|
-
|
|
|
def paint(self):
|
|
|
- def allpathes(reader: ChannelReader, tuple_pathes: dict, days: list):
|
|
|
- count = len(days)
|
|
|
- all_datas = reader.init_data(count)
|
|
|
- for name,tup in tuple_pathes.items():
|
|
|
- ch_datas = reader.init_data(count)
|
|
|
- for i, day in enumerate(days):
|
|
|
- for _card_type,_spec in tup:
|
|
|
- data = reader.read(day, name, _card_type, _spec)
|
|
|
- if data is not None:
|
|
|
- column_pos = i * 86400
|
|
|
- view = ch_datas[:, column_pos:column_pos + 86400]
|
|
|
- view += data
|
|
|
- all_datas += ch_datas
|
|
|
- yield name, ch_datas
|
|
|
- yield 'all',all_datas
|
|
|
-
|
|
|
reader = ChannelReader()
|
|
|
- tuple_pathes = reader.many_tuple_path(self._days,self._chnames,self._card_types,self._spec)
|
|
|
- gen = allpathes(self._reader,tuple_pathes,self._days)
|
|
|
+ tuple_pathes = reader.many_tuple_path(self._days, self._chnames, self._card_types, self._spec)
|
|
|
+ gen = allpathes(self._reader, tuple_pathes, self._days, self._spec)
|
|
|
|
|
|
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)])
|
|
|
+ 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(300) / 300
|
|
|
- for _chname,_data in gen:
|
|
|
+ window = np.ones(10) / 10
|
|
|
+ for _chname, _card_type, _spec, _data in gen:
|
|
|
succ, count, y = calc_chratios(_data, pos_map, self._start_time - day_stamp, self._end_time - day_stamp)
|
|
|
- # y = np.convolve(y, window, 'same')
|
|
|
- ax.plot(x, y, ls='-', label=self._label(chname=_chname,succ=succ,count=count))
|
|
|
+ print(_chname)
|
|
|
+ y = np.convolve(y, window, 'same')
|
|
|
+ ax.plot(x, y, ls='-', label=self._label(chname=_chname, succ=succ, count=count, card_type=_card_type, spec=_spec))
|
|
|
|
|
|
ticks = [d - self._start_time for d in range(self._start_time, self._end_time + 1, self._interval)]
|
|
|
- xlables = [time.strftime('%d-%H:%M', time.localtime(d + self._start_time)) for d in ticks]
|
|
|
+ xlables = [time.strftime('%d-%H:%M:%S', time.localtime(d + self._start_time)) for d in ticks]
|
|
|
|
|
|
return fig_flush(ax, fig, ticks, xlables)
|
|
|
|
|
|
- def _label(self, chname, succ, count, card_type=None,spec=None):
|
|
|
+ def _label(self, chname, succ, count, card_type=None, spec=None):
|
|
|
_card_type = None
|
|
|
if card_type == 1:
|
|
|
_card_type = 'SY'
|
|
@@ -108,7 +140,3 @@ class ChannelPainter(object):
|
|
|
lable += f":{ratio}%={succ}/{count}"
|
|
|
|
|
|
return lable
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|