stanley-king 4 年之前
父節點
當前提交
38edcd9f3a
共有 3 個文件被更改,包括 109 次插入49 次删除
  1. 56 23
      plot/DataCenter.py
  2. 46 5
      plot/app.py
  3. 7 21
      plot/thdf5.py

+ 56 - 23
plot/DataCenter.py

@@ -98,7 +98,7 @@ class DataCenter(object):
         today = stamp - diff.total_seconds()
         return int(today)
 
-    def days(self, root):
+    def _days(self, root):
         result = []
         try:
             for name, sub in root.items():
@@ -109,6 +109,17 @@ class DataCenter(object):
         finally:
             return result
 
+    def days(self):
+        try:
+            hfive = h5py.File(self._file_name, 'r')
+            root = hfive.require_group('/')
+            days = self._days(root)
+            hfive.close()
+            return days
+        except Exception as ex:
+            print(ex)
+            return []
+
     def dir(self, group):
         result = []
         for name, sub in group.items():
@@ -118,19 +129,29 @@ class DataCenter(object):
                 result.append(sub.name)
         return result
 
-    def draw_plot(self, start_time, interval=None, **kwargs):
+
+
+    def draw_plot(self, start_time, interval=300, **kwargs):
         hfive = h5py.File(self._file_name, 'r')
         try:
-            paths = self.datasets(hfive, start_time, **kwargs)
+            filer_text, paths = self.datasets(hfive, start_time, **kwargs)
+
+            fig = Figure(figsize=(16, 9))
+            ax = fig.subplots()
 
             predata = np.zeros((5, 86400))
-            for data in self.read_data(hfive, paths):
+            x = np.arange(0, 86400, interval)
+            for path, data in self.read_data(hfive, paths):
+                data = np.array(data)
                 predata = predata + data
+                self._draw_plot(ax,x, data, interval,path)
                 print(type(data))
 
-            internal = 3600
-            x = np.arange(0, 86400, internal)
-            return self._draw_plot(x, predata, internal)
+            self._draw_plot(ax,x, predata, interval,filer_text)
+            ax.legend()
+            buf = BytesIO()
+            fig.savefig(buf, format="png")
+            return buf
         except Exception as ex:
             print(ex)
         finally:
@@ -138,13 +159,13 @@ class DataCenter(object):
 
     def read_data(self, hfive, paths):
         for path in paths:
-            yield hfive[path]
+            yield path, hfive[path]
 
     def datasets(self, hfive, start_time, **kwargs):
         day_stamp = self.day_stamp(start_time)
         sday = f'{day_stamp}'
         root = hfive.require_group('/')
-        days = self.days(root)
+        days = self._days(root)
         if sday not in days:
             return False
 
@@ -166,7 +187,17 @@ class DataCenter(object):
         return self._filter(dsets, chname=chname, quality=quality, card_type=card_type, amount=amount)
 
     def _filter(self, dsets, chname=None, quality=None, card_type=None, amount=None):
-        result = []
+        filer_text = ''
+        if chname is not None:
+            filer_text = chname
+        if quality is not None:
+            filer_text = filer_text + f"-qua:{quality}"
+        if card_type is not None:
+            filer_text = filer_text + f"-type:{card_type}"
+        if amount is not None:
+            filer_text = filer_text + f"-amount:{amount}"
+
+        paths = []
         for text in dsets:
             items = re.split(r'/', text)
             if len(items) != 6:
@@ -180,30 +211,32 @@ class DataCenter(object):
                 continue
             if (amount is not None) and (_amount != amount):
                 continue
-            result.append(text)
-
-        return result
+            paths.append(text)
 
-    def _draw_plot(self, x, data, internal=300):
-        fig = Figure()
-        ax = fig.subplots()
+        return filer_text, paths
 
+    def _draw_plot(self,ax, x, data, internal=300,path=''):
         # 'commit-succ': 0, 'commit-fail': 1, 'notify-succ': 2, 'notify-fail': 3, 'user_succ': 4
-        all = data[2] + data[3]
-        all = all.reshape((internal, -1))
-        all = np.sum(all, axis=0)
+
 
         ySucc = data[2]
         ySucc = ySucc.reshape((internal, -1))
         ySucc = np.sum(ySucc, axis=0)
 
+        pos = np.where(ySucc >= 1)
+        # ySucc = ySucc[pos]
+
+        all = data[2] + data[3]
+        all = all.reshape((internal, -1))
+        all = np.sum(all, axis=0)
+        # all = all[pos]
+
         ySucc = ySucc / (all + 0.00001)
+        # x = x[pos]
+        ax.plot(x, ySucc,label=path)
+        # ax.scatter(x, ySucc)
 
-        ax.plot(x, ySucc)
 
-        buf = BytesIO()
-        fig.savefig(buf, format="png")
-        return buf
 
 
 dataCenter = DataCenter(debug=False)

+ 46 - 5
plot/app.py

@@ -2,26 +2,67 @@ import os
 from gevent import monkey
 from gevent.pywsgi import WSGIServer
 from flask import Flask
-
 import base64
 from io import BytesIO
 from matplotlib.figure import Figure
-import logging
+import json
 from DataCenter import dataCenter
+# from plog import initLog
+from flask import request, jsonify
+import logging
+import time
 
 app = Flask(__name__)
+app.debug = True
 
 
 @app.route('/plot/index')
 def index():
-    buf = dataCenter.draw_plot(1618502478,chname='lingzh')
+    time_stamp = request.args.get('time_stamp')
+    interval = request.args.get('interval')
+    chname = request.args.get('chname')
+    quality = request.args.get('quality')
+    card_type = request.args.get('card_type')
+    amount = request.args.get('amount')
+
+    if time_stamp is None:
+        time_stamp = time.time()
+    else:
+        time_stamp = int(time_stamp)
+
+    if interval is None:
+        interval = 300
+    else:
+        interval = int(interval)
+
+    if quality is not None:
+        quality = int(quality)
+    if card_type is not None:
+        card_type = int(card_type)
+    if amount is not None:
+        amount = int(amount)
+
+    app.logger.info('time_stamp=', time_stamp, 'interval=', interval, 'chname=', chname,
+                     'quality=', quality, 'card_type=', card_type, 'amount=', amount)
+
+    buf = dataCenter.draw_plot(time_stamp, interval=interval,chname=chname,quality=quality,card_type=card_type,amount=amount)
     data = base64.b64encode(buf.getbuffer()).decode("ascii")
     return f"<img src='data:image/png;base64,{data}'/>"
 
 
+@app.route('/plot/days')
+def days():
+    datas = dataCenter.days()
+    return jsonify(datas)
+
+
 if __name__ == "__main__":
-    # logger = initLog()
-    # logger.info('start')
+    handler = logging.FileHandler(filename='/var/www/html/data/log/plot.log')
+    handler.setLevel(logging.DEBUG)
+    logging_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s',
+                                       datefmt='%Y-%m-%d %H:%M:%S')
+    handler.setFormatter(logging_format)
+    app.logger.addHandler(handler)
 
     monkey.patch_all()
     http_server = WSGIServer(('0.0.0.0', 5000), app)

+ 7 - 21
plot/thdf5.py

@@ -12,6 +12,8 @@ from matplotlib.figure import Figure
 from PIL import Image
 from io import BytesIO
 from PIL import Image
+import json
+
 
 class DataTest(unittest.TestCase):
     def test_parase(self):
@@ -52,29 +54,13 @@ class DataTest(unittest.TestCase):
         y = stamp - today
         pass
 
-    def days(self, root):
-        result = []
-        try:
-            for name, sub in root.items():
-                if isinstance(sub, h5py.Group):
-                    result.append(name)
-        except Exception as ex:
-            print(ex)
-        finally:
-            return result
-
-    def test_h5pyw(self):
-        try:
-            file_name = '/var/www/html/data/stdata/data.hdf5'
-            f = h5py.File(file_name, 'a')
-            days = self.days(f)
-            f.close()
-        except Exception as ex:
-            print(ex)
-        pass
+    def test_days(self):
+        days = dataCenter.days()
+        result = json.dumps(days)
+        print(days)
 
     def test_data(self):
-        buf = dataCenter.draw_plot(1618502478,chname='lingzh')
+        buf = dataCenter.draw_plot(1618502478, chname='lingzh')
         img = Image.open(buf)
         img.show()