2013-12-11 92 views
0

我有熊貓以下DF:分組依據 - 選擇最近的4個事件

df: 
DATE STOCK DATA1 DATA2 DATA3 
01/01/12 ABC 0.40 0.88 0.22 
04/01/12 ABC 0.50 0.49 0.13 
07/01/12 ABC 0.85 0.36 0.83 
10/01/12 ABC 0.28 0.12 0.39 
01/01/13 ABC 0.86 0.87 0.58 
04/01/13 ABC 0.95 0.39 0.87 
07/01/13 ABC 0.60 0.25 0.56 
10/01/13 ABC 0.15 0.28 0.69 
01/01/11 XYZ 0.94 0.40 0.50 
04/01/11 XYZ 0.65 0.19 0.81 
07/01/11 XYZ 0.89 0.59 0.69 
10/01/11 XYZ 0.12 0.09 0.18 
01/01/12 XYZ 0.25 0.94 0.55 
04/01/12 XYZ 0.07 0.22 0.67 
07/01/12 XYZ 0.46 0.08 0.54 
10/01/12 XYZ 0.04 0.03 0.94 
... 

我想組由股票,按日期排序,然後指定的列(在這種情況下DATA1和DATA3) ,我想得到最後四項總結(TTM數據)。

輸出應該是這樣的:

DATE STOCK DATA1 DATA2 DATA3 DATA1_TTM DATA3_TTM 
01/01/12 ABC 0.40 0.88 0.22 NaN   NaN 
04/01/12 ABC 0.50 0.49 0.13 NaN   NaN 
07/01/12 ABC 0.85 0.36 0.83 NaN   NaN 
10/01/12 ABC 0.28 0.12 0.39 2.03  1.56 
01/01/13 ABC 0.86 0.87 0.58 2.49  1.92 
04/01/13 ABC 0.95 0.39 0.87 2.94  2.66 
07/01/13 ABC 0.60 0.25 0.56 2.69  2.39 
10/01/13 ABC 0.15 0.28 0.69 2.55  2.70 
01/01/11 XYZ 0.94 0.40 0.50 NaN   NaN 
04/01/11 XYZ 0.65 0.19 0.81 NaN   NaN 
07/01/11 XYZ 0.89 0.59 0.69 NaN   NaN 
10/01/11 XYZ 0.12 0.09 0.18 2.59  2.18 
01/01/12 XYZ 0.25 0.94 0.55 1.90  2.23 
04/01/12 XYZ 0.07 0.22 0.67 1.33  2.09 
07/01/12 XYZ 0.46 0.08 0.54 0.89  1.94 
10/01/12 XYZ 0.04 0.03 0.94 0.82  2.70 
... 

我的做法迄今已按日期,然後組進行排序,然後在每個組迭代,如果有3個年齡較大的事件,則當前的事件我總和。另外,我想檢查日期是否在1年內。任何人都可以在Python中提供更好的方法嗎?謝謝。

補充:作爲1年部分的說明,假設您記錄最後4個日期,並且它會在1/1/1993,4/1/12,7/1/12,10/1/1 - - 數據錯誤。我不想總結這四個。我想要那個人說NaN。

回答

0

對此,我認爲您可以使用transformrolling_sum。從你的數據幀開始,我可能會做這樣的事情:

>>> df["DATE"] = pd.to_datetime(df["DATE"]) # switch to datetime to ease sorting 
>>> df = df.sort(["STOCK", "DATE"]) 
>>> rsum_columns = "DATA1", "DATA3" 
>>> grouped = df.groupby("STOCK")[rsum_columns] 
>>> new_columns = grouped.transform(lambda x: pd.rolling_sum(x, 4)) 
>>> df[new_columns.columns + "_TTM"] = new_columns 
>>> df 
        DATE STOCK DATA1 DATA2 DATA3 DATA1_TTM DATA3_TTM 
0 2012-01-01 00:00:00 ABC 0.40 0.88 0.22  NaN  NaN 
1 2012-04-01 00:00:00 ABC 0.50 0.49 0.13  NaN  NaN 
2 2012-07-01 00:00:00 ABC 0.85 0.36 0.83  NaN  NaN 
3 2012-10-01 00:00:00 ABC 0.28 0.12 0.39  2.03  1.57 
4 2013-01-01 00:00:00 ABC 0.86 0.87 0.58  2.49  1.93 
5 2013-04-01 00:00:00 ABC 0.95 0.39 0.87  2.94  2.67 
6 2013-07-01 00:00:00 ABC 0.60 0.25 0.56  2.69  2.40 
7 2013-10-01 00:00:00 ABC 0.15 0.28 0.69  2.56  2.70 
8 2011-01-01 00:00:00 XYZ 0.94 0.40 0.50  NaN  NaN 
9 2011-04-01 00:00:00 XYZ 0.65 0.19 0.81  NaN  NaN 
10 2011-07-01 00:00:00 XYZ 0.89 0.59 0.69  NaN  NaN 
11 2011-10-01 00:00:00 XYZ 0.12 0.09 0.18  2.60  2.18 
12 2012-01-01 00:00:00 XYZ 0.25 0.94 0.55  1.91  2.23 
13 2012-04-01 00:00:00 XYZ 0.07 0.22 0.67  1.33  2.09 
14 2012-07-01 00:00:00 XYZ 0.46 0.08 0.54  0.90  1.94 
15 2012-10-01 00:00:00 XYZ 0.04 0.03 0.94  0.82  2.70 

[16 rows x 7 columns] 

我不知道你在問什麼「另外,我要檢查,看是否日期不在一年內」,所以我我會獨自離開。

+0

謝謝。通過這一部分,我的意思是...讓我們假設你採取了最後四個日期,並且它去了1/1/1993,4/1/12,7/1/12,10/1/1 - 如果有數據錯誤。我不想總結這四個。我想要那個人說NaN。 – user1911092