阿里天池零基础入门金融风控-贷款违约预测文本处理
阿里天池零基础入门金融风控-贷款违约预测文本处理
- 文本处理
- 日期处理
- 等级处理
- 就业年限处理
- 删除含有空值的行
- 数据归一化
- 踩坑
文本处理
日期处理
earliesCreditLine:
可以看到earliesCreditLine使用的是英文月份-年来进行存储的。
这里我们使用’-'的正则表达式分开月和年,再用判断语句将英文月份转化为数字月份最后将二者的存储格式统一。
这里代码段使用的不是很好,最好是使用
df.iloc['earliesCreditLine']
获得earliesCreditLine列,因为后续处理test数据时,他们列号对应可能不同,这样写移植性下降。
分开年月代码段
issueDate_originaldata = df.iloc[:, -18]#获得earliesCreditLine列
compiled_re = re.compile(r"-")#使用-将年月分开
i = 0
issueDate_afterdata = []#分开后的数据存储其中
for data in issueDate_originaldata:issueDate_afterdata.append(compiled_re.split(data))i = i + 1#获得数据个数
转化月份代码段
#将存储格式转化为年-月形式
issueDate_lastdata = []
for j in range(i):if issueDate_afterdata[j][0] == 'Jan':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '01')elif issueDate_afterdata[j][0] == 'Feb':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '02')elif issueDate_afterdata[j][0] == 'Mar':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '03')elif issueDate_afterdata[j][0] == 'Apr':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '04')elif issueDate_afterdata[j][0] == 'May':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '05')elif issueDate_afterdata[j][0] == 'Jun':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '06')elif issueDate_afterdata[j][0] == 'Jul':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '07')elif issueDate_afterdata[j][0] == 'Aug':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '08')elif issueDate_afterdata[j][0] == 'Sep':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '09')elif issueDate_afterdata[j][0] == 'Oct':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '10')elif issueDate_afterdata[j][0] == 'Nov':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '11')elif issueDate_afterdata[j][0] == 'Dec':issueDate_lastdata.append(issueDate_afterdata[j][1] + '-' + '12')
#存储在DataFrame格式中
df_issueDate_lastdata = pd.DataFrame(issueDate_lastdata,columns=['issueDate_lastdata'])
issueDate
首先看到issuedDate对应的贷款发放月份格式为年-月-日
这里我们使用同上的正则表达式可以将年月日分开
之后我们便可以计算二者的日期之差了
这里df.iloc[j,12]获得的是一个数据,如果是使用df.loc[,[列名]]获得的是一个dataframe,不能对数据直接进行操作。
print(df.iloc[1, 12])
print(df.loc[1, ['issueDate']])
计算日期之差代码段
countday = []
for j in range(i):last_data = df.iloc[j, 12]#issuedDate列begin_data = df_issueDate_lastdata.iloc[j,0]#处理后的earliesCreditLine列#############df_issueDate_lastdata.iloc[j,:]不对 虽然只有一行 但是返回出来的不是一个数值 而是列表形式last_data_number=compiled_re.split(last_data)begin_data_number = compiled_re.split(begin_data)mon = -int(begin_data_number[1]) + int(last_data_number[1])year = -int(begin_data_number[0]) + int(last_data_number[0])day = int(last_data_number[2])total = year * 365 + mon * 31 + daycountday.append(total)
print(countday)
df['countday']=countday
df.drop(['issueDate'],axis=1,inplace=True)
df.drop(['earliesCreditLine'],axis=1,inplace=True)#坑 删除的话还要加inplace=True
print(df)
df.to_csv('./Result.csv',index=False)#保存时去索引 否则会多加第一列
等级处理
可以发现subGrade中含有grade的信息,于是规约等级的时候以subGrade列来进行规约。
因为要进行规约所以有一个判断的过程,因此要求出grade中的最大值 求grade最大值代码段
。
print("max=")
print(df['grade'].max())
转化subGrade时因为要将subGrade的字母和数字分开所以要使用二个正则表达式进行分割。
分割字母和数字正则表达式
compiled_re2 = re.compile(r"[A-Za-z]")
compiled_re3 = re.compile(r"\d")
转化subGrade代码段
gradescore=[]
for subGrade in df['subGrade']:a=compiled_re2.findall(subGrade)b=compiled_re3.findall(subGrade)if (a[0]=='A')or (a[0]=='a'):score=10elif (a[0]=='B')or (a[0]=='b'):score = 20elif (a[0]=='C')or (a[0]=='c'):score = 30elif (a[0]=='D')or (a[0]=='d'):score = 40elif (a[0]=='E')or (a[0]=='e'):score = 50elif (a[0]=='F')or (a[0]=='F'):score = 60elif (a[0]=='G')or (a[0]=='g'):score = 70else:score=0score+=int(b[0])#b为列表 要加[0]gradescore.append(score)
df['gradescore']=gradescore#添加gradescore列
df.drop(['grade'],axis=1,inplace=True)
df.drop(['subGrade'],axis=1,inplace=True)
df.to_csv('./Result.csv',index=False)
就业年限处理
这个数据的处理与等级处理大致相同,不同点在于数据中含有NAN类型的数据,在正则匹配之前若不处理则程序会报错。
处理就业年限代码段
。
compiled_number = re.compile(r"\d")
compiled_sign=re.compile(r"\W")
number=0
employmentLength_array=[]
for employmentLength in df['employmentLength']:#print(employmentLength)if employmentLength!=employmentLength:#判断FLOAT值是否为空(NAN) 坑employmentLength=0number=0else:a = compiled_number.findall(employmentLength)b = compiled_sign.findall(employmentLength)digit = len(a)number = 0for i in range(digit):number=number*10+float(a[i])digit=digit-1if b[0]=='<':number=number-0.5elif b[0]=='>'or b[0]=='+':number=number+0.5employmentLength_array.append(number)
print(employmentLength_array)
df.drop(['employmentLength'],axis=1,inplace=True)#坑 删除的话还要加inplace=True
df['employmentLength']=employmentLength_array
df.to_csv('./Result.csv',index=False)
删除含有空值的行
这里使用nullcolumn=df[df.isnull().T.any()] 获得含有空值的行,然后用nullcolumn.index.values获得索引值 这样写可以保证删除时的一一对应。
########################################删除空值
'''
df = pd.read_csv("./Result.csv")
nullcolumn=df[df.isnull().T.any()] #获得含有空值的行
print(nullcolumn)
nullcolumn_number=nullcolumn.index.values#获得空值对应索引值
df.drop(index=nullcolumn_number,axis=0,inplace=True)
df.to_csv('./Result2.csv',index=False)
数据归一化
##################数据归一化
df = pd.read_csv("./TESTResult2.csv")
#print(df.info())#确定都是数值类型
df = (df-df.min())/(df.max()-df.min())#即简单实现标准化
df.drop(['id'],axis=1,inplace=True)#删除ID列 非决定属性列
df.drop(['policyCode'],axis=1,inplace=True)#删除policyCode列 此列无意义
df.to_csv('./TESTResult3.csv',index=False)
踩坑
issueDate_originaldata = df.iloc[:, -18]#获得earliesCreditLine列
这里代码段使用的不是很好,最好是使用
df.iloc['earliesCreditLine']
获得earliesCreditLine列,因为后续处理test数据时,他们列号对应可能不同,这样写移植性下降。
2.
df.iloc[j,12]获得的是一个数据,如果是使用df.loc[,[列名]]获得的是一个dataframe,不能对数据直接进行操作。
print(df.iloc[1, 12])
print(df.loc[1, ['issueDate']])
print(df.loc[1, ['issueDate']].values)
print(df.loc[1, ['issueDate']].values[0])
dataframe.values获得行值,以列表的形式返回
3.
dataframe删除列时候若想直接在原表删除要加inplace=True:
df.drop(['employmentLength'],axis=1,inplace=True)#坑 删除的话还要加inplace=True
否则将其赋予一个df2,然后保存df2至csv这样新的csv中删除了对应的列,原表无变化
DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
参数说明:
labels 就是要删除的行列的名字,用列表给定
axis 默认为0,指删除行,因此删除columns时要指定axis=1;
index 直接指定要删除的行
columns 直接指定要删除的列
inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe;
inplace=True,则会直接在原数据上进行删除操作,删除后无法返回。因此,删除行列有两种方式:
1)labels=删除的行列名,axis=0 /1的组合
2)index或columns直接指定要删除的行或列
Dataframe数据保存到csv文件中时,如果不加index=False则会在第一列中加入索引
df.to_csv('./Result.csv',index=False)
阿里天池零基础入门金融风控-贷款违约预测文本处理相关推荐
- 零基础入门金融风控-贷款违约预测-机器学习-数据分析
零基础入门金融风控-贷款违约预测 一.赛题数据 赛题以预测用户贷款是否违约为任务,数据集报名后可见并可下载,该数据来自某信贷平台的贷款记录,总数据量超过120w,包含47列变量信息,其中15列为匿名变 ...
- 零基础入门金融风控-贷款违约预测-Task05——模型融合
有幸参加了阿里云举办的零基础入门金融风控-贷款违约预测训练营.收获颇多. 每天记录一些自己之前的知识盲点,需经常温习. 第五次的学习任务,是模型融合. 一.模型融合常用方法 模型融合有常用的如下六种方 ...
- 笔记之零基础入门金融风控-贷款违约预测
零基础入门金融风控-贷款违约预测 赛题描述 赛题概况 数据概况 合理的创建标题,有助于目录的生成 预测指标 赛题流程 评分卡 笔记记录转载 赛题描述 赛题以金融风控中的个人信贷为背景,要求选手根据贷款 ...
- 零基础入门金融风控-贷款违约预测_Task1
贷款违约预测_Task1 零基础入门金融风控-贷款违约预测_Task1 数据概况 预测指标 零基础入门金融风控-贷款违约预测_Task1 数据概况 数据包含三部分:训练集(train.csv).测试集 ...
- 零基础入门金融风控-贷款违约预测
写在前面: 刚接触数据挖掘,看了几页python就跳进了这个大坑,也不知道该咋写这个博客,先瞎写着吧.介绍下自己参加的这个项目,是Datawhale和天池比赛联合发起的,我们在Datawhale组对学 ...
- 零基础入门金融风控-贷款违约预测-Task4 建模与调参
此部分为零基础入门金融风控的 Task4 建模调参部分,带你来了解各种模型以及模型的评价和调参策略,欢迎大家后续多多交流. 项目地址 比赛地址 4.1 学习目标 学习在金融分控领域常用的机器学习模型 ...
- 天池新人赛-零基础入门金融风控-贷款违约预测-排名174
赛题以预测用户贷款是否违约为任务,该数据来自某信贷平台的贷款记录,总数据量超过120w,包含47列变量信息,其中15列为匿名变量.从中抽取80万条作为训练集,20万条作为测试集A,20万条作为测试集B ...
- DataWhale天池-金融风控贷款违约预测-Task01赛题理解
目录 一.赛题概况 二.数据集介绍 三.预测指标 理解 通过ROC曲线评估分类器 最佳阈值点选择 一.赛题概况 本次新人赛是Datawhale与天池联合发起的0基础入门系列赛事第四场 -- 零基础入门 ...
- 基于机器学习与深度学习的金融风控贷款违约预测
基于机器学习与深度学习的金融风控贷款违约预测 目录 一.赛题分析 1. 任务分析 2. 数据属性 3. 评价指标 4. 问题归类 5. 整体思路 二.数据可视化分析 1. 总体数据分析 2. 数值型数 ...
最新文章
- Linux下Nginx访问web目录提示403Forbidden
- vue 找回密码_vue实现个人信息查看和密码修改功能
- python json.dumps 中的ensure_ascii 参数引起的中文编码问题
- ASP.Net缓存总结
- Dubbo-Admin-0.2.0服务管理中心安装
- java duration 时间差_java8 计算时间差的方法示例
- jbpm知识点——state
- 华为 鸿蒙系统(HarmonyOS)
- 信息安全铁人三项赛真题解析_对 [CrackMe] 【ctf】2018信息安全铁人三项赛个人赛总决赛赛题分享 的一些补充...
- Spring读书笔记-----Spring的Bean之设置Bean值
- form表单问题记录
- Floyd算法(matlab实现)
- HTML5+CSS期末大作业:个人网站设计——响应式个人简历介绍网页(5页) HTML+CSS+JavaScript
- canvas视频录制
- SL400装WIN7后声音键无法使用的解决方法
- 恩尼格玛模拟器_使用ENIGMA模拟器进行数据加密和解密
- CPU使用率100%怎么办
- C语言 平面向量加法
- Python软件编程等级考试一级——20220915
- jmeter分布式执行远程机报错,提示“Engine is busy – please try later”