Используя Pandas API для Python, для каждой временной метки я хочу вычислить количество уникальных устройств, обнаруженных в учетной записи за за последние 48 часов с каждой из временных отметок .
Вот как выглядят мои данные:
╔═════════════════════╦══════════╦═══════════╗
║ timestamp ║ device ║ accountid ║
╠═════════════════════╬══════════╬═══════════╣
║ 2018-10-29 18:52:30 ║ d1ed6e6 ║ DhHUXPw ║
║ 2018-11-01 18:52:30 ║ d123ff96 ║ zgffRDY ║
║ 2018-11-01 20:53:30 ║ e322ff96 ║ zgffRDY ║
║ 2018-11-02 21:33:30 ║ g133gf42 ║ zgffRDY ║
║ 2018-11-15 18:52:30 ║ d123ff96 ║ awfdsct ║
║ 2018-11-17 08:25:30 ║ d123ff96 ║ awfdsct ║
╚═════════════════════╩══════════╩═══════════╝
Я за исключением вывода, чтобы выглядеть так.По существу, для учетной записи zgffRDY
на 2018-11-02 21:33:30
мы видели 3
уникальных устройств за последние 48 часов, тогда как на 2018-11-01 18:52:30
мы видели только 1
устройство (являющееся текущим устройством)
╔═════════════════════╦══════════╦═══════════╦═══════════════════════════╗
║ timestamp ║ device ║ accountid ║ last_48hour_device_count ║
╠═════════════════════╬══════════╬═══════════╬═══════════════════════════╣
║ 2018-10-29 18:52:30 ║ d1ed6e6 ║ DhHUXPw ║ 1 ║
║ 2018-11-01 18:52:30 ║ d123ff96 ║ zgffRDY ║ 1 ║
║ 2018-11-01 20:53:30 ║ e322ff96 ║ zgffRDY ║ 2 ║
║ 2018-11-02 21:33:30 ║ g133gf42 ║ zgffRDY ║ 3 ║
║ 2018-11-15 18:52:30 ║ d123ff96 ║ awfdsct ║ 1 ║
║ 2018-11-16 08:25:30 ║ d123ff96 ║ awfdsct ║ 1 ║
╚═════════════════════╩══════════╩═══════════╩═══════════════════════════╝
Мой текущий код выглядит следующим образом.
count_list = []
for idx, row in df.iterrows():
account = row['accountid']
earliest = row['timestamp'] - pd.to_timedelta('48 hours')
current_time = row['timestamp']
filtered_data = df.query('timestamp >= @earliest and '
'timestamp < @current_time and '
'accountid == @account')
device_cnt = len(set(filtered_data['device']))
count_list.append(device_cnt)
df['last_48hour_device_count'] = count_list
Я получил правильный вывод, но мой код работает слишком медленно, и у меня есть набор данных с большим количеством наблюдений в нем.
Знаете ли вы лучший способ решить эту проблему?