参考:Python手写了 35 种可解释的特征工程方法 - 腾讯云开发者社区-腾讯云
把计算每个用户额度使用率记为特征ft ,按照时间轴以月份p为切片展开,得到申请前30天内的额度使用率,申请前30天至60天内的额度使用率,申请前60天至90天内的额度使用率,…,申请前330天至360天内的额度使用率,得到用户的12个特征。
#读取数据
data = pd.read_excel('textdata.xlsx')
#指定参与衍生的变量名
FEATURE_LIST = ['ft','gt']
#指定聚合月份
P_LIST = [3,6]
#调用变量衍生函数
gen = feature_generation(data, FEATURE_LIST, P_LIST)
df = gen.fit_generate()
data 为需要处理的数据
feature_list 需要处理的变量名的前缀
p_list 需要聚合的月份
df 用于收集最终变量的数据表
使用分批迭代的方法,外层循环遍历需要衍生的特征,内层循环遍历月份,在循环中过generate函数将特征名和月份传入,将结果存入var_df,通过concat将var_df并如selt.df,最后返回self.df。Keras使用分批迭代(fit_generate)的方式训练数据_MXuDong的博客-CSDN博客_fit_generate
调用auto_var函数,将列名和数据传入results,用var_df储存,最后返回var_df
# 定义批量调用双参数的函数,具体函数请往下面看。
def auto_var(self, func):
if func == 'Num':
try:
return self.Num(self.inv, self.p)
except:
print("Num PARSE ERROR", self.inv, self.p)
elif func == 'Nmz':
try:
return self.Nmz(self.inv, self.p)
except:
print("Nmz PARSE ERROR", self.inv, self.p)
elif func == 'Evr':
try:
return self.Evr(self.inv, self.p)
except:
print("Evr PARSE ERROR", self.inv, self.p)
elif func == 'Avg':
try:
return self.Avg(self.inv, self.p)
except:
print("Avg PARSE ERROR", self.inv, self.p)
elif func == 'Tot':
try:
return self.Tot(self.inv, self.p)
except:
print("Tot PARSE ERROR", self.inv, self.p)
elif func == 'Tot2T':
try:
return self.Tot2T(self.inv, self.p)
except:
print("Tot2T PARSE ERROR", self.inv, self.p)
elif func == 'Max':
try:
return self.Max(self.inv, self.p)
except:
print("Tot PARSE ERROR", self.inv, self.p)
elif func == 'Min':
try:
return self.Min(self.inv, self.p)
except:
print("Min PARSE ERROR", self.inv, self.p)
elif func == 'Msg':
try:
return self.Msg(self.inv, self.p)
except:
print("Msg PARSE ERROR", self.inv, self.p)
elif func == 'Msz':
try:
return self.Msz(self.inv, self.p)
except:
print("Msz PARSE ERROR", self.inv, self.p)
elif func == 'Cav':
try:
return self.Cav(self.inv, self.p)
except:
print("Cav PARSE ERROR", self.inv, self.p)
elif func == 'Cmn':
try:
return self.Cmn(self.inv, self.p)
except:
print("Cmn PARSE ERROR", self.inv, self.p)
elif func == 'Std':
try:
return self.Std(self.inv, self.p)
except:
print("Std PARSE ERROR", self.inv, self.p)
elif func == 'Cva':
try:
return self.Cva(self.inv, self.p)
except:
print("Cva PARSE ERROR", self.inv, self.p)
elif func == 'Cmm':
try:
return self.Cmm(self.inv, self.p)
except:
print("Cmm PARSE ERROR", self.inv, self.p)
elif func == 'Cnm':
try:
return self.Cnm(self.inv, self.p)
except:
print("Cnm PARSE ERROR", self.inv, self.p)
elif func == 'Cxm':
try:
return self.Cxm(self.inv, self.p)
except:
print("Cxm PARSE ERROR", self.inv, self.p)
elif func == 'Cxp':
try:
return self.Cxp(self.inv, self.p)
except:
print("Cxp PARSE ERROR", self.inv, self.p)
elif func == 'Ran':
try:
return self.Ran(self.inv, self.p)
except:
print("Ran PARSE ERROR", self.inv, self.p)
elif func == 'Nci':
try:
return self.Nci(self.inv, self.p)
except:
print("Nci PARSE ERROR", self.inv, self.p)
elif func == 'Pdn':
try:
return self.Pdn(self.inv, self.p)
except:
print("Pdn PARSE ERROR", self.inv, self.p)
elif func == 'Cmx':
try:
return self.Cmx(self.inv, self.p)
except:
print("Cmx PARSE ERROR", self.inv, self.p)
elif func == 'Cmp':
try:
return self.Cmp(self.inv, self.p)
except:
print("Cmp PARSE ERROR", self.inv, self.p)
elif func == 'Cnp':
try:
return self.Cnp(self.inv, self.p)
except:
print("Cnp PARSE ERROR", self.inv, self.p)
elif func == 'Msx':
try:
return self.Msx(self.inv, self.p)
except:
print("Msx PARSE ERROR", self.inv, self.p)
elif func == 'Trm':
try:
return self.Trm(self.inv, self.p)
except:
print("Trm PARSE ERROR", self.inv, self.p)
elif func == 'Bup':
try:
return self.Bup(self.inv, self.p)
except:
print("Bup PARSE ERROR", self.inv, self.p)
elif func == 'Ncd':
try:
return self.Ncd(self.inv, self.p)
except:
print("Ncd PARSE ERROR", self.inv, self.p)
elif func == 'Ncn':
try:
return self.Ncn(self.inv, self.p)
except:
print("Ncn PARSE ERROR", self.inv, self.p)
elif func == 'Mai':
try:
return self.Mai(self.inv, self.p)
except:
print("Mai PARSE ERROR", self.inv, self.p)
elif func == 'Mad':
try:
return self.Mad(self.inv, self.p)
except:
print("Mad PARSE ERROR", self.inv, self.p)
elif func == 'Rpp':
try:
return self.Rpp(self.inv, self.p)
except:
print("Rpp PARSE ERROR", self.inv, self.p)
elif func == 'Dpp':
try:
return self.Dpp(self.inv, self.p)
except:
print("Dpp PARSE ERROR", self.inv, self.p)
elif func == 'Mpp':
try:
return self.Mpp(self.inv, self.p)
except:
print("Mpp PARSE ERROR", self.inv, self.p)
elif func == 'Npp':
try:
return self.Npp(self.inv, self.p)
except:
print("Npp PARSE ERROR", self.inv, self.p)
确定数据对应的月份及特征
def Num(self, inv, p):
df = self.data.loc[:, inv + '1':inv + str(p)].values
auto_value = np.where(df > 0, 1, 0).sum(axis=1)
return inv + '_num' + str(p), auto_value
用p和inv来代替月份和特征名。函数Num来说,传入不同的inv取值,会对不同的特征进行计算,而指定不同的p值,就会对不同的月份做聚合。因此只需要遍历每一个inv和每一种p的取值,就可以衍生出更深层次的特征。
where()函数,提取数据大于0的个数
详解Python中where()函数的用法_a_2435542821的博客-CSDN博客
def Evr(inv, p):
df = data.loc[:,inv+'1':inv+str(p)]
Arr = np.where(df>0,1,0).sum(axis=1)
auto_value = np.where(arr,1,0)
return inv+'_evr'+str(p), auto_value
def Avg(inv, p):
df = data.loc[:,inv+'1':inv+str(p)]
auto_value = np.nanmean(df, axis=1)
return inv+'_avg'+str(p), auto_value
nanmean()函数,沿指定轴计算算术平均值,忽略NaN。
python中mean函数_Python numpy.nanmean函数方法的使用_weixin_39666496的博客-CSDN
计算最近p个月特征inv的和。最近(2, p+1)个月,特征inv的和。计算最近p个月特征inv的最大值。计算最近p个月特征inv的最小值。类似。
def Msg(self, inv, p):
df = self.data.loc[:, inv + '1':inv + str(p)].values
df_value = np.where(df > 0, 1, 0)
auto_value = []
for i in range(len(df_value)):
row_value = df_value[i, :]
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 inv + '_msg' + str(p), auto_value
等等可根据相同方法理解代码