Как разбить данные на группы в pyspark - PullRequest
3 голосов
/ 19 апреля 2020

Мне нужно найти группы в данных временных рядов.

Выборка данных

enter image description here

Мне нужно вывести столбец group основанный на value и day.

Я пытался использовать lag, lead и row_number, но это закончилось ничем.

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

PySpark способ сделать это . Найдите конечные точки групп, используя lag, сделайте incremental sum для этого lag, чтобы получить groups, add 1 группам, чтобы получить desired groups.

from pypsark.sql.window import Window
from pyspark.sql import functions as F

w1=Window().orderBy("day")
df.withColumn("lag", F.when(F.lag("value").over(w1)!=F.col("value"), F.lit(1)).otherwise(F.lit(0)))\
  .withColumn("group", F.sum("lag").over(w1) + 1).drop("lag").show()

#+-----+---+-----+
#|value|day|group|
#+-----+---+-----+
#|    1|  1|    1|
#|    1|  2|    1|
#|    1|  3|    1|
#|    1|  4|    1|
#|    1|  5|    1|
#|    2|  6|    2|
#|    2|  7|    2|
#|    1|  8|    3|
#|    1|  9|    3|
#|    1| 10|    3|
#|    1| 11|    3|
#|    1| 12|    3|
#|    1| 13|    3|
#+-----+---+-----+
2 голосов
/ 19 апреля 2020

Кажется, что вы хотите увеличивать группу каждый раз, когда значение изменяется. Если это так, то это своего рода проблема пробелов и островков.

Вот один из подходов, использующий lag() и совокупный sum():

select
    value,
    day,
    sum(case when value = lag_value then 0 else 1 end) over(order by day) grp
from (
    select t.*, lag(value) over(order by day) lag_value
    from mytable t
) t
...