1.导入Pyhon模块/获取数据集
import pandas as pd
import numpy as np
print("获取数据集")
file_name_data = 'd:/Users/jiangxiangtao/Desktop/叉车测试数据文件/叉车测试数据值.xlsx'
df_data = pd.read_excel(file_name_data)
2.规则判断
#提取客户ID
df_data_id =list(df_data['客户ID' ].drop_duplicates ())#删除重复值
df1 = []
df2 = []
print ('开始规则判断' )
for i in df_data_id:
data_1 = df_data.loc[ df_data['客户ID' ] == i ]#提取客户ID
#提取单条客户数据进行规则判定,通过输出0且通过,命中输出1且输出命中规则
if np.array(data_1['调整后客户级别'])=="白名单D类客户" and np.array(data_1['客户类别']) !="个人/个体工商户" and np.array(data_1['有无保证人']) =="无":
df1.append (1)
df2.append ('白名单D类客户且非个人/个体工商户无保证人' )
elif np.array(data_1['所属名单'])=="灰名单" and np.array(data_1['客户类别']) !="个人/个体工商户" and np.array(data_1['有无保证人']) =="无":
df1.append (1)
df2.append ('灰名单客户且非个人/个体工商户无保证人' )
elif np.array ( data_1['调整后客户级别'])=="白名单D类客户" and np.array ( data_1['租期(月)' ] ) <1 and np.array ( data_1['应付预付款' ] ) < np.array ( data_1['租金总额' ] ):
df1.append (1 )
df2.append ("白名单D类客户且租期<1个月且预收款<合同金额" )
elif np.array ( data_1['调整后客户级别'])=="白名单D类客户" and np.array ( data_1['租期(月)' ] ) >=1 and np.array ( data_1['应付预付款' ] ) < np.array ( data_1['预计月租金' ] ):
df1.append (1 )
df2.append ("白名单D类客户且建筑业企业且租期≥1个月且预收款<该订单月租金" )
elif np.array ( data_1['所属名单' ] ) =="灰名单" and np.array ( data_1['租期(月)' ] ) <1 and np.array (
data_1['应付预付款' ] ) < np.array ( data_1['租金总额' ] ):
df1.append (1 )
df2.append ("灰名单客户且租期<1个月且预收款<合同金额" )
elif np.array ( data_1['所属名单' ] ) =="灰名单" and np.array ( data_1['租期(月)' ] ) >=1 and np.array (
data_1['应付预付款' ] ) < np.array ( data_1['预计月租金' ] ):
df1.append (1 )
df2.append ("灰名单客户且建筑业企业且租期≥1个月且预收款<该订单月租金" )
elif np.array ( data_1['调整后客户级别'])=="白名单D类客户" and np.array ( data_1['所属行业' ] ) =="建筑业" and np.array ( data_1['产品分类' ] )=="搬运车" or np.array ( data_1['产品分类' ] )=="堆高车" and np.array ( data_1['单台押金' ] ) <1000 :
df1.append (1 )
df2.append ("白名单D类且建筑业企业搬运车/堆高车押金<1000元/台" )
elif np.array ( data_1['调整后客户级别'])=="白名单D类客户" and np.array ( data_1['所属行业' ] ) =="建筑业" and np.array ( data_1['产品分类' ] )=="叉车" and np.array ( data_1['单台押金' ] ) <2000 :
df1.append (1 )
df2.append ("白名单D类且建筑业企业平衡重/前移式叉车押金<2000元/台" )
elif np.array ( data_1['客户类别'])=="个人/个体工商户" and np.array ( data_1['产品分类' ] )=="搬运车" or np.array ( data_1['产品分类' ] )=="堆高车" and np.array ( data_1['单台押金' ] ) <1000 :
df1.append (1 )
df2.append ("个体工商户搬运车/堆高车押金<1000元/台" )
elif np.array ( data_1['客户类别'])=="个人/个体工商户" and np.array ( data_1['产品分类' ] )=="叉车" and np.array ( data_1['单台押金' ] ) <2000 :
df1.append (1 )
df2.append ("个体工商户平衡重/前移式叉车押金<2000元/台" )
elif np.array ( data_1['调整后客户级别' ] ) =="白名单B类客户" and np.array ( data_1['事业部最长逾期' ] ) >90 :
df1.append (1 )
df2.append ("白名单B类客户租金事业部最长逾期天数>90天" )
elif np.array ( data_1['调整后客户级别' ] ) =="白名单B类客户" and np.array ( data_1['营业店最长逾期' ] ) >60 :
df1.append (1 )
df2.append ("白名单B类客户租金营业店最长逾期天数>60天" )
elif np.array ( data_1['调整后客户级别' ] ) =="白名单C类客户" and np.array ( data_1['事业部最长逾期' ] ) >60:
df1.append (1 )
df2.append ("白名单C类客户租金事业部最长逾期天数>60天" )
elif np.array ( data_1['调整后客户级别' ] ) =="白名单C类客户" and np.array ( data_1['营业店最长逾期' ] ) >30:
df1.append (1 )
df2.append ("白名单C类客户租金营业店最长逾期天数>30天" )
elif np.array ( data_1['调整后客户级别' ] ) =="白名单D类客户" and np.array ( data_1['事业部最长逾期' ] ) >30:
df1.append (1 )
df2.append ("白名单D类客户公司客户租金事业部最长逾期天数>30天" )
elif np.array ( data_1['所属名单' ] ) =="灰名单" and np.array ( data_1['事业部最长逾期' ] ) >30:
df1.append (1 )
df2.append ("灰名单客户租金事业部最长逾期天数>30天" )
elif np.array ( data_1['所属名单' ] ) =="灰名单" :
df1.append (1 )
df2.append ("灰名单客户" )
else:
df1.append(0)
df2.append("通过")
3.合并判断结果至结果表中
df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)
df1.columns=(["结果"])
df2.columns=(["命中规则"])
df_data_1 = df_data.join(df1)
df_data_2 = df_data_1.join(df2)
4.输出通过率和单规则命中情况
df3 = pd.pivot_table(df_data_2, values='客户ID', index='结果', columns=None, aggfunc='count', fill_value=None, margins=True, dropna=True, margins_name='All')#数据透视表
df4 = pd.pivot_table(df_data_2, values='客户ID', index='命中规则', columns=None, aggfunc='count', fill_value=None, margins=True, dropna=True, margins_name='All')#数据透视表
df5 = np.round(df4.apply(lambda x: x /433 *100),4)#统计单规则命中情况
print(df5.sort_values('客户ID'))
df10 = (1 - df_data_2['结果'].sum() /433) *100 #统计通过率
df11 = np.round(df10,2)#统计通过率
print("通过率为:",df11,"%")#统计通过率
5.得到明细结果数据
得到测试通过率,可检查通过率是否满足业务目标,若通过率低于目标值则可根据规则拒绝情况,调整规则后得到目标通过率。
上述规则均以内部合作记录建立,因外部征信数据如黑名单、多头、涉诉情况冷启动阶段无数据验证,可借用已上线的规则进行迁移学习,即现有的通过率减去各征信数据的拒绝率,从而得到接近真实情况的通过率情况。