代码之家  ›  专栏  ›  技术社区  ›  IndigoChild

间隔累计和

  •  0
  • IndigoChild  · 技术社区  · 7 年前

    考虑以下数据帧:

    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\u的累计总和。对于eg: 对于 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年),依此类推。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dan fatihk    7 年前

    基本上,如果开始是零填充的,您需要一个运行总数。你可以通过卷积来实现。下面是一个简单的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元素窗口的和。

    假设每2年期间始终有24行,这将对您有效。

    这里有一个熊猫的例子,每年只使用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