Parcourir la source

add: 表格合并相同列名的列

yq il y a 5 mois
Parent
commit
b7d32d875d
4 fichiers modifiés avec 65 ajouts et 41 suppressions
  1. 2 1
      __init__.py
  2. 5 2
      config/base_config.py
  3. 16 12
      metric_test.py
  4. 42 26
      monitor/report_generate.py

+ 2 - 1
__init__.py

@@ -12,5 +12,6 @@ sys.path.append(dirname(realpath(__file__)))
 from data import DataLoaderMysql
 from entitys import DbConfigEntity
 from monitor import MonitorMetric
+from metrics import MetricBase
 
-__all__ = ['MonitorMetric', 'DataLoaderMysql', 'DbConfigEntity']
+__all__ = ['MonitorMetric', 'DataLoaderMysql', 'DbConfigEntity', 'MetricBase']

+ 5 - 2
config/base_config.py

@@ -8,6 +8,9 @@ import os
 
 
 class BaseConfig:
-    image_path= "./image"
-
+    # 图片缓存位置
+    image_path = "./cache/image"
     os.makedirs(image_path, exist_ok=True)
+
+    # 表格合并相同列名的列
+    merge_table_column = True

+ 16 - 12
metric_test.py

@@ -4,29 +4,33 @@
 @time: 2024/11/1
 @desc: 
 """
-from data import DataLoaderMysql
+import pandas as pd
+
+from data import DataLoaderMysql, DataLoaderBase
 from entitys import DbConfigEntity, MetricFucEntity
-from metrics import MetricBase, f_register_metric_func
+from metrics import MetricBase
 from monitor import MonitorMetric
 
 
 class A(MetricBase):
 
+    def __init__(self, file_path: str, sheet_name: str = 0, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self._file_path = file_path
+        self._sheet_name = sheet_name
+
+    def _load_data(self, data_loader: DataLoaderBase, *args, **kwargs) -> pd.DataFrame:
+        data = data_loader.get_data(self._file_path, self._sheet_name)
+        return data
+
     def calculate(self, *args, **kwargs) -> MetricFucEntity:
-        return MetricFucEntity(table=None, value='1', image_path='./cache/t1.png')
+        data = self._load_data()
+        return MetricFucEntity(table=data, value='1', image_path='./cache/t1.png')
 
 
 if __name__ == "__main__":
     # f_register_metric_func(A)
-
-    db_config = DbConfigEntity.from_config("./config/mysql_config.json")
-    data_loader = DataLoaderMysql(db_config)
-    # metric_clzz = MetricBySqlGeneral()
-    # metric = metric_clzz.calculate(data_loader, "select * from test.t1")
-    # print(metric.head(5))
-    # monitor_metric_config = MonitorMetricConfigEntity.from_config("./config/model_monitor_config_template.json")
+    data_loader = DataLoaderMysql(DbConfigEntity.from_config("./config/mysql_config.json"))
     monitor_metric = MonitorMetric("./config/model_monitor_config_template.json")
     monitor_metric.calculate_metric(data_loader=data_loader)
     monitor_metric.generate_report()
-    # metric_value_dict = monitor_metric.metric_value_dict
-    # print(metric_value_dict)

+ 42 - 26
monitor/report_generate.py

@@ -14,41 +14,51 @@ from docx.oxml.ns import qn
 from docx.shared import Inches
 
 from commom import GeneralException, f_get_datetime
+from config import BaseConfig
 from entitys import MetricFucEntity
 from enums import ResultCodesEnum, PlaceholderPrefixEnum
 
 
 class Report():
 
-    # 设置 table 的边框,用法与 cell 类似
     @staticmethod
-    def _set_table_boarder(table, **kwargs):
-        """
-        Set table`s border
-        Usage:
-        set_table_border(
-            cell,
-            top={"sz": 12, "val": "single", "color": "#FF0000"},
-            bottom={"sz": 12, "color": "#00FF00", "val": "single"},
-            left={"sz": 24, "val": "dashed"},
-            right={"sz": 12, "val": "dashed"},
-        )
-        """
-        borders = OxmlElement('w:tblBorders')
-        for tag in ('bottom', 'top', 'left', 'right', 'insideV', 'insideH'):
-            edge_data = kwargs.get(tag)
-            if edge_data:
-                any_border = OxmlElement(f'w:{tag}')
-                for key in ["sz", "val", "color", "space", "shadow"]:
-                    if key in edge_data:
-                        any_border.set(qn(f'w:{key}'), str(edge_data[key]))
-                borders.append(any_border)
-                table._tbl.tblPr.append(borders)
-
-    # 将table 的所有单元格四个边设置为 0.5 镑, 黑色, 实线
+    def _merge_cell_column(pre_cell, curr_cell):
+        if curr_cell.text == pre_cell.text:
+            column_name = curr_cell.text
+            pre_cell.merge(curr_cell)
+            pre_cell.text = column_name
+            for run in pre_cell.paragraphs[0].runs:
+                run.bold = True
+            pre_cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
+
     @staticmethod
     def _set_table_singleBoard(table):
-        return Report._set_table_boarder(
+        # 将table 的所有单元格四个边设置为 0.5 镑, 黑色, 实线
+
+        def _set_table_boarder(table, **kwargs):
+            """
+            Set table`s border
+            Usage:
+            set_table_border(
+                cell,
+                top={"sz": 12, "val": "single", "color": "#FF0000"},
+                bottom={"sz": 12, "color": "#00FF00", "val": "single"},
+                left={"sz": 24, "val": "dashed"},
+                right={"sz": 12, "val": "dashed"},
+            )
+            """
+            borders = OxmlElement('w:tblBorders')
+            for tag in ('bottom', 'top', 'left', 'right', 'insideV', 'insideH'):
+                edge_data = kwargs.get(tag)
+                if edge_data:
+                    any_border = OxmlElement(f'w:{tag}')
+                    for key in ["sz", "val", "color", "space", "shadow"]:
+                        if key in edge_data:
+                            any_border.set(qn(f'w:{key}'), str(edge_data[key]))
+                    borders.append(any_border)
+                    table._tbl.tblPr.append(borders)
+
+        return _set_table_boarder(
             table,
             top={"sz": 4, "val": "single", "color": "#000000"},
             bottom={"sz": 4, "val": "single", "color": "#000000"},
@@ -98,11 +108,17 @@ class Report():
                 paragraph._element.addnext(table._element)
                 # 列名
                 for column_idx, column_name in enumerate(metric_table.columns):
+                    if column_name == "c3":
+                        column_name = "c2"
                     cell = table.cell(0, column_idx)
                     cell.text = str(column_name)
                     for run in cell.paragraphs[0].runs:
                         run.bold = True
                     cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
+                    # 合并相同的列名
+                    if column_idx != 0 and BaseConfig.merge_table_column:
+                        pre_cell = table.cell(0, column_idx - 1)
+                        Report._merge_cell_column(pre_cell, cell)
                 # 值
                 for row_idx, row in metric_table.iterrows():
                     for column_idx, value in enumerate(row):