From 7ccde55b83f5fca18ce7229a8c9745769c0c56c5 Mon Sep 17 00:00:00 2001 From: itlubber <1830611168@qq.com> Date: Fri, 10 May 2024 16:37:22 +0800 Subject: [PATCH] fix DecisionTreeRuleExtractor methods --- ...\347\225\245\346\214\226\346\216\230.xlsx" | Bin 118229 -> 162476 bytes examples/rule_test.py | 1805 +++++++++++++++++ requirements.txt | 5 +- scorecardpipeline/feature_engineering.py | 94 + scorecardpipeline/feature_selection.py | 9 + scorecardpipeline/rule_extraction.py | 98 +- scorecardpipeline/scorecard.py | 3 - scorecardpipeline/template.xlsx | Bin 8418 -> 8433 bytes 8 files changed, 1949 insertions(+), 65 deletions(-) create mode 100644 examples/rule_test.py create mode 100644 scorecardpipeline/feature_engineering.py create mode 100644 scorecardpipeline/feature_selection.py diff --git "a/examples/model_report/\345\206\263\347\255\226\346\240\221\347\273\204\345\220\210\347\255\226\347\225\245\346\214\226\346\216\230.xlsx" "b/examples/model_report/\345\206\263\347\255\226\346\240\221\347\273\204\345\220\210\347\255\226\347\225\245\346\214\226\346\216\230.xlsx" index 0b51582dfc625b161e91bc56bc3c25ceba3dc038..51f2a642ecf1d15c276aecf50f5872e637b8b1d7 100644 GIT binary patch delta 160383 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 z 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

NH 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/gJm<~@ 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 delta 115811 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 u%%F_$ufLgIUyi)HR9(iUWRNm9r?rL# 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 Gf&M?V=y(+X diff --git a/examples/rule_test.py b/examples/rule_test.py new file mode 100644 index 0000000..6a0ef54 --- /dev/null +++ b/examples/rule_test.py @@ -0,0 +1,1805 @@ +# -*- coding: utf-8 -*- +""" +@Time : 2024/4/18 10:15 +@Author : itlubber +@Site : itlubber.art +""" +import copy +import datetime +import numpy as np +import pandas as pd + +min_num = 40 +hit_num = 30 +sub_div_bin = 0.1 +sample_type_target = {'Total': ['fpd_30_act', 'mob3_dpd_30_act']} +target_ripe = {'fpd_30_act': ['agr_fpd_30'], 'mob3_dpd_30_act': ['agr_mob3_dpd_30']} +target_del_col = {'fpd_30_act': ['agr_fpd_30', 'agr_mob3_dpd_30', 'mob3_dpd_30_act'], 'mob3_dpd_30_act': ['agr_mob3_dpd_30', 'agr_fpd_30', 'fpd_30_act']} +target_min_rate = {'fpd_30_act': [0.015], 'mob3_dpd_30_act': [0.02]} +sample_type_lift = {'Total': {'fpd_30_act': 1.8, 'mob3_dpd_30_act': 3}} + + +def cv(x): + """计算一组数的离散系数""" + m = np.mean(x) + if m == 0: + return None + else: + return np.std(x) / np.mean(x) + + +def cv_type(x): + """基于离散系数判断数据稳定性""" + if x < 0.15: + return '非常稳定' + elif x < 0.4: + return '相对稳定' + elif x < 0.75: + return '不稳定' + else: + return '极不稳定' + + +def get_trend(data, method=np.mean, key='', flag=['高', '低']): + """判断数据的趋势 + + :param data: 需要判断的数据,list类型或者dataframe类型 + :param flag: ['高','低'] 或者 ['快','慢'] + :param method: 次数对应求和,速度对应平均 + :param key:默认为None,如果传入数据为dataframe,则需要指定key,但是必须从小到大排好顺序 + + :return: 不同趋势 + """ + if len(data) == 0: return '无数据' + + if isinstance(data, pd.DataFrame): + if key != None: + data = list(data[data[key].notnull()][key]) + else: + raise '没有指定需要判断趋势的列名' + + if len(data) == 0: + return '无数据' + elif len(data) == 1: + return '无趋势' + elif len(data) > 4: + n1 = len(data) // 4 + n2 = len(data) % 4 + k1 = n1 + k2 = 2 * n1 + (1 if n2 >= 3 else 0) + k3 = k2 + n1 + (1 if n2 >= 2 else 0) + x = [method(data[0:k1]), method(data[k1:k2]), method(data[k2:k3]), method(data[k3:])] + else: + x = data + + cmax = max(x) + cmin = min(x) + cv = np.std(x) / np.mean(x) if np.mean(x) != 0 else 0 + + if cv < 0.15: + return '平稳' + elif len(x) == 2: + if cmax == x[0]: + return '%s > %s' % (flag[0], flag[1]) + else: + return '%s > %s' % (flag[1], flag[0]) + elif len(x) == 3: + if cmax == x[1]: + return '%s > %s > %s' % (flag[1], flag[0], flag[1]) + elif cmin == x[1]: + return '%s > %s > %s' % (flag[0], flag[1], flag[0]) + elif cmax == x[0] and cmin == x[2]: + return '%s > %s' % (flag[0], flag[1]) + else: + return '%s > %s' % (flag[1], flag[0]) + else: + if cmax == x[1] or cmax == x[2]: + return '%s > %s > %s' % (flag[1], flag[0], flag[1]) + elif cmin == x[1] or cmin == x[2]: + return '%s > %s > %s' % (flag[0], flag[1], flag[0]) + elif cmax == x[0] and cmin == x[3]: + return '%s > %s' % (flag[0], flag[1]) + else: + return '%s > %s' % (flag[1], flag[0]) + + +def calculate_var_lift(data, data_sub, hit_flag, target, cut_point, direction): + """计算lift + + data: 全量样本 + data_sub: 满足条件的样本 + hit_flag: 触碰标签 + target: string 需要计算lift的列名 + """ + if '>' in direction: + data_hit = data_sub[data_sub[hit_flag] > cut_point] if len(data_sub) > 0 else data_sub + bad = len(data_hit[data_hit[target] == 1]) if len(data_hit) > 0 else np.nan + hit_bad_rate = bad / len(data_hit) if len(data_hit) > 0 else np.nan + else: + data_hit = data_sub[data_sub[hit_flag] <= cut_point] if len(data_sub) > 0 else data_sub + bad = len(data_hit[data_hit[target] == 1]) if len(data_hit) > 0 else np.nan + hit_bad_rate = bad / len(data_hit) if len(data_hit) > 0 else np.nan + bad = len(data[data[target] == 1]) + allhit_bad_rate = bad / len(data) if len(data) > 0 else np.nan + return hit_bad_rate / allhit_bad_rate if allhit_bad_rate > 0 else np.nan + + +def calculate_var_odds(data, data_sub, hit_flag, target, cut_point, direction): + """计算odds ratio + + data: DataFrame 成熟的样本子集的补集(未触碰所有样本) + data_sub : 成熟的样本子集(如某个省份的数据集) + hit_flag: 触碰标签 + target: string 需要计算odds ratio的列名 + """ + if '>' in direction: + data_hit = data_sub[data_sub[hit_flag] > cut_point] if len(data_sub) > 0 else data_sub + bad = len(data_hit[data_hit[target] == 1]) if len(data_hit) > 0 else np.nan + good = len(data_hit[data_hit[target] != 1]) if len(data_hit) > 0 else np.nan + hit_bad_good_rate = bad / good if good > 0 else np.nan + # data_nohit = data[data[hit_flag] <= cut_point] + bad_nohit = len(data[data[target] == 1]) + good_nohit = len(data[data[target] != 1]) + nohit_bad_good_rate = bad_nohit / good_nohit if good_nohit > 0 else np.nan + else: + data_hit = data_sub[data_sub[hit_flag] <= cut_point] if len(data_sub) > 0 else data_sub + bad = len(data_hit[data_hit[target] == 1]) if len(data_hit) > 0 else np.nan + good = len(data_hit[data_hit[target] != 1]) if len(data_hit) > 0 else np.nan + hit_bad_good_rate = bad / good if good > 0 else np.nan + # data_nohit = data[data[hit_flag] > cut_point] + bad_nohit = len(data[data[target] == 1]) + good_nohit = len(data[data[target] != 1]) + nohit_bad_good_rate = bad_nohit / good_nohit if good_nohit > 0 else np.nan + return hit_bad_good_rate / nohit_bad_good_rate if nohit_bad_good_rate > 0 else np.nan + + +# 1.7按月对规则进行泛化,分析规则触碰情况和风险表现情况 +def get_month_odds(data, rule_name, rule_type, cut_point, target, rule_limit, rule_all, use_credit_flag, circle_mth, mth, direction, var): + """ + :param data: 数据框 + :param rule_name: 规则名 + :param rule_type: 规则类型 + :param cut_point: 切点,cut-off + :param target: 目标字段 + :param rule_limit: 泛化样本类型 + :param rule_all: 线上已有规则触碰情况对应的字段列名 + :param use_credit_flag: 是否用信列 + :param circle_mth: 申请月对应的列 + :param mth: 要泛化的具体月 + :param direction: 变量取值方向 + :param var: 泛化变量名 + :return: 按月泛化分析结果 + """ + data = copy.deepcopy(data) + data = data[data[circle_mth] == mth] + dic = {} + dic['报告日期'] = datetime.datetime.now().strftime('%Y-%m-%d') + if rule_limit == 'Total': + len_prod = len(data['product_name'].unique()) + if len_prod >= 3: + dic['产品名称'] = str(data['product_name'].values[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data['product_name'].unique()[0]) + '&' + str(data['product_name'].unique()[1]) + else: + dic['产品名称'] = str(data['product_name'].unique()[0]) + elif rule_limit == '其他': + data_prod = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])]['product_name'].unique() + len_prod = len(data_prod) + if len_prod >= 3: + dic['产品名称'] = str(data_prod[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data_prod[0]) + '&' + str(data_prod[1]) + else: + dic['产品名称'] = str(data_prod[0]) + elif rule_limit == sample_type_col[rule_limit][1][0]: + data_prod = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])]['product_name'].unique() + len_prod = len(data_prod) + if len_prod >= 3: + dic['产品名称'] = str(data_prod[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data_prod[0]) + '&' + str(data_prod[1]) + else: + dic['产品名称'] = str(data_prod[0]) + dic['样本类型'] = rule_limit + dic['风险类型'] = '短期风险' if target == 'fpd_30_act' else '中长期风险' + dic['目标字段'] = target + dic['规则名称'] = rule_name + dic['规则类型'] = rule_type + dic['申请月'] = mth + dic['申请量'] = len(data) + dic['通过量'] = len(data[data[rule_all] == 0]) + dic['通过率'] = dic['通过量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['用信量'] = len(data[data[use_credit_flag] == 1]) + dic['用信率'] = dic['用信量'] / dic['通过量'] if dic['通过量'] > 0 else None + dic['置前触碰量'] = len(data[data[rule_all] == 1]) + ## 统计逾期成熟样本量 + tmp15 = data[data['agr_fpd_15'] == 1] + tmp = data[data[target_ripe[target][0]] == 1] + if '>' in direction: + if rule_limit == 'Total': + dic['策略触碰量'] = len(data[data[var] > cut_point]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point)]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point)]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | (data[var] > cut_point)]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['整体成熟量'] = len(tmp) + dic['额外触碰成熟量'] = len(tmp[(tmp[rule_all] == 0) & (tmp[var] > cut_point)]) # len(tmp[tmp[var] > cut_point]) + dic['整体成熟坏样本量'] = len(tmp[tmp[target] == 1]) + dic['额外触碰成熟坏样本量'] = len(tmp[(tmp[rule_all] == 0) & (tmp[target] == 1) & (tmp[var] > cut_point)]) + dic['fpd15整体成熟量'] = len(tmp15) + dic['fpd15额外触碰成熟量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] > cut_point)]) + dic['fpd15整体成熟坏样本量'] = len(tmp15[tmp15['fpd_15_act'] == 1]) + dic['fpd15额外触碰成熟坏样本量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] > cut_point) & (tmp15['fpd_15_act'] == 1)]) + dic['整体逾期率'] = len(tmp[tmp[target] == 1]) / dic['整体成熟量'] if dic['整体成熟量'] > 0 else None + dic['额外触碰逾期率'] = dic['额外触碰成熟坏样本量'] / dic['额外触碰成熟量'] if dic['额外触碰成熟量'] > 0 else None + dic['置后触碰整体逾期率'] = (dic['整体成熟坏样本量'] - dic['额外触碰成熟坏样本量']) / (dic['整体成熟量'] - dic['额外触碰成熟量']) if (dic['整体成熟量'] - dic['额外触碰成熟量']) > 0 else None + dic['逾期率下降值'] = dic['整体逾期率'] - dic['置后触碰整体逾期率'] if dic['置后触碰整体逾期率'] != None else None + dic['逾期率下降幅度'] = (dic['整体逾期率'] - dic['置后触碰整体逾期率']) / dic['整体逾期率'] if (dic['整体逾期率'] != None and dic['置后触碰整体逾期率'] != None and + dic['整体逾期率'] != 0) else None + tmp_sub = tmp + tmp_nohit = tmp[(tmp[var] <= cut_point)] + tmp_sub15 = tmp15 + tmp_nohit15 = tmp15[tmp15[var] <= cut_point] + dic['额外触碰Odds'] = calculate_var_odds(data=tmp_nohit, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰Lift'] = calculate_var_lift(data=tmp, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Odds'] = calculate_var_odds(data=tmp_nohit15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Lift'] = calculate_var_lift(data=tmp15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == '其他': + dic['策略触碰量'] = len(data[(data[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['整体成熟量'] = len(tmp) + dic['额外触碰成熟量'] = len(tmp[(tmp[rule_all] == 0) & (tmp[var] > cut_point) & (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['整体成熟坏样本量'] = len(tmp[(tmp[target] == 1)]) + dic['额外触碰成熟坏样本量'] = len(tmp[(tmp[rule_all] == 0) & (tmp[target] == 1) & (tmp[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['fpd15整体成熟量'] = len(tmp15) + dic['fpd15额外触碰成熟量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] > cut_point) & (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['fpd15整体成熟坏样本量'] = len(tmp15[tmp15['fpd_15_act'] == 1]) + dic['fpd15额外触碰成熟坏样本量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] > cut_point) & + (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])) & (tmp15['fpd_15_act'] == 1)]) + dic['整体逾期率'] = len(tmp[tmp[target] == 1]) / dic['整体成熟量'] if dic['整体成熟量'] > 0 else None + dic['额外触碰逾期率'] = dic['额外触碰成熟坏样本量'] / dic['额外触碰成熟量'] if dic['额外触碰成熟量'] > 0 else None + dic['置后触碰整体逾期率'] = (dic['整体成熟坏样本量'] - dic['额外触碰成熟坏样本量']) / (dic['整体成熟量'] - dic['额外触碰成熟量']) if (dic['整体成熟量'] - dic['额外触碰成熟量']) > 0 else None + dic['逾期率下降值'] = dic['整体逾期率'] - dic['置后触碰整体逾期率'] if dic['置后触碰整体逾期率'] != None else None + dic['逾期率下降幅度'] = (dic['整体逾期率'] - dic['置后触碰整体逾期率']) / dic['整体逾期率'] if (dic['整体逾期率'] != None and dic['置后触碰整体逾期率'] != None and + dic['整体逾期率'] != 0) else None + tmp_sub = tmp[tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])] + tmp_nohit = tmp[(((tmp[var] <= cut_point) & (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))) | + (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))] + tmp_sub15 = tmp15[tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])] + tmp_nohit15 = tmp15[(((tmp15[var] <= cut_point) & (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))) | + (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))] + dic['额外触碰Odds'] = calculate_var_odds(data=tmp_nohit, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰Lift'] = calculate_var_lift(data=tmp, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Odds'] = calculate_var_odds(data=tmp_nohit15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Lift'] = calculate_var_lift(data=tmp15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == sample_type_col[rule_limit][1][0]: + dic['策略触碰量'] = len(data[(data[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['整体成熟量'] = len(tmp) + dic['额外触碰成熟量'] = len(tmp[(tmp[var] > cut_point) & (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['整体成熟坏样本量'] = len(tmp[(tmp[target] == 1)]) + dic['额外触碰成熟坏样本量'] = len(tmp[(tmp[rule_all] == 0) & (tmp[target] == 1) & (tmp[var] > cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['fpd15整体成熟量'] = len(tmp15) + dic['fpd15额外触碰成熟量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] > cut_point) & (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['fpd15整体成熟坏样本量'] = len(tmp15[tmp15['fpd_15_act'] == 1]) + dic['fpd15额外触碰成熟坏样本量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] > cut_point) & + (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])) & (tmp15['fpd_15_act'] == 1)]) + dic['整体逾期率'] = len(tmp[tmp[target] == 1]) / dic['整体成熟量'] if dic['整体成熟量'] > 0 else None + dic['额外触碰逾期率'] = dic['额外触碰成熟坏样本量'] / dic['额外触碰成熟量'] if dic['额外触碰成熟量'] > 0 else None + dic['置后触碰整体逾期率'] = (dic['整体成熟坏样本量'] - dic['额外触碰成熟坏样本量']) / (dic['整体成熟量'] - dic['额外触碰成熟量']) if (dic['整体成熟量'] - dic['额外触碰成熟量']) > 0 else None + dic['逾期率下降值'] = dic['整体逾期率'] - dic['置后触碰整体逾期率'] if dic['置后触碰整体逾期率'] != None else None + dic['逾期率下降幅度'] = (dic['整体逾期率'] - dic['置后触碰整体逾期率']) / dic['整体逾期率'] if (dic['整体逾期率'] != None and dic['置后触碰整体逾期率'] != None and + dic['整体逾期率'] != 0) else None + tmp_sub = tmp[tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])] + tmp_nohit = tmp[(((tmp[var] <= cut_point) & (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))) | (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))] + tmp_sub15 = tmp15[tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])] + tmp_nohit15 = tmp15[(((tmp15[var] <= cut_point) & (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))) | + (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))] + dic['额外触碰Odds'] = calculate_var_odds(data=tmp_nohit, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰Lift'] = calculate_var_lift(data=tmp, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Odds'] = calculate_var_odds(data=tmp_nohit15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Lift'] = calculate_var_lift(data=tmp15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + else: + if rule_limit == 'Total': + dic['策略触碰量'] = len(data[data[var] <= cut_point]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point)]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point)]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | (data[var] <= cut_point)]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['整体成熟量'] = len(tmp) + dic['额外触碰成熟量'] = len(tmp[tmp[var] <= cut_point]) + dic['整体成熟坏样本量'] = len(tmp[tmp[target] == 1]) + dic['额外触碰成熟坏样本量'] = len(tmp[(tmp[rule_all] == 0) & (tmp[target] == 1) & (tmp[var] <= cut_point)]) + dic['fpd15整体成熟量'] = len(tmp15) + dic['fpd15额外触碰成熟量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] <= cut_point)]) + dic['fpd15整体成熟坏样本量'] = len(tmp15[tmp15['fpd_15_act'] == 1]) + dic['fpd15额外触碰成熟坏样本量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] <= cut_point) & (tmp15['fpd_15_act'] == 1)]) + dic['整体逾期率'] = len(tmp[tmp[target] == 1]) / dic['整体成熟量'] if dic['整体成熟量'] > 0 else None + dic['额外触碰逾期率'] = dic['额外触碰成熟坏样本量'] / dic['额外触碰成熟量'] if dic['额外触碰成熟量'] > 0 else None + dic['置后触碰整体逾期率'] = (dic['整体成熟坏样本量'] - dic['额外触碰成熟坏样本量']) / (dic['整体成熟量'] - dic['额外触碰成熟量']) if (dic['整体成熟量'] - dic['额外触碰成熟量']) > 0 else None + dic['逾期率下降值'] = dic['整体逾期率'] - dic['置后触碰整体逾期率'] if dic['置后触碰整体逾期率'] != None else None + dic['逾期率下降幅度'] = (dic['整体逾期率'] - dic['置后触碰整体逾期率']) / dic['整体逾期率'] if (dic['整体逾期率'] != None and dic['置后触碰整体逾期率'] != None and + dic['整体逾期率'] != 0) else None + tmp_sub = tmp + tmp_nohit = tmp[(tmp[var] > cut_point)] + tmp_sub15 = tmp15 + tmp_nohit15 = tmp15[tmp15[var] > cut_point] + dic['额外触碰Odds'] = calculate_var_odds(data=tmp_nohit, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰Lift'] = calculate_var_lift(data=tmp, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Odds'] = calculate_var_odds(data=tmp_nohit15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Lift'] = calculate_var_lift(data=tmp15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == '其他': + dic['策略触碰量'] = len(data[(data[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['整体成熟量'] = len(tmp) + dic['额外触碰成熟量'] = len(tmp[(tmp[var] <= cut_point) & (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['整体成熟坏样本量'] = len(tmp[(tmp[target] == 1)]) + dic['额外触碰成熟坏样本量'] = len(tmp[(tmp[target] == 1) & (tmp[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['fpd15整体成熟量'] = len(tmp15) + dic['fpd15额外触碰成熟量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] <= cut_point) & (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['fpd15整体成熟坏样本量'] = len(tmp15[tmp15['fpd_15_act'] == 1]) + dic['fpd15额外触碰成熟坏样本量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] <= cut_point) & + (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])) & (tmp15['fpd_15_act'] == 1)]) + dic['整体逾期率'] = len(tmp[tmp[target] == 1]) / dic['整体成熟量'] if dic['整体成熟量'] > 0 else None + dic['额外触碰逾期率'] = dic['额外触碰成熟坏样本量'] / dic['额外触碰成熟量'] if dic['额外触碰成熟量'] > 0 else None + dic['置后触碰整体逾期率'] = (dic['整体成熟坏样本量'] - dic['额外触碰成熟坏样本量']) / (dic['整体成熟量'] - dic['额外触碰成熟量']) if (dic['整体成熟量'] - dic['额外触碰成熟量']) > 0 else None + dic['逾期率下降值'] = dic['整体逾期率'] - dic['置后触碰整体逾期率'] if dic['置后触碰整体逾期率'] != None else None + dic['逾期率下降幅度'] = (dic['整体逾期率'] - dic['置后触碰整体逾期率']) / dic['整体逾期率'] if (dic['整体逾期率'] != None and dic['置后触碰整体逾期率'] != None and + dic['整体逾期率'] != 0) else None + tmp_sub = tmp[tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])] + tmp_nohit = tmp[(((tmp[var] > cut_point) & (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))) | + (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))] + tmp_sub15 = tmp15[tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])] + tmp_nohit15 = tmp15[(((tmp15[var] > cut_point) & (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))) | + (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))] + dic['额外触碰Odds'] = calculate_var_odds(data=tmp_nohit, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰Lift'] = calculate_var_lift(data=tmp, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Odds'] = calculate_var_odds(data=tmp_nohit15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Lift'] = calculate_var_lift(data=tmp15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == sample_type_col[rule_limit][1][0]: + dic['策略触碰量'] = len(data[(data[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['整体成熟量'] = len(tmp) + dic['额外触碰成熟量'] = len(tmp[(tmp[var] <= cut_point) & (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['整体成熟坏样本量'] = len(tmp[(tmp[target] == 1)]) + dic['额外触碰成熟坏样本量'] = len(tmp[(tmp[target] == 1) & (tmp[var] <= cut_point) & (data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['fpd15整体成熟量'] = len(tmp15) + dic['fpd15额外触碰成熟量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] <= cut_point) & (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['fpd15整体成熟坏样本量'] = len(tmp15[tmp15['fpd_15_act'] == 1]) + dic['fpd15额外触碰成熟坏样本量'] = len(tmp15[(tmp15[rule_all] == 0) & (tmp15[var] <= cut_point) & + (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])) & (tmp15['fpd_15_act'] == 1)]) + dic['整体逾期率'] = len(tmp[tmp[target] == 1]) / dic['整体成熟量'] if dic['整体成熟量'] > 0 else None + dic['额外触碰逾期率'] = dic['额外触碰成熟坏样本量'] / dic['额外触碰成熟量'] if dic['额外触碰成熟量'] > 0 else None + dic['置后触碰整体逾期率'] = (dic['整体成熟坏样本量'] - dic['额外触碰成熟坏样本量']) / (dic['整体成熟量'] - dic['额外触碰成熟量']) if (dic['整体成熟量'] - dic['额外触碰成熟量']) > 0 else None + dic['逾期率下降值'] = dic['整体逾期率'] - dic['置后触碰整体逾期率'] if dic['置后触碰整体逾期率'] != None else None + dic['逾期率下降幅度'] = (dic['整体逾期率'] - dic['置后触碰整体逾期率']) / dic['整体逾期率'] if (dic['整体逾期率'] != None and dic['置后触碰整体逾期率'] != None and + dic['整体逾期率'] != 0) else None + tmp_sub = tmp[tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])] + tmp_nohit = tmp[(((tmp[var] > cut_point) & (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))) | + (tmp[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))] + tmp_sub15 = tmp15[tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])] + tmp_nohit15 = tmp15[(((tmp15[var] > cut_point) & (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))) | + (tmp15[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))] + dic['额外触碰Odds'] = calculate_var_odds(data=tmp_nohit, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰Lift'] = calculate_var_lift(data=tmp, data_sub=tmp_sub, hit_flag=var, target=target, cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Odds'] = calculate_var_odds(data=tmp_nohit15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + dic['额外触碰fpd15_Lift'] = calculate_var_lift(data=tmp15, data_sub=tmp_sub15, hit_flag=var, target='fpd_15_act', cut_point=cut_point, direction=direction) + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + return df_ls + + +# 1.8按周对规则进行泛化,分析规则触碰情况 +def get_weeks_hit(data, rule_name, rule_type, cut_point, target, rule_limit, rule_all, use_credit_flag, circle_week, week, direction, var): + """ + :param data: 数据框 + :param rule_name: 规则名 + :param rule_type: 规则类型 + :param cut_point: 切点,cut-off + :param target: 目标字段 + :param rule_limit: 泛化样本类型 + :param rule_all: 线上已有规则触碰情况对应的字段列名 + :param use_credit_flag: 是否用信列 + :param circle_week: 申请周对应的列 + :param week: 要泛化的具体周 + :param direction: 变量取值方向 + :param var: 泛化变量名 + :return: 按周泛化分析结果 + """ + data = copy.deepcopy(data) + data = data[data[circle_week] == week] + dic = {} + dic['报告日期'] = datetime.datetime.now().strftime('%Y-%m-%d') + if rule_limit == 'Total': + len_prod = len(data['product_name'].unique()) + if len_prod >= 3: + dic['产品名称'] = str(data['product_name'].values[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data['product_name'].unique()[0]) + '&' + str(data['product_name'].unique()[1]) + else: + dic['产品名称'] = str(data['product_name'].unique()[0]) + elif rule_limit == '其他': + data_prod = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])]['product_name'].unique() + len_prod = len(data_prod) + if len_prod >= 3: + dic['产品名称'] = str(data_prod[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data_prod[0]) + '&' + str(data_prod[1]) + else: + dic['产品名称'] = str(data_prod[0]) + elif rule_limit == sample_type_col[rule_limit][1][0]: + data_prod = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])]['product_name'].unique() + len_prod = len(data_prod) + if len_prod >= 3: + dic['产品名称'] = str(data_prod[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data_prod[0]) + '&' + str(data_prod[1]) + else: + dic['产品名称'] = str(data_prod[0]) + dic['样本类型'] = rule_limit + dic['风险类型'] = '短期风险' if target == 'fpd_30_act' else '中长期风险' + dic['目标字段'] = target + dic['规则名称'] = rule_name; + dic['规则类型'] = rule_type; + dic['申请周'] = week; + dic['申请量'] = len(data); + dic['通过量'] = len(data[data[rule_all] == 0]) + dic['通过率'] = dic['通过量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['用信量'] = len(data[data[use_credit_flag] == 1]) + dic['用信率'] = dic['用信量'] / dic['通过量'] if dic['通过量'] > 0 else None + dic['置前触碰量'] = len(data[data[rule_all] == 1]) + if '>' in direction: + if rule_limit == 'Total': + dic['策略触碰量'] = len(data[data[var] > cut_point]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point)]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point)]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | (data[var] > cut_point)]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == '其他': + dic['策略触碰量'] = len(data[(data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == sample_type_col[rule_limit][1][0]: + dic['策略触碰量'] = len(data[(data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + else: + if rule_limit == 'Total': + dic['策略触碰量'] = len(data[data[var] <= cut_point]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point)]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point)]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | (data[var] <= cut_point)]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == '其他': + dic['策略触碰量'] = len(data[(data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == sample_type_col[rule_limit][1][0]: + dic['策略触碰量'] = len(data[(data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + return df_ls + + +# 1.9按日对规则进行泛化,分析规则触碰情况 +def get_days_hit(data, rule_name, rule_type, cut_point, target, rule_limit, rule_all, use_credit_flag, circle_day, day, direction, var): + """ + :param data: 数据框 + :param rule_name: 规则名 + :param rule_type: 规则类型 + :param cut_point: 切点,cut-off + :param target: 目标字段 + :param rule_limit: 泛化样本类型 + :param rule_all: 线上已有规则触碰情况对应的字段列名 + :param use_credit_flag: 是否用信列 + :param circle_day: 申请日对应的列 + :param day: 要泛化的具体日 + :param direction: 变量取值方向 + :param var: 泛化变量名 + :return: 按日泛化分析结果 + """ + data = copy.deepcopy(data) + data = data[data[circle_day] == day] + dic = {} + dic['报告日期'] = datetime.datetime.now().strftime('%Y-%m-%d') + if rule_limit == 'Total': + len_prod = len(data['product_name'].unique()) + if len_prod >= 3: + dic['产品名称'] = str(data['product_name'].values[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data['product_name'].unique()[0]) + '&' + str(data['product_name'].unique()[1]) + else: + dic['产品名称'] = str(data['product_name'].unique()[0]) + elif rule_limit == '其他': + data_prod = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])]['product_name'].unique() + len_prod = len(data_prod) + if len_prod >= 3: + dic['产品名称'] = str(data_prod[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data_prod[0]) + '&' + str(data_prod[1]) + else: + dic['产品名称'] = str(data_prod[0]) + elif rule_limit == sample_type_col[rule_limit][1][0]: + data_prod = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])]['product_name'].unique() + len_prod = len(data_prod) + if len_prod >= 3: + dic['产品名称'] = str(data_prod[0]) + '等' + str(len_prod) + '个产品' + elif len_prod >= 2: + dic['产品名称'] = str(data_prod[0]) + '&' + str(data_prod[1]) + else: + dic['产品名称'] = str(data_prod[0]) + dic['样本类型'] = rule_limit + dic['风险类型'] = '短期风险' if target == 'fpd_30_act' else '中长期风险' + dic['目标字段'] = target + dic['规则名称'] = rule_name; + dic['规则类型'] = rule_type; + dic['申请日'] = day; + dic['申请量'] = len(data); + dic['通过量'] = len(data[data[rule_all] == 0]) + dic['通过率'] = dic['通过量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['用信量'] = len(data[data[use_credit_flag] == 1]) + dic['用信率'] = dic['用信量'] / dic['通过量'] if dic['通过量'] > 0 else None + dic['置前触碰量'] = len(data[data[rule_all] == 1]) + if '>' in direction: + if rule_limit == 'Total': + dic['策略触碰量'] = len(data[data[var] > cut_point]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point)]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point)]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | (data[var] > cut_point)]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == '其他': + dic['策略触碰量'] = len(data[(data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == sample_type_col[rule_limit][1][0]: + dic['策略触碰量'] = len(data[(data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] > cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + else: + if rule_limit == 'Total': + dic['策略触碰量'] = len(data[data[var] <= cut_point]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point)]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point)]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | (data[var] <= cut_point)]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == '其他': + dic['策略触碰量'] = len(data[(data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + elif rule_limit == sample_type_col[rule_limit][1][0]: + dic['策略触碰量'] = len(data[(data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['重复触碰量'] = len(data[(data[rule_all] == 1) & (data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['额外触碰量'] = len(data[(data[rule_all] == 0) & (data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1]))]) + dic['置后触碰量'] = len(data[(data[rule_all] == 1) | ((data[var] <= cut_point) & ( + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])))]) + dic['置前触碰率'] = dic['置前触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['策略触碰率'] = dic['策略触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰率'] = dic['重复触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['额外触碰率'] = dic['额外触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['置后触碰率'] = dic['置后触碰量'] / dic['申请量'] if dic['申请量'] > 0 else None + dic['重复触碰占策略触碰比例'] = dic['重复触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + dic['额外触碰占策略触碰比例'] = dic['额外触碰量'] / dic['策略触碰量'] if dic['策略触碰量'] > 0 else None + df_ls = pd.DataFrame.from_dict(dic, orient='index').T + return df_ls + + +# 1.10 按月泛化结果汇总 +def get_mths_result(data, rule_name, rule_type, var, cut_point, target, rule_limit, rule_all, use_credit_flag, circle_mth, direction, base_lift, subset_total): + """ + :param data: 数据框 + :param rule_name: 规则名 + :param rule_type: 规则类型 + :param var: 泛化变量名 + :param cut_point: 切点,cut-off + :param target: 目标字段 + :param rule_limit: 泛化样本类型 + :param rule_all: 线上已有规则触碰情况对应的字段列名 + :param use_credit_flag: 是否用信列 + :param circle_mth: 申请月对应的列 + :param direction: 变量取值方向 + :param base_lift: 临界Lift + :param subset_total: 是否获取每个子集作为计算整体 + :return: 所有泛化月泛化结果汇总 + """ + if subset_total: ##获取每个计算整体 + if rule_limit == 'Total': + data = data + elif rule_limit == '其他': + data = data[ + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])] + elif rule_limit == sample_type_col[rule_limit][1][0]: + data = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])] + mths = sorted(set(data[circle_mth])) + df_contra_monthly = get_month_odds(data=data, rule_name=rule_name, rule_type=rule_type, + cut_point=cut_point, target=target, rule_limit=rule_limit, rule_all=rule_all, use_credit_flag=use_credit_flag, direction=direction, + circle_mth=circle_mth, mth=mths[0], var=var) + + for mth in mths[1:]: + df2_contra_monthly = get_month_odds(data=data, rule_name=rule_name, rule_type=rule_type, + cut_point=cut_point, target=target, rule_limit=rule_limit, rule_all=rule_all, use_credit_flag=use_credit_flag, direction=direction, + circle_mth=circle_mth, mth=mth, var=var) + + df_contra_monthly = pd.concat([df_contra_monthly, df2_contra_monthly]) + df_contra_monthly['额外触碰Lift大于目标值的月份占比'] = sum(df_contra_monthly['额外触碰Lift'] > base_lift) / sum( + df_contra_monthly['额外触碰Lift'].notnull()) if sum(df_contra_monthly['额外触碰Lift'].notnull()) > 0 else None + df_contra_monthly['置前触碰率离散度'] = cv_type(cv(df_contra_monthly['置前触碰率']) if df_contra_monthly['置前触碰率'].sum() > 0 else 0) + df_contra_monthly['策略触碰率离散度'] = cv_type(cv(df_contra_monthly['策略触碰率']) if df_contra_monthly['策略触碰率'].sum() > 0 else 0) + df_contra_monthly['重复触碰率离散度'] = cv_type(cv(df_contra_monthly['重复触碰率']) if df_contra_monthly['重复触碰率'].sum() > 0 else 0) + df_contra_monthly['额外触碰率离散度'] = cv_type(cv(df_contra_monthly['额外触碰率']) if df_contra_monthly['额外触碰率'].sum() > 0 else 0) + df_contra_monthly['置后触碰率离散度'] = cv_type(cv(df_contra_monthly['置后触碰率']) if df_contra_monthly['置后触碰率'].sum() > 0 else 0) + try: + df_contra_monthly['评估结论'] = '建议上线' if (df_contra_monthly['额外触碰Lift大于目标值的月份占比'].values[0] >= 0.8) \ + & ((df_contra_monthly['额外触碰率离散度'].values[0] == '非常稳定') | (df_contra_monthly['策略触碰率离散度'].values[0] == '相对稳定')) else '不建议上线' + except: + df_contra_monthly['评估结论'] = '不建议上线' + return df_contra_monthly + + +# 1.11 按周泛化结果汇总 +def get_weeks_result(data, rule_name, rule_type, var, cut_point, target, rule_limit, rule_all, use_credit_flag, circle_week, direction, subset_total): + """ + :param data: 数据框 + :param rule_name: 规则名 + :param rule_type: 规则类型 + :param var: 泛化变量名 + :param cut_point: 切点,cut-off + :param target: 目标字段 + :param rule_limit: 泛化样本类型 + :param rule_all: 线上已有规则触碰情况对应的字段列名 + :param use_credit_flag: 是否用信列 + :param circle_week: 申请周对应的列 + :param direction: 变量取值方向 + :param subset_total: 是否获取每个子集作为计算整体 + :return: 所有泛化周泛化结果汇总 + """ + if subset_total: ##获取每个计算整体 + if rule_limit == 'Total': + data = data + elif rule_limit == '其他': + data = data[ + data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])] + elif rule_limit == sample_type_col[rule_limit][1][0]: + data = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])] + td = datetime.datetime.now().strftime('%Y-%m-%d') + max_week = data[circle_week].max() + if td <= max_week: + weeks = sorted(set(data[circle_week]))[-11:-1] + data = data[data[circle_week].map(lambda x: x in weeks)] + else: + weeks = sorted(set(data[circle_week]))[-10:] + data = data[data[circle_week].map(lambda x: x in weeks)] + df_monthly = get_weeks_hit(data=data, rule_name=rule_name, rule_type=rule_type, cut_point=cut_point, target=target, rule_limit=rule_limit, rule_all=rule_all, + use_credit_flag=use_credit_flag, direction=direction, circle_week=circle_week, week=weeks[0], var=var) + + for week in weeks[1:]: + df2_monthly = get_weeks_hit(data=data, rule_name=rule_name, rule_type=rule_type, cut_point=cut_point, target=target, rule_limit=rule_limit, rule_all=rule_all, + use_credit_flag=use_credit_flag, direction=direction, circle_week=circle_week, week=week, var=var) + + df_monthly = pd.concat([df_monthly, df2_monthly]) + df_monthly['置前触碰率离散度'] = cv_type(cv(df_monthly['置前触碰率']) if df_monthly['置前触碰率'].sum() > 0 else 0) + df_monthly['策略触碰率离散度'] = cv_type(cv(df_monthly['策略触碰率']) if df_monthly['策略触碰率'].sum() > 0 else 0) + df_monthly['重复触碰率离散度'] = cv_type(cv(df_monthly['重复触碰率']) if df_monthly['重复触碰率'].sum() > 0 else 0) + df_monthly['额外触碰率离散度'] = cv_type(cv(df_monthly['额外触碰率']) if df_monthly['额外触碰率'].sum() > 0 else 0) + df_monthly['置后触碰率离散度'] = cv_type(cv(df_monthly['置后触碰率']) if df_monthly['置后触碰率'].sum() > 0 else 0) + return df_monthly + + +# 1.12 按日泛化结果汇总 +def get_days_result(data, rule_name, rule_type, var, cut_point, target, rule_limit, rule_all, use_credit_flag, circle_day, direction, subset_total): + """ + :param data: 数据框 + :param rule_name: 规则名 + :param rule_type: 规则类型 + :param var: 泛化变量名 + :param cut_point: 切点,cut-off + :param target: 目标字段 + :param rule_limit: 泛化样本类型 + :param rule_all: 线上已有规则触碰情况对应的字段列名 + :param use_credit_flag: 是否用信列 + :param circle_day: 申请日对应的列 + :param direction: 变量取值方向 + :param subset_total: 是否获取每个子集作为计算整体 + :return: 所有泛化日泛化结果汇总 + """ + if subset_total: ##获取每个计算整体 + if rule_limit == 'Total': + data = data + elif rule_limit == '其他': + data = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) not in sample_type_col[rule_limit][1])] + elif rule_limit == sample_type_col[rule_limit][1][0]: + data = data[data[sample_type_col[rule_limit][0]].map(lambda x: str(x) in sample_type_col[rule_limit][1])] + days = sorted(set(data[circle_day]))[-10:] + data = data[data[circle_day].map(lambda x: x in days)] + df_monthly = get_days_hit(data=data, rule_name=rule_name, rule_type=rule_type, cut_point=cut_point, target=target, rule_limit=rule_limit, rule_all=rule_all, + use_credit_flag=use_credit_flag, direction=direction, circle_day=circle_day, day=days[0], var=var) + + for day in days[1:]: + df2_monthly = get_days_hit(data=data, rule_name=rule_name, rule_type=rule_type, cut_point=cut_point, target=target, rule_limit=rule_limit, rule_all=rule_all, + use_credit_flag=use_credit_flag, direction=direction, circle_day=circle_day, day=day, var=var) + + df_monthly = pd.concat([df_monthly, df2_monthly]) + df_monthly['置前触碰率离散度'] = cv_type(cv(df_monthly['置前触碰率']) if df_monthly['置前触碰率'].sum() > 0 else 0) + df_monthly['策略触碰率离散度'] = cv_type(cv(df_monthly['策略触碰率']) if df_monthly['策略触碰率'].sum() > 0 else 0) + df_monthly['重复触碰率离散度'] = cv_type(cv(df_monthly['重复触碰率']) if df_monthly['重复触碰率'].sum() > 0 else 0) + df_monthly['额外触碰率离散度'] = cv_type(cv(df_monthly['额外触碰率']) if df_monthly['额外触碰率'].sum() > 0 else 0) + df_monthly['置后触碰率离散度'] = cv_type(cv(df_monthly['置后触碰率']) if df_monthly['置后触碰率'].sum() > 0 else 0) + return df_monthly + + +def rule_combine_results(data, rules_dict, rule_all, use_credit_flag, circle_mth, circle_week, circle_day, base_lift, subset_total): + """基于数据字典泛化结果汇总并输出 + + :param data: 需要分析的数据 + :param rules_dict: 阈值测算输出的规则字典 + :param rule_all: 已有所有规则汇总后的字段名称 + :param use_credit_flag: 是否用信列 + :param circle_mth: 申请月对应的列 + :param circle_week: 申请周对应的列 + :param circle_day: 申请日对应的列 + :param base_lift: 临界Lift + :param subset_total: 是否获取每个子集作为计算整体 + + :return: 泛化结果汇总输出 + """ + for var in rules_dict.Var.unique(): + rules_dict01 = rules_dict[rules_dict.Var == var] + min_index = rules_dict01.index.min() + starttime_init = datetime.datetime.now() + for row in rules_dict01.loc[min_index:min_index].iterrows(): + print('正在泛化的规则为:' + row[1]['Rule_Name'] + '\n' + '规则适用范围为:' + str(row[1]['Rule_Limit']) + '\n' + '目标字段为:' + row[1]['Target']) + print('泛化的变量名称为:', var) + rule_name = row[1]['Rule_Name'] + sample_type1 = str(row[1]['Rule_Limit']) + rule_type = row[1]['Rule_Type'] + target = row[1]['Target'] + cut_point = row[1]['Threshold'] + var = var + direction = row[1]['Direction'] + df_monthly = get_mths_result(data=data + , rule_name=rule_name + , rule_type=rule_type + , var=var + , cut_point=cut_point + , target=target + , rule_limit=sample_type1 + , rule_all=rule_all + , use_credit_flag=use_credit_flag + , circle_mth=circle_mth + , direction=direction + , base_lift=base_lift + , subset_total=subset_total) + df_weekly = get_weeks_result(data=data + , rule_name=rule_name + , rule_type=rule_type + , var=var + , cut_point=cut_point + , target=target + , rule_limit=sample_type1 + , rule_all=rule_all + , use_credit_flag=use_credit_flag + , circle_week=circle_week + , direction=direction + , subset_total=subset_total) + df_daily = get_days_result(data=data + , rule_name=rule_name + , rule_type=rule_type + , var=var + , cut_point=cut_point + , target=target + , rule_limit=sample_type1 + , rule_all=rule_all + , use_credit_flag=use_credit_flag + , circle_day=circle_day + , direction=direction + , subset_total=subset_total) + if len(rules_dict01) > 1: + for row in rules_dict01.loc[(min_index + 1):].iterrows(): + print('正在泛化的规则为:' + row[1]['Rule_Name'] + '\n' + '规则适用范围为:' + str( + row[1]['Rule_Limit']) + '\n' + '目标字段为:' + row[1]['Target']) + print('泛化的变量名称为:', var) + rule_name = row[1]['Rule_Name'] + sample_type1 = row[1]['Rule_Limit'] + rule_type = row[1]['Rule_Type'] + target = row[1]['Target'] + cut_point = row[1]['Threshold'] + var = var + direction = row[1]['Direction'] + df_monthly_01 = get_mths_result(data=data, rule_name=rule_name, rule_type=rule_type, var=var, cut_point=cut_point, target=target, rule_limit=sample_type1, rule_all=rule_all, + use_credit_flag=use_credit_flag, circle_mth=circle_mth, direction=direction, base_lift=base_lift, subset_total=subset_total) + df_monthly = pd.concat([df_monthly, df_monthly_01]) + df_weekly_01 = get_weeks_result(data=data, rule_name=rule_name, rule_type=rule_type, var=var, cut_point=cut_point, target=target, rule_limit=sample_type1, rule_all=rule_all, + use_credit_flag=use_credit_flag, circle_week=circle_week, direction=direction, subset_total=subset_total) + df_weekly = pd.concat([df_weekly, df_weekly_01]) + df_daily_01 = get_days_result(data=data, rule_name=rule_name, rule_type=rule_type, var=var, cut_point=cut_point, target=target, rule_limit=sample_type1, rule_all=rule_all, + use_credit_flag=use_credit_flag, circle_day=circle_day, direction=direction, subset_total=subset_total) + df_daily = pd.concat([df_daily, df_daily_01]) + + df_monthly.insert(loc=0, column="序号", value=df_monthly["规则名称"].map({rule: index for index, rule in enumerate(df_monthly['规则名称'].unique(), start=1)}).values) + df_weekly.insert(loc=0, column="序号", value=df_weekly["规则名称"].map({rule: index for index, rule in enumerate(df_weekly['规则名称'].unique(), start=1)}).values) + df_daily.insert(loc=0, column="序号", value=df_daily["规则名称"].map({rule: index for index, rule in enumerate(df_daily['规则名称'].unique(), start=1)}).values) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 结果输出 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< # + writer = ExcelWriter() + + # 相关规则说明 + worksheet = writer.get_sheet_by_name("0.说明") + + end_row, _ = writer.insert_value2sheet(worksheet, "B2", value="1、规则说明", style="header_middle", end_space="E2", align={"horizontal": "left"}) + + _, end_col = writer.insert_value2sheet(worksheet, (end_row + 1, 2), value="规则类型", style="header_middle") + end_row, _ = writer.insert_value2sheet(worksheet, (end_row + 1, end_col), value="规则上线标准", style="header_middle") + + _, end_col = writer.insert_value2sheet(worksheet, (end_row, 2), value="HC", style="middle") + end_row, _ = writer.insert_value2sheet(worksheet, (end_row, end_col), value="准入类规则需结合产品和适用场景进行考虑", style="middle", align={"horizontal": "left"}) + + _, end_col = writer.insert_value2sheet(worksheet, (end_row, 2), value="FR/CR", style="last_middle") + # end_row, _ = writer.insert_value2sheet(worksheet, (end_row, end_col), value=f"同时满足如下条件:\r\n1.近n个月额外触碰Lift>={base_lift}的月份占比>=80%\r\n2.按月统计的额外触碰率离散度稳定(非常稳定或相对稳定)\r\n注:追踪月份至少 >= 3", style="last_middle", align={"horizontal": "left"}) + end_row, _ = writer.insert_value2sheet(worksheet, (end_row, end_col), value=f'="同时满足如下条件:" & CHAR(10) & "1.近n个月额外触碰Lift>={base_lift}的月份占比>=80%" & CHAR(10) & "2.按月统计的额外触碰率离散度稳定(非常稳定或相对稳定)" & CHAR(10) & "注:追踪月份至少 >= 3"', style="last_middle", align={"horizontal": "left", "wrap_text": True}) + + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row + 2}", value="2、稳定性划分标准", style="header_middle", end_space=f"E{end_row + 2}", align={"horizontal": "left"}) + cv_describe = pd.DataFrame({"序号": [1, 2, 3, 4], "波动幅度": ["[0%, 15%)", "[15%, 40%)", "[40%, 75%)", "[75%, 正无穷)"], "类型": ["非常稳定", "相对稳定", "不稳定", "极不稳定"], "备注": ["波动幅度=离散度"] * 4}) + end_row, _ = dataframe2excel(cv_describe, writer, sheet_name=worksheet, start_row=end_row + 1, merge_column=["备注"], merge=True) + + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row + 2}", value="3、统计指标含义", style="header_middle", end_space=f"E{end_row + 2}", align={"horizontal": "left"}) + end_row, _ = dataframe2excel(word_desc, writer, sheet_name=worksheet, start_row=end_row + 1) + + # 规则增益效果评估 + worksheet = writer.get_sheet_by_name("1.规则泛化") + + # 评估规则明细 + end_row, _ = writer.insert_value2sheet(worksheet, f"B2", value="0、规则逻辑", style="header_middle", end_space=f"AY2") + end_row, _ = dataframe2excel(rules_dict01, writer, sheet_name=worksheet, start_row=end_row + 1) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 每月规则泛化 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< # + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row + 2}", value="1、月度规则泛化", style="header_middle", end_space=f"AY{end_row + 2}", align={"horizontal": "left"}) + + # 每月规则命中拒绝及效果评估 + text1, text2, text3 = std_result_output(df_monthly, "M") + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text1, style="merge_middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text2, style="merge_middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text3, style="middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + + end_row, _ = dataframe2excel(df_monthly, writer, sheet_name=worksheet, start_row=end_row + 1, merge_column=["序号", "报告日期", "产品名称", "样本类型"], merge=True) + + # # 规则增益效果评估 + # end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row + 2}", value="2、规则效能", style="header_middle", end_space=f"AY{end_row + 2}") + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 每周规则泛化 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< # + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row + 2}", value="2、每周规则泛化", style="header_middle", end_space=f"AY{end_row + 2}", align={"horizontal": "left"}) + + text1, text2, text3 = std_result_output(df_weekly, "W") + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text1, style="merge_middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text2, style="merge_middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text3, style="middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + + end_row, _ = dataframe2excel(df_weekly, writer, sheet_name=worksheet, start_row=end_row + 1, merge_column=["序号", "报告日期", "产品名称", "样本类型"], merge=True) + + # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 每日规则泛化 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< # + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row + 2}", value="3、每日规则泛化", style="header_middle", end_space=f"AY{end_row + 2}", align={"horizontal": "left"}) + + text1, text2, text3 = std_result_output(df_daily, "D") + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text1, style="merge_middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text2, style="merge_middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + end_row, _ = writer.insert_value2sheet(worksheet, f"B{end_row}", value=text3, style="middle", end_space=f"AY{end_row}", align={"horizontal": "left"}) + + end_row, _ = dataframe2excel(df_daily, writer, sheet_name=worksheet, start_row=end_row + 1, merge_column=["序号", "报告日期", "产品名称", "样本类型"], merge=True) + + writer.save(path_rule + var + '_single_rule_' + str(datetime.datetime.now().strftime('%Y%m%d%H%M%S')) + '.xlsx') + + +# 2.9 规则合并泛化时 按月、周、日输出分析结果函数 +def std_result_output_01(wb, sheetname, data, offset): + """ + 泛化结果输出函数 + """ + nrows, ncols = data.shape + first_title = wb.add_format(title_dic) + body_text_title = wb.add_format(subtitle_format) + body_text_center = wb.add_format(body_text_format_01) + body_text_left = wb.add_format(body_text_left_format_01) + body_text_percent = wb.add_format(body_text_per_format_01) + body_text_center2 = wb.add_format(body_text_format_02) + body_text_left2 = wb.add_format(body_text_left_format_02) + body_text_percent2 = wb.add_format(body_text_per_format_02) + ws = wb.add_worksheet(sheetname) + ws.hide_gridlines({'option': 1}) + ws.autofilter(offset + 5, offset, offset + 5 + nrows, ncols) + ws.set_column(0, 0, 2) + ws.freeze_panes(7, 10) ## 冻结单元格 + ws.merge_range(offset, offset, offset, ncols, sheetname, first_title) + if '规则泛化' in sheetname: + data_01 = data[-3:] + data_02 = data[data['额外触碰成熟量'] >= 10][-3:] + data_03 = data[data['整体逾期率'] > 0][-3:] + hit_rate = sum(data_01['额外触碰量']) / sum(data_01['申请量']) + risk_double = (data_02['额外触碰成熟坏样本量'].sum() / data_02['额外触碰成熟量'].sum()) / (sum(data_02['整体成熟坏样本量']) / sum(data_02['整体成熟量'])) if sum(data_02['整体成熟坏样本量']) > 0 else np.nan + overdue_minus = sum(data_03['整体成熟坏样本量']) / sum(data_03['整体成熟量']) - sum(data_03['整体成熟坏样本量'] - data_03['额外触碰成熟坏样本量']) / sum(data_03['整体成熟量'] - data_03['额外触碰成熟量']) if sum(data_03['整体成熟量'] - data_03['额外触碰成熟量']) > 0 else np.nan + overdue_range = overdue_minus / (sum(data_03['整体成熟坏样本量']) / sum(data_03['整体成熟量'])) if sum(data_03['整体成熟坏样本量']) > 0 else np.nan + text1 = "1.策略上线后通过率下降预估值 = 近3个月额外触碰量之和/近3个月申请量之和;策略上线后逾期率变化预估值 = (近n个有表现月逾期样本之和/近n个有表现月成熟样本之和)-(近n个有表现月置后触碰坏样本之和/近n个有表现月置后触碰成熟样本之和) ;备注:取整体逾期率大于0的近n个月计算策略上线后逾期率变化值,n默认取3,若不足3个月,有几个月计算几个月;" + text2 = "2.策略上线后额外触碰Lift预估值 = (近n个有表现月额外触碰成熟坏样本量之和/近n个有表现月额外触碰成熟量之和)/(近n个有表现月整体成熟坏样本量之和/近n个有表现月整体成熟量之和);备注:取额外触碰成熟量大于等于10的近n个月计算策略上线后额外触碰Lift预估值,n默认取3,若不足3个月,有几个月计算几个月;" + if overdue_minus > 0: + text3 = "3.策略上线后通过率预计下降:{:.2f}%,逾期率下降:{:.2f}%,逾期率下降幅度:{:.2f}%,额外触碰Lift预估值为:{:.2f}。".format(hit_rate * 100, overdue_minus * 100, overdue_range * 100, risk_double) + else: + text3 = "3.策略上线后通过率预计下降:{:.2f}%,逾期率上升:{:.2f}%,逾期率上升幅度:{:.2f}%,额外触碰Lift预估值为:{:.2f}。".format(hit_rate * 100, abs(overdue_minus) * 100, abs(overdue_range) * 100, risk_double) + if 'Weekly' in sheetname: + week_num = str(len(data['申请周'].unique())) + mean_obs = data['置前触碰率'].mean() * 100 + cv_rate = cv(data['置前触碰率']) + if data['置前触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='置前触碰率') + text1 = "1.近" + week_num + "个申请周平均置前触碰率%.2f" % mean_obs + '%, ' + '置前触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + ';置前触碰率整体趋势:' + trend + ";" + mean_obs = data['策略触碰率'].mean() * 100 + cv_rate = cv(data['策略触碰率']) + if data['策略触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='策略触碰率') + text2 = "2.近" + week_num + "个申请周策略触碰率%.2f" % mean_obs + '%, ' + '策略触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + '; 策略触碰率整体趋势:' + trend + ";" + mean_obs = data['额外触碰率'].mean() * 100 + cv_rate = cv(data['额外触碰率']) + if data['额外触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='额外触碰率') + text3 = "3.近" + week_num + "个申请周额外触碰率%.2f" % mean_obs + '%, ' + '额外触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + '; 额外触碰率整体趋势:' + trend + ";" + if 'Dayly' in sheetname: + day_num = str(len(data['申请日'].unique())) + mean_obs = data['置前触碰率'].mean() * 100 + cv_rate = cv(data['置前触碰率']) + if data['置前触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='置前触碰率') + text1 = "1.近" + day_num + "个申请日平均置前触碰率%.2f" % mean_obs + '%, ' + '置前触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + ';置前触碰率整体趋势:' + trend + ";" + mean_obs = data['策略触碰率'].mean() * 100 + cv_rate = cv(data['策略触碰率']) + if data['策略触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='策略触碰率') + text2 = "2.近" + day_num + "个申请日策略触碰率%.2f" % mean_obs + '%, ' + '策略触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + '; 策略触碰率整体趋势:' + trend + ";" + mean_obs = data['额外触碰率'].mean() * 100 + cv_rate = cv(data['额外触碰率']) + if data['额外触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='额外触碰率') + text3 = "3.近" + day_num + "个申请日额外触碰率%.2f" % mean_obs + '%, ' + '额外触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + '; 额外触碰率整体趋势:' + trend + ";" + ws.merge_range(offset + 1, offset, offset + 1, ncols, text1, body_text_left2) + ws.merge_range(offset + 2, offset, offset + 2, ncols, text2, body_text_left2) + ws.merge_range(offset + 3, offset, offset + 3, ncols, text3, body_text_left2) + ws.set_row(offset + 4, 7) + column = data.columns + need_len = get_max_len(data=data, nrows=nrows, ncols=ncols, max_len=40) + for i in range(len(need_len)): + ws.set_column(i + 1, i + 1, need_len[i]) + data = data.replace(np.nan, '') + data = data.replace(np.inf, 'Inf') + for j in range(ncols): + ws.write(offset + 5, j + 1, column[j], body_text_title) + for i in range(nrows): + for j in range(ncols): + if '量' in column[j]: + ws.conditional_format(offset + 6, j + 1, offset + 6 + nrows - 1, j + 1, condition_format_green_no) + elif (('率' in column[j]) or ('占比' in column[j])): + ws.conditional_format(offset + 6, j + 1, offset + 6 + nrows - 1, j + 1, condition_format_pink_no) + elif 'Odds' in column[j] or 'Lift' in column[j] or '风险' in column[j]: + ws.conditional_format(offset + 6, j + 1, offset + 6 + nrows - 1, j + 1, condition_format_red_no) + elif '%' in column[j] or '比例' in column[j]: + ws.conditional_format(offset + 6, j + 1, offset + 6 + nrows - 1, j + 1, condition_format_blue_no) + value = data.iloc[i][j] + if int(data.iloc[i, 0] % 2) == 1: + if '%' in column[j] or 'rate' in column[j] or '占比' in column[j] or '率' in column[j] or '比例' in column[j]: + ws.write(i + offset + 6, j + 1, value, body_text_percent) + else: + ws.write(i + offset + 6, j + 1, value, body_text_center) + else: + if '%' in column[j] or 'rate' in column[j] or '占比' in column[j] or '率' in column[j] or '比例' in column[j]: + ws.write(i + offset + 6, j + 1, value, body_text_percent2) + else: + ws.write(i + offset + 6, j + 1, value, body_text_center2) + ws.set_row(offset + 5 + nrows + 1, 7) + ws.merge_range(offset + 5 + nrows + 2, offset, offset + 5 + nrows + 2, ncols, '2.规则效能', first_title) + ws.set_row(offset + 5 + nrows + 3, 7) + if '规则泛化' in sheetname: + add_combine_plot(wb=wb, ws=ws, column=column, label_x_start=offset + 5, x_start=offset + 5 + 1, x_end=offset + 5 + 1 + nrows, + title='规则效能分析', x_label='申请月', y1_list=['额外触碰Lift', '额外触碰fpd15_Lift'], + y2_list=['置前触碰率', '策略触碰率', '重复触碰率', '额外触碰率', '置后触碰率'], + x_title='申请月', y1_title='额外触碰Lift', y2_title='规则触碰率', width=750, height=500, if_combine=True, + chart1_type='column', chart2_type='line', chart_row=offset + 5 + nrows + 4, chart_col=1) + if 'Weekly' in sheetname: + add_plot(wb=wb, ws=ws, column=column, label_x_start=offset + 5, x_start=offset + 5 + 1, + x_end=offset + 6 + nrows, title='规则效能分析', x_label='申请周', + y1_list=['置前触碰率', '策略触碰率', '重复触碰率', '额外触碰率', '置后触碰率'], + x_title='申请周', y1_title='规则触碰率', width=720, height=500, chart1_type='line', chart_row=offset + 5 + nrows + 4, chart_col=1) + if 'Dayly' in sheetname: + add_plot(wb=wb, ws=ws, column=column, label_x_start=offset + 5, x_start=offset + 5 + 1, + x_end=offset + 5 + nrows, title='规则效能分析', x_label='申请日', + y1_list=['置前触碰率', '策略触碰率', '重复触碰率', '额外触碰率', '置后触碰率'], + x_title='申请日', y1_title='规则触碰率', width=720, height=500, chart1_type='line', + chart_row=offset + 5 + nrows + 4, chart_col=1) + + +# 1.14 规则合并泛化结果汇总并输出 +def rule_combine_results_01(data, rule_all, use_credit_flag, cut_point, rule_name, rule_name_chinese, + rule_type, rule_limit, circle_mth, circle_week, circle_day, target, direction, var, base_lift, subset_total): + """ + :param data: 需要分析的数据 + :param rule_all: 已有所有规则汇总后的字段名称 + :param use_credit_flag: 是否用信列 + :param cut_point: 切点,cut-off + :param rule_name: 泛化规则英文名 + :param rule_name_chinese: 泛化规则中文名 + :param rule_type: 泛化规则类型 + :param rule_limit: 泛化样本类型 + :param circle_mth: 申请月对应的列 + :param circle_week: 申请周对应的列 + :param circle_day: 申请日对应的列 + :param target: 目标字段 + :param direction: 变量取值方向 + :param var: 泛化变量名 + :param base_lift: 临界Lift + :param subset_total: 是否获取每个子集作为计算整体 + :return: 泛化结果汇总输出 + """ + ana_date = datetime.datetime.now().strftime('%Y-%m-%d') + rules_dict01 = pd.DataFrame( + {'Ana_Date': [ana_date], 'Rule_Name': [rule_name], 'Description': [rule_name_chinese], 'Rule_Type': [rule_type], + 'Rule_Limit': [rule_limit], 'Target': [target], 'Threshold': [cut_point], 'Direction': [direction], 'var': [var]}) + starttime_init = datetime.datetime.now() + print('程序开始执行时间为: ' + str(starttime_init)) + print('正在泛化的规则为:' + rule_name + '\n' + '规则适用范围为:' + rule_limit + '\n' + '目标字段为:' + target) + df_monthly = get_mths_result(data=data, rule_name=rule_name, rule_type=rule_type, var=var, + cut_point=cut_point, direction=direction, target=target, rule_limit=rule_limit, rule_all=rule_all, use_credit_flag=use_credit_flag, + circle_mth=circle_mth, base_lift=base_lift, subset_total=subset_total) + df_weekly = get_weeks_result(data=data, rule_name=rule_name, rule_type=rule_type, var=var, + cut_point=cut_point, direction=direction, target=target, rule_limit=rule_limit, rule_all=rule_all, use_credit_flag=use_credit_flag, + circle_week=circle_week, subset_total=subset_total) + df_daily = get_days_result(data=data, rule_name=rule_name, rule_type=rule_type, var=var, + cut_point=cut_point, direction=direction, target=target, rule_limit=rule_limit, rule_all=rule_all, use_credit_flag=use_credit_flag, + circle_day=circle_day, subset_total=subset_total) + cols = df_monthly.columns.tolist() + df_monthly['序号'] = 1 + for i, j in enumerate(list(df_monthly['规则名称'].unique())): + df_monthly['序号'][df_monthly['规则名称'] == j] = (i + 1) + col1 = ['序号'] + col1.extend(cols) + df_monthly = df_monthly[col1] + + cols = df_weekly.columns.tolist() + df_weekly['序号'] = 1 + for i, j in enumerate(list(df_weekly['规则名称'].unique())): + df_weekly['序号'][df_weekly['规则名称'] == j] = (i + 1) + col1 = ['序号'] + col1.extend(cols) + df_weekly = df_weekly[col1] + + cols = df_daily.columns.tolist() + df_daily['序号'] = 1 + for i, j in enumerate(list(df_daily['规则名称'].unique())): + df_daily['序号'][df_daily['规则名称'] == j] = (i + 1) + col1 = ['序号'] + col1.extend(cols) + df_daily = df_daily[col1] + endtime_init = datetime.datetime.now() + print('程序结束执行时间为: ' + str(endtime_init)) + print('程序执行时间为: ' + str(endtime_init - starttime_init)) + + # 结果输出 + wb = xlsxwriter.Workbook(path_rule + rule_name + '_' + str(datetime.datetime.now().strftime('%Y%m%d%H%M%S')) + '.xlsx') + description_output(wb=wb, sheetname='0.说明', df1=rules_dict01, df2=word_desc, offset=1, base_lift=base_lift) + std_result_output_01(wb=wb, sheetname='1.规则泛化', data=df_monthly, offset=1) + std_result_output_01(wb=wb, sheetname='2A.Weekly触碰模拟', data=df_weekly, offset=1) + std_result_output_01(wb=wb, sheetname='2B.Dayly触碰模拟', data=df_daily, offset=1) + wb.close() + + +""" +2.规则泛化分析结果输出相关函数 +""" + +# 2.1 excel格式设置 +biaotou = '#44546A' +title = '#44546A' +title_sub1 = '#00868B' +title_sub2 = '#00E5EE' +text = '#F2F2F2' +xunhuan1 = '#D1D1D1' +xunhuan2 = '#E3E3E3' +title_size = 12 +text_title_size = 9 +text_size = 8 +split_color = 'white' + +# 条件格式: 蓝色数据条,不指定最大、最小值,绿色 +condition_format_green_no = {'type': 'data_bar', 'bar_solid': True, 'data_bar_2010': True, + 'bar_color': '#65d97d'} +# 条件格式: 黄色数据条,不指定最大、最小值,橙色 +condition_format_red_no = {'type': 'data_bar', 'bar_solid': True, 'data_bar_2010': True, + 'bar_color': '#f2572d'} +# 条件格式: 黄色数据条,不指定最大、最小值,橙色 +condition_format_pink_no = {'type': 'data_bar', 'bar_solid': True, 'data_bar_2010': True, + 'bar_color': '#FF69B4'} +condition_format_blue_no = {'type': 'data_bar', 'bar_solid': True, 'data_bar_2010': True, + 'bar_color': '#1E90FF'} +condition_format_3_color = {'type': '3_color_scale', + 'max_color': '#F8696B', 'mid_color': '#FFEB84', 'min_color': '#63BE7B'} + +# 总标题 +title_dic = {'bold': True, 'font_name': 'Arial', 'font_size': title_size, 'font_color': 'white', + 'top_color': biaotou, 'bottom_color': biaotou, 'left_color': biaotou, + 'right_color': biaotou, 'bg_color': biaotou} + +# 表格正文: 边框白色,字体12,背景深灰色、居中 +subtitle_format = {'border': True, 'font_size': text_title_size, 'font_name': 'Arial', 'font_color': 'white', + 'left_color': 'white', 'right_color': 'white', 'bg_color': biaotou, + 'align': 'center', 'valign': 'vcenter'} + +# 表格正文: 边框白色,字体12,背景灰色1、居中 +body_text_format_01 = {'border': True, 'font_size': text_size, 'font_name': 'Arial', + 'bg_color': text, 'top_color': split_color, + 'bottom_color': split_color, + 'left_color': split_color, + 'right_color': split_color, + 'align': 'center', 'valign': 'vcenter'} + +# 正文左对齐 +body_text_left_format_01 = copy.deepcopy(body_text_format_01) +body_text_left_format_01['align'] = 'left' +# 正文为比率 +body_text_per_format_01 = copy.deepcopy(body_text_format_01) +body_text_per_format_01['num_format'] = '0.00%' + +# 表格正文: 边框白色,字体12,背景灰色2、居中 +body_text_format_02 = {'border': True, 'font_size': text_size, 'font_name': 'Arial', + 'bg_color': xunhuan2, 'top_color': split_color, + 'bottom_color': split_color, + 'left_color': split_color, + 'right_color': split_color, + 'align': 'center', 'valign': 'vcenter'} + + +# 正文左对齐 +body_text_left_format_02 = copy.deepcopy(body_text_format_02) +body_text_left_format_02['align'] = 'left' +# 正文为比率 +body_text_per_format_02 = copy.deepcopy(body_text_format_02) +body_text_per_format_02['num_format'] = '0.00%' + + +# 2.2 规则稳定性说明 +type_dic = pd.DataFrame([[1, '0%~15%', '非常稳定'], [2, '15%~40%', '相对稳定'], [3, '40%~75%', '不稳定'], [4, '>75%', '极不稳定']]) + + +# 2.3自动获取单元格内容的length,如果包含汉字,则一个汉字计数为2,如果是英文,则计数为1 +def get_same_len(x): + """ + :param x: 输入内容 + :return: 字符串长度 + """ + import re + if type(x) != str: + x = str(x) + num = 0 + for i in list(x): + if re.match("[\u4e00-\u9fa5]+", i): + num = num + 2 + else: + num = num + 1 + return num + + +# 2.4 自动获取每一列的最大长度 +def get_max_len(data, nrows, ncols, max_len=60): + """ + 自动计算每一列的长度 + (1)先获得每一列的最长的一个单元格内容的长度 + (2)如果超过最大长度限制,则只取最大程度,其余内容自动换行,否则无需限制 + 字符串length对应到excel的单元格列宽需要缩小到0.73684,具体缩放比例可以修改 + """ + data = data.fillna('') + res = [] + res1 = [] + column = data.columns + for i in range(len(column)): + x = column[[i]][0] + res1.append(get_same_len(x)) + res2 = [] + for i in range(ncols): + tmp = [] + for j in range(nrows): + tmp.append(get_same_len(data.iloc[j, i])) + tmp = max(tmp) + if tmp > max_len: + tmp = max_len + res2.append(tmp * 0.73684) + for i, j in zip(res1, res2): + res.append(max(i, j)) + return res + + +# 2.5 规则泛化说明函数 +def description_output(wb, sheetname, df1, df2, offset, base_lift): + """ + :param wb: excel 文件 + :param sheetname: sheetname + :param df1: 待输出数据框1 + :param df2: 待输出数据框2 + :param offset: 输出位置 + :param base_lift: 最小lift + :return: 策略泛化结果说明 + """ + nrows, ncols = df1.shape + first_title = wb.add_format(title_dic) + body_text_title = wb.add_format(subtitle_format) + body_text_center = wb.add_format(body_text_format_01) + body_text_left = wb.add_format(body_text_left_format_01) + body_text_percent = wb.add_format(body_text_per_format_01) + body_text_format_01_01 = copy.deepcopy(body_text_format_01) + body_text_format_01_01['text_wrap'] = 1 + body_text_center_01 = wb.add_format(body_text_format_01_01) + column = df1.columns + ws = wb.add_worksheet(sheetname) + ws.hide_gridlines({'option': 1}) + ws.set_column(0, 0, 2) + for i in range(len(column)): + x = column[[i]][0] + ll = get_same_len(x) + lll = max(8, ll) + ws.set_column(i + offset, i + offset, lll) + ws.merge_range(offset, offset, offset, ncols, '1.规则说明', first_title) + ws.set_row(2, 7) + title_01 = ['规则类型', '规则上线标准'] + ws.write(3, 1, title_01[0], body_text_title) + ws.merge_range(3, 2, 3, 5, title_01[1], body_text_title) + rule_type01 = 'HC'; + rule_type02 = 'FR/CR'; + text_01 = '准入类规则需结合产品和适用场景进行考虑' + text_021 = "同时满足如下条件:" + text_022 = "1.近n个月额外触碰Lift>=" + str(base_lift) + "的月份占比>=80%" + text_023 = "2.按月统计的额外触碰率离散度稳定(非常稳定或相对稳定)" + text_024 = "注:追踪月份至少 >= 3" + ws.write(4, 1, rule_type01, body_text_center) + ws.merge_range(4, 2, 4, 5, text_01, body_text_left) + ws.merge_range(5, 1, 8, 1, rule_type02, body_text_center) + ws.merge_range(5, 2, 5, 5, text_021, body_text_left) + ws.merge_range(6, 2, 6, 5, text_022, body_text_left) + ws.merge_range(7, 2, 7, 5, text_023, body_text_left) + ws.merge_range(8, 2, 8, 5, text_024, body_text_left) + ws.set_row(9, 7) + # 增加备注 + title = ['序号', '波动幅度', '类型', '备注'] + for i in range(len(title) - 1): + ws.write(10, i + 1, title[i], body_text_title) + ws.merge_range(10, len(title), 10, len(title) + 1, '备注', body_text_title) + rshape, cshape = type_dic.shape + for i in range(rshape): + for j in range(cshape): + ws.write(10 + 1 + i, j + 1, type_dic.iloc[i][j], body_text_center) + ws.merge_range(10 + 1, cshape + 1, 10 + rshape, cshape + 2, '波动幅度=离散度', body_text_center) + ws.set_row(15, 7) + ws.merge_range(16, 1, 16, ncols, '2.规则逻辑', first_title) + ws.set_row(17, 7) + df1 = df1.replace(np.nan, '') + df1 = df1.replace(np.inf, 'Inf') + for i in range(len(column)): + x = column[[i]][0] + ll = get_same_len(x) + lll = max(8, ll) + ws.set_column(i + 1, i + 1, lll) + for j in range(ncols): + ws.write(18, j + 1, column[j], body_text_title) + for i in range(nrows): + for j in range(ncols): + if 'odds' in column[j] or 'Odds' in column[j]: + ws.conditional_format(19, j + 1, 19 + nrows - 1, j + 1, condition_format_pink_no) + value = df1.iloc[i][j] + if '%' in column[j] or 'Rate' in column[j] or '占比' in column[j] or '率' in column[j]: + ws.write(19 + i, j + 1, value, body_text_percent) + else: + ws.write(19 + i, j + 1, value, body_text_center) + ws.set_row(19 + nrows, 7) + ws.merge_range(19 + nrows + 1, 1, 19 + nrows + 1, ncols, '3.规则字段', first_title) + ws.set_row(19 + nrows + 2, 7) + nrows2, ncols2 = df2.shape + df2 = df2.replace(np.nan, '') + df2 = df2.replace(np.inf, 'Inf') + column = df2.columns + need_len = get_max_len(data=df2.iloc[:, 1:], nrows=nrows2, ncols=ncols2 - 1, max_len=45) + for i in range(len(need_len)): + ws.set_column(i + 2, i + 2, need_len[i]) + for j in range(ncols2): + ws.write(19 + nrows + 3, j + 1, column[j], body_text_title) + for i in range(nrows2): + for j in range(ncols2): + value = df2.iloc[i][j] + ws.write(19 + nrows + 4 + i, j + 1, value, body_text_center_01) + + +# 2.6 规则泛化指标说明 +word_desc = [{'评估内容': '样本类型', '内容详细含义': '测算和泛化样本细分类型', '备注': '取值可以是地域、渠道等'}, + {'评估内容': '风险类型', '内容详细含义': '测算和泛化变量为欺诈类变量则属于短期风险;测算和泛化变量为信用变量则属于中长期风险', '备注': None}, + {'评估内容': '目标字段', '内容详细含义': '测算和泛化的目标字段', '备注': None}, + {'评估内容': '规则类型', '内容详细含义': 'FR/CR/HC', '备注': 'FR是欺诈类规则;CR为信用类规则;HC为强规则'}, + {'评估内容': '申请量', '内容详细含义': '申请量', '备注': None}, + {'评估内容': '通过量', '内容详细含义': '审批通过量', '备注': None}, + {'评估内容': '通过率', '内容详细含义': '通过量/申请量', '备注': None}, + {'评估内容': '用信量', '内容详细含义': '审批通过且支用量', '备注': None}, + {'评估内容': '用信率', '内容详细含义': '用信量/通过量', '备注': None}, + {'评估内容': '置前触碰量', '内容详细含义': '已有所有规则触碰量', '备注': None}, + {'评估内容': '策略触碰量', '内容详细含义': '待上线规则触碰量(包含申请拒绝触碰和申请通过触碰)', '备注': None}, + {'评估内容': '重复触碰量', '内容详细含义': '待上线规则和已有规则重复触碰量', '备注': None}, + {'评估内容': '额外触碰量', '内容详细含义': '待上线规则在申请通过样本上触碰量', '备注': None}, + {'评估内容': '置后触碰量', '内容详细含义': '已有所有规则和待上线规则一共触碰量', '备注': None}, + {'评估内容': '置前触碰率', '内容详细含义': '置前触碰量/申请量', '备注': None}, + {'评估内容': '策略触碰率', '内容详细含义': '策略触碰量/申请量', '备注': None}, + {'评估内容': '重复触碰率', '内容详细含义': '重复触碰量/申请量', '备注': None}, + {'评估内容': '额外触碰率', '内容详细含义': '额外触碰量/申请量', '备注': None}, + {'评估内容': '置后触碰率', '内容详细含义': '置后触碰量/申请量', '备注': None}, + {'评估内容': '重复触碰占策略触碰比例', '内容详细含义': '重复触碰量)/策略触碰量', '备注': None}, + {'评估内容': '额外触碰占策略触碰比例', '内容详细含义': '额外触碰量)/策略触碰量', '备注': None}, + {'评估内容': '整体成熟量', '内容详细含义': '观测成熟量', '备注': None}, + {'评估内容': '额外触碰成熟量', '内容详细含义': '观测成熟且额外触碰量', '备注': None}, + {'评估内容': '整体成熟坏样本量', '内容详细含义': '观测成熟坏样本量', '备注': None}, + {'评估内容': '额外触碰成熟坏样本量', '内容详细含义': '观测成熟且额外触碰坏样本量', '备注': None}, + {'评估内容': 'fpd15整体成熟量', '内容详细含义': 'fpd15观测成熟量', '备注': None}, + {'评估内容': 'fpd15额外触碰成熟量', '内容详细含义': 'fpd15观测成熟且额外触碰量', '备注': None}, + {'评估内容': 'fpd15整体成熟坏样本量', '内容详细含义': 'fpd15观测成熟坏样本量', '备注': None}, + {'评估内容': 'fpd15额外触碰成熟坏样本量', '内容详细含义': 'fpd15观测成熟且额外触碰坏样本量', '备注': None}, + {'评估内容': '整体逾期率', '内容详细含义': '观测成熟样本中逾期样本占比', '备注': None}, + {'评估内容': '额外触碰逾期率', '内容详细含义': '观测成熟且额外触碰样本中逾期样本占比', '备注': None}, + {'评估内容': '额外触碰后整体逾期率', '内容详细含义': '观测成熟样本中剔除额外触碰样本后逾期样本占比', '备注': None}, + {'评估内容': '逾期率下降值', '内容详细含义': '策略上线后逾期率下降值', '备注': None}, + {'评估内容': '逾期率下降幅度', '内容详细含义': '策略上线后逾期率下降幅度', '备注': None}, + {'评估内容': '额外触碰Odds', '内容详细含义': '(额外触碰成熟申请单中坏好比)/(非额外触碰成熟申请单坏/好)', '备注': None}, + {'评估内容': '额外触碰Lift', '内容详细含义': '(额外触碰成熟申请单中坏样本占比)/(全量成熟申请单坏样本占比)', '备注': None}, + {'评估内容': '额外触碰fpd15_Odds', '内容详细含义': '(额外触碰fpd15成熟申请单中坏好比)/(非额外触碰fpd15成熟申请单中坏/好)', '备注': None}, + {'评估内容': '额外触碰fpd15_Lift', '内容详细含义': '(额外触碰fpd15成熟申请单中坏样本占比)/(全量fpd15成熟申请单坏样本占比)', '备注': None}, + {'评估内容': '额外触碰Lift大于目标值的月份占比', '内容详细含义': '额外触碰非空Lift大于阈值月份数/额外触碰非空Lift月份数', '备注': '阈值可根据实际情况自己设定,如取值为3'}, + {'评估内容': '置前触碰率离散度', '内容详细含义': '置前触碰率是否稳定', '备注': '0%~15%:非常稳定\n15%~40%:相对稳定\n40%~75%:不稳定\n>75%:极不稳定'}, + {'评估内容': '策略触碰率离散度', '内容详细含义': '策略触碰率是否稳定', '备注': '0%~15%:非常稳定\n15%~40%:相对稳定\n40%~75%:不稳定\n>75%:极不稳定'}, + {'评估内容': '重复触碰率离散度', '内容详细含义': '重复触碰率是否稳定', '备注': '0%~15%:非常稳定\n15%~40%:相对稳定\n40%~75%:不稳定\n>75%:极不稳定'}, + {'评估内容': '额外触碰率离散度', '内容详细含义': '额外触碰率是否稳定', '备注': '0%~15%:非常稳定\n15%~40%:相对稳定\n40%~75%:不稳定\n>75%:极不稳定'}, + {'评估内容': '置后触碰率离散度', '内容详细含义': '置后触碰率是否稳定', '备注': '0%~15%:非常稳定\n15%~40%:相对稳定\n40%~75%:不稳定\n>75%:极不稳定'}, + {'评估内容': '评估结论', '内容详细含义': '基于策略筛选规则,评估策略是否进行上线', '备注': None}] + +word_desc = pd.DataFrame(word_desc)[['评估内容', '内容详细含义', '备注']] + + +# 2.8 按月泛化时规则风险表现情况画图函数 +def add_combine_plot(wb, ws, column, label_x_start=1 + 6, x_start=1 + 6 + 1, x_end=int(1 + 6 + 1 + 12 * 1 / 2), title='客户级规则效能分析', x_label='申请月', + y1_list=['额外触碰Lift', '额外触碰fpd15_Lift'], y2_list=['置前触碰率', '策略触碰率', '重复触碰率', '额外触碰率', '置后触碰率'], + x_title='申请月', y1_title='额外触碰Lift', y2_title='规则触碰率', width=760, height=520, if_combine=True, chart1_type='column', chart2_type='line', + chart_row=1 + 6 + 12 + 4, chart_col=1): + """ + :param column: 数据框列名 + :param label_x_start: 数据框列名开始行 + :param x_start: 数据框取值开始行 + :param x_end: 数据框取值结束行 + :param title: 图表名称 + :param x_label: X轴数据列名 + :param y1_list: Y1轴数据列名 + :param y2_list: Y2轴数据列名 + :param x_title: X轴标题 + :param y1_title: Y1轴标题 + :param y2_title: Y2轴标题 + :param width: 图表宽 + :param height: 图表高 + :param if_combine: 是否画组合图,默认是 + :param chart1_type: 组合图1类型,默认是柱状图 + :param chart2_type: 组合图2类型,默认是折线图 + :param chart_row: 图表插入行 + :param chart_col: 图表插入列 + :return: + """ + x1 = list(column).index(x_label) + 1 + y1_index_list = [list(column).index(i) + 1 for i in y1_list] + y2_index_list = [list(column).index(i) + 1 for i in y2_list] + column_chart1 = wb.add_chart({'type': chart1_type}) + column_chart1.set_size({'width': width, 'height': height}) + for k in y1_index_list: + column_chart1.add_series( + {'name': [ws.name, label_x_start, k], + 'num_font': {'name': '微软雅黑', 'size': 9}, + 'categories': [ws.name, x_start, x1, x_end, x1], + 'values': [ws.name, x_start, k, x_end, k], + 'data_labels': {'value': False} + }) + column_chart1.set_title({'name': title, 'name_font': {'name': '微软雅黑', 'size': 10, 'bold': False}}) + column_chart1.set_x_axis({'name': x_title, 'name_font': {'name': '微软雅黑', 'size': 9, 'bold': False}}) + column_chart1.set_y_axis({'name': y1_title, 'name_font': {'name': '微软雅黑', 'size': 9, 'bold': False}}) + column_chart1.set_chartarea({'border': {'none': True}, 'fill': {'color': text}}) + column_chart1.set_plotarea({'border': {'none': True}, 'fill': {'color': text}}) + if if_combine: + line_chart2 = wb.add_chart({'type': chart2_type}) + for k in y2_index_list: + line_chart2.add_series( + {'name': [ws.name, label_x_start, k], + 'num_font': {'name': '微软雅黑', 'size': 9}, + 'categories': [ws.name, x_start, x1, x_end, x1], + 'values': [ws.name, x_start, k, x_end, k], + 'data_labels': {'value': False}, + 'y2_axis': True + }) + column_chart1.combine(line_chart2) + line_chart2.set_y2_axis({'name': y2_title, 'name_font': {'name': '微软雅黑', 'size': 9, 'bold': False}}) + ws.insert_chart(chart_row, chart_col, column_chart1) + + +def add_plot(wb, ws, column, label_x_start=1 + 6, x_start=1 + 6 + 1, x_end=int(1 + 6 + 1 + 12 * 1 / 2), title='客户级规则效能分析', x_label='申请周', + y1_list=['置前触碰率', '策略触碰率', '重复触碰率', '额外触碰率', '置后触碰率'], x_title='申请周', y1_title='规则触碰率', width=760, height=520, chart1_type='line', + chart_row=1 + 6 + 12 + 4, chart_col=1): + """ + 插入图形函数 + """ + x1 = list(column).index(x_label) + 1 + y1_index_list = [list(column).index(i) + 1 for i in y1_list] + column_chart1 = wb.add_chart({'type': chart1_type}) + column_chart1.set_size({'width': width, 'height': height}) + for k in y1_index_list: + column_chart1.add_series( + {'name': [ws.name, label_x_start, k], + 'num_font': {'name': '微软雅黑', 'size': 9}, + 'categories': [ws.name, x_start, x1, x_end, x1], + 'values': [ws.name, x_start, k, x_end, k], + 'data_labels': {'value': False} + }) + column_chart1.set_title({'name': title, 'name_font': {'name': '微软雅黑', 'size': 10, 'bold': False}}) + column_chart1.set_x_axis({'name': x_title, 'name_font': {'name': '微软雅黑', 'size': 9, 'bold': False}}) + column_chart1.set_y_axis({'name': y1_title, 'name_font': {'name': '微软雅黑', 'size': 9, 'bold': False}}) + column_chart1.set_chartarea({'border': {'none': True}, 'fill': {'color': text}}) + column_chart1.set_plotarea({'border': {'none': True}, 'fill': {'color': text}}) + ws.insert_chart(chart_row, chart_col, column_chart1) + + +def std_result_output(data, freq): + """泛化结果输出函数,按月、周、日输出分析结果函数 + """ + if freq == "M": + data_01 = data[-3:] + data_02 = data[data['额外触碰成熟量'] >= 10][-3:] + data_03 = data[data['整体逾期率'] > 0][-3:] + hit_rate = sum(data_01['额外触碰量']) / sum(data_01['申请量']) + risk_double = (data_02['额外触碰成熟坏样本量'].sum() / data_02['额外触碰成熟量'].sum()) / (sum(data_02['整体成熟坏样本量']) / sum(data_02['整体成熟量'])) if sum(data_02['整体成熟坏样本量']) > 0 else np.nan + overdue_minus = sum(data_03['整体成熟坏样本量']) / sum(data_03['整体成熟量']) - sum(data_03['整体成熟坏样本量'] - data_03['额外触碰成熟坏样本量']) / sum(data_03['整体成熟量'] - data_03['额外触碰成熟量']) if sum(data_03['整体成熟量'] - data_03['额外触碰成熟量']) > 0 else np.nan + overdue_range = overdue_minus / (sum(data_03['整体成熟坏样本量']) / sum(data_03['整体成熟量'])) if sum(data_03['整体成熟坏样本量']) > 0 else np.nan + text1 = "1.策略上线后通过率下降预估值 = 近3个月额外触碰量之和/近3个月申请量之和;策略上线后逾期率变化预估值 = (近n个有表现月逾期样本之和/近n个有表现月成熟样本之和)-(近n个有表现月置后触碰坏样本之和/近n个有表现月置后触碰成熟样本之和) ;备注:取整体逾期率大于0的近n个月计算策略上线后逾期率变化值,n默认取3,若不足3个月,有几个月计算几个月;" + text2 = "2.策略上线后额外触碰Lift预估值 = (近n个有表现月额外触碰成熟坏样本量之和/近n个有表现月额外触碰成熟量之和)/(近n个有表现月整体成熟坏样本量之和/近n个有表现月整体成熟量之和);备注:取额外触碰成熟量大于等于10的近n个月计算策略上线后额外触碰Lift预估值,n默认取3,若不足3个月,有几个月计算几个月;" + if overdue_minus > 0: + text3 = "3.策略上线后通过率预计下降:{:.2f}%,逾期率下降:{:.2f}%,逾期率下降幅度:{:.2f}%,额外触碰Lift预估值为:{:.2f}。".format(hit_rate * 100, overdue_minus * 100, overdue_range * 100, risk_double) + else: + text3 = "3.策略上线后通过率预计下降:{:.2f}%,逾期率上升:{:.2f}%,逾期率上升幅度:{:.2f}%,额外触碰Lift预估值为:{:.2f}。".format(hit_rate * 100, abs(overdue_minus) * 100, abs(overdue_range) * 100, risk_double) + elif freq == "W": + week_num = str(len(data['申请周'].unique())) + mean_obs = data['置前触碰率'].mean() * 100 + cv_rate = cv(data['置前触碰率']) + if data['置前触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='置前触碰率') + text1 = "1.近" + week_num + "个申请周平均置前触碰率%.2f" % mean_obs + '%, ' + '置前触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + ';置前触碰率整体趋势:' + trend + ";" + mean_obs = data['策略触碰率'].mean() * 100 + cv_rate = cv(data['策略触碰率']) + if data['策略触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='策略触碰率') + text2 = "2.近" + week_num + "个申请周策略触碰率%.2f" % mean_obs + '%, ' + '策略触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + '; 策略触碰率整体趋势:' + trend + ";" + mean_obs = data['额外触碰率'].mean() * 100 + cv_rate = cv(data['额外触碰率']) + if data['额外触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='额外触碰率') + text3 = "3.近" + week_num + "个申请周额外触碰率%.2f" % mean_obs + '%, ' + '额外触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + '; 额外触碰率整体趋势:' + trend + ";" + elif freq == "D": + day_num = str(len(data['申请日'].unique())) + mean_obs = data['置前触碰率'].mean() * 100 + cv_rate = cv(data['置前触碰率']) + if data['置前触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='置前触碰率') + text1 = "1.近" + day_num + "个申请日平均置前触碰率%.2f" % mean_obs + '%, ' + '置前触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + ';置前触碰率整体趋势:' + trend + ";" + mean_obs = data['策略触碰率'].mean() * 100 + cv_rate = cv(data['策略触碰率']) + if data['策略触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='策略触碰率') + text2 = "2.近" + day_num + "个申请日策略触碰率%.2f" % mean_obs + '%, ' + '策略触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + '; 策略触碰率整体趋势:' + trend + ";" + mean_obs = data['额外触碰率'].mean() * 100 + cv_rate = cv(data['额外触碰率']) + if data['额外触碰率'].sum() == 0: + cv_rate = 0 + info = cv_type(cv_rate) + trend = get_trend(data, key='额外触碰率') + text3 = "3.近" + day_num + "个申请日额外触碰率%.2f" % mean_obs + '%, ' + '额外触碰率波动幅度%.2f' % (100 * cv_rate) + '%, ' + info + '; 额外触碰率整体趋势:' + trend + ";" + else: + raise "frqp must in [M\W\D]" + + return text1, text2, text3 + + +if __name__ == '__main__': + import os + import xlsxwriter + import sys + + sys.path.append("../") + from scorecardpipeline import * + + init_setting() + + # 参数值设置 + sample_range = '202108-202110' + seq = 1 + # sample_type取值只有Total,表示测算全量样本,不需要配置参数sample_type_col;若还有其他样本类型,也支持同时测算 + sample_type = ['Total'] + + # 若sample_type需测算类型1和类型2的样本,类型1和类型2所在的字段为ordertype,sample_type_col参数示例如下 + # sample_type_col = { + # '类型1': ['ordertype', ['类型1']], + # '类型2': ['ordertype', ['类型2']] + # } + + sample_type_target = {'Total': ['fpd_30_act', 'mob3_dpd_30_act']} + + target_ripe = {'fpd_30_act': ['agr_fpd_30'], 'mob3_dpd_30_act': ['agr_mob3_dpd_30']} + + target_del_col = {'fpd_30_act': ['agr_fpd_30', 'agr_mob3_dpd_30', 'mob3_dpd_30_act'], + 'mob3_dpd_30_act': ['agr_mob3_dpd_30', 'agr_fpd_30', 'fpd_30_act']} + + sub_div_bin = 0.1 + target_min_rate = {'fpd_30_act': [0.015], 'mob3_dpd_30_act': [0.02]} + min_num = 40 + hit_num = 30 + sample_type_lift = {'Total': {'fpd_30_act': 1.8, 'mob3_dpd_30_act': 3}} + + # 泛化结果输出路径 + path_rule = "rule_data/rule_result/" + + if not os.path.exists(path_rule): + os.makedirs(path_rule) + + # 4.读入数据并进行数据预处理 + # 读入测算环节筛选的待泛化规则 + rules_dict = pd.read_excel("rule_data/规则字典.xlsx") + + # 加载数据 + mydata = pd.read_csv("rule_data/rule_data.csv", encoding="gbk") + mydata.columns = mydata.columns.map(lambda x: x.lower()) + + for i in mydata.columns[mydata.dtypes != 'object']: + mydata[i][mydata[i].map(lambda x: x in [-999, -9999, -999999])] = np.nan + + for i in mydata.columns[mydata.dtypes == 'object']: + mydata[i] = mydata[i].map(lambda x: str(x).strip()) + mydata[i][mydata[i].map(lambda x: x in ['-999', '-9999', '-999999'])] = np.nan + try: + mydata[i] = mydata[i].astype('float64') + except: + pass + + # 处理灰样本 + mydata['mob3_dpd_30_act'] = mydata['mob3_dpd_30_act'].map(lambda x: 1 if x == 1 else 0) + + # 5.基于加载的函数进行策略自动泛化;(需要基于阈值测算的数据字典) + + """ # 泛化参数说明 + target_ripe 获取目标字段对应的是否成熟标签,与测算环节参数一样 + sample_type_col 若测算样本是整个样本的子集,需配置sample_type_col参数,指名样本类型从哪个字段获取,与测算环节参数一样 + rules_dict 测算环节筛选的待泛化规则集 + rule_all 当前已经在线上运行的所有规则对应的决策结果标签字段,1代表拒绝,0代表未拒绝 + use_credit_flag 授信申请通过后是否用信标签字段,1代表用信,0代表未用信 + circle_mth 申请月对应的字段,在进行策略泛化的时候的会按月进行泛化,分析策略触碰情况和风险表现情况 + circle_week 申请周对应的字段,在进行策略泛化的时候会按申请周进行泛化,分析近10周策略触碰情况 + circle_day 申请日对应的字段,在进行策略泛化的时候会按申请日进行泛化,分析近10日策略触碰情况 + base_lift 策略泛化时,取额外触碰样本的Lift值与base_lift进行比较,若额外触碰Lift值大于base_lift则说明策略效果较好 + subset_total 是否获取全量样本作为计算整体,若取值为False则分母为全样本,计算各种指标时是从全量样本维度考虑的,若取值为True则分母为样本类型对应的样本 + """ + + target_ripe = {'fpd_30_act': ['agr_fpd_30'], 'mob3_dpd_30_act': ['agr_mob3_dpd_30']} + + # 在进行策略测算时,若除测算全量样本(Total)外还测算了类型1和类型2的样本,假设类型1和类型2所在的字段为ordertype,则需设置sample_type_col参数,否则不需要进行设置。 + # sample_type_col = { + # '类型1': ['ordertype', ['类型1']], + # '类型2': ['ordertype', ['类型2']] + # } + + # 对测算环节筛选的样本进行自动化泛化 + starttime = datetime.datetime.now() + print('程序开始执行时间为: ' + str(starttime)) + + rule_combine_results(data=mydata, rules_dict=rules_dict, rule_all='apply_refuse_flag', use_credit_flag='if_loan_flag', circle_mth='apply_mth', circle_week='apply_week', circle_day='apply_day', base_lift=3, subset_total=True) + + endtime = datetime.datetime.now() + print('程序开始执行时间为: ' + str(endtime - starttime)) + + # 6.基于步骤3策略泛化结果筛选泛化效果好的规则集进行合并泛化(不需要测算结果数据字典) + + # 此次未筛选到足够多的泛化效果好的规则,只为跑通代码流程,代码执行结果供参考。基于泛化效果好的规则集,重构一条规则进行泛化,变量取值为1表示规则触碰,取值为0表示规则未触碰。 + + mydata['all_need_online_rule'] = mydata.apply(lambda x: 1 if (x['var3'] > 3 or x['var6'] > 5) else 0, axis=1) + + starttime = datetime.datetime.now() + print('程序开始执行时间为: ' + str(starttime)) + rule_combine_results_01(data=mydata, rule_all='apply_refuse_flag', use_credit_flag='if_loan_flag', cut_point=0, direction='>', rule_name='待上线规则合并泛化', rule_name_chinese='待上线规则合并泛化', var='all_need_online_rule', rule_type='CR', rule_limit='Total', circle_mth='apply_mth', circle_week='apply_week', circle_day='apply_day', target='mob3_dpd_30_act', base_lift=3, subset_total=True) + endtime = datetime.datetime.now() + print('程序执行时间为: ' + str(endtime - starttime)) diff --git a/requirements.txt b/requirements.txt index 67ae1ab..0c1b3d8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ Cython wget -numpy<=1.23.5,>1.23.1 +numpy>1.23.1 pandas matplotlib seaborn>=0.10.0 @@ -9,7 +9,7 @@ statsmodels<0.14,>=0.13.2 scikit-learn>=1.3.1 toad scorecardpy -ortools +ortools<9.8.0 ropwr>=0.4.0 optbinning CairoSVG>=2.7.0 @@ -26,3 +26,4 @@ six>=1.15.0 openpyxl==3.0.7 sweetviz numexpr +minepy diff --git a/scorecardpipeline/feature_engineering.py b/scorecardpipeline/feature_engineering.py new file mode 100644 index 0000000..9b9b2d8 --- /dev/null +++ b/scorecardpipeline/feature_engineering.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +""" +@Time : 2024/5/10 10:28 +@Author : itlubber +@Site : itlubber.art +""" +import numpy as np +import numexpr as ne +from pandas import DataFrame +from sklearn.base import BaseEstimator, TransformerMixin + + +class NumExprDerive(BaseEstimator, TransformerMixin): + """Derive features by expressions. + + Parameters + ----------- + derivings : list, default=None + Each entry is a (name, expr) pair representing a deriving rule. + + Examples + ----------- + >>> import pandas as pd + >>> from scorecardpipeline.feature_engineering import NumExprDerive + >>> X = pd.DataFrame({"f0": [2, 1.0, 3], "f1": [np.inf, 2, 3], "f2": [2, 3, 4], "f3": [2.1, 1.4, -6.2]}) + >>> fd = NumExprDerive(derivings=[("f4", "where(f1>1, 0, 1)"), ("f5"、"f1+f2"), ("f6", "sin(f1)"), ("f7", "abs(f3)")) + >>> fd.fit_transform(X) + """ + def __init__(self, derivings=None): + self.derivings = derivings + + def fit(self, X, y=None): + self._check_keywords() + self._validate_data(X, dtype=None, ensure_2d=True, force_all_finite=False) + return self + + def _check_keywords(self): + derivings = self.derivings + if derivings is None: + raise ValueError("Deriving rules should not be empty!") + if not isinstance(derivings, list): + raise ValueError("Deriving rules should be a list!") + for i, entry in enumerate(derivings): + if not isinstance(entry, tuple): + raise ValueError("The {}-th deriving rule should be a tuple!".format(i)) + if len(entry) != 2: + raise ValueError("The f}-th deriving rule is not a two-element (drived_name, expression) tuple!".format(i)) + name, expr = entry + if not isinstance(name, str) or not isinstance(expr, str): + raise ValueError("The {}-th deriving rule is not a two-string tuple!".format(i)) + + @staticmethod + def _get_context(X, feature_names=None): + if feature_names is not None: + return {name: X[:, i] for i, name in enumerate(feature_names)} + return {"f%d" % i: X[:, i] for i in range(X.shape[1])} + + def _transform_frame(self, X): + feature_names = X.columns.tolist() + self.features_names = feature_names + index = X.index + X = self._validate_data(X, dtype="numeric", ensure_2d=True, force_all_finite=False) + context = self._get_context(X, feature_names=feature_names) + n_derived = len(self.derivings) + X_derived = np.empty((X.shape[0], n_derived), dtype=np.float64) + derived_names = [] + for i, (name, expr) in enumerate(self.derivings): + derived_names.append(name) + X_derived[:, i] = ne.evaluate(expr, local_dict=context) + data = np.hstack((X, X_derived)) + columns = feature_names + derived_names + return DataFrame(data=data, columns=columns, index=index) + + def _transform_ndarray(self, X): + X = self._validate_data(X, dtype="numeric", ensure_2d=True, force_all_finite=False) + context = self._get_context(X, feature_names=None) + n_derived = len(self.derivings) + X_derived = np.empty((X.shape[0], n_derived), dtype=np.float64) + derived_names = [] + for i, (name, expr) in enumerate(self.derivings): + derived_names.append(name) + X_derived[:, i] = ne.evaluate(expr, local_dict=context) + return np.hstack((X, X_derived)) + + def transform(self, X): + if isinstance(X, DataFrame): + return self._transform_frame(X) + return self._transform_ndarray(X) + + def _more_tags(self): + return { + "X_types": ["2darray"], + "allow_nan": True, + } diff --git a/scorecardpipeline/feature_selection.py b/scorecardpipeline/feature_selection.py new file mode 100644 index 0000000..c8abc74 --- /dev/null +++ b/scorecardpipeline/feature_selection.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +""" +@Time : 2024/5/8 14:06 +@Author : itlubber +@Site : itlubber.art +""" + +from sklearn.feature_selection import RFECV, RFE, SelectFromModel, SelectKBest +from sklearn.model_selection import StratifiedKFold, GroupKFold diff --git a/scorecardpipeline/rule_extraction.py b/scorecardpipeline/rule_extraction.py index 1b6fe73..be625c8 100644 --- a/scorecardpipeline/rule_extraction.py +++ b/scorecardpipeline/rule_extraction.py @@ -19,12 +19,13 @@ from optbinning import OptimalBinning from sklearn.tree import DecisionTreeClassifier +from .rule import Rule from .utils import init_setting from .excel_writer import ExcelWriter, dataframe2excel class DecisionTreeRuleExtractor: - def __init__(self, target="target", labels=["positive", "negative"], feature_map={}, nan=-1., max_iter=128, writer=None, combiner=None, seed=None, theme_color="2639E9"): + def __init__(self, target="target", labels=["positive", "negative"], feature_map={}, nan=-1., max_iter=128, writer=None, seed=None, theme_color="2639E9", decimal=4): """决策树自动规则挖掘工具包 :param target: 数据集中好坏样本标签列名称,默认 target @@ -33,7 +34,11 @@ def __init__(self, target="target", labels=["positive", "negative"], feature_map :param nan: 在决策树策略挖掘时,默认空值填充的值,默认 -1 :param max_iter: 最多支持在数据集上训练多少颗树模型,每次生成一棵树后,会剔除特征重要性最高的特征后,再生成树,默认 128 :param writer: 在之前程序运行时生成的 ExcelWriter,可以支持传入一个已有的writer,后续所有内容将保存至该workbook中,默认 None + :param seed: 随机种子,保证结果可复现使用,默认为 None + :param theme_color: 主题色,默认 2639E9 克莱因蓝,可设置位其他颜色 + :param decimal: 精度,决策树分裂节点阈值的精度范围,默认 4,即保留4位小数 """ + self.decimal = decimal self.seed = seed self.nan = nan self.target = target @@ -77,57 +82,42 @@ def encode_cat_features(self, X, y): else: return X - def get_dt_rules(self, tree, feature_names, total_bad_rate, total_count): + def get_dt_rules(self, tree, feature_names): tree_ = tree.tree_ left = tree.tree_.children_left right = tree.tree_.children_right feature_name = [feature_names[i] if i != -2 else "undefined!" for i in tree_.feature] rules = dict() - result_dataframe = pd.DataFrame() - def recurse(node, depth, parent): # 搜每个节点的规则 - nonlocal result_dataframe + nonlocal rules if tree_.feature[node] != -2: # 非叶子节点,搜索每个节点的规则 name = feature_name[node] - thd = np.round(tree_.threshold[node], 3) - s = "{} <= {} ".format(name, thd, node) + thd = np.round(tree_.threshold[node], self.decimal) + s = Rule("{} <= {}".format(name, thd)) # 左子 if node == 0: rules[node] = s else: - rules[node] = rules[parent] + ' & ' + s + rules[node] = rules[parent] & s + recurse(left[node], depth + 1, node) - s = "{} > {}".format(name, thd) + + s = Rule("{} > {}".format(name, thd)) # 右子 if node == 0: rules[node] = s else: - rules[node] = rules[parent] + ' & ' + s + rules[node] = rules[parent] & s recurse(right[node], depth + 1, node) - else: - result = pd.DataFrame() - result['组合策略'] = rules[parent], - result['好样本数'] = tree_.value[node][0][0].astype(int) - result['好样本占比'] = result['好样本数'] / (total_count * (1 - total_bad_rate)) - result['坏样本数'] = tree_.value[node][0][1].astype(int) - result['坏样本占比'] = result['坏样本数'] / (total_count * total_bad_rate) - result['命中数'] = result['好样本数'] + result['坏样本数'] - result['命中率'] = result['命中数'] / total_count - result['坏率'] = result['坏样本数'] / result['命中数'] - result['样本整体坏率'] = total_bad_rate - result['LIFT值'] = result['坏率'] / result['样本整体坏率'] - - result_dataframe = pd.concat([result_dataframe, result], axis=0) recurse(0, 1, 0) - return result_dataframe.sort_values("LIFT值", ascending=True)[self.describe_columns].reset_index(drop=True) + return list(rules.values()) def select_dt_rules(self, decision_tree, x, y, lift=0., max_samples=1., save=None, verbose=False, drop=False): - rules = self.get_dt_rules(decision_tree, x.columns, sum(y) / len(y), len(y)) - total_rules = len(rules) + rules = self.get_dt_rules(decision_tree, x.columns) try: viz_model = dtreeviz.model(decision_tree, @@ -140,9 +130,15 @@ def select_dt_rules(self, decision_tree, x, y, lift=0., max_samples=1., save=Non except AttributeError: raise "请检查 dtreeviz 版本" - rules = rules.query(f"LIFT值 >= {lift} & 命中率 <= {max_samples}").reset_index(drop=True) + rules_reports = pd.DataFrame() + for rule in rules: + rules_reports = pd.concat([rules_reports, rule.report(x.join(y), target=y.name).query("分箱 == '命中'")]) - if len(rules) > 0: + rules_reports = rules_reports.rename(columns={"指标名称": "组合策略", "样本总数": "命中数", "样本占比": "命中率"}).drop(columns=["分箱"]) + rules_reports["样本整体坏率"] = round(y.mean(), self.decimal) + rules_reports = rules_reports.query(f"LIFT值 >= {lift} & 命中率 <= {max_samples}").reset_index(drop=True) + + if len(rules_reports) > 0: # font_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'matplot_chinese.ttf') # font_manager.fontManager.addfont(font_path) # plt.rcParams['font.family'] = font_manager.FontProperties(fname=font_path).get_name() @@ -166,9 +162,9 @@ def select_dt_rules(self, decision_tree, x, y, lift=0., max_samples=1., save=Non if verbose: from IPython.core.display_functions import display if self.feature_map is not None and len(self.feature_map) > 0: - display(rules.replace(self.feature_map, regex=True)) + display(rules_reports.replace(self.feature_map, regex=True)) else: - display(rules) + display(rules_reports) display(decision_tree_viz) if save: if os.path.dirname(save) and not os.path.exists(os.path.dirname(save)): @@ -195,43 +191,25 @@ def select_dt_rules(self, decision_tree, x, y, lift=0., max_samples=1., save=Non os.remove("combine_rules_cache") if drop: - if len(rules) > 0: - return rules, decision_tree.feature_names_in_[list(decision_tree.feature_importances_).index(max(decision_tree.feature_importances_))], total_rules + if len(rules_reports) > 0: + return rules_reports, decision_tree.feature_names_in_[list(decision_tree.feature_importances_).index(max(decision_tree.feature_importances_))], len(rules_reports) else: - return rules, decision_tree.feature_names_in_[list(decision_tree.feature_importances_).index(min(decision_tree.feature_importances_))], total_rules + return rules_reports, decision_tree.feature_names_in_[list(decision_tree.feature_importances_).index(min(decision_tree.feature_importances_))], len(rules_reports) else: - return rules, total_rules + return rules_reports, len(rules_reports) def query_dt_rules(self, x, y, parsed_rules=None): - total_count = len(y) - total_bad_rate = y.sum() / len(y) - - rules = pd.DataFrame() - if isinstance(parsed_rules, pd.DataFrame): - parsed_rules = parsed_rules["组合策略"].unique() + parsed_rules = [Rule(r) for r in parsed_rules["组合策略"].unique()] + rules_reports = pd.DataFrame() for rule in parsed_rules: - select_index = x.query(rule).index - if len(select_index) > 0: - y_select = y[select_index] - df = pd.Series() - df['组合策略'] = rule - df['好样本数'] = len(y_select) - y_select.sum() - df['好样本占比'] = df['好样本数'] / (total_count * (1 - total_bad_rate)) - df['坏样本数'] = y_select.sum() - df['坏样本占比'] = df['坏样本数'] / (total_count * total_bad_rate) - df['命中数'] = df['好样本数'] + df['坏样本数'] - df['命中率'] = df['命中数'] / total_count - df['坏率'] = df['坏样本数'] / df['命中数'] - df['样本整体坏率'] = total_bad_rate - df['LIFT值'] = df['坏率'] / df['样本整体坏率'] - else: - df = pd.Series({'组合策略': rule, '好样本数': 0, '好样本占比': 0., '坏样本数': 0, '坏样本占比': 0., '命中数': 0, '命中率': 0., '坏率': 0., '样本整体坏率': total_bad_rate, 'LIFT值': 0., }) + rules_reports = pd.concat([rules_reports, rule.report(x.join(y), target=y.name).query("分箱 == '命中'")]) - rules = pd.concat([rules, pd.DataFrame(df).T]).reset_index(drop=True) + rules_reports = rules_reports.rename(columns={"指标名称": "组合策略", "样本总数": "命中数", "样本占比": "命中率"}).drop(columns=["分箱"]) + rules_reports["样本整体坏率"] = round(y.mean(), self.decimal) - return rules[self.describe_columns] + return rules_reports def insert_dt_rules(self, parsed_rules, end_row, start_col, save=None, sheet=None, figsize=(500, 350)): if isinstance(sheet, Worksheet): @@ -239,7 +217,7 @@ def insert_dt_rules(self, parsed_rules, end_row, start_col, save=None, sheet=Non else: worksheet = self.writer.get_sheet_by_name(sheet or "决策树组合策略挖掘") - end_row, end_col = dataframe2excel(parsed_rules, self.writer, sheet_name=worksheet, start_row=end_row + 1, start_col=start_col, percent_cols=['好样本占比', '坏样本占比', '命中率', '坏率', '样本整体坏率', 'LIFT值'], condition_cols=["坏率", "LIFT值"]) + end_row, end_col = dataframe2excel(parsed_rules, self.writer, sheet_name=worksheet, start_row=end_row + 1, start_col=start_col, percent_cols=['好样本占比', '坏样本占比', '命中率', '坏样本率', '样本整体坏率', 'LIFT值', '坏账改善', '准确率', '精确率', '召回率', 'F1分数'], condition_cols=["坏样本率", "LIFT值"]) if save is not None: end_row, end_col = self.writer.insert_pic2sheet(worksheet, save, (end_row + 1, start_col), figsize=figsize) diff --git a/scorecardpipeline/scorecard.py b/scorecardpipeline/scorecard.py index 57603a6..e9278ec 100644 --- a/scorecardpipeline/scorecard.py +++ b/scorecardpipeline/scorecard.py @@ -146,13 +146,11 @@ def inverse_transform(self, X): def _more_tags(self): return { - "X_types": ["2darray"], "allow_nan": False, } class NPRoundStandardScoreTransformer(StandardScoreTransformer): - """Stretch the predict probability to a normal distributed score.""" def __init__(self, base_score=660, pdo=75, bad_rate=0.15, down_lmt=300, up_lmt=1000, round_decimals=0, greater_is_better=True, cutoff=None): self.round_decimals = round_decimals @@ -205,7 +203,6 @@ def fit(self, X, y=None, **fit_params): self.lambdas_ = np.array([self._box_cox_optimize(col) for col in X.T]) for i, lmbda in enumerate(self.lambdas_): X[:, i] = stats.boxcox(X[:, i], lmbda) - print(X.max(), X.min(), X.mean()) self.scaler_ = MinMaxScaler(feature_range=(self.down_lmt, self.up_lmt)).fit(X) return self diff --git a/scorecardpipeline/template.xlsx b/scorecardpipeline/template.xlsx index aff95ef67fc2bfb93e20349d118533c7b0536905..47b6a0b0a751f7371f13e0db9f8c1762aaec7155 100644 GIT binary patch delta 2719 zcmV;Q3Sjl(LGeMb+6aH9ur?YJ0{{Tz1^@sL0001ZY%h0ja%*C5Z)+}iZEUPn%Wm5+ z5WE-YKM1@l67{kzL9iXhADJ- z@c!NYQpm+jh=m0Jl}b>qbsam7qB$#x+7mUaz%v)JBpOV4<)~URlBt|AT^5e#x{*^7 zUZFKYEMI~l=5tP2Dri%(O0PjAD~JaAD(AK8&`SCexRS_4Q`=OOH9*XG!SziGimZ~x zM^}}QWL7}fD;$4XD+%8Se%OV<>vjUy&Q>L-QYbOkdjRdMN$ zAWBa%u346#9++auo-D|w9yPoGFLp7;$T`@^`B;JhwI6>Ln#qc2HWrlzsXb7CtE^h= zaV|i_)(QLCaLJ%|Ktd1>jD*HyrjCiutwt6Ja?TXQ=M>Fs#w6EH%G5%O+A+|Tjd;^`J04lxX`b1Wp2fJ~@vn`EV_u*rk`PtCfn=q z0~UXH6NDRU0{{Rq2><{M0001ZY%g#AthVdW}Dq?fnH3` zh#Y?3d^4nzN3G!AHPsDMGDYE8fIKP-RWg6MP0_Qf+@B+_F+`SxD@jvypbdJI{rE%D zm;Md?+O-b3`xVQR&k)~MFYi8v`SyCx!8m~}$X;L)l z9a+-+?p+fO@Qdv@+3nw0z18FpM)CbOG>Ws*YQ8-mE9{c6>3vL=w54T= zW==Ug!fGXRh};15HcFRpF&xV&g3z5SOE|3zXsp?GXGf!I_}wUDpn0;SWMqGDAT+I~1rA5I{Fb#u=#lu$TbHXPnS-IMLXUk<($jf@Vy zyQ%>882cic1wY4O;OCPd^rtg2_vf=o?B{V9t!LBKMV!YY?C}F%!2pM0_nunt@zO9s zIg>}NjtY&vAQG70Ab|*vO5owYPWCsGfCCki*dGwHvJb}w1hYMRz2A%( zbD{>#-N0<1!JW!j%{{)_6@POZ3%u+^TCq3`bEdg$=!r14w=hgqNda>swi+6Lf>==8 zWBjg`8`smcxCN)VU2ivmFnWWCrBu=%J18YujGtGHv3#j8??aSwK@JwL81JOF>DI5D zv=r7jQ~3ds*(v7h^ha#OxHyxp^S=obrOd)kwgtSP;`fCVWoK4=fqy0Mgym;g`@8IT zE6alZUc^}v#!pEwzZ-_ZEKHMN_^@~k(ky<=v*>PgH_!jj>7xG zHP3emd-rNiJYT+m0^tD-B1(Q4qhADX>lS6$(QU6Tjaj$CXZ$2Yyz2xlo(nH`FaxCu z`qZ}j&(091XvofvuWIML`=aaa&z3B?gPBo3Wa(=(Mb8o{zE%E<*?$7Lsy(izEl?PR zYJ3tc+Y^V4#t+@N@5O^*5{F3?XYJ8Dc3J#Wo-|mRPJ?5wNe5A$hWQ%_5nJbt?qhm` zz=E7?^JJJ_FyVi!Sr_$Rvy2#r0|oVS{vA}a7#uVKf77@ISfXZ6E}FPS<6F~Swnk`4 zTV?zA7T6Fo^|3wYem&==*b! z(W1D#$aq7!Ht=M01I9_PfhQ?Td6T1^a}CAV@*UL7M&6;kSZY%<=Z|KK8^+(+7H~qy zHLk%if59BX9WZQ0B03@kACb+6sd|9m7%HeiIg8^c#@}8CrnbKh^vc9pOLu5|r(@hH zTkt^~-FquXW81b-oAxn${usZm9-jNEp;XD7dI0u&iO`!2;7lZPJJ38t_%8WIBl z0OXTtA2b_y6NDRU0{{Rq2><{M00000000000000001K12A36e|50kJD6_W`d5F59T zaYcm!007AZ000;O000000000000000c#||BMFBIDdLSbk^>h9mQ~>}0djbFe5dZ)H Z0000000000000t`xF943ogM%H0054l1`hxL delta 2700 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 G0001Q6AK#v