Как определить следующее событие после экземпляра указанного события индикатора для нескольких пользователей - PullRequest
0 голосов
/ 30 марта 2019

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

Я взломал код 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. сортировка данных по метке времени по возрастанию
  2. сбросить индекс, превратить его в столбец «позиция»
  3. создать список всех индексов, где событие == индикатор
  4. перебрать список индексов событий индикатора и добавить 1 к каждому, чтобы создать список индексов + 1 (который должен быть событием, следующим сразу за индикатором), если в строке нет двух индикаторов, в этом случае второй индикатор должен быть индекс + 1, а следующая строка не должна быть включена.
  5. подмножество фрейма данных включает только индексы + 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 пользователей и экспоненциально больше событий, поэтому эффективность важна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...