分组依据 - 选择最近的4个事件

时间:2013-12-11 18:55:40

标签: python pandas

我在熊猫中有以下df:

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年部分的澄清,让我们说你采取最后四个日期,它是1/1/1993,4/1 / 12,7 / 1 / 12,10 / 12/12 - 数据错误。我不想总结那四个。我希望那个人说NaN。

1 个答案:

答案 0 :(得分: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]

我不知道你在问什么“另外,我想检查一下日期是否在1年内”,所以我会单独留下。