Какой по счету месяц покупки с момента публикации? 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

Ответы (0 шт):