Как автоматически удалить часть акции, когда она достигает срока годности в Python? (в рамках метода FIFO) - PullRequest
0 голосов
/ 28 июня 2019

У меня есть датафрейм pandas со структурой, показанной ниже:

| Contract |Purchase Date|Value|Expiration Date|Demand|Stock
| A        | 2019-01-01  |1000 | 2019-01-04    |700   | 300
| B        | 2019-01-02  |1000 | 2019-01-05    |1000  | 300
| C        | 2019-01-03  |1000 | 2019-01-06    |1200  | 100 
| D        | 2019-01-04  |1000 | 2019-01-07    |1000  | 100
| E        | 2019-01-05  |1000 | 2019-01-08    |1000  | 0
| F        | 2019-01-06  |1000 | 2019-01-09    |800   | 200
| G        | 2019-01-07  |1000 | 2019-01-10    |1000  | 200

В столбце «Спрос» представлены требуемые дневные объемы, в столбце «Контракт» - дневные объемы, которые были приобретены для удовлетворения спроса. Эти контракты имеют срок годности. Система работает следующим образом:

  • Когда спрос ниже, чем контракты, оставшийся объем поступает в столбец «Запас» (как в первой строке примера).

  • Когда спрос выше, чем контракты, и есть положительный запас, он используется для удовлетворения спроса (как в строке 3). Здесь мы используем методологию FIFO. Другими словами, первый купленный контракт - первый контракт, если он не истек (как в строке 5).

Итак, мне нужно автоматически удалить из запаса суммы, срок действия которых истек в то же время, когда запас автоматически уменьшается, когда спрос превышает контракты в соответствии с методологией FIFO.

Я новичок в python и не смог найти подход, который мне подходит. Буду признателен за любую вашу идею.

Просто чтобы прояснить, я не ищу, чтобы вы его кодировали, а я ищу соответствующую библиотеку, которая могла бы обрабатывать эти операции. Я знаю, что должен использовать объекты deque для части FIFO (а также здесь есть много информации об этом), но не знаю, как обрабатывать даты истечения срока действия.

1 Ответ

0 голосов
/ 28 июня 2019

Попробуйте:

import pandas as pd
dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D')

for each in dates:
    if each.month==expire_month and each.day ==expire_day:
        df.drop(df.columns[[0,1,3]], axis=1, inplace=True) #You can select your own columns such as stock

Для FIFO:

df.shift(1)
df.loc[0] = new_row

df.shift (n) сместит строки n раз, заполнив первые n строк 'na' и избавляемся от последних n строк. Количество рядов df не будет изменить с помощью df.shift.

...