一、利用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