#python #pandas #dataframe
Вопрос:
У меня есть два фрейма данных pandas, один из которых содержит stock: поставка, а другой содержит список открытых заказов: заказы.
Поставка:
sku | Supply_QTY | распределенный | пропущенный |
---|---|---|---|
ProductA | 5 | 0 | 0 |
Продукт | 5 | 0 | 0 |
ProductC | 5 | 0 | 0 |
Заказы:
идентификатор заказа | линия | sku | нужно_qty | Поставка одобрена |
---|---|---|---|---|
1 | 1 | ProductA | 5 | |
2 | 1 | ProductD | 5 | |
3 | 1 | ProductC | 5 | |
3 | 2 | ProductA | 5 | |
4 | 1 | ProductC | 5 |
В настоящее время код просматривает заказы и проверяет, какое количество необходимо для покрытия каждого материала. Затем в кадрах данных о поставках отображается, сколько единиц товара может быть поддержано поставкой, а какое количество не может быть поддержано, используя столбцы «Поставка», выделенные и пропущенные.
Я хочу улучшить это, просматривая фреймы данных заказов, проверяя, достаточно ли запасов для этой строки, если в столбец Supply_Approved добавить «Одобрено«? и удалите это количество из фреймов данных поставки, в противном случае установите значение «Не одобрено».
Дополнительная информация: Я знаю, что зацикливание на кадрах данных не рекомендуется, однако я не вижу другого способа обойти это.
Как только я разберусь с этой частью, я планирую добавить дополнительные сложности, например, пометить «Одобрено» только в том случае, если все строки в заказе могут быть поддержаны.
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