import pandas as pd
import numpy as np
dic={'delq1':[0,0,1],
'delq2':[1,1,2],
'delq3':[2,0,3],
'delq4':[0,1,4],
'delq5':[1,2,5],
'delq6':[1,3,0],
'delq7':[1,0,1],
'delq8':[0,0,2],
'delq9':[0,1,3],
'delq10':[0,2,0]}
df1=pd.DataFrame(data=dic,index=['cust1','cust2','cust3'])
上图是一个记录客户近10期的逾期记录的数据框,基于逾期行为数据进行变量的衍生。比如cust1客户,最近1期状态为M0,最近2期状态为M1,还款历史字段应为“0001110210”。
1.计算近p期总逾期次数
方法一:
def month_count(df, p):
auto_value=np.where(df>0,1,0).sum(axis=1)
return auto_value
auto_value=month_count(df1,10)
方法二:
def delqcnt(x,term):
result=0
j=term+1
for i in range(1,j):
result=result+(1 if (x['delq'+str(i)]>0) else 0) #计算每期记录是否逾期
return result #输出加总逾期次数结果
df1['加总逾期次数']=df1.apply(lambda x:delqcnt(x,10),axis=1)
结果:
2.计算近p期最大的连续逾期次数
def maxcontinue(x,term):
result=0
temp=0 #临时存储的变量
j=term+1
for i in range(1,j):
if (x['delq'+str(i)]==0) :
temp=0 #如果当前字段不逾期,重新计算连续次数
temp=temp+(1 if (x['delq'+str(i)]>0) else 0) #计算连续逾期次数
result=max(result,temp) #每一段连续逾期比较,取最大的一段逾期
return result #输出最大的逾期次数
df1['最大的连续逾期次数']=df1.apply(lambda x:maxcontinue(x,10),axis=1)
即计算还款历史中连续大于0的个数,cust1客户最大连续逾期次数为3,为1->1->1,cust3连续逾期次数为5,为1->2->3->4->5。
3.最近一次逾期距今月份数
方法一:
def lastdelq(x,term):
result=99 #输出结果默认为99
j=term+1 #为了获取到相应的字段
for i in range(1,j): #循环取值
result=min(result,(i if (x['delq'+str(i)]>0) else 99)) #计算最近一次逾期距今月份数
return result #输出最近一次逾期距今月份数
df1['最近一次逾期距今月份数_1']=df1.apply(lambda x:lastdelq(x,10),axis=1)
方法二:
def lastdelq_(df1,term):
auto_value=[]
for i in range(len(df1)):
row_value=df1.ix[i,'delq1':'delq'+str(term)]
if row_value.max()<=0:
indexs=0
auto_value.append(indexs)
else:
indexs=1
for j in row_value:
if j>0:
break
indexs+=1
auto_value.append(indexs)
return auto_value
df1['最近一次逾期距今月份数_2']=lastdelq_(df1,10)
4.计算逾期连续增加的次数
def maxcontinuechg(x,term):
result=0 #输出结果默认为0
temp=0 #临时变量设置为0
for i in range(1,term): #循环取值
j=i+1 #取后一位期数的值
if (x['delq'+str(j)]<=x['delq'+str(i)]):
temp=0 #若逾期期数没有增加,设置临时变量为0
temp=temp+(1 if (x['delq'+str(j)]>x['delq'+str(i)]) else 0) #计算逾期连续增加的次数
result=max(result,temp) #若有多段连续逾期,比对取最大的一段
return result #输出逾期连续增加的次数
df1['逾期连续增加的次数']=df1.apply(lambda x:maxcontinuechg(x,10),axis=1)
5.计算逾期增加的次数
def maxcontinuechg(x,term):
result=0 #输出结果默认为0
temp=0 #临时变量设置为0
for i in range(1,term): #循环取值
j=i+1 #取后一位期数的值
temp=temp+(1 if (x['delq'+str(j)]>x['delq'+str(i)]) else 0) #计算逾期连续增加的次数
result=max(result,temp) #若有多段连续逾期,比对取最大的一段
return result #输出逾期增加的次数
df1['逾期增加的次数']=df1.apply(lambda x:maxcontinuechg(x,10),axis=1)
6.计算最近p个月,每两个月间的增长量的最大值
def maxtwomonth_interval(x,term):
result=0
for i in range(1,term):
j=i+1
temp=x[j]-x[i]
# print(temp)
result=max(result,temp)
return result
df1['每两个月间的增长量的最大值']=df1.apply(lambda x:maxtwomonth_interval(x,9),axis=1)
7.计算最近p个月取最大值的月份距现在的月份数
def maxmonth_interval(x,term):
df=x.ix[:,'delq1':'delq'+str(term)]
df['_max'] = np.nanmax(df, axis=1)
for i in range(1, term + 1):
df['delq' + str(i)] = list(df['delq' + str(i)] == df['_max'])
df_value = np.where(df == True, 1, 0)
auto_value = []
for i in range(len(df_value)):
row_value = df_value[i, :]
indexs = 1
for j in row_value:
if j == 1:
break
indexs += 1
auto_value.append(indexs)
return auto_value
df1['最近p个月取最大值的月份距现在的月份数']=maxmonth_interval(df1,10)
8.计算最近p个月的均值
def Avg(x,p):
df=x.ix[:,'delq1':'delq'+str(p)]
auto_value=np.nanmean(df,axis=1)
return auto_value
df1['最近p个月的均值']=Avg(df1,10)
计算最近p个月的和
def Tot(x,p):
df=x.ix[:,'delq1':'delq'+str(p)]
auto_value=np.nansum(df,axis=1)
return auto_value
df1['最近p个月的求和']=Tot(df1,10)
计算最近p个月特征的最大值
def Max(x,p):
df=x.ix[:,'delq1':'delq'+str(p)]
auto_value=np.nanmax(df,axis=1)
return auto_value
df1['最近p个月的最大值']=Max(df1,10)
【作者】:Labryant
【原创公众号】:风控猎人
【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。
【转载说明】:转载请说明出处,谢谢合作!~
页面更新:2024-05-22
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号