У меня есть 3 dataframes
, уже отсортированные с датой и p_id
и без значений null
как:
Первый кадр данных
df1 = pd.DataFrame([['2018-07-05',8.0,1],
['2018-07-15',1.0,1],
['2018-08-05',2.0,1],
['2018-08-05',2.0,2]],
columns=["purchase_date", "qty", "p_id"])
Второй кадр данных
df2 = pd.DataFrame([['2018-07-15',2.0,1],
['2018-08-04',7.0,1],
['2018-08-15',1.0,2]],
columns=["sell_date", "qty", "p_id"])
Третий кадр данных
df3 = pd.DataFrame([['2018-07-25',1.0,1],
['2018-08-15',1.0,1]],
columns=["expired_date", "qty", "p_id"])
dataframe
выглядит так:
1-е: (содержит данные о покупке)
purchase_date qty p_id
0 2018-07-05 8.0 1
1 2018-07-15 1.0 1
2 2018-08-05 2.0 1
3 2018-08-05 2.0 2
2-й: (содержит данные о продажах)
sell_date qty p_id
0 2018-07-15 2.0 1
1 2018-08-04 7.0 1
2 2018-08-15 1.0 2
3-й: (содержит данные об истечении срока действия)
expired_date qty p_id
0 2018-07-25 1.0 1
1 2018-08-15 1.0 1
Теперь я хочу найти когда продукт, срок действия которого истек, был куплен
после FIFO
(срок действия первого купленного продукта истекает первым)
Объяснение: Рассмотрим товар с идентификатором 1
По дате 2018-07-15
У нас было 8 + 1 купленное количество и -2 проданное количество, т.е. всего 8 + 1-2 количество на складе, -ve
знак означает вычет количества
По дате 2018-07-25
Количество
1 истекло, поэтому первая запись для нашего нового when_product_expired
dataframe
будет:
purchase_date expired_date p_id
2018-07-05 2018-07-25 1
А затем для следующей записи об истечении срока действия
По дате 2018-08-04
7 количество было продано, поэтому текущее количество будет 8 + 1-2-7 = 0
По дате 2018-08-05
2 количество куплено, поэтому текущее количество 0 + 2
По дате 2018-08-15
1 количество истекло
Таким образом, новая и последняя запись будет:
purchase_date expired_date p_id
2018-07-05 2018-07-25 1
2018-08-05 2018-08-15 1
На этот раз срок годности продукта истек, был куплен 2018-07-25
На самом деле у меня есть время даты, поэтому время покупки и продажи никогда не будет равным (можно предположить), также до продажи и истечения срока действия всегда будет какое-то количество товара на складе, т. Е. Данные согласованы
И заранее спасибо :-)
Обновлено
Что я сейчас думаю, это переименовать все поля даты в одно и то же имя поля и добавить покупку, продажу, срок действия dataframe
с отрицательным знаком, но это не поможет мне
df2.qty = df2.qty*-1
df3.qty=df3.qty*-1
new = pd.concat([df1,df2, df3],sort=False)
.sort_values(by=["purchase_date"],ascending=True)
.reset_index(drop=True)