Saltar al contenido

Calcule la desviación estándar de los datos agrupados en un Spark DataFrame

Sé libre de divulgar nuestra web y códigos en tus redes sociales, apóyanos para hacer crecer nuestra comunidad.

Solución:

Chispa 1.6+

Puedes usar stddev_pop para calcular la desviación estándar de la población y stddev / stddev_samp para calcular la desviación estándar de la muestra imparcial:

import org.apache.spark.sql.functions.stddev_samp, stddev_pop

selectedData.groupBy($"user").agg(stdev_pop($"duration"))

Chispa 1.5 y menos (la respuesta original):

No tan bonito y sesgado (igual que el valor devuelto por describe) pero usando la fórmula:

wikipedia sdev

puedes hacer algo como esto:

import org.apache.spark.sql.functions.sqrt

selectedData
    .groupBy($"user")
    .agg((sqrt(
        avg($"duration" * $"duration") -
        avg($"duration") * avg($"duration")
     )).alias("duration_sd"))

Por supuesto, puede crear una función para reducir el desorden:

import org.apache.spark.sql.Column
def mySd(col: Column): Column = 
    sqrt(avg(col * col) - avg(col) * avg(col))


df.groupBy($"user").agg(mySd($"duration").alias("duration_sd"))

También es posible utilizar Hive UDF:

df.registerTempTable("df")
sqlContext.sql("""SELECT user, stddev(duration)
                  FROM df
                  GROUP BY user""")

Fuente de la imagen: https://en.wikipedia.org/wiki/Standard_deviation

El código aceptado no se compila, ya que tiene un error tipográfico (como lo señaló MRez). El fragmento a continuación funciona y está probado.

Para chispa 2,0 + :

import org.apache.spark.sql.functions._
val _avg_std = df.groupBy("user").agg(
        avg(col("duration").alias("avg")),
        stddev(col("duration").alias("stdev")),
        stddev_pop(col("duration").alias("stdev_pop")),
        stddev_samp(col("duration").alias("stdev_samp"))
        )

Aquí puedes ver las comentarios y valoraciones de los usuarios

Tienes la opción de añadir valor a nuestro contenido informacional asistiendo con tu experiencia en los comentarios.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *