Панды: подсчитайте количество устройств, просмотренных на одну учетную запись за последние 48 часов - PullRequest
0 голосов
/ 25 января 2019

Используя 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

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

Знаете ли вы лучший способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы сосредоточены на идентификаторах учетных записей, поэтому я предлагаю сначала ввести groupby поле accountid.

При добавлении поля идентификатора устройства это становится очень похожена это ТАК вопрос.Поэтому я думаю, что ваш конечный результат выглядит так:

cutoff = pd.Timestamp.now() - pd.to_timedelta('48 hours')
df = df[timestamp > cutoff]
df.groupby('accountid').device.nunique()
0 голосов
/ 25 января 2019

Логика, которую вы применяете, не совсем ясна на основании описания, но метод группового панда должен дать то, что вы ищете, основываясь на том, что вы описываете.

Вызов будет выглядеть примерно такэто:

df.groupby(['timestamp','accountId']).cumcount()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...