Saltar al contenido

¿Cómo calcular la media y la desviación estándar dado un PySpark DataFrame?

Esta cuestión se puede solucionar de variadas formas, por lo tanto te enseñamos la que en nuestra opinión es la resolución más completa.

Solución:

Puede utilizar las funciones integradas para obtener estadísticas agregadas. Aquí se explica cómo obtener la media y la desviación estándar.

from pyspark.sql.functions import mean as _mean, stddev as _stddev, col

df_stats = df.select(
    _mean(col('columnName')).alias('mean'),
    _stddev(col('columnName')).alias('std')
).collect()

mean = df_stats[0]['mean']
std = df_stats[0]['std']

Tenga en cuenta que hay tres funciones de desviación estándar diferentes. De los documentos, el que usé (stddev) devuelve lo siguiente:

Función agregada: devuelve la desviación estándar de muestra imparcial de la expresión en un grupo

Podrías usar el describe() método también:

df.describe().show()

Consulte este enlace para obtener más información: pyspark.sql.functions

ACTUALIZAR: Así es como puede trabajar con los datos anidados.

Utilizar explode para extraer los valores en filas separadas, luego llame mean y stddev como se muestra arriba.

Aquí hay un MWE:

from pyspark.sql.types import IntegerType
from pyspark.sql.functions import explode, col, udf, mean as _mean, stddev as _stddev

# mock up sample dataframe
df = sqlCtx.createDataFrame(
    [(680, [[691,1], [692,5]]), (685, [[691,2], [692,2]]), (684, [[691,1], [692,3]])],
    ["product_PK", "products"]
)

# udf to get the "score" value - returns the item at index 1
get_score = udf(lambda x: x[1], IntegerType())

# explode column and get stats
df_stats = df.withColumn('exploded', explode(col('products')))
    .withColumn('score', get_score(col('exploded')))
    .select(
        _mean(col('score')).alias('mean'),
        _stddev(col('score')).alias('std')
    )
    .collect()

mean = df_stats[0]['mean']
std = df_stats[0]['std']

print([mean, std])

Qué salidas:

[2.3333333333333335, 1.505545305418162]

Puede verificar que estos valores son correctos usando numpy:

vals = [1,5,2,2,1,3]
print([np.mean(vals), np.std(vals, ddof=1)])

Explicación: su "products" la columna es una list de lists. Vocación explode hará una nueva fila para cada elemento del exterior list. Entonces agarra el "score" valor de cada una de las filas explotadas, que ha definido como el segundo elemento en un elemento de 2 list. Finalmente, llame a las funciones agregadas en esta nueva columna.

Reseñas y puntuaciones del tutorial

Si tienes alguna duda y capacidad de acrecentar nuestro reseña puedes añadir una disquisición y con mucho placer lo analizaremos.

¡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 *