我有一個表,其中包含id、dates、一個target(可能是多類的,但現在是二進制的,其中1是fail)和一個基于date列的yearmonth列。以下是此表的前8行:
我想為過去的3個月創(chuàng)建回溯特性,這樣對于每一行,我們都會回顧過去,看看id在過去3個月的表現。因此,對于第6行(日期為2015年11月9日)的ex,id A在過去3個日歷月(即8月、9月和10月)的失敗百分比為75%(使用第2-5行)。
df = pd.DataFrame({'id':['A','A','A','A','A','A','A','B'],'date' :['2015-03-16','2015-05-29','2015-08-02','2015-09-05','2015-09-22','2015-10-15','2015-11-09','2015-04-17'],'target':[0,1,1,1,0,1,1,0]} )
df['date'] = pd.to_datetime(df['date'], dayfirst = True)
df['yearmonth'] = df['date'].dt.to_period('M')
agg_dict = {
"Total_Transactions": pd.NamedAgg(column='target', aggfunc='count'),
"Fail_Count": pd.NamedAgg(column='target', aggfunc=(lambda x: len(x[x == 1]))),
"Perc_Monthly_Fails": pd.NamedAgg(column='target', aggfunc=(lambda x: len(x[x == 1])/len(x)*100))
}
df.groupby(['id','yearmonth']).agg(**agg_dict).reset_index(level = 1)
我使用id和month(見下文)進行了聚合,并嘗試了滾動窗口之類的方法,但找不到一種方法來實際聚合每一行的特定時間段。感謝您的幫助。
您可以通過將數據幀與
'id'
上的自身合并來實現這一點。首先,我們將創(chuàng)建一個First of month
'fom'
列,因為您的日期邏輯希望基于前幾個月而不是具體的日期進行回顧。然后我們將數據幀與它自身合并,帶上索引,這樣我們就可以在最后分配結果。使用月偏移量,我們可以將其過濾為只將觀察值保持在該行觀察值的3個月內,然后我們
groupby
原始索引并取'target'
的平均值來獲得失敗百分比,我們可以將其分配回(索引上的對齊)。如果輸出中有
NaN
,那是因為該行在前3個月沒有觀察到,所以您無法計算。