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