Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pySpark,聚合复杂函数(连续事件的差异)_Python_Pandas_Apache Spark_Pyspark - Fatal编程技术网

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"))