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

标签 python pandas dataframe

如何在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/

相关文章:

python - Qt 和 PyQt 表小部件不断增长的行数

python - 正确地将变量传递给函数

python - arcpy:程序在相交时崩溃

python - 如何在 Python 中粘贴(如 R)和 groupby

python - 在 Python 中的数据框中对所有可能的列组合应用函数——更好的方法

python - 如何启动和停止周期性后台任务?

python - Plotly-Dash:为每个选定的 df 列添加新的 y 轴

python - 过滤数据框以创建另一个数据框

python - 根据 Pandas 数据框中的另一列获取子字符串

python - 我无法从数据帧保存到 postgresql