我有一个数据表,其中包含大量数据,所有数据都分布在多个列中。下面提取的数据将显示我面临的问题:
此表表示库存系统中的更改。正数量变化表示新商品已添加到库存中,商品价格已知。物品价格等于进口采购价格。
订单生成时,相应的金额变化为负数,且价格未知。该算法应填写这些未知价格。
库存时间最长的商品应首先以与购买时相同的价格出售。一旦这样的批次耗尽,下一批应该用于确定销售的价格。
例如,在第3行中,销售了3件商品,我们在库存中留下了9件商品。我们通过查看数据了解到,这三种产品的单品价格是49.55。但当然,随着项目的增加和减少,它开始变得更加复杂:
取最后一排。那一刻,第一批(49.55)已经完全售出。下一批(48.25)只有2个项目 - 对于订购的7个项目来说还不够。之后的批次(47.23)足以提供剩余的5个项目。因此,每个项目的价格应该是这两个价格的加权平均值。
所以现在,我正在寻找一个函数或算法来确定下订单时应该使用的商品价格。
答案 0 :(得分:1)
这里有一些python代码实现了从库存中销售商品的FIFO algorithm:
stock = [
{ "before": 0, "change": 10, "price": 49.55 },
{ "before": 10, "change": 2, "price": 48.25 },
{ "before": 12, "change": -3, "price": None },
{ "before": 9, "change": -3, "price": None },
{ "before": 6, "change": -4, "price": None },
{ "before": 2, "change": 8, "price": 47.23 },
{ "before": 10, "change": -7, "price": None },
]
queue = []
for line in stock:
if line["change"] > 0:
queue.append({ "stock": line["change"], "price": line["price"] })
else:
# calculate price from queue
count = -line["change"]
totalPrice = 0
while count > 0:
take = min(count, queue[0]["stock"])
totalPrice += take * queue[0]["price"]
count -= take
queue[0]["stock"] -= take
if not queue[0]["stock"]:
queue.pop(0) # no more items in this "batch": remove it
# Calculate an average price. Because of rounding, cents may not add up
line["price"] = round(totalPrice / -line["change"], 2)
# output result
for line in stock:
print(line)
输出是:
{'before': 0, 'change': 10, 'price': 49.55}
{'before': 10, 'change': 2, 'price': 48.25}
{'before': 12, 'change': -3, 'price': 49.55}
{'before': 9, 'change': -3, 'price': 49.55}
{'before': 6, 'change': -4, 'price': 49.55}
{'before': 2, 'change': 8, 'price': 47.23}
{'before': 10, 'change': -7, 'price': 47.52}
请注意,某些价格(示例中的最后一个)是两个或更多批次的价格加权平均值。在这种情况下,实际平均值可能有更多的十进制数字,需要四舍五入。这将导致金额余额在出售之后不完全为0。