$expMovingAvg (agregação)
Nesta página
Definição
Novidades na versão 5.0.
Retorna a média móvel exponencial deexpressões numéricas aplicadas a documentos em uma partição definida no estágio $setWindowFields
.
$expMovingAvg
está disponível somente no estágio $setWindowFields
.
$expMovingAvg
sintaxe:
{ $expMovingAvg: { input: <input expression>, N: <integer>, alpha: <float> } }
$expMovingAvg
pega um documento com estes campos:
Campo | Descrição | ||
---|---|---|---|
Especifica a expressão a ser avaliada. Expressões não numéricas são ignoradas. | |||
Um Você deve especificar N ou alpha. Não é possível especificar ambos. O valor
| |||
Um Você deve especificar N ou alpha. Não é possível especificar ambos. O valor
|
Comportamento
Você deve especificar N ou alpha. Não é possível especificar ambos.
$expMovingAvg
ignora valores não numéricos, valores null
e campos ausentes.
Exemplos
Crie uma coleção stockPrices
que contenha os preços das ações denominadas "MDB"
e "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 } ] )
Uso da média móvel exponencial N
Este exemplo usa $expMovingAvg
no estágio $setWindowFields
para produzir a média móvel exponencial para os preços das ações ponderados para dois documentos históricos (dois dias para os documentos de exemplo) usando N definido como 2
:
db.stockPrices.aggregate( [ { $setWindowFields: { partitionBy: "$stock", sortBy: { date: 1 }, output: { expMovingAvgForStock: { $expMovingAvg: { input: "$price", N: 2 } } } } } ] )
No exemplo:
partitionBy: "$stock"
particiona os documentos na collection porstock
. Existem partições para"MDB"
e"MSFT"
.sortBy: { date: 1 }
classifica os documentos em cada partição pordate
em ordem crescente (1
), para que odate
mais antigo seja o primeiro.output
retorna a média móvel exponencial para o campo de açõesprice
com N definido como2
:Nos documentos de entrada, há um documento para cada dia e os documentos são ordenados por
date
. Portanto, com N definido como2
, oprice
no documento atual e oprice
no documento anterior, se disponível, recebem o peso mais alto na fórmula da média móvel exponencial.A média móvel exponencial para o campo
price
é armazenada em um novo campo chamadoexpMovingAvgForStocks
, conforme mostrado nos resultados a seguir.
{ "_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 }
Uso da média móvel exponencial alpha
Este exemplo utiliza $expMovingAvg
no estágio $setWindowFields
para produzir a média móvel exponencial para os preços das ações utilizando alfa configurado como 0.75
:
db.stockPrices.aggregate( [ { $setWindowFields: { partitionBy: "$stock", sortBy: { date: 1 }, output: { expMovingAvgForStock: { $expMovingAvg: { input: "$price", alpha: 0.75 } } } } } ] )
No exemplo:
partitionBy: "$stock"
particiona os documentos na collection porstock
. Existem partições para"MDB"
e"MSFT"
.sortBy: { date: 1 }
classifica os documentos em cada partição pordate
em ordem crescente (1
), para que odate
mais antigo seja o primeiro.output
define a média móvel exponencial para os preços das ações em um novo campo chamadoexpMovingAvgForStock
, conforme mostrado nos resultados a seguir. O valor de alfa é definido como0.75
na fórmula da média móvel 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 }