我尝试计算每个组在窗口上的移动平均值,但我只想将每个子组的最大值(在窗口上)包含到我的计算中。这是我的样本数据。
df = spark.createDataFrame(
[(1, 'a', 1, 5.0),
(1, 'a', 2, 10.0),
(1, 'a', 3, 25.0),
(1, 'a', 4, 50.0),
(1, 'a', 5, 75.0),
(1, 'b', 3, 100.0),
(1, 'b', 4, 30.0),
(1, 'b', 5, 60.0),
(1, 'b', 6, 90.0),
(1, 'b', 7, 120.0),
(2, 'c', 1, 200.0),
(2, 'c', 2, 400.0),
(2, 'c', 3, 600.0),
(2, 'c', 4, 800.0),
(2, 'c', 5, 1000.0),
(2, 'c', 6, 1200.0),
(2, 'c', 7, 1300.0),
(2, 'c', 8, 1400.0),
(2, 'd', 5, 150.0),
(2, 'd', 6, 250.0),
(2, 'd', 7, 350.0)],
("group", "sub-group","time", "value"))
我使用窗口函数并定义窗口如下
w = Window.partitionBy('group').orderBy('time').rangeBetween(-2, -1)
我的预期结果低于数据帧。有办法做这个计算吗?
df = spark.createDataFrame(
[(1, 'a', 1, 5.0, None),
(1, 'a', 2, 10.0, 5.0),
(1, 'a', 3, 25.0, 10.0),
(1, 'a', 4, 50.0, 62.5),
(1, 'a', 5, 75.0, 40.0),
(1, 'b', 3, 100.0, 10.0),
(1, 'b', 4, 30.0, 62.5),
(1, 'b', 5, 60.0, 40.0),
(1, 'b', 6, 90.0, 67.5),
(1, 'b', 7, 120.0, 82.5),
(2, 'c', 1, 200.0, None),
(2, 'c', 2, 400.0, 200.0),
(2, 'c', 3, 600.0, 400.0),
(2, 'c', 4, 800.0, 600.0),
(2, 'c', 5, 1000.0, 800.0),
(2, 'c', 6, 1200.0, 575.0),
(2, 'c', 7, 1300.0, 725.0),
(2, 'c', 8, 1400.0, 825.0),
(2, 'd', 5, 150.0, 800.0),
(2, 'd', 6, 250.0, 575.0),
(2, 'd', 7, 350.0, 725.0)],
("group", "sub-group","time", "value", "avg_max_value"))
我不确定是否真的理解整个计算过程,但我做了一个尝试(这与您的手动输出不完全匹配):
- 每次计算子组 的最大值
- 计算一个组和一个时间的平均值
from pyspark.sql import functions as F, Window
df.withColumn(
"value_1",
F.max("value").over(
Window.partitionBy("group", "sub-group").orderBy("time").rangeBetween(-2, -1)
),
).withColumn(
"value_2", F.avg("value_1").over(Window.partitionBy("group", "time"))
).orderBy(
"group sub-group time".split()
).show()
+-----+---------+----+------+-------+-------+
|group|sub-group|time| value|value_1|value_2|
+-----+---------+----+------+-------+-------+
| 1| a| 1| 5.0| null| null|
| 1| a| 2| 10.0| 5.0| 5.0|
| 1| a| 3| 25.0| 10.0| 10.0|
| 1| a| 4| 50.0| 25.0| 62.5|
| 1| a| 5| 75.0| 50.0| 75.0|
| 1| b| 3| 100.0| null| 10.0|
| 1| b| 4| 30.0| 100.0| 62.5|
| 1| b| 5| 60.0| 100.0| 75.0|
| 1| b| 6| 90.0| 60.0| 60.0|
| 1| b| 7| 120.0| 90.0| 90.0|
| 2| c| 1| 200.0| null| null|
| 2| c| 2| 400.0| 200.0| 200.0|
| 2| c| 3| 600.0| 400.0| 400.0|
| 2| c| 4| 800.0| 600.0| 600.0|
| 2| c| 5|1000.0| 800.0| 800.0|
| 2| c| 6|1200.0| 1000.0| 575.0|
| 2| c| 7|1300.0| 1200.0| 725.0|
| 2| c| 8|1400.0| 1300.0| 1300.0|
| 2| d| 5| 150.0| null| 800.0|
| 2| d| 6| 250.0| 150.0| 575.0|
| 2| d| 7| 350.0| 250.0| 725.0|
+-----+---------+----+------+-------+-------+