如何在数据框列上执行cumsum时设置最小值(实际库存不能低于0)

时间:2016-04-19 07:34:52

标签: python pandas dataframe

如何在python / pandas中使用最小值执行累积和?

在下表中:

  • “库存变化”列反映了每日销售/新库存购买。
  • 数据输入/人为错误意味着应用cumsum显示负库存水平-5,这在物理上是不可能的
  • 如“库存”列所示,数据输入错误最终仍然是一个问题(100 vs 95)。

数据帧

barImpl

实现这一目标的一种方法是使用循环但是它会很混乱,并且可能有更有效的方法来实现这一点。

以下是生成数据帧的代码:

fooBarEntityImpl

如何在python / pandas中应用具有最小值的累积和来生成“库存”列中显示的值?

3 个答案:

答案 0 :(得分:1)

根据数据,循环具有相同符号的块可能更有效,例如。大的运行子块都是正面或负面的。在一系列负值之后,您只需要小心回到正值。

使用最小限制值作为向量的minS求和:

import numpy as np
i_sign = np.append(np.where(np.diff(np.sign(vector)) > 0)[0],[len(vector)])
i0 = 1
csum = np.maximum(minS, vector[:1])
for i1 in i_sign:
    tmp_csum = np.maximum(minS, csum[-1] + np.cumsum(vector[i0:i1+1]))
    csum = np.append(csum, tmp_csum)
    i0 = i1

csum中的最终输出。

答案 1 :(得分:0)

非常难看的解决方案

start = df.index[0]
df['cumsum'] = [max(df['change in inventory'].loc[start:end].sum(), 0) 
     for end in  df.index]

答案 2 :(得分:0)

不幸的是,您可以使用循环:

lastvalue = 0
newcum = []
for row in df['change in inventory']:
    thisvalue =  row + lastvalue
    if thisvalue < 0:
        thisvalue = 0
    newcum.append( thisvalue )
    lastvalue = thisvalue

print pd.Series(newcum, index=df.index)
2015-01-01    100
2015-01-02     80
2015-01-03     50
2015-01-04     10
2015-01-05      0
2015-01-06    100
dtype: int64