如何在熊猫的时间窗口中计算事件频率

时间:2018-03-22 07:48:57

标签: python pandas pandas-groupby

假设我在Pandas中有一个数据框,描述了在一段时间内在不同商店生产的水果的销售情况:

    Time_of_sale    Product     Store
05.01.2018 15:37    Apple        1
05.01.2018 13:58    Apple        1
05.01.2018 15:36    Banana       2
05.01.2018 15:33    Banana       3
15.08.2017 19:08    Strawberry   4
15.08.2017 19:04    Blueberry    4
03.09.2017 15:32    Pere         5
03.09.2017 15:31    Pere         6
05.01.2018 15:32    Blueberry    7
05.01.2018 15:27    Banana       2
08.01.2018 09:31    Grapes       1

我想要添加到每一行,基本上是此商店中在一个时间窗口内(例如3小时)内销售的此产品的销售量。

例如在第一行:

  • 3小时内在商店1售出了多少苹果?

因此,结果应该添加一个新列(因此不进行下采样)。

Time_of_sale           Product         Store       Sales_in_TF
05.01.2018 15:37    Apple           1                2
05.01.2018 13:58    Apple           1                2
05.01.2018 15:36    Banana          2                2
05.01.2018 15:33    Banana          3                1
15.08.2017 19:08    Strawberry      4                1
15.08.2017 19:04    Blueberry       4                1
03.09.2017 15:32    Pere            5                1
03.09.2017 15:31    Pere            6                1
05.01.2018 15:32    Blueberry       7                1
05.01.2018 15:27    Banana          2                2
08.01.2018 09:31    Grapes          1                1

我正在调查

series.resample('3H', label='right').count() 

以及

df.groupby(pd.Grouper(freq='3H', closed='left'))

但我真的找不到我要找的东西 也许你们有个主意?

1 个答案:

答案 0 :(得分:0)

我创建了一个虚拟变量的所有1 s,因此它会计算出来。

df['Amount'] = 1
groups = df.groupby((
    pd.Grouper(key='Time_of_sale', freq='6H'),
    'Product', 
    'Store'
))
groups.count()

结果:

                                      Amount
Time_of_sale        Product    Store        
2017-03-09 12:00:00 Pere       5           1
                               6           1
2017-08-15 18:00:00 Blueberry  4           1
                    Strawberry 4           1
2018-05-01 12:00:00 Apple      1           2
                    Banana     2           2
                               3           1
                    Blueberry  7           1
2018-08-01 06:00:00 Grapes     1           1

编辑:哎呀没看到你想要下采样。这不是很优雅,但你可以这样做:

dfs = []
for i, group in df.groupby((pd.Grouper(key='Time_of_sale', freq='6H'), 'Product', 'Store')):
    group['Amount'] = group.shape[0]
    dfs.append(group)
pd.concat(dfs)

哪个没有下采样。<​​/ p>

       Time_of_sale     Product  Store  Amount
2017-03-09 15:32:00  Pere            5       1
2017-03-09 15:31:00  Pere            6       1
2017-08-15 19:04:00  Blueberry       4       1
2017-08-15 19:08:00  Strawberry      4       1
2018-05-01 15:37:00  Apple           1       2
2018-05-01 13:58:00  Apple           1       2
2018-05-01 15:36:00  Banana          2       2
2018-05-01 15:27:00  Banana          2       2
2018-05-01 15:33:00  Banana          3       1
2018-05-01 15:32:00  Blueberry       7       1
2018-08-01 09:31:00  Grapes          1       1