Оптимизация функции Pandas, которая сравнивает фреймы данных - PullRequest
0 голосов
/ 02 мая 2018

У меня есть журналы транскрипции, в которых записывается использование компьютера с киоском, и другой набор журналов для времени работы компьютера в автономном режиме. Журналы транзакций содержат поле datetime, которое позволяет узнать, когда произошла транзакция (или сеанс).

    event_date  raw_data1   session_id  ws_id
0   2017-11-06 12:13:06 {'description': 'Home'} 0604e80d-1ae6-48d0-81bf-32ca1dc58e4c    machine2
1   2017-11-06 12:13:41 {'description': 'AreYouStillThere'} 0604e80d-1ae6-48d0-81bf-32ca1dc58e4c    machine2
2   2017-11-06 12:14:09 {'description': 'AttractiveAnimation'}  0604e80d-1ae6-48d0-81bf-32ca1dc58e4c    machine2
3   2017-11-07 10:06:15 {'description': 'Home'} e2e7565f-60b4-4e7b-a8f0-d0a9c384b283    machine13
4   2017-11-07 10:06:27 {'description': 'AuthenticationPanelAdmin'} e2e7565f-60b4-4e7b-a8f0-d0a9c384b283    machine13

Цель этой функции - увидеть, какие session_ids совпадают с автономным журналом

    dtrange start   end status  machine_id
0   DateTimeTZRange(datetime.datetime(2017, 11, 17...   2017-11-17 14:46:15 2017-11-17 15:01:15 2   12
1   DateTimeTZRange(datetime.datetime(2017, 11, 17...   2017-11-17 14:47:02 2017-11-17 15:02:02 2   22
2   DateTimeTZRange(datetime.datetime(2017, 11, 17...   2017-11-17 14:47:23 2017-11-17 15:02:23 2   18
3   DateTimeTZRange(datetime.datetime(2017, 11, 17...   2017-11-17 14:48:09 2017-11-17 15:03:09 2   17
4   DateTimeTZRange(datetime.datetime(2017, 11, 17...   2017-11-17 14:49:18 2017-11-17 15:04:18 2   15

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

Это код, который я использую для возврата всех session_ids, которые произошли, когда машина находится в автономном режиме. Он фильтрует автономный фрейм данных с каждой строкой из фрейма данных транзакции и возвращает session_id, если автономное событие совпало с временем сеанса:

def CheckSession(machinename, sessiontime, sessionid):
    if len(offlinedf[(offlinedf.start<sessiontime)
             &(offlinedf.end>sessiontime)
             &(offlinedf.name==machinename)])>0:
        return sessionid

sessions = df.apply(lambda row: CheckSession(row["name"], row["created_at1"], row["session_id"]), axis=1)

Это создает список сеансов, но он очень медленный, а кадры данных довольно большие. Я все еще учусь, как лучше всего работать с библиотекой панд - я надеялся оптимизировать ее, используя некоторую векторизацию, но не смог понять, как ее построить таким образом.

1 Ответ

0 голосов
/ 02 мая 2018

Рассмотрим объединение df и offlinedf по name , а затем фильтрацию с query в соответствии с логика внутри вашей функции. Затем преобразуйте столбец sessionid отфильтрованного информационного кадра в список.

session_df = df.merge(offlinedf, on='name', suffixes=['', '_'])\
               .query('start < created_at1 & end > created_at1') 

sessions = session_df['sessionid'].tolist()

В любой работе по анализу данных блочная обработка объектов лучше, чем итеративная обработка строк.

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