rangeBetween с отрицательными значениями для предыдущих строк - PullRequest
1 голос
/ 24 мая 2019

Я хочу использовать окно, которое вычисляет среднее значение за последние 5 результатов перед текущим результатом.

Например, если у меня есть фрейм данных с результатами, mean_last_5 будет выглядеть следующим образом:

   Result    Mean_last_5
1. 4         NaN
2. 2         NaN
3. 6         NaN
4. 3         NaN
5. 2         NaN
6. 6         3.4
7. 3         3.8

Шестая строка будет рассчитываться как: (4+2+6+3+2)/5 = 3.4.

Так что в терминах Панд я бы катал окно 5 со сдвигом 1.

С PySpark я просто не могу понять, как это сделать. Текущий код:

def mean_last_5(df):
    window = Window.partitionBy('Id').orderBy('year').rangeBetween(Window.currentRow-5, Window.currentRow)

    return df.withColumn('mean_last_5', sf.avg('result').over(window))

Ошибка:

не удается разрешить из-за несоответствия типов данных: рамка окна диапазона с границами значений не может использоваться в спецификации окна с множественным порядком в выражениях:

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Поскольку вам не важны значения в строках, а только смещение текущей строки, вы должны использовать rowsBetween вместо rangeBetween. Разница иллюстрируется здесь: В чем разница между rowBetween и rangeBetween? .

Обратите внимание, что для rowsBetween оба значения являются включающими, поэтому, чтобы получить скользящее среднее для предыдущих 5 строк (не включая текущую), вы хотите определить окно как:

window = Window.partitionBy('Id').orderBy('year').rowsBetween(Window.currentRow-5, Window.currentRow-1)

или аналогично:

window = Window.partitionBy('Id').orderBy('year').rowsBetween(-5, -1)

Тогда используйте это как прежде:

df.withColumn('mean_last_5', avg('result').over(window))
0 голосов
/ 24 мая 2019

Попробуйте это:

def mean_last_5(df):
    window = Window.partitionBy('Id').orderBy('year').rangeBetween(-1, -6)

    return df.withColumn('mean_last_5', sf.avg('result').over(window))

Я поставил 0, потому что я хочу текущую строку, и -5, потому что я хочу 5 предыдущих, включая фактический результат.

...