如何在 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]
在这里您可以使用限制变量中的天数来指定时间跨度。
希望这能解决您正在寻找的问题。
我想根据索引的不同级别进行滚动求和,但正在努力实现它。我没有解释问题,而是在下面给出了演示输入和所需输出以及我正在寻找的见解类型。
所以我有多个品牌,他们每个品牌在不同年月日的各种商品类别的销售额按如下分组。我想要的是每天级别的动态滚动总和,按要求滚动 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]
在这里您可以使用限制变量中的天数来指定时间跨度。 希望这能解决您正在寻找的问题。