Подстановка дат доставки по заказам
У меня есть таблица orders
| Номер заказа | Пункт отгрузки | КССС мат | осталось произвести, тн |
|---|---|---|---|
| 1 | Пермь | 207465 | 10 |
| 2 | Пермь | 4435 | 7 |
| 3 | Волгоград | 19192 | 25 |
и таблица graphic
| Пункт отгрузки | Код КССС | Дата_производства | Объем_фасовки |
|---|---|---|---|
| Пермь | 207465 | 2022-06-11 | 8.0 |
| Пермь | 207465 | 2022-06-13 | 12.0 |
| Волгоград | 19192 | 2022-06-12 | 30.0 |
| Пермь | 4435 | 2022-06-14 | 4.0 |
| Тюмень | 3033626 | 2022-06-13 | 60.0 |
Мне нужно получить колонку в таблице orders, где будет написана дата производства, которую он будет брать из таблицы graphic. Если в таблице orders колонка "осталось произвести" меньше или равно чем "объем фасовки", то минусовать из таблицы graphic это значение "осталось произвести", а если больше, то "объем фасовки" должен быть нулевым или может быть удалено.
Алгоритм, который я написала, не учитывает того, что в таблице graphic может быть две разные даты на один и тот же продукт и пункт отгрузки. Если на первую дату не хватает объема, она должна смотреть на следующую, если имеется, и прибавлять остаток к ней
def data_shipment(city, code, required_to_make):
if graphic[(graphic['Пункт отгрузки']==city) & (graphic['Код КССС']==code)].empty:
return '-'
elif required_to_make == 0:
return '-'
elif required_to_make>0:
if graphic.loc[(graphic['Пункт отгрузки']==city) & (graphic['Код КССС']==code), 'Объем_фасовки, т'].iloc[0] >= required_to_make:
graphic.loc[(graphic['Пункт отгрузки']==city) & (graphic['Код КССС']==code), 'Объем_фасовки, т'] -= required_to_make
data = graphic[(graphic['Пункт отгрузки']==city) & (graphic['Код КССС']==code)]['Дата_производства'].dt.date.iloc[0]
return data
else:
graphic.loc[(graphic['Пункт отгрузки']==city) & (graphic['Код КССС']==code), 'Объем_фасовки, т'].iloc[0] = 0
data = graphic[(graphic['Пункт отгрузки']==city) & (graphic['Код КССС']==code)]['Дата_производства'].dt.date.iloc[0]
return data
orders['дата производства'] = orders.apply(lambda x: data_shipment(x['Пункт отгрузки'], x['КССС мат'], x['осталось произвести, тн']), axis=1)
Итоговая таблица, которую я хочу видеть
| Номер заказа | Пункт отгрузки | КССС мат | осталось произвести, тн | Дата производства | Сколько возможно произвести на эту дату |
|---|---|---|---|---|---|
| 1 | Пермь | 207465 | 10 | 2022-06-13 | 10 |
| 2 | Пермь | 4435 | 7 | 2022-06-14 | 4 |
| 3 | Волгоград | 19192 | 20 | 2022-06-12 | 20 |