区间累计和
Cumulative sum at intervals
考虑这个数据框:
dfgg
Out[305]:
Parts_needed output
Year Month PartId
2018 1 L27849 72 72
2 L27849 75 147
3 L27849 101 248
4 L27849 103 351
5 L27849 77
6 L27849 120
7 L27849 59
8 L27849 79
9 L27849 28
10 L27849 64
11 L27849 511
12 L27849 34
2019 1 L27849 49
2 L27849 68
3 L27849 75
4 L27849 45
5 L27849 84
6 L27849 42
7 L27849 40
8 L27849 52
9 L27849 106
10 L27849 75
11 L27849 176
12 L27849 58 2193
2020 1 L27849 135 2328
2 L27849 45 2301
3 L27849 21 2247
4 L27849 35
5 L27849 17
6 L27849 39
...
2025 7 L27849 94
8 L27849 13
9 L27849 94
10 L27849 65
11 L27849 141
12 L27849 34
2026 1 L27849 22
2 L27849 132
3 L27849 49
4 L27849 33
5 L27849 48
6 L27849 53
7 L27849 103
8 L27849 122
9 L27849 171
10 L27849 182
11 L27849 68
12 L27849 23
2027 1 L27849 44
2 L27849 21
3 L27849 52
4 L27849 53
5 L27849 57
6 L27849 187
7 L27849 69
8 L27849 97
9 L27849 31
10 L27849 29
11 L27849 33
12 L27849 8
在此数据框中,我需要每隔 2 年获取 Parts_needed 的累计总和。例如:
对于 1-2018, 72
将继续添加到以下行 75,101,103..
直到 1-2020 135
。同样,在 2-2018, 75
将继续添加到以下行 101,103..
直到 2-2020 45
。然而,在过去 2 年中,累积总和将用于剩余的任何行。我无法使用 np.cumsum() 设置范围 有人可以帮我吗?
编辑:我已经编辑,以包括预期的输出。对于 2-2020,输出为 2328+45-72(因为 72 已添加 2 年) 对于 3-2020,输出为 2301+21-75(因为已添加 75 已 2 年)等等。
基本上,如果开头是零填充,您需要 运行 总数。你可以用卷积来做到这一点。这是一个简单的 numpy 示例,您应该能够适应您的 pandas 用例:
import numpy as np
a = np.array([10,20,3,4,5,6,7])
width = 4
kernel = np.ones(width)
np.convolve(a,kernel)
返回
array([10., 30., 33., 37., 32., 18., 22., 18., 13., 7.])
如您所见,这是输出中 37
之前的累积总和(或 a[3]
),之后是滚动 4 元素的总和 window。
假设您在每 2 年期间始终有 24 行,这将适用于您。
这是一个 pandas 示例,每年只使用 2 个月(因此 width
是 4
而不是 24
):
>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'year':[18,18,19,19,20,20,21,21],'month':[1,2,1,2,1,2,1,2],'parts':[230,5,2,12,66,32,1,2]})
>>> df
month parts year
0 1 230 18
1 2 5 18
2 1 2 19
3 2 12 19
4 1 66 20
5 2 32 20
6 1 1 21
7 2 2 21
>>> width = 4
>>> kernel = np.ones(width)
>>> # Drop the last elements as you don't want the window to roll passed the end
>>> np.convolve(df['parts'],kernel)[:-width+1]
array([230., 235., 237., 249., 85., 112., 111., 101.])
现在您只需将最后一个数组分配给 DataFrame
的新列
考虑这个数据框:
dfgg
Out[305]:
Parts_needed output
Year Month PartId
2018 1 L27849 72 72
2 L27849 75 147
3 L27849 101 248
4 L27849 103 351
5 L27849 77
6 L27849 120
7 L27849 59
8 L27849 79
9 L27849 28
10 L27849 64
11 L27849 511
12 L27849 34
2019 1 L27849 49
2 L27849 68
3 L27849 75
4 L27849 45
5 L27849 84
6 L27849 42
7 L27849 40
8 L27849 52
9 L27849 106
10 L27849 75
11 L27849 176
12 L27849 58 2193
2020 1 L27849 135 2328
2 L27849 45 2301
3 L27849 21 2247
4 L27849 35
5 L27849 17
6 L27849 39
...
2025 7 L27849 94
8 L27849 13
9 L27849 94
10 L27849 65
11 L27849 141
12 L27849 34
2026 1 L27849 22
2 L27849 132
3 L27849 49
4 L27849 33
5 L27849 48
6 L27849 53
7 L27849 103
8 L27849 122
9 L27849 171
10 L27849 182
11 L27849 68
12 L27849 23
2027 1 L27849 44
2 L27849 21
3 L27849 52
4 L27849 53
5 L27849 57
6 L27849 187
7 L27849 69
8 L27849 97
9 L27849 31
10 L27849 29
11 L27849 33
12 L27849 8
在此数据框中,我需要每隔 2 年获取 Parts_needed 的累计总和。例如:
对于 1-2018, 72
将继续添加到以下行 75,101,103..
直到 1-2020 135
。同样,在 2-2018, 75
将继续添加到以下行 101,103..
直到 2-2020 45
。然而,在过去 2 年中,累积总和将用于剩余的任何行。我无法使用 np.cumsum() 设置范围 有人可以帮我吗?
编辑:我已经编辑,以包括预期的输出。对于 2-2020,输出为 2328+45-72(因为 72 已添加 2 年) 对于 3-2020,输出为 2301+21-75(因为已添加 75 已 2 年)等等。
基本上,如果开头是零填充,您需要 运行 总数。你可以用卷积来做到这一点。这是一个简单的 numpy 示例,您应该能够适应您的 pandas 用例:
import numpy as np
a = np.array([10,20,3,4,5,6,7])
width = 4
kernel = np.ones(width)
np.convolve(a,kernel)
返回
array([10., 30., 33., 37., 32., 18., 22., 18., 13., 7.])
如您所见,这是输出中 37
之前的累积总和(或 a[3]
),之后是滚动 4 元素的总和 window。
假设您在每 2 年期间始终有 24 行,这将适用于您。
这是一个 pandas 示例,每年只使用 2 个月(因此 width
是 4
而不是 24
):
>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'year':[18,18,19,19,20,20,21,21],'month':[1,2,1,2,1,2,1,2],'parts':[230,5,2,12,66,32,1,2]})
>>> df
month parts year
0 1 230 18
1 2 5 18
2 1 2 19
3 2 12 19
4 1 66 20
5 2 32 20
6 1 1 21
7 2 2 21
>>> width = 4
>>> kernel = np.ones(width)
>>> # Drop the last elements as you don't want the window to roll passed the end
>>> np.convolve(df['parts'],kernel)[:-width+1]
array([230., 235., 237., 249., 85., 112., 111., 101.])
现在您只需将最后一个数组分配给 DataFrame