Python Pyspark:功能工程师时间点度量

Python Pyspark:功能工程师时间点度量,python,pyspark,apache-spark-sql,feature-engineering,Python,Pyspark,Apache Spark Sql,Feature Engineering,我已经尝试了最长的时间来建模时间点数据。为了举例说明这一过程,想象4个不同的顾客(有些是回头客,有些是新顾客)在商店购物(如下所示) 我正在尝试使用Pyspark按ID对代码进行分区,并创建两个特性:mean(当时)purchase和total purchase。结果如下: 我已经通过简单的累积求和确定了Total_Purchase_1列,但我无法在我的一生中获得时间点平均值(mean_Purchase_1),其中平均值仅使用该日期的滞后值计算 有没有人有过处理此类特征工程任务的经验?我是一

我已经尝试了最长的时间来建模时间点数据。为了举例说明这一过程,想象4个不同的顾客(有些是回头客,有些是新顾客)在商店购物(如下所示)

我正在尝试使用Pyspark按ID对代码进行分区,并创建两个特性:mean(当时)purchase和total purchase。结果如下:

我已经通过简单的累积求和确定了Total_Purchase_1列,但我无法在我的一生中获得时间点平均值(mean_Purchase_1),其中平均值仅使用该日期的滞后值计算


有没有人有过处理此类特征工程任务的经验?我是一个喜欢R的人,有使用dplyr甚至Python中的Pandas处理它的经验,但我正在尝试使用Pyspark对此进行优化。谢谢

这应该是一个有效的解决方案,使用
窗口函数
mean()

在这里创建DF 输入 输出
您想如何计算平均购买量?如果是针对一组客户?i、 e,对于B55-它总是500,如果是这样的话,我不理解其他两个值是如何来的-第二行和第三行平均购买1的650和100。。如果您能帮助澄清逻辑,那就太好了Hey@dsk谢谢您的提问。指标基于该日期的当前平均值。例如,2015年2月10日是客户B55的第一次购买,因此他们的平均值等于2016年5月1日的购买(1000/1)是他们的第二次购买(300美元),因此在当时,他们的平均值是(1000+300)/2=650对于延迟的响应表示抱歉。我分享了一个解决方案,如果这对你有用,请你检查并帮助接受和投票。很高兴看到它对你有帮助:)你介意投赞成票吗:)对于答案,我将不胜感激!
from pyspark.sql import functions as F
from pyspark.sql import types as T
from pyspark.sql.window import Window as W
df = spark.createDataFrame([("B55","2018-05-28", 200),
                           ("B55","2016-05-01", 300),
                           ("B55","2015-02-10", 1000),
                            ("A37","2017-12-30", 2100),
                            ("A37","2016-06-21", 2000)
                           ],[ "id","date","value"])
df.show()
_w = W.partitionBy("id").orderBy("date")
df = df.withColumn("mean", F.mean("value").over(_w))
df.show()
+---+----------+-----+
| id|      date|value|
+---+----------+-----+
|B55|2018-05-28|  200|
|B55|2016-05-01|  300|
|B55|2015-02-10| 1000|
|A37|2017-12-30| 2100|
|A37|2016-06-21| 2000|
+---+----------+-----+
+---+----------+-----+------+
| id|      date|value|  mean|
+---+----------+-----+------+
|A37|2016-06-21| 2000|2000.0|
|A37|2017-12-30| 2100|2050.0|
|B55|2015-02-10| 1000|1000.0|
|B55|2016-05-01|  300| 650.0|
|B55|2018-05-28|  200| 500.0|
+---+----------+-----+------+