Python pySpark,聚合复杂函数(连续事件的差异)
我有一个数据框(Python pySpark,聚合复杂函数(连续事件的差异),python,pandas,apache-spark,pyspark,Python,Pandas,Apache Spark,Pyspark,我有一个数据框(df),它的列是userid(用户id)、day(day) 我感兴趣的是计算每个用户每天活动的平均时间间隔 例如,对于给定的用户,数据帧可能看起来像这样 userid day 1 2016-09-18 1 2016-09-20 1 2016-09-25 import numpy as np np.mean(np.diff(df[df.userid==1].day)) 如果数据
df
),它的列是userid
(用户id)、day
(day)
我感兴趣的是计算每个用户每天活动的平均时间间隔
例如,对于给定的用户,数据帧可能看起来像这样
userid day
1 2016-09-18
1 2016-09-20
1 2016-09-25
import numpy as np
np.mean(np.diff(df[df.userid==1].day))
如果数据帧是熊猫数据帧,我可以像这样计算我感兴趣的数量
userid day
1 2016-09-18
1 2016-09-20
1 2016-09-25
import numpy as np
np.mean(np.diff(df[df.userid==1].day))
然而,这是相当低效的,因为我有数百万的用户在数据帧中,但我相信它可以这样做
df.groupby("userid").agg({"day": lambda x: np.mean(np.diff(x))})
第一个问题是,我不确定这是否有效,因为在应用np.mean(np.diff(x))
之前需要对日期进行排序
相反,第二个问题是,这是低效的,因为我只能在将数据帧转换为数据帧时这样做
有没有办法用pySpark做同样的事情呢?窗口功能来帮助你。一些进口:
from pyspark.sql.functions import col, datediff, lag
from pyspark.sql.window import Window
窗口定义
w = Window().partitionBy("userid").orderBy("day")
和查询
(df
.withColumn("diff", datediff(lag("day", 1).over(w), "day"))
.groupBy("userid")
.mean("diff"))