Назначьте Запасы Заказам С помощью двух фреймов данных Pandas

#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