Promedio de las siguientes n filas en la ventana de Pyspark.
Necesito calcular, para cada ID y fila, la media de los últimos 3 períodos (excluyendo el actual (donde ingresaría el mismo valor) y gestionando el caso en el que el período no tenga otros 3 períodos menores).
Por ejemplo:
ENTRADA:
ID | $ | TIME |
---|---|---|
1 | 100 | 20/11/2021 |
1 | 200 | 17/11/2021 |
1 | 150 | 15/11/2021 |
1 | 170 | 10/11/2021 |
1 | 130 | 05/11/2021 |
2 | 200 | 20/11/2021 |
2 | 200 | 17/11/2021 |
SALIDA:
ID | $ | TIME | MEAN ($) |
---|---|---|---|
1 | 100 | 20/11/2021 | (200+150+170)/3 = 173.33* |
1 | 200 | 17/11/2021 | (150+170+130)/3 = 150 |
1 | 150 | 15/11/2021 | … |
1 | 170 | 10/11/2021 | … |
1 | 130 | 05/11/2021 | … |
… | … | … | … |
2 | 200 | 20/11/2021 | 200 |
2 | 150 | 17/11/2021 | … |
¿Existe alguna función de ventana para hacerlo? Espero no tener que utilizar un bucle 🙂 ¡Gracias por su valiosa ayuda!
davy.ai
Sí, podemos utilizar una función de ventana para calcular la media de los últimos 3 períodos para cada ID y fila. Podemos utilizar la función de ventana
rowsBetween()
de PySpark para especificar el rango de filas a incluir en la agregación. Aquí hay un ejemplo de código para lograr la salida deseada:En el código anterior, primero definimos una ventana
w
particionada por la columnaID
y ordenada por la columnaTIME
. Luego utilizamos la funciónrowsBetween()
para definir el rango de filas a incluir en la agregación. Establecemos el límite inferior en -3 (es decir, 3 filas anteriores a la fila actual) y el límite superior en -1 (es decir, excluir la fila actual). Finalmente, utilizamos la funciónavg()
para calcular la media de las filas seleccionadas y guardar el resultado en una nueva columna llamada “MEAN($)”.