Панды: инвентаризация пересчитывается с учетом окончательного значения - PullRequest
0 голосов
/ 22 мая 2018

Я кодирую скрипт Pyhton для пересчета инвентарного количества конкретного SKU с сегодняшнего дня за последние 365 дней, учитывая фактический запас.Для этого я использую фрейм данных Python Pandas, как показано ниже:

Index   DATE    SUM_IN  SUM_OUT
0      5/12/18   500        0
1      5/13/18    0      -403
2      5/14/18    0       -58
3      5/15/18    0       -39
4      5/16/18   100        0
5      5/17/18    0       -98
6      5/18/18   276        0
7      5/19/18    0      -139
8      5/20/18    0       -59
9      5/21/18    0       -70

Фрейм данных представляет сумму количеств IN и OUT хранилища, сгруппированных по дате.Мое намерение состоит в том, чтобы добавить столбец с именем «STOCK», который представляет уровень запаса SKU на текущий день.Для этого у меня есть фактический уровень запасов (индекс 9).Так что мне нужно пересчитать все уровни день за днем ​​по всем рядам дат (от индекса 9 до индекса 0).

В Excel это просто.Я могу поместить фактический уровень в последнюю строку и просто расширять вычисления до тех пор, пока не достигну строки с индексом 0. Как показано (столбец E - это формула, столбец G - желаемый результат):

Inventory Recalculation on Excel

Может ли кто-нибудь помочь мне достичь этого результата?

У меня уже есть запас в последний день (то есть 21.05.2008 равен 10),То, что мне нужно, это поместить число 10 в индекс 9 и рассчитать запасы других прошедших дней, от индекса 8 до 0.

Желаемый результат должен быть:

Index   DATE    TRANSACTION_IN  TRANSACTION_OUT SUM_IN  SUM_OUT STOCK
0      5/12/18         1                 0        500      0     500
1      5/13/18         0                 90        0     -403     97
2      5/14/18         0                 11        0     -58      39
3      5/15/18         0                 11        0     -39      0
4      5/16/18         1                 0        100      0     100
5      5/17/18         0                 17        0     -98      2
6      5/18/18         1                 0        276      0     278
7      5/19/18         0                 12        0    -139     139
8      5/20/18         0                 4         0    -59       80
9      5/21/18         0                 7         0    -70       10

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

(обновлено)

last_stock = 10  # You should try another value
a = (df.SUM_IN + df.SUM_OUT).cumsum()
df["STOCK"] = a - (a.iloc[-1] - last_stock)
0 голосов
/ 22 мая 2018

Используя cumsum для создания ключа для groupby, мы снова используем cumsum

df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()
Out[292]: 
0    500.0
1     97.0
2     39.0
3      0.0
4    100.0
5      2.0
6    276.0
7    137.0
8     78.0
9      8.0
dtype: float64

Обновление

s=df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()-df.STOCK
df['SUM_IN'].replace(0,np.nan).ffill()+df.groupby(df['SUM_IN'].gt(0).cumsum()).SUM_OUT.cumsum()-s.groupby(df['SUM_IN'].gt(0).cumsum()).bfill().fillna(0)
Out[318]: 
0    500.0
1     97.0
2     39.0
3      0.0
4    100.0
5      2.0
6    278.0
7    139.0
8     80.0
9     10.0
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...