GroupBy在多列上并根据日期列应用移动功能

问题描述 投票:1回答:2

我们假设我有这个数据集:

Store_id    Order_id    Date    Order_value
1   1   01/01/2018  1
1   4   02/01/2018  0
1   5   02/01/2018  2
1   6   02/01/2018  1
1   8   03/01/2018  2
1   9   03/01/2018  NA
2   2   01/01/2018  3
2   3   01/01/2018  2
2   7   02/01/2018  NA
2   10  03/01/2018  1
2   11  03/01/2018  2
2   12  03/01/2018  NA

我想应用移动函数(例如移动平均值)来检索每个商店和日期的聚合值。

因此,例如在移动平均线的情况下(窗口= 2&min_periods = 1,未计入NAs)我想要具有以下内容:

Store_id    Date    Orders_value
1   01/01/2018  1
1   02/01/2018  1
1   03/01/2018  1.25
2   01/01/2018  2.5
2   02/01/2018  2.5
2   03/01/2018  1.5

为了方便您,可以通过以下方式计算:

Store_id    Date    Orders_value
1   01/01/2018  (1)/1
1   02/01/2018  (1+2+0+1)/4
1   03/01/2018  (NA+2+1+2+0)/5
2   01/01/2018  (2+3)/2
2   02/01/2018  (NA+2+3)/3
2   03/01/2018  (NA+2+1+NA)/4

因为我不算NAs,所以这就是:

Store_id    Date    Orders_value
1   01/01/2018  (1)/1
1   02/01/2018  (1+2+0+1)/4
1   03/01/2018  (2+1+2+0)/4
2   01/01/2018  (2+3)/2
2   02/01/2018  (2+3)/2
2   03/01/2018  (2+1)/2

它给出了你在上面看到的结果。

我怎么能用pandas做到这一点?

举一个简短的单词例子,例如我在03/01/2018期间对商店1的要求是对于该商店的日期02/01/2018和03/01的所有订单价值的平均值/ 2018(在窗口大小为2的情况下)。

因此,这是我想在03/01/2018日期为商店1做的事情:

( Orders_value(Order_1_value + Order_2_value + ... + Order_n_value , 03/01/2018) + Orders_value(Order_1_value + Order_2_value + ... + Order_m_value , 02/01/2018) ) / (n + m) =

# n & m in Order_n_value & Order_m_value refers to the number of the order for this day at this store - not at the order id of the particular order

= ( Orders_value(Order_1_value, 03/01/2018) + Orders_value(Order_2_value, 03/01/2018) +  Orders_value(Order_1_value, 02/01/2018) + Orders_value(Order_2_value, 02/01/2018) + Orders_value(Order_3_value, 03/01/2018) ) / (2 + 3)

= ( NA + 2 + 1 + 2 + 0 ) / 5

= ( 2 + 1 + 2 + 0) / 4 # NAs not counted in

= 1.25

类似地,我希望每个商店的所有日期都做同样的事情。

正如我所说,我希望在pandas的移动平均线之外对我自己的移动函数做同样的事情,所以提供一个对任何自定义函数都有效的解决方案会很好。

请记住,我最近问了一个非常相似的问题(GroupBy on multiple columns and apply moving function),所以如果你需要一些灵感,你可以看看它。

python pandas
2个回答
2
投票

得到它了!你需要使用time-aware rolling

df.Date = pd.to_datetime(df.Date, dayfirst=True)
temp_df = df.set_index('Date').groupby('Store_id')['Order_value'].rolling(
        '2d', min_periods=1).mean().reset_index()
temp_df.groupby(['Store_id', 'Date']).last()


                Order_value
Store_id    
      Date  
1   2018-01-01          1.00
    2018-01-02          1.00
    2018-01-03          1.25
2   

    2018-01-01          2.50
    2018-01-02          2.50
    2018-01-03          1.50

您也可以用mean替换apply并使用自定义函数。


-1
投票

我无法从您的问题中找出您的需求,但如果您正在寻找的是一种将自定义函数应用于滚动窗口的简单方法,请尝试以下方法:

import pandas as pd
df = pd.DataFrame(data=myData)
df['newColumnName'] = df['DataColumnName'].rolling(window=2).apply(lambda x: myFunction(x))
© www.soinside.com 2019 - 2024. All rights reserved.