当前位置: 首页 > 知识库问答 >
问题:

用python实现库存的先进先出分配?

汤飞羽
2023-08-25

我现在有一张表,示例如下,image.png
其中总数列是每个产品要出库的数量,
ShipmentID是出库的批次,每个产品可能有很多个批次(虽然示例表只给了一个)
每个产品都对应了很多订单,预计到货时间列是订单号对应的到货时间,
待到货量即订单的数量,
现在需要把每个订单中的待到货量按先进先出即预计到货时间在前的先出,分配给不同批次的出库量。
得到的结果如下图所示。
image.png
我根据网上搜到的提示,写了半天,写出几行代码,如下所示:

import pandas as pd# 读取表格数据df = pd.read_excel(r"D:\打单报关数据\PO分配改良.xlsx",sheet_name = "Sheet2")# 按预计到货时间升序排序df = df.sort_values(by=['中文名称','ShipmentID','预计到货时间'])# 创建新列用于记录分配结果df['分配数量'] = 0allocated_qty = 0 # 分配数量df["辅助列"] = df['中文名称']+df['ShipmentID'].astype(str)+df['订单号']for data_id in df['辅助列'].unique():    data_df = df[df['辅助列'] == data_id]    total_qty = data_df['总数'].sum()    order_qty = data_df['待到货量'].sum()    if order_qty >= total_qty:        allocated_qty = total_qty    else:        allocated_qty = order_qty        df.loc[data_df.index,'分配数量'] = allocated_qty        order_qty  =  order_qty - allocated_qty        total_qty  =  total_qty - allocated_qty        if order_qty == 0 and total_qty ==0:            breakdf

但是这样写出来的结果是下面这样的:
image.png
这显然是错的,不知道为什么会出现这样的错误,我想知道正确的怎么写?我知道应该用循坏,但是我实在没写上来。如果有人能够给予帮助,将感激不尽。

共有1个答案

耿学义
2023-08-25

你可以将问题拆解。目前情况是:你需要将某件商品,例如A,总数按照到货时间分配给所有A的分配数量。
那么你按照【中文名称】分组,获得例子中的A=25,B=50。例如有很多种,那么用一个字典储存:d={'A':25,'B':50,'C':100,...}。
表格照旧打开,按照你之前的,并且按照【到货时间】和【中文名称】升序。
接着遍历字典,for k,v in d.items():... 这个k就是ABC,v就是总数。 然后用pandas的条件取值,我pandas很久没用了,具体的你查一下。例如要取中文名称是A的,df['中文名称'==k],然后按照循序,遍历每一个符合条件的,把v不断减少【待到货量】,填到【分配数量】这边。 注意数值边界,不要有负数

 类似资料:
  • 基础的FIFO队列 # queue_fifo.py import queue q = queue.Queue() for i in range(5): q.put(i) while not q.empty(): print(q.get(), end=' ') print() LIFO队列 # queue_lifo.py import queue q = queue.Lif

  • 介绍 FIFO(first in first out) 先进先出策略。元素不停的加入缓存直到缓存满为止,当缓存满时,清理过期缓存对象,清理后依旧满则删除先入的缓存(链表首部对象)。 优点:简单快速 缺点:不灵活,不能保证最常用的对象总是被保留 使用 Cache<String,String> fifoCache = CacheUtil.newFIFOCache(3); //加入元素,每个元素可以设

  • 本文向大家介绍python实现最大优先队列,包括了python实现最大优先队列的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python实现最大优先队列的具体代码,供大家参考,具体内容如下 说明:为了增强可复用性,设计了两个类,Heap类和PriorityQ类,其中PriorityQ类继承Heap类,从而达到基于最大堆实现最大优先队列。 测试结果: 以上就是本文的全部内容,希望对大

  • 问题内容: 假设我有一些SKU的购买和销售数据: 假设按购买顺序出售,我如何通过SQL查找销售利润率?例如,sku 123的保证金是 其中有2件以17.50购买,还有1件以15.00购买尚未售出。 问题答案: 好问题。我采用的方法是计算总销售额。然后计算累计购买量,并将其与特殊逻辑结合起来以得出正确的结合算术: 注意:我尚未测试此查询,因此它可能存在语法错误。

  • 问题内容: 这是我的门禁桌[dbo]。[tblAccess] 情况 假设员工将在同一天进出。 员工当天将有多个进出,因此需要先进后出。 需要每天获取详细信息,两个日期之间,按EmployeeId分组 员工的(InTime,InLocation)或(OUTTime,OutLocation)可以为null 如果(InTime)为null,则FirstInLocation和duration将为null,

  • 有时候你可能想: 将自定义加载程序字符串应用于语言,而不是让vue-loader推断它; 覆盖默认语言的内置加载程序配置; 使用自定义加载程序预处理或后处理特定语言块。 为此,为vue-loader指定loaders选项: 注意,preLoaders和postLoaders只在 >=10.3.0中支持 Webpack 2.x module.exports = { // 其余选项... mo