python - 使用两个 Pandas DataFrame 将库存分配给订单
问题描述
我有两个熊猫数据框,一个包含 stock: supply,另一个包含未结订单列表:orders。
供应:
库存单位 | 供应_数量 | 已分配 | 错过 |
---|---|---|---|
产品A | 5 | 0 | 0 |
产品B | 5 | 0 | 0 |
产品C | 5 | 0 | 0 |
订单:
order_id | 线 | 库存单位 | 需要_数量 | 供应_批准 |
---|---|---|---|---|
1 | 1 | 产品A | 5 | |
2 | 1 | 产品D | 5 | |
3 | 1 | 产品C | 5 | |
3 | 2 | 产品A | 5 | |
4 | 1 | 产品C | 5 |
该代码当前循环遍历订单并检查覆盖每种材料所需的数量。然后,供应数据框显示供应可以支持多少单位的库存,以及使用分配和错过的供应列不能支持的数量。
我想通过循环遍历订单数据框来改进这一点,检查该行是否有足够的库存,是否将“已批准”添加到Supply_Approved 列?并从供应 DataFrames 中删除该数量,否则将值设置为“未批准”。
附加信息:我知道不建议循环遍历 DataFrames,但是我看不到另一种解决方法。
一旦我弄清楚这部分,我计划增加更多复杂性,例如如果订单上的所有行都可以支持,则仅标记“已批准”。
import pandas as pd
import random
def get_supply():
supply = pd.DataFrame([{'sku': 'ProductA', 'Supply_QTY': 5},
{'sku': 'ProductB', 'Supply_QTY': 5},
{'sku': 'ProductC', 'Supply_QTY': 5},
{'sku': 'ProductD', 'Supply_QTY': 5},
], columns=['sku', 'Supply_QTY']).set_index('sku')
supply.loc[:, 'allocated'] = 0
supply.loc[:, 'missed'] = 0
return supply
def get_orders():
skus = ['ProductA', 'ProductB', 'ProductC', 'ProductD']
res = []
for i in range(0, 1000, 1):
res.append({'order_id': i,
'sku': random.choice(skus),
'line': 1,
'Needed_QTY': 1})
orders = pd.DataFrame(res,
columns=['order_id', 'sku','line', 'Needed_QTY']).set_index('order_id')
return orders
supply = get_supply()
orders = get_orders()
for i, res in orders.iterrows():
sku = res['sku']
n_items = res['Needed_QTY']
inv = supply[supply.index == sku]['Supply_QTY'].values[0]
if (inv-n_items) >= 0:
supply.loc[(supply.index == sku), 'allocated'] += n_items
supply.loc[(supply.index == sku), 'Supply_QTY'] -= n_items
else:
supply.loc[(supply.index == sku), 'missed'] += n_items
解决方案
推荐阅读
- matlab - sequenceInputLayer() 被连接的数组的维度不一致
- macos - Bonjour:如何配置 macOS 10.14 以访问 machine.local 域中的子域?
- c# - 单人游戏。各种绘图功能中的水平深度?
- javascript - 如果我在两个对象之间使用加法运算符会发生什么
- eclipselink - 使用 EclipseLink 2.7.4 时为空 MetaModel
- bash - 如何按日期自动化 git history squash?
- javascript - ChartJS GridLine 动态
- microservices - 当出现 n 个异常时,Ocelot QoS 不会断路
- oracle - WHEN-BUTTON-PRESSED 触发器引发未处理的异常 ORA-01407
- r - 在 R 中不使用循环的迭代问题