Определение дружеских связей в DataFrame
У меня появилась, в которой надо определить наличие дружеской связи. Поясню, на работе стоит пропускной пункт. Сотрудник, проходя через него, попадает в базу, где фиксируется его время и ФИО. Если сотрудник часто проходит через пункт с одним и тем же человеком, то можно считать, что между ними дружеская связь. Для примера я сделал маленький time Series:
import pandas as pd
dict_df={
'Data':['2020-02-10 10:00:23','2020-02-10 10:01:23','2020-02-10 10:01:30','2020-02-10 10:01:43',
'2020-02-10 10:02:02','2020-02-10 10:02:30','2020-02-10 10:02:35','2020-02-10 10:02:50',
'2020-02-10 10:02:58','2020-02-10 10:03:02','2020-02-10 10:03:10','2020-02-10 10:03:15',
'2020-02-10 10:03:26','2020-02-10 10:03:32','2020-02-10 10:03:38','2020-02-10 10:03:40',
'2020-02-10 10:03:46','2020-02-10 10:03:50','2020-02-10 10:04:04','2020-02-10 10:04:12',
'2020-02-10 10:04:23','2020-02-10 10:04:27','2020-02-10 10:04:45','2020-02-10 10:04:50',
'2020-02-10 10:04:59','2020-02-10 10:05:20','2020-02-10 10:05:26','2020-02-10 10:05:40',
'2020-02-10 10:05:56','2020-02-10 10:06:12','2020-02-10 10:06:18','2020-02-10 10:06:30',
'2020-02-10 10:06:37'],
'Name':['Ann','Jhon','Chase','Bruce','Evan','Fred','Hugh','Gregory','Jack','Caleb','Eric','James',
'Ann','Gerld','Jess','Juan','Luke','Kyle','Neil','Owen','James','Eric','Jhon','Jess','Norman',
'Hugh','Fred','Gregory','Ryan','Angel','Cole','James','Eric']}
df=pd.DataFrame(dict_df)
Вот так от выглядит:
Data Name
0 2020-02-10 10:00:23 Ann
1 2020-02-10 10:01:23 Jhon
2 2020-02-10 10:01:30 Chase
3 2020-02-10 10:01:43 Bruce
4 2020-02-10 10:02:02 Evan
5 2020-02-10 10:02:30 Fred
6 2020-02-10 10:02:35 Hugh
7 2020-02-10 10:02:50 Gregory
8 2020-02-10 10:02:58 Jack
9 2020-02-10 10:03:02 Caleb
10 2020-02-10 10:03:10 Eric
11 2020-02-10 10:03:15 James
12 2020-02-10 10:03:26 Ann
13 2020-02-10 10:03:32 Gerld
14 2020-02-10 10:03:38 Jess
15 2020-02-10 10:03:40 Juan
16 2020-02-10 10:03:46 Luke
17 2020-02-10 10:03:50 Kyle
18 2020-02-10 10:04:04 Neil
19 2020-02-10 10:04:12 Owen
20 2020-02-10 10:04:23 James
21 2020-02-10 10:04:27 Eric
22 2020-02-10 10:04:45 Jhon
23 2020-02-10 10:04:50 Jess
24 2020-02-10 10:04:59 Norman
25 2020-02-10 10:05:20 Hugh
26 2020-02-10 10:05:26 Fred
27 2020-02-10 10:05:40 Gregory
28 2020-02-10 10:05:56 Ryan
29 2020-02-10 10:06:12 Angel
30 2020-02-10 10:06:18 Cole
31 2020-02-10 10:06:30 James
32 2020-02-10 10:06:37 Eric
Мне надо, что было так:
Data Name cluster
0 2020-02-10 10:00:23 Ann 0
1 2020-02-10 10:01:23 Jhon 0
2 2020-02-10 10:01:30 Chase 0
3 2020-02-10 10:01:43 Bruce 0
4 2020-02-10 10:02:02 Evan 0
5 2020-02-10 10:02:30 Fred 1
6 2020-02-10 10:02:35 Hugh 1
7 2020-02-10 10:02:50 Gregory 1
8 2020-02-10 10:02:58 Jack 0
9 2020-02-10 10:03:02 Caleb 0
10 2020-02-10 10:03:10 Eric 2
11 2020-02-10 10:03:15 James 2
12 2020-02-10 10:03:26 Ann 0
13 2020-02-10 10:03:32 Gerld 0
14 2020-02-10 10:03:38 Jess 0
15 2020-02-10 10:03:40 Juan 0
16 2020-02-10 10:03:46 Luke 0
17 2020-02-10 10:03:50 Kyle 0
18 2020-02-10 10:04:04 Neil 0
19 2020-02-10 10:04:12 Owen 0
20 2020-02-10 10:04:23 James 2
21 2020-02-10 10:04:27 Eric 2
22 2020-02-10 10:04:45 Jhon 0
23 2020-02-10 10:04:50 Jess 0
24 2020-02-10 10:04:59 Norman 0
25 2020-02-10 10:05:20 Hugh 1
26 2020-02-10 10:05:26 Fred 1
27 2020-02-10 10:05:40 Gregory 1
28 2020-02-10 10:05:56 Ryan 0
29 2020-02-10 10:06:12 Angel 0
30 2020-02-10 10:06:18 Cole 0
31 2020-02-10 10:06:30 James 2
32 2020-02-10 10:06:37 Eric 2
Можно увидеть, что Fred, Gregory и Hugh проходили несколько раз вместе, значит дружеская связь установлена. Также James и Eric вместе проходили, значит тоже дружеская связь.
Я хочу понять, можно ли ее решить с помощью машинного обучения, скажем кластеризацией. Подскажите, может у кого есть мысли.
Ответы (1 шт):
Не уверен, что это задача для машинного обучения. А вот решить ее на графе - вполне. Строите нагруженный граф, где каждая вершина - сотрудник, а каждая нагруженная связь - это количество раз, когда они проходили ворота вместе. Потом с этим графом можно работать примерно так, как это делают, когда выявляют связи в социальных сетях. Обнаруживать дружеские коллективы, например. Или влюбленные парочки :-). Кстати, примерно так в соответствующих прикладных областях выявляют и членов криминальных группировок и аффилированные компании. По нагруженному графу связей, которые правда строятся исходя из другого набора признаков.
Если под кластеризацией вы понимали задачу разбиения графа на связанные компоненты - то да. А если кластеризация, как она понимается в задачах машинного обучения - то трудно вообразить. Ну и Датафрейм тут совсем инструмент, а не определяющий фактор задачи.