Условные расчеты с Pandas | Оставшийся запас транзакционного листа - PullRequest
0 голосов
/ 05 августа 2020

У меня есть фреймворк, в котором перечислены транзакции продукта. Он показывает стоимость каждого продукта и количество включенных в транзакцию.

# Input: Transaction Sheet

      Products     Single Value      Ammount     Type         
0     Prod1          -112,20          15,00      Buy   
1     Prod1         -221,84           12,00      Sell  
2     Prod1          339,93           48,00      Buy
3     Prod1         -855,50           13,00      Buy
4     Prod1           68,40           90,00      Buy
5     Prod1           45,1            10,00      Sell
..    ....           .......       ........      ....
8     Prod1         1.179,10          12,00      Sell
9     Prod1         -355,52           15,00      Buy
10    Prod1          -23,23           18,00      Sell
11    Prod1         -3235,33         300,00      Sell

Я хочу получить одну строку в конце, которая выражает текущий запас продукта. Если товара на складе больше нет, не следует создавать фрейм данных. Но если есть запас, оставшееся значение и номер продукта должны быть выражены там.

# Output: Remaining inventory and average purchase price


      Products     Average Value      Ammount         
0     Prod1          -112,20          15,00 

Если бы я не использовал pandas, я бы просто перебирал строки и добавлял / вычитал существующие наборы. Если в конце все еще есть запасы, я вычисляю среднюю стоимость всех транзакций до последней полной продажи.

Я еще не нашел жизнеспособного способа решить эту проблему с помощью pandas - это довольно ново для меня. Может ли кто-нибудь помочь мне в реализации таких расчетов?

1 Ответ

1 голос
/ 05 августа 2020

Вот попытка использовать функцию cumsum (), чтобы получить ваш инвентарь под рукой. Я еще не научился работать с группировкой продуктов, так что на самом деле это может быть шагом в неправильном направлении. Тем не менее, он здесь для обсуждения:

import pandas as pd


def get_change(amount, type): 
  if type  == 'Buy':  
    return amount
  else:  
    return -amount



df = pd.DataFrame( {
  'Products': ['Prod1'] * 10 , 
  'Single Value': ['-112.2',  '-221.84',  '339.93',  '-855.5',  '68.4',  '45.1',  '1.179.10',  '-355.52',  '-23.23',  '-3235.33'], 
  'Amount': [ 15,  12,  48,  13,  90,  10,  12,  15,  18,  300], 
  'Type': [ 'Buy',  'Sell',  'Buy',  'Buy',  'Buy',  'Sell',  'Sell',  'Buy',  'Sell',  'Sell']
} )

df['change'] = df.apply( lambda row : get_change( row['Amount'], row['Type'] ), axis = 1 )
df['onhand'] = df['change'].cumsum() 
print(df)

Доходность:

  Products Single Value  Amount  Type  change  onhand
0    Prod1       -112.2      15   Buy      15      15
1    Prod1      -221.84      12  Sell     -12       3
2    Prod1       339.93      48   Buy      48      51
3    Prod1       -855.5      13   Buy      13      64
4    Prod1         68.4      90   Buy      90     154
5    Prod1         45.1      10  Sell     -10     144
6    Prod1     1.179.10      12  Sell     -12     132
7    Prod1      -355.52      15   Buy      15     147
8    Prod1       -23.23      18  Sell     -18     129
9    Prod1     -3235.33     300  Sell    -300    -171

Тем не менее, это работает для меня только тогда, когда продукт такой же (как в вашем примере данных) . Эксперименты с groupby('Products') не дали результатов, которые я ищу в столбце ниже. Из-за этого ограниченного прогресса я предлагаю это как подход - возможно, нежизнеспособный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...