如何在python/pandas中计算最小值的累加和?
在下表中:
- “库存变化”列反射(reflect)每日销售/新库存采购。
- 数据输入/人为错误意味着应用 cumsum 显示 -5 的负库存水平,这在物理上是不可能的。
- 如“库存”列所示,数据输入错误在最后仍然是一个问题(100 比 95)。
数据框
change in inventory inventory cumsum
2015-01-01 100 100 100
2015-01-02 -20 80 80
2015-01-03 -30 50 50
2015-01-04 -40 10 10
2015-01-05 -15 0 -5
2015-01-06 100 100 95
实现此目的的一种方法是使用循环,但它会很困惑,可能有更有效的方法来做到这一点。
这是生成数据框的代码:
import pandas as pd
df = pd.DataFrame.from_dict({'change in inventory': {'2015-01-01': 100,
'2015-01-02': -20,
'2015-01-03': -30,
'2015-01-04': -40,
'2015-01-05': -15,
'2015-01-06': 100},
'inventory': {'2015-01-01': 100,
'2015-01-02': 80,
'2015-01-03': 50,
'2015-01-04': 10,
'2015-01-05': 0,
'2015-01-06': 100}})
df['cumsum'] = df['change in inventory'].cumsum()
df
如何在 python/pandas 中应用具有最小值的累积和来生成“库存”列中显示的值?
最佳答案
根据数据,循环具有相同符号的 block 可能更有效,例如。大的运行子 block 都是正的或负的。在运行负值后,您只需要小心回到正值即可。
最小限制值为 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 中的最终输出。
关于python - 在数据框列上执行 cumsum 时如何设置最小值(物理库存不能低于 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36711557/