scorecardpipeline.auto_eda 源代码
# -*- coding: utf-8 -*-
"""
@Time : 2023/12/29 11:17
@Author : itlubber
@Site : itlubber.art
"""
import os
import re
import time
import traceback
import pandas as pd
from datetime import datetime, timedelta
import sweetviz as sv
[文档]def auto_eda_sweetviz(all_data, target=None, save="model_report/auto_eda.html", pairwise=True, labels=None, exclude=None, num_features=None, cat_features=None, text_features=None):
"""对数据量和特征个数较少的数据集进行自动 EDA 产出分析报告文档
:param all_data: 需要 EDA 的数据集
:param target: 目标变量,仅支持整数型或布尔型的目标变量
:param labels: 当传入 target 时为需要对比的数据集名称 [true, false],当不传入 target 时为数据集名字
:param save: 报告存储路径,后缀使用 .html
:param pairwise: 是否需要显示特征之间的分布情况
:param exclude: 需要排除的特征名称
:param num_features: 需要强制转为数值型的特征名称
:param cat_features: 需要强制转为类别型的特征名称
:param text_features: 需要强制转为文本的特征名称
"""
# 配置文件初始化
sv.config_parser.read_dict({"Layout": {"show_logo": 0}})
# 设置跳过某些列
feature_config = sv.FeatureConfig(skip=exclude, force_num=num_features, force_cat=cat_features, force_text=text_features)
if save:
if os.path.dirname(save) != "" and not os.path.exists(os.path.dirname(save)):
os.makedirs(os.path.dirname(save), exist_ok=True)
if target is None:
report_all = sv.analyze(
[all_data, labels] if labels else all_data
, pairwise_analysis="on" if pairwise else "off"
, feat_cfg=feature_config
)
report_all.show_html(save, open_browser=False)
else:
# 自动 eda 两个数据集,根据数据集中某个字段区分
report = sv.compare_intra(
all_data
, all_data[target] == 1
, labels if labels else ["坏客户", "好客户"]
, feat_cfg=feature_config
, pairwise_analysis="on"
)
report.show_html(save, open_browser=False)
if __name__ == '__main__':
import numpy as np
from scorecardpipeline import germancredit
# 加载数据集
data = germancredit()
# 设置目标变量名称 & 映射目标变量值域为 {0, 1}
target = "creditability"
data[target] = data[target].map({"good": 0, "bad": 1})
# 随机替换 20% 的数据为 np.nan
for col in data.columns.drop(target):
for i in range(len(data)):
if np.random.rand() > 0.8:
data[col].loc[i] = np.nan
# 自动 eda 并保存文件
auto_eda_sweetviz(data, target=target)