区间累计和

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 个月(因此 width4 而不是 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

的新列