【问题标题】:How to speed up rolling diff in Pandas when applied to segments of DataFrame应用于 DataFrame 段时如何加快 Pandas 中的滚动差异
【发布时间】:2022-08-17 21:06:07
【问题描述】:

我有以下代码

from random import randrange, randint
from datetime import timedelta, datetime

def random_date(start, end):
    delta = end - start
    int_delta = (delta.days * 24 * 60 * 60) + delta.seconds
    random_second = randrange(int_delta)
    return start + timedelta(seconds=random_second)

from datetime import datetime
d1 = datetime.strptime(\'1/1/2008 1:30 PM\', \'%m/%d/%Y %I:%M %p\')
d2 = datetime.strptime(\'1/1/2009 4:50 AM\', \'%m/%d/%Y %I:%M %p\')

num_rows = 40000
num_users = 10000
events = [\'page_view\', \'session_start\']

random_timestamps = [random_date(d1, d2).timestamp() for i in range(num_rows)]
random_users = [randint(0, num_users) for i in range(num_rows)]
random_events = [events[randint(0, 1)] for i in range(num_rows)]
df = pd.DataFrame({\'event_timestamp\': random_timestamps,
                   \'user_pseudo_id\': random_users,
                   \'event_name\': random_events
                   })


user_ids = df.user_pseudo_id.unique()
df.sort_values([\'event_timestamp\', \'event_name\'], ascending=[True, False], inplace=True)

for user_id in user_ids:
  df.loc[df.user_pseudo_id == user_id, \'event_timestamp_diff\'] = df[df.user_pseudo_id == user_id][\'event_timestamp\'].rolling(window=2).apply(np.diff)

df.event_timestamp_diff.fillna(0, inplace=True)

df 是来自 Google Analytics 4 的与特定用户 pseudo_user_id 相关的事件(新会话、网页浏览等)。我想要完成的是仅针对与特定用户相关的事件计算来自先前事件的时间戳差异。本质上,对于此用户,此事件发生在上一个事件之后多长时间。

我之前以非常有限的方式使用了rolling,并希望有另一种选择(例如shift)或分组逻辑来帮助在有大量用户的情况下加快这一速度。

  • 你应该提供一个可重现的例子
  • 不要使用loops 使用groupby 语句
  • @mozway 我添加了一个可重现的示例

标签: python pandas dataframe google-analytics


【解决方案1】:
for user_id in user_ids:
  df.loc[df.user_pseudo_id == user_id, 'event_timestamp_diff'] = df[df.user_pseudo_id == user_id]['event_timestamp'].rolling(window=2).apply(np.diff)

可以替换为

df['event_timestamp_diff'] = df.groupby('user_pseudo_id')['event_timestamp'].rolling(window=2).apply(np.diff).reset_index(0,drop=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多