Цель: для нескольких пользователей определить, какое событие следует сразу за каждым экземпляром указанного события индикатора.
Я взломал код Python, который работает с данными от одного пользователя. Тем не менее, я не могу понять, как реализовать это для данных от нескольких пользователей. Кажется, что Гроуби должен работать, но я застреваю.
Пример набора данных:
+---------+---------------------+-----------+
| User ID | Timestamp | Event |
+---------+---------------------+-----------+
| U4 | 19-02-2018 01:22:00 | INDICATOR |
| U2 | 07-03-2018 00:28:00 | Event 3 |
| U1 | 28-02-2018 11:46:00 | INDICATOR |
| U3 | 07-03-2018 00:30:00 | INDICATOR |
| U2 | 06-03-2018 19:31:00 | Event 8 |
| U3 | 04-03-2018 19:49:00 | INDICATOR |
| U4 | 01-03-2018 22:52:00 | Event 10 |
| U1 | 07-03-2018 02:57:00 | Event 10 |
| U3 | 10-03-2018 21:36:00 | Event 4 |
+---------+---------------------+-----------+
Используя приведенный ниже код, я смог найти события, следующие за индикатором для одного пользователя.
- сортировка данных по метке времени по возрастанию
- сбросить индекс, превратить его в столбец «позиция»
- создать список всех индексов, где событие == индикатор
- перебрать список индексов событий индикатора и добавить 1 к каждому, чтобы создать список индексов + 1 (который должен быть событием, следующим сразу за индикатором), если в строке нет двух индикаторов, в этом случае второй индикатор должен быть индекс + 1, а следующая строка не должна быть включена.
- подмножество фрейма данных включает только индексы + 1 строка
Это работает для данных от одного пользователя:
def FollowingEvent(data2):
data2.sort_values('Time').reset_index(drop=True)
data2['Position'] = data2.index
indexesFirst = data2.Position[data2['Link'] == 'youtube.com/'].tolist()
indexesSecond = []
for i in indexesFirst:
if (i == 0):
new = i+1
indexesSecond.append(new)
elif (i > 0) & (i < len(data2)):
if data2.Link[i] != data2.Link[i-1]:
new = i+1
indexesSecond.append(new)
return(data2.iloc[indexesSecond])
Это работает для одного пользователя, но я не смог масштабировать это, чтобы найти события для набора данных с несколькими пользователями. Фактический набор данных имеет более 2000 пользователей и экспоненциально больше событий, поэтому эффективность важна.