推导函数的数学方法

时间:2018-01-13 17:22:13

标签: python algorithm function math

我有一个数据表,其中包含大量数据,所有数据都分布在多个列中。下面提取的数据将显示我面临的问题:

data sheet example

此表表示库存系统中的更改。正数量变化表示新商品已添加到库存中,商品价格已知。物品价格等于进口采购价格。

订单生成时,相应的金额变化为负数,且价格未知。该算法应填写这些未知价格。

库存时间最长的商品应首先以与购买时相同的价格出售。一旦这样的批次耗尽,下一批应该用于确定销售的价格。

例如,在第3行中,销售了3件商品,我们在库存中留下了9件商品。我们通过查看数据了解到,这三种产品的单品价格是49.55。但当然,随着项目的增加和减少,它开始变得更加复杂:

取最后一排。那一刻,第一批(49.55)已经完全售出。下一批(48.25)只有2个项目 - 对于订购的7个项目来说还不够。之后的批次(47.23)足以提供剩余的5个项目。因此,每个项目的价格应该是这两个价格的加权平均值。

所以现在,我正在寻找一个函数或算法来确定下订单时应该使用的商品价格。

1 个答案:

答案 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。