pyspark中子组最大值的滚动平均值



我尝试计算每个组在窗口上的移动平均值,但我只想将每个子组的最大值(在窗口上)包含到我的计算中。这是我的样本数据。

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

我不确定是否真的理解整个计算过程,但我做了一个尝试(这与您的手动输出不完全匹配):

  1. 每次计算子组
  2. 的最大值
  3. 计算一个组和一个时间的平均值
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|
+-----+---------+----+------+-------+-------+

相关内容

  • 没有找到相关文章

最新更新