簡體   English   中英

應用於 DataFrame 段時如何加快 Pandas 中的滾動差異

[英]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)

for 循環與 groupby 的比較圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM