【发布时间】:2019-07-22 06:12:26
【问题描述】:
假设我有这个数据集:
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,NA 不计算在内)我想要以下内容:
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
因为我不计入 NA,所以就是这样:
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 做到这一点?
举个简单的例子,例如,我希望商店 1 在 03/01/2018 的日期是对该商店在 2018 年 2 月 1 日的所有订单值取平均值,并且03/01/2018(在窗口大小为 2 的情况下)。
因此,这就是我想在 2018 年 3 月 1 日为商店 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),所以如果您需要一些灵感,可以看看它。
【问题讨论】: