【问题标题】:Loop through Pandas rolling sum (To get the sum of last 100)循环遍历 Pandas 滚动总和(获取最后 100 的总和)
【发布时间】:2019-11-07 03:49:18
【问题描述】:

我有以下数据:

Date        Qty
01/01/2019  4.15
02/01/2019  12.39
03/01/2019  14.15
04/01/2019  12.15
05/01/2019  3.26
06/01/2019  6.23
07/01/2019  15.89
08/01/2019  5.55
09/01/2019  12.49
10/01/2019  9.4
11/01/2019  9.11
12/01/2019  9.18
13/01/2019  13.45
14/01/2019  4.52
15/01/2019  0
16/01/2019  0
17/01/2019  8.41
18/01/2019  9.55
19/01/2019  15.43
20/01/2019  16.45
21/01/2019  9.28
22/01/2019  9.55
23/01/2019  7.87
24/01/2019  12.58
25/01/2019  6.12
26/01/2019  6.15
27/01/2019  6.07
28/01/2019  15.53

我想要实现的输出是这样的:

Date        Window_Sum
01/01/2019  
02/01/2019  
03/01/2019  
04/01/2019  
05/01/2019  
06/01/2019  
07/01/2019  
08/01/2019  
09/01/2019  
10/01/2019  
11/01/2019  100.62
12/01/2019  109.8
13/01/2019  110.86
14/01/2019  101.23
15/01/2019  101.23
16/01/2019  101.23
17/01/2019  109.64
18/01/2019  103.78
19/01/2019  112.98
20/01/2019  107.99
21/01/2019  104.78
22/01/2019  104.93
23/01/2019  103.69
24/01/2019  107.09
25/01/2019  113.21
26/01/2019  101.39
27/01/2019  107.46
28/01/2019  105.03

让我简单解释一下获取输出的逻辑: 所以01/01/2019,Qty是4.15,回头看没有其他值,所以累计和不大于100,所以输出值为NULL。

快进到 10/01/2019,数量是 9.4,回头看累计总和是 95.66。由于累计和不大于100,所以输出为NULL值。

接下来,我们将看看 2019 年 11 月 1 日。这里的Qty是9.11,回头看累计是100.62。之所以是 100.62 而不是 104.77,是因为从 2019 年 11 月 1 日到 2019 年 2 月 1 日(向后看)的数量总和首先达到 100/略高于 100。

同样,在 2019 年 12 月 12 日,这里的 Qty 是 9.18,回头看累计总和是 100.8,因为从 12/01/2019 到 02/01/2019(向后看)的 Qty 总和是 100 /先略高于100。

是否有一种解决方案允许循环进入 pandas 滚动求和函数以实现此结果?

我在这里想要实现的是确保一旦累积总和达到 100 或略高于 100,然后我将取该值并将其附加到“Window_Sum”中。

更新:设法让代码在帮助下运行。这是解决方案:

#get last row index
start=len(data)-1

#initialise cumulative sum
cumsum = 0

for i in range(start,-1,-1):
    j=i
    while cumsum < 100:
        cumsum +=  data.loc[j,'Qty']
        if j!=0:
            j-=1
        else: 
            cumsum=None
            break

    data.loc[i,'Window_Sum']=cumsum
    cumsum=0

【问题讨论】:

    标签: python pandas loops cumulative-sum rolling-computation


    【解决方案1】:

    只需使用cumsum() 函数:

    In [7]: df['Window_Sum'] = df['Qty'].cumsum()
    
    In [8]: df.head()
    Out[8]:
            Date  Qty  Window_Sum
    0  01-Jan-19  4.0         4.0
    1  02-Jan-19  1.0         5.0
    2  03-Jan-19  6.0        11.0
    3  04-Jan-19  3.0        14.0
    4  05-Jan-19  3.0        17.0
    

    希望这就是你要找的东西!

    【讨论】:

    • 您好,我在这里想要实现的是确保一旦累积总和达到 100 或略高于 100,然后我将取值并将其附加到“Window_Sum”中。跨度>
    • 我错过了那部分,但仍不清楚您到底想要达到什么目的。您是否介意编辑问题以澄清问题,或者使用较小的数据集(如 5-10 行)作为示例?
    • 我想我开始明白了。您需要具有恒定回溯的窗口累积和吗?
    • 嗨,是的。我需要找到滚动总和的最佳窗口,以便一旦累积总和达到 100 或略高于 100,我将获取该值并将其附加到该特定日期期间的新列“Window_Sum”中。
    • 我还没有完全理解。 “追加”是什么意思?您可以编辑问题以使用较小的数据集演示类似的事情吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2016-10-24
    相关资源
    最近更新 更多