stanley-king vor 2 Jahren
Ursprung
Commit
1818af2de6

+ 19 - 8
plot/plot_control.py

@@ -20,16 +20,11 @@ logging.basicConfig(filename='/var/www/html/data/log/flask.log',
 logger = logging.getLogger('plot')
 logger = logging.getLogger('plot')
 
 
 def parse_parmeter():
 def parse_parmeter():
-    cur_time = int(time.time())
-
-    start_time = request.args.get('start_time')
-    start_time = cur_time - 7200 if start_time is None else int(start_time.strip())
-
     end_time = request.args.get('end_time')
     end_time = request.args.get('end_time')
-    end_time = cur_time if end_time is None else int(end_time.strip())
+    end_time = None if end_time is None else int(end_time.strip())
 
 
-    stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
-    logger.debug("start_time=%s end_time=%s",stime(start_time) ,stime(end_time))
+    start_time = request.args.get('start_time')
+    start_time = None if start_time is None else int(start_time.strip())
 
 
     card_types = request.args.get('card_types')
     card_types = request.args.get('card_types')
     card_types = filter_cardtype(card_types)
     card_types = filter_cardtype(card_types)
@@ -83,6 +78,22 @@ def mch_ratio():
     except Exception as ex:
     except Exception as ex:
         return onError(ex)
         return onError(ex)
 
 
+@app.route('/plot/mch_order_send')
+def mch_order_send():
+    try:
+        logger.debug('start mch_order_send')
+        start_time, end_time, card_types, spec, filter_wave = parse_parmeter()
+        mchids = request.args.get('mchids')
+        mchids = filter_mchids(mchids)
+
+        painter = MerchantPainter(start_time=start_time, end_time=end_time, mchids=mchids, card_types=card_types, spec=spec, filter_wave=filter_wave)
+        buf = painter.paint_refilling()
+        data = base64.b64encode(buf.getbuffer()).decode("ascii")
+
+        return f"<img src='data:image/png;base64,{data}'/>"
+    except Exception as ex:
+        return onError(ex)
+
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
     debug_mode = True
     debug_mode = True

+ 12 - 2
plot/refill/ChannelPainter.py

@@ -55,8 +55,18 @@ class ChannelPainter(object):
         self._reader = ChannelReader()
         self._reader = ChannelReader()
         _start_time, _end_time, self._chnames, self._card_types, self._spec, self._filter_wave = start_time, end_time, chnames, card_types, spec, filter_wave
         _start_time, _end_time, self._chnames, self._card_types, self._spec, self._filter_wave = start_time, end_time, chnames, card_types, spec, filter_wave
 
 
-        start_time = self._reader.near_stamp(_start_time,True)
-        end_time = self._reader.near_stamp(_end_time,False)
+        if _end_time is None:
+            _end_time = int(time.time())
+        end_time = self._reader.near_stamp(_end_time, False)
+        if end_time is None:
+            raise Exception('data is empty')
+
+        if _start_time is None or start_time > end_time:
+            _start_time = end_time - 7200
+
+        start_time = self._reader.near_stamp(_start_time, True)
+        if start_time is None:
+            raise Exception('data is empty')
 
 
         stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
         stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
         logger.debug("start_time=%s end_time=%s",stime(start_time) ,stime(end_time))
         logger.debug("start_time=%s end_time=%s",stime(start_time) ,stime(end_time))

+ 2 - 1
plot/refill/DataStream.py

@@ -6,7 +6,8 @@ import h5py
 from enum import IntEnum
 from enum import IntEnum
 import threading
 import threading
 
 
-__all__ = ['DataWriteStream', 'DataReadStream', 'day_stamp', 'EMchPosmap', 'EChPosmap', 'ENetPosmap', 'open_hdf5', 'time_border']
+__all__ = ['DataWriteStream', 'DataReadStream', 'day_stamp', 'EMchPosmap', 'EChPosmap', 'ENetPosmap', 'open_hdf5', 'time_border',
+           'calc_interval']
 
 
 import logging
 import logging
 
 

+ 93 - 11
plot/refill/MerchantPainter.py

@@ -1,15 +1,17 @@
-from .DataStream import EMchPosmap as pos_map, day_stamp, span_days, time_border, calc_interval
+from .DataStream import EMchPosmap as pos_map, span_days, time_border, calc_interval
 from .MerchantReader import MerchantReader
 from .MerchantReader import MerchantReader
 from matplotlib.figure import Figure
 from matplotlib.figure import Figure
 from matplotlib import ticker
 from matplotlib import ticker
 from io import BytesIO
 from io import BytesIO
 import numpy as np
 import numpy as np
-from .algorithm import calc_mchratios
+from .algorithm import calc_mchratios, calc_morder_send
 import time as time
 import time as time
 
 
 import logging
 import logging
+
 logger = logging.getLogger('painter')
 logger = logging.getLogger('painter')
 
 
+
 def allpathes(reader: MerchantReader, tuple_pathes: dict, days: list, spec=None):
 def allpathes(reader: MerchantReader, tuple_pathes: dict, days: list, spec=None):
     count = len(days)
     count = len(days)
     show_detail = True if len(list(tuple_pathes.keys())) == 1 else False
     show_detail = True if len(list(tuple_pathes.keys())) == 1 else False
@@ -54,11 +56,21 @@ class MerchantPainter(object):
         self._reader = MerchantReader()
         self._reader = MerchantReader()
         _start_time, _end_time, self._mchids, self._card_types, self._spec, self._filter_wave = start_time, end_time, mchids, card_types, spec, filter_wave
         _start_time, _end_time, self._mchids, self._card_types, self._spec, self._filter_wave = start_time, end_time, mchids, card_types, spec, filter_wave
 
 
-        start_time = self._reader.near_stamp(_start_time,True)
-        end_time = self._reader.near_stamp(_end_time,False)
+        if _end_time is None:
+            _end_time = int(time.time())
+        end_time = self._reader.near_stamp(_end_time, False)
+        if end_time is None:
+            raise Exception('data is empty')
+
+        if _start_time is None or start_time > end_time:
+            _start_time = end_time - 7200
+
+        start_time = self._reader.near_stamp(_start_time, True)
+        if start_time is None:
+            raise Exception('data is empty')
 
 
         stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
         stime = lambda t: time.strftime('%d-%H:%M:%S', time.localtime(t))
-        logger.debug("start_time=%s end_time=%s",stime(start_time) ,stime(end_time))
+        logger.debug("start_time %d , %s end_time=%s", start_time, stime(start_time), stime(end_time))
 
 
         interval = calc_interval(start_time, end_time)
         interval = calc_interval(start_time, end_time)
         start_time = time_border(interval, start_time, True)
         start_time = time_border(interval, start_time, True)
@@ -77,10 +89,18 @@ class MerchantPainter(object):
             ax.set(xlabel='time', ylabel='ratio')
             ax.set(xlabel='time', ylabel='ratio')
             return ax, fig
             return ax, fig
 
 
-        def flush(ax, fig, ticks, lables):
+        def flush(ax, fig, xticks=None, xlables=None, yticks=None, ylables=None):
             ax.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=4))
             ax.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=4))
-            ax.set_xticks(ticks=ticks)
-            ax.set_xticklabels(lables)
+            if xticks is not None:
+                ax.set_xticks(ticks=xticks)
+            if xlables is not None:
+                ax.set_xticklabels(xlables)
+
+            if yticks is not None:
+                ax.set_yticks(ticks=yticks)
+            if ylables is not None:
+                ax.set_yticklabels(ylables)
+
             fig.autofmt_xdate()
             fig.autofmt_xdate()
             ax.grid()
             ax.grid()
             fig.subplots_adjust(left=0.1, right=0.8, top=0.95, bottom=0.1)
             fig.subplots_adjust(left=0.1, right=0.8, top=0.95, bottom=0.1)
@@ -113,10 +133,10 @@ class MerchantPainter(object):
             y = np.convolve(y, window, 'same') if window is not None else y
             y = np.convolve(y, window, 'same') if window is not None else y
             ax.plot(x, y, ls='-', label=self._label(chname=_mchid, succ=succ, count=count, card_type=_card_type, spec=_spec))
             ax.plot(x, y, ls='-', label=self._label(chname=_mchid, 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:%S', time.localtime(d + self._start_time)) for d in ticks]
+        xticks = [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 xticks]
 
 
-        return fig_flush(ax, fig, ticks, xlables)
+        return fig_flush(ax, fig, xticks=xticks, xlables=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
         _card_type = None
@@ -148,4 +168,66 @@ class MerchantPainter(object):
 
 
         return lable
         return lable
 
 
+    def _fig_bar_funs(self):
+        def create():
+            fig = Figure(figsize=(19, 8))
+            ax = fig.subplots()
+            ax.set_title('success ratio')
+            ax.set(xlabel='time', ylabel='ratio')
+            return ax, fig
+
+        def flush(ax, fig, xticks=None, xlables=None, yticks=None, ylables=None):
+            if xticks is not None:
+                ax.set_xticks(ticks=xticks)
+            if xlables is not None:
+                ax.set_xticklabels(xlables)
+
+            if yticks is not None:
+                ax.set_yticks(ticks=yticks)
+            if ylables is not None:
+                ax.set_yticklabels(ylables)
+
+            ax.grid()
+            fig.autofmt_xdate()
+
+            buf = BytesIO()
+            fig.savefig(buf, format="png")
+            return buf
+
+        return create, flush
+
+    def paint_refilling(self):
+        tuple_pathes = self._reader.many_tuple_path(self._days, self._mchids, self._card_types, self._spec)
+        gen = allpathes(self._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_bar_funs()
+        ax, fig = fig_create()
+
+        lables = list()
+        datas = list()
+        for _mchid, _card_type, _spec, _data in gen:
+            if _mchid == 'all':
+                continue
+
+            lables.append(f"{_mchid}")
+            ret = calc_morder_send(_data, pos_map, self._start_time - day_stamp, self._end_time - day_stamp)
+            datas.append(ret)
+
+        send_count, submit_count, succ_count, fail_count, amounts, lack = zip(*datas)
+        width = 0.20
+        x_asix = np.arange(len(lables))
+
+        rect_send = ax.bar(x_asix - width * 0.5, list(send_count), width, label='send', align='center')
+        rect_submit = ax.bar(x_asix - width * 1.5, list(submit_count), width, label='summit',align='center')
+        rect_succ = ax.bar(x_asix + width * 0.5, list(succ_count), width, label='succ',align='center')
+        rect_fail = ax.bar(x_asix + width * 1.5, list(fail_count), width, label='fail', align='center')
+
+        ax.bar_label(rect_send, padding=3)
+        # ax.bar_label(rect_submit, padding=3)
+        # ax.bar_label(rect_succ, padding=3)
+        # ax.bar_label(rect_fail, padding=3)
 
 
+        return fig_flush(ax, fig, xticks=x_asix, xlables=lables)

+ 15 - 1
plot/refill/algorithm.py

@@ -1,4 +1,5 @@
 
 
+from .DataStream import EMchPosmap
 import numpy as np
 import numpy as np
 
 
 def calc_chratios(data,pos_map,start,end):
 def calc_chratios(data,pos_map,start,end):
@@ -24,4 +25,17 @@ def calc_mchratios(data,pos_map,start,end):
     commit += 0.0000001
     commit += 0.0000001
     y = succ / commit
     y = succ / commit
     y = y.ravel()
     y = y.ravel()
-    return int(all[0, -1]), int(all[0, -1] + all[1, -1]), y
+    return int(all[0, -1]), int(all[0, -1] + all[1, -1]), y
+
+
+def calc_morder_send(data, pos_map: type(EMchPosmap), start: int, end: int):
+    view = data[:, start:end]
+    sums = np.sum(view, axis=1)
+
+    all_return = sums[pos_map.succ_count] + sums[pos_map.fail_count] + 0.0000001
+    ratio = sums[pos_map.succ_count] / all_return
+    send_count = sums[pos_map.submit_count] - sums[pos_map.succ_count] - sums[pos_map.fail_count]
+    send_amounts = sums[pos_map.submit_amounts] - sums[pos_map.succ_mch_amounts] - sums[pos_map.fail_mch_amounts]
+    lack_amounts = send_amounts * ratio
+
+    return send_count, sums[pos_map.submit_count], sums[pos_map.succ_count], sums[pos_map.fail_count], send_amounts, lack_amounts