阿里天池零基础入门金融风控-贷款违约预测文本处理

    科技2024-05-31  81

    阿里天池零基础入门金融风控-贷款违约预测文本处理

    文本处理日期处理等级处理就业年限处理删除含有空值的行数据归一化 踩坑

    文本处理

    日期处理

    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 + day countday.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=10 elif (a[0]=='B')or (a[0]=='b'): score = 20 elif (a[0]=='C')or (a[0]=='c'): score = 30 elif (a[0]=='D')or (a[0]=='d'): score = 40 elif (a[0]=='E')or (a[0]=='e'): score = 50 elif (a[0]=='F')or (a[0]=='F'): score = 60 elif (a[0]=='G')or (a[0]=='g'): score = 70 else: score=0 score+=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=0 number=0 else: a = compiled_number.findall(employmentLength) b = compiled_sign.findall(employmentLength) digit = len(a) number = 0 for i in range(digit): number=number*10+float(a[i]) digit=digit-1 if b[0]=='<': number=number-0.5 elif b[0]=='>'or b[0]=='+': number=number+0.5 employmentLength_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)
    Processed: 0.015, SQL: 8