Parcourir la source

modify: jupyter输出优化

yq il y a 3 mois
Parent
commit
7f4a9de6d9
4 fichiers modifiés avec 32 ajouts et 15 suppressions
  1. 12 2
      commom/utils.py
  2. 2 1
      entitys/data_feaure_entity.py
  3. 6 2
      feature/strategy_iv.py
  4. 12 10
      model/model_lr.py

+ 12 - 2
commom/utils.py

@@ -5,11 +5,13 @@
 @desc:  各种工具类
 """
 
+import base64
 import datetime
 import inspect
 import os
 from json import JSONEncoder
-import base64
+from typing import Union
+
 import dataframe_image as dfi
 import pandas as pd
 import pytz
@@ -57,7 +59,8 @@ def _f_image_to_base64(image_path):
         return img_str.decode("utf-8")
 
 
-def f_display_images_by_side(image_path_list, display, title: str = "", width: int = 500):
+def f_display_images_by_side(image_path_list, display, title: str = "", width: int = 500,
+                             image_path_list2: Union[list, None] = None, title2: str = "", ):
     if isinstance(image_path_list, str):
         image_path_list = [image_path_list]
     html_str = '<div style="display:flex; justify-content:space-around;">'
@@ -66,6 +69,13 @@ def f_display_images_by_side(image_path_list, display, title: str = "", width: i
     for image_path in image_path_list:
         html_str += f'<img src="data:image/png;base64,{_f_image_to_base64(image_path)}" style="width:{width}px;"/>'
     html_str += '</div>'
+    if not (image_path_list2 is None or len(image_path_list2) == 0):
+        html_str += '<div style="display:flex; justify-content:space-around;">'
+        if title2 != "":
+            html_str += '<h3>{}</h3>'.format(title2)
+        for image_path in image_path_list2:
+            html_str += f'<img src="data:image/png;base64,{_f_image_to_base64(image_path)}" style="width:{width}px;"/>'
+        html_str += '</div>'
     display.display(display.HTML(html_str))
 
 

+ 2 - 1
entitys/data_feaure_entity.py

@@ -67,6 +67,7 @@ class DataFeatureEntity():
         odds0 = train_bad_len / train_good_len
         return odds0
 
+
 class DataPreparedEntity():
     """
     训练集测试集特征准备完毕
@@ -98,7 +99,7 @@ class DataSplitEntity():
     初始数据训练集测试集划分
     """
 
-    def __init__(self, train_data: pd.DataFrame, val_data: pd.DataFrame, test_data: pd.DataFrame):
+    def __init__(self, train_data: pd.DataFrame, val_data: pd.DataFrame = None, test_data: pd.DataFrame = None):
         self._train_data = train_data
         self._val_data = val_data
         self._test_data = test_data

+ 6 - 2
feature/strategy_iv.py

@@ -401,11 +401,15 @@ class StrategyIv(FilterStrategyBase):
             display.display(metric_value_dict["变量iv"].table)
             # 打印变量相关性
             f_display_images_by_side(metric_value_dict["变量有效性"].image_path, display, width=800)
+
             # 打印变量趋势
-            f_display_images_by_side(metric_value_dict["变量趋势-训练集"].image_path, display, title="变量趋势训练集")
+            var_trend_train = metric_value_dict["变量趋势-训练集"].image_path
+            var_trend_test = None
             metric_test = metric_value_dict.get("变量趋势-测试集")
             if metric_test is not None:
-                f_display_images_by_side(metric_test.image_path, display, title="变量趋势测试集")
+                var_trend_test = metric_test.image_path
+            f_display_images_by_side(var_trend_train, display, title="变量趋势训练集", image_path_list2=var_trend_test,
+                                     title2="变量趋势测试集")
             # 打印breaks_list
             breaks_list = {}
             for x_column, feature in candidate_dict.items():

+ 12 - 10
model/model_lr.py

@@ -106,12 +106,12 @@ class ModelLr(ModelBase):
             f_df_to_image(test_data_gain, test_data_gain_path)
             metric_value_dict["测试集分数分箱"] = MetricFucEntity(table=test_data_gain, image_path=test_data_gain_path)
 
-        # 模型分psi
-        model_psi = f_calcu_model_psi(train_data_original, test_data_original)
-        model_psi_path = self._train_config.f_get_save_path(f"model_psi.png")
-        f_df_to_image(model_psi, model_psi_path)
-        metric_value_dict["模型稳定性"] = MetricFucEntity(table=model_psi, value=model_psi["psi"].sum().round(4),
-                                                     image_path=model_psi_path)
+            # 模型分psi
+            model_psi = f_calcu_model_psi(train_data_original, test_data_original)
+            model_psi_path = self._train_config.f_get_save_path(f"model_psi.png")
+            f_df_to_image(model_psi, model_psi_path)
+            metric_value_dict["模型稳定性"] = MetricFucEntity(table=model_psi, value=model_psi["psi"].sum().round(4),
+                                                         image_path=model_psi_path)
 
         if jupyter:
             from IPython import display
@@ -119,13 +119,15 @@ class ModelLr(ModelBase):
             display.display(metric_value_dict["模型结果"].table)
             f_display_images_by_side(metric_value_dict["模型结果"].image_path, display)
             # 模型psi
-            display.display(metric_value_dict["模型稳定性"].table)
-            print(f"模型psi: {metric_value_dict['模型稳定性'].value}")
+            if test_data is not None:
+                display.display(metric_value_dict["模型稳定性"].table)
+                print(f"模型psi: {metric_value_dict['模型稳定性'].value}")
             display.display(metric_value_dict["变量系数"].table)
             print("-----训练集-分数分箱-----")
             display.display(metric_value_dict["训练集分数分箱"].table)
-            print("-----测试集-分数分箱-----")
-            display.display(metric_value_dict["测试集分数分箱"].table)
+            if test_data is not None:
+                print("-----测试集-分数分箱-----")
+                display.display(metric_value_dict["测试集分数分箱"].table)
             # 评分卡
             display.display(metric_value_dict["评分卡"].table)