一、利用python衍生近几天的时间切片特征
源数据
stat_date id look gender 2020-9-1 1 1 1 2020-9-1 2 3 0 2020-9-2 1 1 1 2020-9-2 2 4 0 2020-9-3 3 5 0 2020-9-3 1 1 1 2020-9-3 2 1 0 2020-9-4 1 1 1
衍生代码
#lastdays表示衍生近x天,cols是list形式,表示需要衍生的特征列名
def last_days_feature(df,lastdays,cols): stat_date=set(df.stat_date)#把所有的日期都取出来,一个个看近x天的 df_sub=pd.DataFrame() for date2 in stat_date: date1=(pd.to_datetime(date2,format='%Y-%m-%d')-datetime.timedelta(days=lastdays-1)).strftime('%Y-%m-%d') df_date=df[(df.stat_date>=date1)&(df.stat_date<=date2)] df_tmp=df_date[df.stat_date==date2][['stat_date','id']] for col in cols: agg_list = [('last_%s_%s_count'%(lastdays,col),'count'), ('last_%s_%s_sum'%(lastdays,col),'sum'), ('last_%s_%s_max'%(lastdays,col),'max'), ('last_%s_%s_min'%(lastdays,col),'min'), ('last_%s_%s_mean'%(lastdays,col),'mean'), #('last_%s_%s_var'%(lastdays,col),'var'), #('last_%s_%s_std'%(lastdays,col),'std'), ('last_%s_%s_median'%(lastdays,col),'median')] #('last_%s_%s_skew'%(lastdays,col),'skew')] # 选取时间切片内的数据 进行groupby聚合计算 df_group=df_date.groupby('id')[col].agg(agg_list).reset_index() df_group['stat_date']=date2 #每一个col groupby后都要横向合并一下 df_tmp=pd.merge(df_tmp,df_group,how='left',on=['stat_date','id'])
#每一个date的都要上下拼接好 df_sub=pd.concat([df_sub,df_tmp],axis=0)
#最后所有date的拼接到总的df里面 df=pd.merge(df,df_sub,how='left',on=['stat_date','id']).reset_index(drop=True) return df
衍生近1天的特征(就是只有当天的特征)
#衍生近几天的特征 df=pd.read_csv('a.csv')
#首先将时间转换位标准格式,这点很重要,否则2020-9-1和2020-09-02直接比,是不对的 df['stat_date']=[(pd.to_datetime(d,format='%Y-%m-%d')).strftime('%Y-%m-%d') for d in df.stat_date] df=last_days_feature(df,1,['look']) df
输出:
衍生近2天的特征(包含今天和昨天的)
#衍生近几天的特征 df=pd.read_csv('a.csv') df['stat_date']=[(pd.to_datetime(d,format='%Y-%m-%d')).strftime('%Y-%m-%d') for d in df.stat_date] df=last_days_feature(df,2,['look']) df
如果再接着衍生近3天的特征,会直接把前面的衍生结果拼接上去
df=last_days_feature(df,3,['look']) df