Какой по счету месяц покупки с момента публикации? Dataframe
У меня есть два датафрейма df_rep и df_pub.
df_rep: В этом датафрейме хранится информация о том, что именно продано, когда и за какую цену.
| Product | Date | Price |
|---|---|---|
| Phone | 2021-12-26 | 30 |
| Phone | 2021-12-15 | 30 |
| Phone | 2022-02-12 | 30 |
| Notebook | 2021-12-22 | 54 |
| Notebook | 2022-01-12 | 54 |
| Notebook | 2022-01-14 | 54 |
| Monitor | 2022-01-30 | 100 |
| Monitor | 2022-02-05 | 100 |
df_pub: В этом датафрейме хранится информация о том, когда были опубликованы те или иные товары.
| Product | Date |
|---|---|
| Phone | 2021-12-10 |
| Notebook | 2021-11-12 |
| Monitor | 2021-12-12 |
Я хотел при помощи библиотеки Matplotlib или при помощи Plotly создать график чтобы сравнивать где какой товар продался больше и принес прибыль в свой первый месяц, второй месяц и т.д. Чтобы создать такой график нужно обладать информацией о том в какой по счету месяц с момента публикации продался каждый товар. Плюс если конкретный товар не продался во втором месяце то необходимо в датафрейм добавить информацию о том что этот же товар не принес прибыли во втором месяце.
Чтобы справиться с этой проблемой я решил добавить в df_rep новый столбец в котором указано в цифрах какой по счету месяц продажи товара с момента публикации, сравнивая с датой из df_pub. Плюс добавил строки с информацией о том, что тот или иной товар не принёс прибыль в том или ином месяце. А затем при помощи метода groupby сгруппировал данные по названию и месяцу. Плюс суммировал доход.
Я каким-то способом смог это реализовать, но мне хочется получить совет от профессионалов, как это можно было сделать наиболее эффективнее? Как вы поступили бы для достижения этой цели?
import pandas as pd
import datetime
report = {"Product" : ["Phone","Phone","Phone","Notebook","Notebook","Notebook","Monitor","Monitor"], "Date" : ["2021-12-26","2021-12-15","2022-02-12","2021-12-22","2022-01-12","2022-01-14","2022-01-30","2022-02-05"], "Price" : ["30","30","30","54","54","54","100","100"]}
publish = {"Product" : ["Phone", "Notebook", "Monitor"], "Date" : ["2021-12-10","2021-11-12","2021-12-12"]}
df_rep = pd.DataFrame(report)
df_pub = pd.DataFrame(publish)
df_rep["Date"] = pd.to_datetime(df_rep["Date"], format="%Y/%m/%d")
df_pub["Date"] = pd.to_datetime(df_pub["Date"], format="%Y/%m/%d")
df_rep["Price"] = pd.to_numeric(df_rep["Price"])
df_rep["Month"] = (0)
for i in range(0, df_pub.shape[0]):
k = 1
for j in pd.date_range(start=df_pub.loc[i, "Date"], end=(datetime.datetime.now() + pd.offsets.MonthEnd(0, normalize=True)), freq='M'):
if df_rep.loc[(df_rep["Product"] == df_pub.loc[i, "Product"]) & ((df_rep['Date'] + pd.offsets.MonthEnd(0, normalize=True)) == j)].empty != True:
df_rep.loc[(df_rep["Product"] == df_pub.loc[i, "Product"]) & ((df_rep['Date'] + pd.offsets.MonthEnd(0, normalize=True)) == j), "Month"] = k
else:
df_rep.loc[len(df_rep)] = [df_pub.loc[i, "Product"],
j,
0,
k]
k = k + 1
df_grp = df_rep.groupby(["Product", "Month"]).agg({"Price":"sum"})
Датафрейм df_rep после манипуляции:
| Product | Date | Price | Month |
|---|---|---|---|
| Phone | 2021-12-26 | 30 | 1 |
| Phone | 2021-12-15 | 30 | 1 |
| Phone | 2022-02-12 | 30 | 3 |
| Notebook | 2021-12-22 | 54 | 2 |
| Notebook | 2022-01-12 | 54 | 3 |
| Notebook | 2022-01-14 | 54 | 3 |
| Monitor | 2022-01-30 | 100 | 2 |
| Monitor | 2022-02-05 | 100 | 3 |
| Phone | 2022-01-31 | 0 | 2 |
| Notebook | 2021-11-30 | 0 | 1 |
| Notebook | 2022-02-28 | 0 | 4 |
| Monitor | 2021-12-31 | 0 | 1 |
Датафрейм после метода groupby:
| Product | Month | Price |
|---|---|---|
| Phone | 1 | 60 |
| Phone | 2 | 0 |
| Phone | 3 | 30 |
| Notebook | 1 | 0 |
| Notebook | 2 | 54 |
| Notebook | 3 | 108 |
| Notebook | 4 | 0 |
| Monitor | 1 | 0 |
| Monitor | 2 | 100 |
| Monitor | 3 | 100 |