- 检查是否有空值
for col in var_all: x = transaction_risk_sample[col].isnull().sum() if x != 0: print(col, x) 循环遍历每一个列 统计当前列的空值数据 得到rat_timelong_lst_avg这个列有47个空值
- 填充空值 用均值填充 训练和预测样本集都需要做处理
rat_timelong_lst_avg_mean = np.mean(transaction_risk_sample['rat_timelong_lst_avg'])#获取该列的均值 transaction_risk_sample['rat_timelong_lst_avg'].fillna(rat_timelong_lst_avg_mean, inplace = True) #对训练集补充空值 transaction_risk_score_sample['rat_timelong_lst_avg'].fillna(rat_timelong_lst_avg_mean, inplace = True) #对训练集补充空值
- 异常值处理
观察到所有的变量都是数值型(原数据未给出具体变量信息,只能从数据类型上判断) 由于未给出具体变量信息,无法判断是否异常值,故此处不做异常值处理
- 分组操作
transaction_risk_sample.groupby(['cnt_result', 'target']).size() 先以cnt_result字段分组 再根据target字段分组 最后统计每一组的大小 和数据库分组的概念是一样的
- 导入画图的库
import matplotlib.pyplot as plt import seaborn as sns
如果报错
ImportError: No module named 'seaborn'
安装此库
pip3 install seaborn
- 画图探索每组违约率差异
df = pd.DataFrame() #创建一个新的表 df['total'] = transaction_risk_sample.groupby(['type_lst_login'])['target'].count() #计算每组的总数 df['bad'] = transaction_risk_sample.groupby(['type_lst_login'])['target'].sum() #计算每组违约总数 df['default_rate'] = df['bad']/df['total'] #计算每组违约率 df = df.reset_index() sns.barplot(data = df, x = 'type_lst_login', y = 'default_rate')
简单分析下这个逻辑
1、对样本结果表 transaction_risk_sample 先按照type_lst_login最后登陆时间分组 再按照target(是否违约 1违约0没有违约)进行分组 得到每一个登陆时间用户是否违约的情况 2、count()是包含target为0和1的情况 即每一个登陆时间内访问的用户数(总数) 3、sum() 仅包含target=1的情况 对所有的1进行求和 得到的是每一个登陆时间内 违约的用户数 4、每组违约的用户数 / 总数 得到每组的违约率 5、reset_index 设置索引 加快数据处理速度 6、barplot画图 x轴是登陆时间 y轴是每个登陆时间的违约率
- 对于连续型变量做箱线图 观察数据分布
var_num = [] for col in transaction_risk_sample.columns: x = transaction_risk_sample[].nunique() #观察每个变量里有多少个不同的值 print(col, x) var_num.append(col)
代码分析
训练遍历每一个列 获取当前列的不同值个数
- 箱线图
plt.boxplot(transaction_risk_sample['city_lst_login']) 获取city_lst_login最后的登陆城市这一列数据画箱线图