En MongoDB, el $stdDevPop
El operador de tubería de agregación calcula la desviación estándar de la población de sus valores de entrada.
Los valores de entrada pueden ser de un grupo de documentos (es decir, documentos que están agrupados por la misma clave), o pueden ser varios campos dentro de un solo documento.
Sintaxis
El $stdDevPop
operador admite dos sintaxis.
Sintaxis 1:
{ $stdDevPop: <expression> }
Sintaxis 2:
{ $stdDevPop: [ <expression1>, <expression2> ... ] }
La primera sintaxis acepta un argumento y la segunda sintaxis acepta múltiples argumentos.
Cuando se usa en el $group
etapa, solo puede usar la primera sintaxis. En este caso, $stdDevPop
devuelve la desviación estándar de población de la expresión especificada para un grupo de documentos que comparten el mismo grupo por clave.
Ejemplos de sintaxis 1 (argumento único)
Aquí hay un par de ejemplos que usan la sintaxis 1.
Documentos agrupados
Este ejemplo usa $stdDevPop
junto con $group
para devolver la desviación estándar en un grupo de documentos que están agrupados por clave.
Supongamos que tenemos una colección llamada stonks
con los siguientes documentos:
{ "_id" : 1, "ticker" : "gme", "price" : 10 } { "_id" : 2, "ticker" : "gme", "price" : 40 } { "_id" : 3, "ticker" : "gme", "price" : 90 } { "_id" : 4, "ticker" : "gme", "price" : 180 } { "_id" : 5, "ticker" : "gme", "price" : 290 } { "_id" : 6, "ticker" : "gme", "price" : 390 } { "_id" : 7, "ticker" : "gme", "price" : 190 } { "_id" : 8, "ticker" : "gme", "price" : 90 } { "_id" : 9, "ticker" : "gme", "price" : 10 } { "_id" : 10, "ticker" : "jnj", "price" : 131 } { "_id" : 11, "ticker" : "jnj", "price" : 133 } { "_id" : 12, "ticker" : "jnj", "price" : 138 } { "_id" : 13, "ticker" : "jnj", "price" : 141 } { "_id" : 14, "ticker" : "jnj", "price" : 145 } { "_id" : 15, "ticker" : "jnj", "price" : 150 } { "_id" : 16, "ticker" : "jnj", "price" : 154 } { "_id" : 17, "ticker" : "jnj", "price" : 156 } { "_id" : 18, "ticker" : "jnj", "price" : 160 }
Podemos agrupar estos documentos por su ticker
y luego use $stdDevPop
para devolver la desviación estándar de la población del price
campo para cada grupo:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$price" }
}
}
]
)
Resultado:
{ "_id" : "gme", "standardDeviation" : 123.7380746218039 } { "_id" : "jnj", "standardDeviation" : 9.752492558885207 }
Podemos ver que gme
tiene una desviación estándar mucho más alta que jnj
.
Arreglos
Este ejemplo aplica $stdDevPop
a un solo documento que contiene un campo con una matriz de valores.
Esta opción solo está disponible cuando se utiliza la sintaxis de argumento único. Las matrices se ignoran cuando se usa la sintaxis de múltiples argumentos (más sobre esto a continuación).
Supongamos que tenemos una colección llamada players
con los siguientes documentos:
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 7, 2, 3, 8, 7, 1 ] } { "_id" : 2, "player" : "Marge", "scores" : [ 0, 1, 8, 17, 18, 8 ] } { "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8, 0, 1, 3 ] } { "_id" : 4, "player" : "Brian", "scores" : [ 7 ] } { "_id" : 5, "player" : "Farnsworth", "scores" : [ ] } { "_id" : 6, "player" : "Meg", "scores" : null }
Podemos aplicar $stdDevPop
a las scores
campo en cada documento:
db.players.aggregate(
[
{
$project:
{
standardDeviation: { $stdDevPop: "$scores" }
}
}
]
)
Resultado:
{ "_id" : 1, "standardDeviation" : 2.849991049037143 } { "_id" : 2, "standardDeviation" : 6.968181653455625 } { "_id" : 3, "standardDeviation" : 5.467073155618908 } { "_id" : 4, "standardDeviation" : 0 } { "_id" : 5, "standardDeviation" : null } { "_id" : 6, "standardDeviation" : null }
En este caso, los tres primeros documentos arrojaron la desviación estándar de los distintos números que estaban en sus respectivas matrices.
El documento 4 dio como resultado una desviación estándar de 0
. Esto se debe a que solo proporcionamos un número en la matriz.
El documento 5 devolvió null
porque proporcionamos una matriz vacía.
El documento 6 devolvió null
porque proporcionamos null
como argumento.
Ejemplo de sintaxis 2 (múltiples argumentos)
La segunda sintaxis consiste en proporcionar $stdDevPop
con más de un argumento. $stdDevPop
luego calcula la desviación estándar en función de todos los argumentos proporcionados.
Supongamos que tenemos una colección llamada data
con los siguientes documentos:
{ "_id" : 1, "a" : 1, "b" : 2, "c" : 3, "d" : 4 } { "_id" : 2, "a" : 1, "b" : 2, "c" : 3, "d" : [ 4 ] } { "_id" : 3, "a" : 1, "b" : 2, "c" : 3, "d" : "Hey" }
Podemos usar $stdDevPop
para devolver la desviación estándar de la población de a
, b
, c
y d
campos de cada documento:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Resultado:
{ "_id" : 1, "result" : 1.118033988749895 } { "_id" : 2, "result" : 0.816496580927726 } { "_id" : 3, "result" : 0.816496580927726 }
El documento 1 devuelve la desviación estándar en función de sus valores de entrada de 1
, 2
, 3
y 4
.
Sin embargo, los últimos dos documentos solo devolvieron la desviación estándar para los valores de entrada de 1
, 2
y 3
. El $stdDevPop
el operador ignoró su d
los campos.
¿Por qué es esto?
La forma en que funciona es que $stdDevPop
ignora los valores no numéricos. Entonces, en este caso, ignoró "Hey"
en el documento 3 y calculó la desviación estándar de la población de los campos (numéricos) restantes.
En cuanto al documento 2, es d
campo contiene una matriz. Como se mencionó, el $stdDevPop
El operador ignora las matrices cuando usa la sintaxis de múltiples argumentos. Más precisamente, trata las matrices como valores no numéricos cuando se usa en este contexto. Y como se mencionó, $stdDevPop
ignora los valores no numéricos.
Si todos los valores no son numéricos, entonces $stdDevPop
devuelve null
.
Campos faltantes
Al usar la sintaxis de varios argumentos, $stdDevPop
ignora cualquier campo faltante. Es decir, si proporciona un campo que no existe, lo ignora. Si ninguno de los campos existe, devuelve null
.
Ejemplo:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Resultado:
{ "_id" : 1, "result" : 1.118033988749895 } { "_id" : 2, "result" : 0.816496580927726 } { "_id" : 3, "result" : 0.816496580927726 }
En este caso proporcioné un campo extra ($e
) que no existe en el documento. $stdDevPop
calculó la desviación estándar en función de los campos restantes que hacen existir.
Sin embargo, esto es lo que sucede cuando ninguno de los campos existen:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$x", "$y", "$z" ] }
}
}
]
)
Resultado:
{ "_id" : 1, "result" : null } { "_id" : 2, "result" : null } { "_id" : 3, "result" : null }
El resultado es null
para todos los documentos.
Cuando se usa la sintaxis de argumento único, un campo faltante da como resultado null
.
Ejemplo:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$oops!" }
}
}
]
)
Resultado:
{ "_id" : "gme", "standardDeviation" : null } { "_id" : "jnj", "standardDeviation" : null }
Etapas disponibles
$stdDevPop
está disponible en las siguientes etapas:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
etapa que incluye un$expr
expresión
Calcular la desviación estándar de la muestra
Ver MongoDB $stdDevSamp
si necesita obtener la muestra desviación estándar, a diferencia de la población Desviación Estándar. Este operador es útil si sus valores abarcan una muestra de una población de datos a partir de la cual generalizar sobre la población.