[英]How to speed up rolling diff in Pandas when applied to segments of DataFrame
我有以下代码
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
相关的事件(新的 session、综合浏览量等)。 我想要完成的是仅针对与特定用户相关的事件计算来自先前事件的时间戳差异。 本质上,对于此用户,此事件发生在上一个事件之后多长时间。
我以前以非常有限的方式使用rolling
,并希望有另一个选项(例如shift
)或分组逻辑,这将有助于在有大量用户的情况下加快这一速度。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.