如何在 Python 中的不同索引级别上使用条件 window 标准进行滚动求和

How to do rolling sum with conditional window criteria on different index levels in Python

我想根据索引的不同级别进行滚动求和,但正在努力实现它。我没有解释问题,而是在下面给出了演示输入和所需输出以及我正在寻找的见解类型。

所以我有多个品牌,他们每个品牌在不同年月日的各种商品类别的销售额按如下分组。我想要的是每天级别的动态滚动总和,按要求滚动 window 年。

例如,如果有人问

演示问题 1) 到某一天(不包括那一天)他们最近 2 年的特定品牌特定类别的销售额是多少。

我需要能够每天回答这个问题,即每一行都应该有一个数字,如 Table 2.0.

我希望能够以这样的方式编码,如果问题从 2 年变为 3 年,我只需要更改一个数字。 我也需要在月的级别上做同样的事情。

演示问题 2) 直到某一天(不包括那一天)他们在该特定年份的特定类别的特定品牌的最后 3 个月的销售额是多少。

下面是演示输入

table按品牌、类别、年、月、日和销售总额分组 table,其中包含所有信息和当时的销售情况每天等级

Table1.0

Brand Category Year Month Day Sales
ABC Big Appliances 2021 9 3 0
Clothing 2021 9 2 0
Electronics 2020 10 18 2
Utensils 2020 10 18 0
2021 9 2 4
3 0
XYZ Big Appliances 2012 4 29 7
2013 4 7 6
Clothing 2012 4 29 3
Electronics 2013 4 9 1
27 2
5 4 5
2015 4 27 7
5 2 2
Fans 2013 4 14 4
5 4 0
2015 4 18 1
5 17 11
2016 4 12 18
Furniture 2012 5 4 1
8 6
20 4
2013 4 5 1
7 8
9 2
2015 4 18 12
27 15
5 2 4
17 3
Musical-inst 2012 5 18 10
2013 4 5 6
2015 4 16 10
18 0
2016 4 12 1
16 13
Utencils 2012 5 8 2
2016 4 16 3
18 2
2017 4 12 13

下面是基于演示 table(过去 2 年累计总和不包括那天)

的演示问题 1 的所需输出

Table2.0

Brand Category Year Month Day Sales Conditional Cumsum(till last 2 years)
ABC Big Appliances 2021 9 3 0 0
Clothing 2021 9 2 0 0
Electronics 2020 10 18 2 0
Utensils 2020 10 18 0 0
2021 9 2 4 0
3 0 4
XYZ Big Appliances 2012 4 29 7 0
2013 4 7 6 7
Clothing 2012 4 29 3 0
Electronics 2013 4 9 1 0
27 2 1
5 4 5 3
2015 4 27 7 8
5 2 2 15
Fans 2013 4 14 4 0
5 4 0 4
2015 4 18 1 4
5 17 11 5
2016 4 12 18 12
Furniture 2012 5 4 1 0
8 6 1
20 4 7
2013 4 5 1 11
7 8 12
9 2 20
2015 4 18 12 11
27 15 23
5 2 4 38
17 3 42
Musical-inst 2012 5 18 10 0
2013 4 5 6 10
2015 4 16 10 6
18 0 16
2016 4 12 1 10
16 13 11
Utencils 2012 5 8 2 0
2016 4 16 3 0
18 2 3
2017 4 12 13 5

结束想法:

想法基本上是滚动 window 年列,保持 2 年跨度标准并继续总结销售数据。

P.S 由于数据量巨大,我真的需要一个快速的解决方案,因此我创建了一个 .apply 行式函数,我认为这不可行。使用某种组滚动总和或支持列的更好解决方案将非常有帮助。

这里我给出了上述问题的示例解决方案。
我只考虑了一个产品,所以解决方案很简单

代码:

from datetime import date,timedelta
Input={"Utencils": [[2012,5,8,2],[2016,4,16,3],[2017,4,12,13]]}
Input1=Input["Utencils"]
Limit=timedelta(365*2)
cumsum=0
lis=[]
Tot=[]
for i in range(len(Input1)):
    if(lis):
        while(lis):
            idx=lis[0]
            Y,M,D=Input1[i][:3]
            reqDate=date(Y,M,D)-Limit
            Y,M,D=Input1[idx][:3]
            if(date(Y,M,D)<=reqDate):
                lis.pop(0)
                cumsum-=Input1[idx][3]
            else:
                break
    Tot.append(cumsum)
    lis.append(i)
    cumsum+=Input1[i][3]
print(Tot)

此处 Tot 将为给定数据输出所需的 cumsum 列。 输出:

[0, 0, 3]

在这里您可以使用限制变量中的天数来指定时间跨度。 希望这能解决您正在寻找的问题。