Pandas: Как использовать рекурсивную функцию? - PullRequest
0 голосов
/ 09 января 2020

У меня есть следующий набор данных, и я пытаюсь найти способ вычислить столбец Leftover на основе остальных столбцов.

Лог c Я пытаюсь реализовать logi c прост -

  • Если Order появится через неделю, мы вычтем любые Inventory доступные на текущей неделе,
  • Если Order все еще имеет Оставшееся количество для выполнения, мы вычитаем его из Inventory из предыдущих трех недель
  • Если Order все еще имеет оставшееся количество для выполнения, мы вычитаем его из Inventory из следующих трех недель
  • Если Order выполнено в 7-недельном окне, все оставшиеся Inventory присутствуют, мы переносим его в Leftover столбец

Например:

  • Для части AB C на неделе 5 есть заказ на 70. Сначала мы возьмем инвентарь с той же недели, 70 - 10 = 60
  • У нас еще осталось 60 заказов, мы потребляем запас доступно на 4-й неделе, 60 - 20 = 40
  • У нас еще осталось 40 заказов, мы потребляем запас, доступный на 3-й неделе, 40 - 30 = 10
  • У нас еще осталось 10 заказов, мы потребляем запас, доступный на 2-й неделе, 10 - 5 = 5
  • У нас еще 5 заказов осталось, но мы не можем использовать инвентарь на 1-й неделе, потому что он находится за пределами 3-недельного окна, поэтому мы go продвигаем еще 3 недели
  • Мы go на 6-ю неделю и видим, что доступно 50 единиц в Inventory, 50 - 5 = 45
  • Теперь, когда мы выполнили заказы на 4-ю неделю, мы go выполняем следующий выполняемый заказ, то есть на 7-й неделе, который имеет 60 заказов.
  • Нам нужно выполнить 60 заказов, поэтому мы сначала потребляем запас за текущую неделю, 60 - 5 = 55
  • У нас еще есть 55 заказов, поэтому мы потребляем запас за предыдущую неделю, то есть за неделю 6. Теперь запомните, предыдущий заказ уже забрал 5 единиц из инвентаря 6-й недели, поэтому у нас осталось только 45 единиц на эту неделю, поэтому 55 - 45 = 10
  • У нас еще осталось 10 заказов, но мы не можем go вернуться больше, как я инвентарь уже использовался предыдущим заказом
  • Мы потребляем инвентарь из будущего сейчас, т.е. недели 8, 10 - 30 = -20
  • И вот как мы получаем значение Остатка -20 для Деталь ABC в неделю 8
  • Повторите те же логи c для детали XYZ
   Part  Week  Inventory  Orders  Leftover
0   ABC     1         10       0         0
1   ABC     2          5       0         0
2   ABC     3         30       0         0
3   ABC     4         20       0         0
4   ABC     5         10      70         0
5   ABC     6         50       0         0
6   ABC     7          5      60         0
7   ABC     8         30       0       -20
8   XYZ     1         10       0        10
9   XYZ     2          5       0        15
10  XYZ     3         10       0         0
11  XYZ     4         30       0         0
12  XYZ     5         30      90         0

Теперь это может быть достигнуто большим количеством if-else утверждения, но как это можно сделать намного эффективнее, используя Pandas Векторизация, Рекурсия и меньше строк кода, как я буду использовать этот лог c на 1000+ частей?

import pandas as pd
import numpy as np

data = {
    "Part": ["ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "ABC", "XYZ", "XYZ", "XYZ", "XYZ", "XYZ"],
    "Week": [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5],
    "Inventory": [10, 5, 30, 20, 10, 50, 5, 30, 10, 5, 10, 30, 30],
    "Orders": [0, 0, 0, 0, 70, 0, 60, 0, 0, 0, 0, 0, 90],
    "Leftover": [10, 0, 0, 0, 0, 0, 0, -20, 10, 15, 0, 0, 0],
}

df = pd.DataFrame(data)

print(df)

Спасибо Я ценю любую помощь в этом.

...