Definición
Nuevo en la versión 5.0.
Devuelve la media móvil exponencial de expresiones numéricas aplicadas a documentos en una partición definida en la etapa $setWindowFields.
$expMovingAvg solo está disponible en la etapa $setWindowFields.
$expMovingAvg sintaxis:
{ $expMovingAvg: { input: <input expression>, N: <integer>, alpha: <float> } }
$expMovingAvg toma un documento con estos campos:
Campo | Descripción | ||
|---|---|---|---|
Especifica la expresión a evaluar. Las expresiones no numéricas se ignoran. | |||
Un Debe especificar N o alpha. No puedes especificar ambos. El valor | |||
Un Debe especificar N o alpha. No puedes especificar ambos. El valor |
Comportamiento
Debe especificar N o alpha. No puedes especificar ambos.
$expMovingAvg ignora valores no numéricos, valores null, y campos faltantes.
Ejemplos
Crea una colección de stockPrices que contenga precios de acciones nombradas "MDB" y "MSFT":
db.stockPrices.insertMany( [ { stock: "MDB", date: new Date( "2020-05-18T20:00:00Z" ), price: 13 }, { stock: "MDB", date: new Date( "2020-05-19T20:00:00Z" ), price: 15.4 }, { stock: "MDB", date: new Date( "2020-05-20T20:00:00Z" ), price: 12 }, { stock: "MDB", date: new Date( "2020-05-21T20:00:00Z" ), price: 11.7 }, { stock: "MSFT", date: new Date( "2020-05-18T20:00:00Z" ), price: 82 }, { stock: "MSFT", date: new Date( "2020-05-19T20:00:00Z" ), price: 94 }, { stock: "MSFT", date: new Date( "2020-05-20T20:00:00Z" ), price: 112 }, { stock: "MSFT", date: new Date( "2020-05-21T20:00:00Z" ), price: 97.3 } ] )
Promedio móvil exponencial utilizando N
Este ejemplo utiliza $expMovingAvg en la etapa $setWindowFields para generar la media móvil exponencial de los precios de las acciones ponderados para dos documentos históricos (dos días para los documentos de ejemplo) utilizando N establecido en 2:
db.stockPrices.aggregate( [ { $setWindowFields: { partitionBy: "$stock", sortBy: { date: 1 }, output: { expMovingAvgForStock: { $expMovingAvg: { input: "$price", N: 2 } } } } } ] )
En el ejemplo:
partitionBy: "$stock"particiona los documentos de la colección enstock. Existen particiones para"MDB"y"MSFT".sortBy: { date: 1 }ordena los documentos de cada partición pordateen orden ascendente (1), de modo que eldatemás antiguo sea el primero.outputdevuelve la media móvil exponencial para el campo de accionespricecon N establecido en2:En los documentos de entrada, hay un documento para cada día y los documentos están ordenados por
date. Por lo tanto, con N establecido en2, elpriceen el documento actual y elpriceen el documento anterior, si está disponible, se les asigna el peso más alto en la fórmula de promedio móvil exponencial.El promedio móvil exponencial para el campo
pricese almacena en un nuevo campo llamadoexpMovingAvgForStocks, como se muestra en los siguientes resultados.
{ "_id" : ObjectId("60d11fef833dfeadc8e6286b"), "stock" : "MDB", "date" : ISODate("2020-05-18T20:00:00Z"), "price" : 13, "expMovingAvgForStock" : 13 } { "_id" : ObjectId("60d11fef833dfeadc8e6286c"), "stock" : "MDB", "date" : ISODate("2020-05-19T20:00:00Z"), "price" : 15.4, "expMovingAvgForStock" : 14.6 } { "_id" : ObjectId("60d11fef833dfeadc8e6286d"), "stock" : "MDB", "date" : ISODate("2020-05-20T20:00:00Z"), "price" : 12, "expMovingAvgForStock" : 12.866666666666667 } { "_id" : ObjectId("60d11fef833dfeadc8e6286e"), "stock" : "MDB", "date" : ISODate("2020-05-21T20:00:00Z"), "price" : 11.7, "expMovingAvgForStock" : 12.088888888888889 } { "_id" : ObjectId("60d11fef833dfeadc8e6286f"), "stock" : "MSFT", "date" : ISODate("2020-05-18T20:00:00Z"), "price" : 82, "expMovingAvgForStock" : 82 } { "_id" : ObjectId("60d11fef833dfeadc8e62870"), "stock" : "MSFT", "date" : ISODate("2020-05-19T20:00:00Z"), "price" : 94, "expMovingAvgForStock" : 90 } { "_id" : ObjectId("60d11fef833dfeadc8e62871"), "stock" : "MSFT", "date" : ISODate("2020-05-20T20:00:00Z"), "price" : 112, "expMovingAvgForStock" : 104.66666666666667 } { "_id" : ObjectId("60d11fef833dfeadc8e62872"), "stock" : "MSFT", "date" : ISODate("2020-05-21T20:00:00Z"), "price" : 97.3, "expMovingAvgForStock" : 99.75555555555556 }
Promedio móvil exponencial utilizando alpha
Este ejemplo usa $expMovingAvg en la etapa $setWindowFields para obtener la media móvil exponencial de los precios de las acciones usando alfa configurado en 0.75:
db.stockPrices.aggregate( [ { $setWindowFields: { partitionBy: "$stock", sortBy: { date: 1 }, output: { expMovingAvgForStock: { $expMovingAvg: { input: "$price", alpha: 0.75 } } } } } ] )
En el ejemplo:
partitionBy: "$stock"particiona los documentos de la colección enstock. Existen particiones para"MDB"y"MSFT".sortBy: { date: 1 }ordena los documentos de cada partición pordateen orden ascendente (1), de modo que eldatemás antiguo sea el primero.outputestablece la media móvil exponencial para los precios de las acciones en un nuevo campo llamadoexpMovingAvgForStock, como se muestra en los siguientes resultados. El valor de alpha se establece en0.75en la fórmula de media móvil exponencial.
{ "_id" : ObjectId("60d11fef833dfeadc8e6286b"), "stock" : "MDB", "date" : ISODate("2020-05-18T20:00:00Z"), "price" : 13, "expMovingAvgForStock" : 13 } { "_id" : ObjectId("60d11fef833dfeadc8e6286c"), "stock" : "MDB", "date" : ISODate("2020-05-19T20:00:00Z"), "price" : 15.4, "expMovingAvgForStock" : 14.8 } { "_id" : ObjectId("60d11fef833dfeadc8e6286d"), "stock" : "MDB", "date" : ISODate("2020-05-20T20:00:00Z"), "price" : 12, "expMovingAvgForStock" : 12.7 } { "_id" : ObjectId("60d11fef833dfeadc8e6286e"), "stock" : "MDB", "date" : ISODate("2020-05-21T20:00:00Z"), "price" : 11.7, "expMovingAvgForStock" : 11.95 } { "_id" : ObjectId("60d11fef833dfeadc8e6286f"), "stock" : "MSFT", "date" : ISODate("2020-05-18T20:00:00Z"), "price" : 82, "expMovingAvgForStock" : 82 } { "_id" : ObjectId("60d11fef833dfeadc8e62870"), "stock" : "MSFT", "date" : ISODate("2020-05-19T20:00:00Z"), "price" : 94, "expMovingAvgForStock" : 91 } { "_id" : ObjectId("60d11fef833dfeadc8e62871"), "stock" : "MSFT", "date" : ISODate("2020-05-20T20:00:00Z"), "price" : 112, "expMovingAvgForStock" : 106.75 } { "_id" : ObjectId("60d11fef833dfeadc8e62872"), "stock" : "MSFT", "date" : ISODate("2020-05-21T20:00:00Z"), "price" : 97.3, "expMovingAvgForStock" : 99.6625 }