Анализ схожести строк в датафрейме 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 шт):
Ну так вы придумайте себе минимальный интервал между закрытием одной сделки и открытием другой, при котором эти сделки можно считать клонами.
Например, пусть будет так, что если новая сделка открыта не позднее 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 Заключена