分享

使用pandas进行变量衍生

 乙甲壬 2020-07-18
import pandas as pdimport numpy as npdic={'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'])
使用pandas进行变量衍生

  上图是一个记录客户近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_valueauto_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)]>0else 0#计算每期记录是否逾期    return result #输出加总逾期次数结果df1['加总逾期次数']=df1.apply(lambda x:delqcnt(x,10),axis=1)

结果:

使用pandas进行变量衍生

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)]>0else 0#计算连续逾期次数        result=max(result,temp) #每一段连续逾期比较,取最大的一段逾期    return result #输出最大的逾期次数df1['最大的连续逾期次数']=df1.apply(lambda x:maxcontinue(x,10),axis=1)
使用pandas进行变量衍生

即计算还款历史中连续大于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)]>0else 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_valuedf1['最近一次逾期距今月份数_2']=lastdelq_(df1,10)
使用pandas进行变量衍生

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)
使用pandas进行变量衍生

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)
使用pandas进行变量衍生

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 resultdf1['每两个月间的增长量的最大值']=df1.apply(lambda x:maxtwomonth_interval(x,9),axis=1)
使用pandas进行变量衍生

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, 10)    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_valuedf1['最近p个月取最大值的月份距现在的月份数']=maxmonth_interval(df1,10)
使用pandas进行变量衍生

8.计算最近p个月的均值

def Avg(x,p):    df=x.ix[:,'delq1':'delq'+str(p)]    auto_value=np.nanmean(df,axis=1)    return auto_valuedf1['最近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_valuedf1['最近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_valuedf1['最近p个月的最大值']=Max(df1,10)
使用pandas进行变量衍生

【作者】:Labryant

【原创公众号】:风控猎人

【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。

【转载说明】:转载请说明出处,谢谢合作!~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多