Лучший подход для расчета разницы во времени между двумя рядами - PullRequest
1 голос
/ 06 июня 2019

Сценарий

У меня есть фрейм данных с заданной структурой, и в итоге я хочу найти разницу во времени между ответами и запросами службы. Имеет следующие столбцы:

  • Отметка
  • Услуги
  • Команда
  • MESSAGE_TYPE
  • MESSAGE_ID

И пример данных будет:

Timestamp   Service      Command     Message_Type   Message_ID
12:00:00    FoodOrders  SeeStock()  Request        125
12:00:02    FoodOrders  SeeStock()  Response       125

Вывод должен быть что-то вроде

Service   Command   Message_ID  TimeDiff
FoodOrders  SeeStock  125       00:00:02

Что я думал делать

Группировка по Service, Command, Message_ID и добавление дополнительного столбца с некоторой функцией, которая вычисляет разницу во времени.

Мои актуальные вопросы

  • Мой первоначальный план хорош? Я пытаюсь сделать код максимально чистым и быстрым

Спасибо.

Ответы [ 4 ]

1 голос
/ 06 июня 2019

Если важна производительность, избегайте агрегации и группирования, поскольку медленнее, лучше создавать серии Response и Response с MultiIndex и вычитать Timestamp s, sort_index также должно помочь с производительностью:

#if necessary
#df['Timestamp'] = pd.to_timedelta(df['Timestamp'])

cols = ['Service','Command','Message_ID']
s1 = df[df['Message_Type'] == 'Response'].set_index(cols)['Timestamp'].sort_index()
s2 = df[df['Message_Type'] == 'Request'].set_index(cols)['Timestamp'].sort_index()

df1 = s1.sub(s2).reset_index()
print (df1)
      Service     Command  Message_ID Timestamp
0  FoodOrders  SeeStock()         125  00:00:02
1 голос
/ 06 июня 2019

, за которым следует код из другого поста:

import time

start = time.time()
print("hello")
end = time.time()
print(end - start)

вы можете измерить время самостоятельно.

Попробуйте подход oyur и лямбду, чтобы проверить его.

1 голос
/ 06 июня 2019

Если вы используете ноутбук Юпитер, вы можете попробовать что-то вроде этого:

%timeit df.sort_values('Time').groupby(['Service', 'Command', 'Message_Type', 'Message_ID']).apply(lambda x: x.iloc[1]['Time'] - x.iloc[0]['Time'])

В моем примере у меня есть это:

2.97 ms ± 310 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

И я также думаю, что это хорошоплан =)

1 голос
/ 06 июня 2019

План более или менее в порядке. Обратите внимание, что для эффективности было бы лучше не передавать лямбда-функцию напрямую для вычисления пользовательского агрегата, такого как TimeDiff. Лучше сначала рассчитать вспомогательные агрегации, которые можно выполнить с помощью встроенных модулей pandas / numpy, а затем вычислить собственное агрегирование на их основе.

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