Docs Menu
Docs Home
/
MongoDB ๋งค๋‰ด์–ผ
/ / /

expMovingAvg (์ง‘๊ณ„)

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ

  • ์ •์˜
  • ํ–‰๋™
  • ์˜ˆ์‹œ

๋ฒ„์ „ 5.0์— ์ถ”๊ฐ€.

$expMovingAvg

๋‹จ๊ณ„์—์„œ ์ •์˜๋œ $setWindowFields ํŒŒํ‹ฐ์…˜ ์˜ ๋ฌธ์„œ์— ์ ์šฉ๋œ ์ˆซ์žํ‘œํ˜„์‹ ์˜ ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

$expMovingAvg๋Š” $setWindowFields ์Šคํ…Œ์ด์ง€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$expMovingAvg ๊ตฌ๋ฌธ:

{
$expMovingAvg: {
input: <input expression>,
N: <integer>,
alpha: <float>
}
}

$expMovingAvg (์€)๋Š” ๋‹ค์Œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

ํ•„๋“œ
์„ค๋ช…

ํ‰๊ฐ€ํ•  ํ‘œํ˜„์‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ํ‘œํ˜„์‹์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์ง€์ˆ˜ ์ด๋™ ํ‰๊ท  ๊ณ„์‚ฐ์—์„œ ์ˆ˜ํ•™์  ๊ฐ€์ค‘์น˜๊ฐ€ ํฐ ๊ธฐ๋ก ๋ฌธ์„œ ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” integer๋กœ, ๊ฐ€์žฅ ์ตœ๊ทผ ๋ฌธ์„œ๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

N ๋˜๋Š” alpha ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ง€์ •ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ˆ˜์‹์—์„œ๋Š” N ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ฝ๊ณ  ์žˆ๋Š” ๋ฌธ์„œ์˜ ํ‘œํ˜„์‹ ๊ฐ’๊ณผ ์ด์ „ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ˜„์žฌ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

current result = current value * ( 2 / ( N + 1 ) ) +
previous result * ( 1 - ( 2 / ( N + 1 ) ) )

์ง€์ˆ˜์  ๊ฐ์‡  ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” double๋กœ, ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท  ๊ณ„์‚ฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. alpha ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ์ด์ „ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ์— ๋” ๋‚ฎ์€ ์ˆ˜ํ•™์  ์œ ์˜์„ฑ์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

N ๋˜๋Š” alpha ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ง€์ •ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ˆ˜์‹์—์„œ๋Š” alpha ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ฝ๊ณ  ์žˆ๋Š” ๋ฌธ์„œ์˜ ํ‘œํ˜„์‹ ๊ฐ’๊ณผ ์ด์ „ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ˜„์žฌ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

current result = current value * alpha +
previous result * ( 1 - alpha )

๋ฐ˜๋“œ์‹œ N ๋˜๋Š” alpha๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ง€์ •ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

$expMovingAvg๋Š” ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฐ’, null ๊ฐ’ ๋ฐ ๋ˆ„๋ฝ๋œ ํ•„๋“œ๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

"MDB" ๋ฐ "MSFT" ์ฃผ์‹์˜ ๊ฐ€๊ฒฉ์ด ํฌํ•จ๋œ stockPrices ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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 }
] )

์ด ์˜ˆ์‹œ์—์„œ๋Š” $setWindowFields ๋‹จ๊ณ„์˜ $expMovingAvg๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ธฐ๋ก ๋ฌธ์„œ (์˜ˆ์‹œ ๋ฌธ์„œ์˜ ๊ฒฝ์šฐ 2์ผ)์— ๊ฐ€์ค‘์น˜๋ฅผ ์ ์šฉํ•œ ์ฃผ๊ฐ€์— ๋Œ€ํ•œ ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ N์€ 2๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

db.stockPrices.aggregate( [
{
$setWindowFields: {
partitionBy: "$stock",
sortBy: { date: 1 },
output: {
expMovingAvgForStock: {
$expMovingAvg: { input: "$price", N: 2 }
}
}
}
}
] )

์˜ˆ์‹œ:

  • partitionBy: "$stock" ๋Š” collection์˜ ๋ฌธ์„œ๋ฅผ stock๋กœ ํŒŒํ‹ฐ์…”๋‹ํ•ฉ๋‹ˆ๋‹ค. "MDB" ๋ฐ "MSFT"์— ๋Œ€ํ•œ ํŒŒํ‹ฐ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • sortBy: { date: 1 } ๊ฐ ํŒŒํ‹ฐ์…˜์˜ ๋ฌธ์„œ๋ฅผ date์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ(1)์œผ๋กœ ์ •๋ ฌํ•˜๋ฏ€๋กœ, ๊ฐ€์žฅ ์ด๋ฅธ date์ด ์ฒซ ๋ฒˆ์งธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • output N ์ด 2 ๋กœ ์„ค์ •๋œ ์ฃผ์‹ price ํ•„๋“œ์— ๋Œ€ํ•œ ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ์ž…๋ ฅ ๋ฌธ์„œ์—๋Š” ๋งค์ผ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ฌธ์„œ๋Š” date ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ N์ด 2๋กœ ์„ค์ •๋˜๋ฉด ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท  ๊ณต์‹์—์„œ ํ˜„์žฌ ๋ฌธ์„œ์˜ price์™€ ์ด์ „ ๋ฌธ์„œ์˜ price(์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)์— ๊ฐ€์žฅ ๋†’์€ ๊ฐ€์ค‘์น˜๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

    • price ํ•„๋“œ์˜ ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท ์€ ๋‹ค์Œ ๊ฒฐ๊ณผ์™€ ๊ฐ™์ด expMovingAvgForStocks๋ผ๋Š” ์ƒˆ ํ•„๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

{ "_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 }

์ด ์˜ˆ์ œ์—์„œ๋Š” $setWindowFields ๋‹จ๊ณ„์—์„œ $expMovingAvg๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ŒํŒŒ๋ฅผ 0.75๋กœ ์„ค์ •ํ•œ ์ฃผ๊ฐ€์˜ ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

db.stockPrices.aggregate( [
{
$setWindowFields: {
partitionBy: "$stock",
sortBy: { date: 1 },
output: {
expMovingAvgForStock: {
$expMovingAvg: { input: "$price", alpha: 0.75 }
}
}
}
}
] )

์˜ˆ์‹œ:

  • partitionBy: "$stock" ๋Š” collection์˜ ๋ฌธ์„œ๋ฅผ stock๋กœ ํŒŒํ‹ฐ์…”๋‹ํ•ฉ๋‹ˆ๋‹ค. "MDB" ๋ฐ "MSFT"์— ๋Œ€ํ•œ ํŒŒํ‹ฐ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • sortBy: { date: 1 } ๊ฐ ํŒŒํ‹ฐ์…˜์˜ ๋ฌธ์„œ๋ฅผ date์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ(1)์œผ๋กœ ์ •๋ ฌํ•˜๋ฏ€๋กœ, ๊ฐ€์žฅ ์ด๋ฅธ date์ด ์ฒซ ๋ฒˆ์งธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • output ๋‹ค์Œ ๊ฒฐ๊ณผ์™€ ๊ฐ™์ด expMovingAvgForStock ์ด๋ผ๋Š” ์ƒˆ ํ•„๋“œ์—์„œ ์ฃผ๊ฐ€์— ๋Œ€ํ•œ ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ˆ˜ ์ด๋™ ํ‰๊ท  ๊ณต์‹ ์—์„œ ์•ŒํŒŒ๊ฐ’์€ ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.0.75

{ "_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 }

๋Œ์•„๊ฐ€๊ธฐ

$exp

์ด ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ