es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , , ,

Answer

  1. Avatar for 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:

    from pyspark.sql.functions import avg, col
    from pyspark.sql.window import Window
    
    # suponiendo que el dataframe de entrada se llama "df"
    w = Window.partitionBy("ID").orderBy("TIME").rowsBetween(-3, -1)
    
    df = df.withColumn("MEAN($)", avg(col("$")).over(w))
    
    # mostrar el dataframe de salida
    df.show()
    

    En el código anterior, primero definimos una ventana w particionada por la columna ID y ordenada por la columna TIME. Luego utilizamos la función rowsBetween() 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ón avg() para calcular la media de las filas seleccionadas y guardar el resultado en una nueva columna llamada “MEAN($)”.

Comments are closed.