Анализ схожести строк в датафрейме Pandas

Прошу помощи в решении задачи:

Задача состоит в том чтобы проанализировать сделки из списка в датафрейме, необходимо выявить случаи (связи) когда отклоняется сделка и сразу за ней создается новая (ориентируемся на дату закрытия предыдущей и открытия следующей)

Проблема которую решает данный анализ:

Менеджеры по сделкам чтобы не нарушить нормативные сроки по ведению сделки отклоняют сделку и создают ее клон с уже новыми сроками

Исходный датафрейм

  df = pd.DataFrame({"deal":["EJ3232", "EJ3233", "EJ3234","ER3434","ER3435","ED3284"],
                  "INN":["123","123","123,"222","222","333"],
                  "type":["AAB","AAA","AAA,"BBB","BBB","CCC"],
                  "start":["27.02.2019 15:49", "28.02.2019 10:49", "01.03.2019 16:01", "17.02.2019 15:49", "28.02.2019 10:49", "01.04.2019 16:01"],
                  "end":["28.02.2019  08:49", "01.03.2019 15:49", "06.03.2019 18:49", "18.02.2019  09:49", "01.03.2019 15:49", "06.04.2019 18:49"],
                  "status": ["Отклонена", "Отклонена", "Заключена", "Отклонена", "Заключена", "Заключена"]})

Не удается решить данную задачу стандартными средствами, идей как установить такую взаимосвязь по сделкам нет. Прошу подсказать способ или функцию для решения данного кейса


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

Автор решения: strawdog

Ну так вы придумайте себе минимальный интервал между закрытием одной сделки и открытием другой, при котором эти сделки можно считать клонами.
Например, пусть будет так, что если новая сделка открыта не позднее 3х часов после закрытия другой сделки, будем считать их клонами:

df["start"] = pd.to_datetime(df["start"], dayfirst=True)
df["end"] = pd.to_datetime(df["end"], dayfirst=True)
res = pd.DataFrame()
for _, g in df.groupby("INN", as_index=False):
    if len(g):
        res = pd.concat([res, g[(g["start"]-g["end"].shift()).abs().le("3h")]])
print(res)

res:

     deal  INN type               start                 end     status
1  EJ3233  123  AAA 2019-02-28 10:49:00 2019-03-01 15:49:00  Отклонена
2  EJ3234  123  AAA 2019-03-01 16:01:00 2019-03-06 18:49:00  Заключена

UPDATE Если нужно включить в результат записи обеих сравниваемых сделок, то можно переделать код на:

for _, g in df.groupby("INN", as_index=False):
    idx = g[(g["start"]-g["end"].shift()).abs().le("3h")].index
    if len(idx):
        res = pd.concat([res, df[df.index.isin(idx-1)], df[df.index.isin(idx)]]).drop_duplicates()

res:

     deal  INN type               start                 end     status
0  EJ3232  123  AAB 2019-02-27 15:49:00 2019-02-28 08:49:00  Отклонена
1  EJ3233  123  AAA 2019-02-28 10:49:00 2019-03-01 15:49:00  Отклонена
2  EJ3234  123  AAA 2019-03-01 16:01:00 2019-03-06 18:49:00  Заключена
→ Ссылка