Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
MongoDBchevron-right

Funções de janela e coleções de séries temporais

Mark Smith7 min read • Published Dec 23, 2021 • Updated Aug 13, 2024
MongoDBTime Series
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
As funções de janela e as collection de séries temporais são recursos que foram adicionados ao MongoDB 5.0. As funções de janela permitem que você execute uma janela em um conjunto classificado de documentos, produzindo cálculos em cada etapa da janela, como média móvel ou pontuações de correlação. As collection de séries temporais reduzemdrasticamente o custo de armazenamento e aumentam o desempenho do MongoDB ao trabalhar com dados de séries temporais. As funções de janela podem ser executadas em qualquer tipo de collection no MongoDB, não apenas collection de séries temporais, mas as duas andam juntas como ... duas coisas que combinam muito bem. Não sou fã de sanduíches de manteiga de amendoim e geleia, mas você entendeu!
Neste artigo, vou ajudá-lo a se preparar com um projeto de dados que criei e, em seguida, mostrarei como executar algumas funções de janela nos dados. Esses tipos de operações eram possíveis em versões anteriores do MongoDB, mas as funções de janela, com o estágio$setWindowFields, tornam essas operações relativamente simples.

Pré-requisitos

Esta publicação pressupõe que você já conhece os fundamentosdas coleções de séries temporaise também pode ser útil para entender como otimizar suas coleções de séries temporais.
Você também precisará do seguinte software instalado em sua máquina de desenvolvimento para acompanhar o código no projeto de amostra:
Depois de configurar suas coleções de séries temporais corretamente e preenchê-las com muitos dados de séries temporais, você estará pronto para começar a analisar os dados que está coletando. Como as coleções de séries temporais têm tudo a ver com tempo, você provavelmente executará operaçõestemporais na coleção para obter os dados mais recentes ou mais antigos da coleção. Você provavelmente também desejará executar cálculos com medições feitas ao longo do tempo. É aqui que as novas funções de janela do MongoDB são especialmente úteis.
Os operadores temporais e as funções de janela podem ser usados com qualquer tipo de coleção, mas são especialmente úteis com dados de séries temporais, e as coleções de séries temporais serão cada vez mais otimizadas para uso com esses tipos de operações.

Obtendo os dados de amostra

Encontrei alguns dados da bolsa de valores no Kagglee achei que seria divertido analisá-los. Eu usei a versão 2 do conjuntode dados.
Escrevi alguns scripts para automatizar o processo de criação de uma collection de séries temporais e de importação de dados para a collection. Também automatizei a execução de algumas das operações descritas abaixo nos dados, para que você possa ver os resultados. Você pode encontrar os scripts no Github, juntamente com informações sobre como executá-los, se quiser fazer isso enquanto acompanha esta postagem do blog.

Preparando-se para o projeto de exemplo

No momento em que escrevemos, as coleções de séries temporais terminaram de ser lançadas com o lançamento do MongoDB 5.0. Dessa forma, a integração com a aba Agregação da interface do Atlas Data Explorer não está completa, e a integração com o MongoDB Charts também não.
Para ver os resultados da execução de funções de janela e operações temporais em uma coleção de séries temporais, criei alguns exemplos de código JavaScript para executar agregações em uma coleção e exportá-los para uma nova coleção usando $merge. Esta é a técnica para criar visualizações materializadas no MongoDB.
Eu colei todos os scripts usando um executor de tarefas chamado Just. É um pouco como o Make, se você já usou isso, mas mais fácil de instalar e usar. Você não precisa usá-lo, mas ele possui alguns recursos interessantes, como ler a configuração de um arquivo dotenv automaticamente. É altamente recomendável que você experimente!
Primeiro, crie um arquivo chamado ".env" e adicione uma variável de configuração chamada MDB_URI, assim:
1MDB_URI="mongodb+srv://USERNAME:PASSWORD@YOURCLUSTER.mongodb.net/DATABASE?retryWrites=true&w=majority"
Seu URI e as credenciais nele serão diferentes, e você pode obtê-lo a partir da interface de Atlas user , fazendo login no Atlas e clicando no botão "Conectar" próximo aos detalhes do cluster. Certifique-se de que criou um MongoDB 5.0 cluster ou superior.
Depois de salvar o arquivo .env, abra sua linha de comando no diretório correto e execute just connect para testar a configuração - ela instruirá mongosh a abrir um shell interativo conectado ao seu cluster.
Você pode executar db.ping() apenas para verificar se está tudo bem e, em seguida, digitar exit seguido pela tecla "Enter" para sair do mongosh.

Crie sua coleção de séries temporais

Você pode executar just init para criar a coleção, mas se não estiver usando o Apenas, o comando a ser executado dentro do mongosh para criar sua coleção é:
1// From init_database.js
2db.createCollection("stock_exchange_data", {
3    timeseries: {
4        timeField: "ts",
5        metaField: "source",
6        granularity: "hours"
7    }
8});
Isso criará uma coleção de séries temporais chamada "stock_exchange_data", com um campo de tempo de "ts ", um metaField de "source" (especificando a bolsa de valores para a qual cada conjunto de medições é relevante) e, como há um registropor fonte por dia, escolhi a granularidade mais próxima, que é "hours".

Importar o conjunto de dados de amostra

Se você executar o just import, ele importará os dados para a collection que você acabou de criar, por meio do seguinte MongoDB CLI:
1mongoimport --uri $MDB_URI indexProcessed.json --collection stock_exchange_data
Observação: ao importar dados para uma coleção de séries temporais, é muito importante que seus dados estejam em ordem cronológica, caso contrário a importação será muito lenta!
Um único documento de amostra se parece com isto:
1{
2 "source": {
3 "Region": "Hong Kong",
4 "Exchange": "Hong Kong Stock Exchange",
5 "Index": "HSI",
6 "Currency": "HKD"
7 },
8 "ts": {
9 "$date": "1986-12-31T00:00:00+00:00"
10 },
11 "open": {
12 "$numberDecimal": "2568.300049"
13 },
14 "high": {
15 "$numberDecimal": "2568.300049"
16 },
17 "low": {
18 "$numberDecimal": "2568.300049"
19 },
20 "close": {
21 "$numberDecimal": "2568.300049"
22 },
23 "adjustedClose": {
24 "$numberDecimal": "2568.300049"
25 },
26 "volume": {
27 "$numberDecimal": "0.0"
28 },
29 "closeUSD": {
30 "$numberDecimal": "333.87900637"
31 }
32}
De uma forma que corresponda aos parâmetros da série temporal da collection, " ts " contém o carimbo de data/hora das medições no documento e " source " contém metadados que descrevem a fonte das medições — nesse caso, a Bolsa de Valores de Hong Kong.
Você pode ler sobre o significado de cada uma das medições na documentação do conjunto de dados. Trabalharei principalmente com "closeUSD", que é o valor de fechamento da troca, em dólares no final do dia especificado.

Funções de janela

As funções de janela permitem aplicar um cálculo a valores em uma série de documentos ordenados, seja em uma janela de tempo específica ou em um número específico de documentos.
Quero visualizar os resultados dessas operações no MongoDB Atlas Charts. Você pode anexar um pipeline de agregação a uma fonte de dados do Charts, para que você possa usar $setWindowFunction diretamente nas agregações da fonte de dados. Nesse caso, porém, mostrarei como executar as funções de janela com um $merge estágio , gravando em uma nova collection e, em seguida, a nova collection pode ser usada como uma fonte de dados de gráficos. Essa técnica de gravar resultados pré-calculados em uma nova collection geralmente é chamada de visão materializada ou, coloquialmente, com dados de séries temporais , de rollup.
Primeiro, criei um gráfico de "action_exchange_data" no MongoDB Charts, com "ts" (o timestamp) no eixo x e "closeUSD" no eixo y, separados em séries por "source.exchange". Filtrei especificamente os dados para o ano de 2008, para que eu pudesse investigar os valores do mercado de ações durante a crise de crédito no final do ano.
Você notará que os dados acima são bem irregulares. Uma maneira comum de suavizar dados com picos é executar uma média móvel nos dados, em que os dados de cada dia são calculados com os 5 dias anteriores, por exemplo.
O seguinte pipeline de agregação criará um gráfico suavizado:
1[{
2 $setWindowFields: {
3 partitionBy: "$source",
4 sortBy: { ts: 1 },
5 output: {
6 "window.rollingCloseUSD": {
7 $avg: "$closeUSD",
8 window: {
9 documents: [-5, 0]
10 }
11 }
12 }
13 }
14},
15{
16 $merge: {
17 into: "stock_exchange_data_processed",
18 whenMatched: "replace"
19 }
20}]
A primeira etapa aplica a função de janela $avg ao valor closeUSD. Os dados são particionados por " $source " porque as diferentes bolsas de valores são séries discretas e devem ser calculadas separadamente. Optei por criar uma janela sobre documentos 6 por vez, em vez de 6 dias, porque não há valores no fim de semana, e isso significa que cada valor será criado como uma média de um número igual de documentos, caso contrário, o primeiro dia de cada semana incluiria apenas valores dos últimos 3 dias da semana anterior.
O segundo estágio $merge armazena o resultado da agregação na coleção "stock_exchange_data_processed". Cada documento será idêntico ao documento equivalente na coleção "action_exchange_data", mas com um campo extra, "window.rollingCloseUSD".
A plotagem desses dados mostra um gráfico muito mais suave, e a queda em várias exchanges em setembro pode ser vista com mais clareza.
É possível executar mais de uma função de janela na mesma collection em um único estágio $setWindowFields, desde que todas operem na mesma sequência de documentos (embora a especificação da janela possa ser diferente).
O arquivo window_functions.js contém o seguinte estágio, que executa duas funções de janela na coleção:
1{
2 $setWindowFields: {
3 partitionBy: "$source",
4 sortBy: { ts: 1 },
5 output: {
6 "window.rollingCloseUSD": {
7 $avg: "$closeUSD",
8 window: {
9 documents: [-5, 0]
10 }
11 },
12 "window.dailyDifference": {
13 $derivative: {
14 input: "$closeUSD",
15 unit: "day"
16 },
17 window: {
18 documents: [-1, 0]
19 }
20 },
21 }
22 }
23}
Observe que, embora a ordem de classificação da coleção deva ser compartilhada entre ambas as funções de janela, elas podem especificar a janela individualmente – a função $avg opera em uma janela de 6 documentos, enquanto a $derivative é executada em pares de documentos.
O gráfico derivado, filtrado apenas para a Bolsa de Valores de Nova York, está abaixo:
Isso mostra a diferença diária no valor de mercado no final de cada dia. Preciso reconhecer que errei um pouco aqui para demonstrar a função de janela $derivativeaqui. Talvez tivesse sido mais apropriado apenas subtrair$first de $last. Mas esse é um post do blog para um dia diferente.
O gráfico acima é bastante pontiagudo, então adicionei outra função de janela no próximo estágio, para calcular a média dos valores ao longo de 10 dias:
Essas duas grandes quedas no final do ano realmente destacam o momento em que a crise de crédito começou a se manifestar de fato. Lembre-se de que, só porque você calculou um valor com uma função de janela em um estágio, não há nada que o impeça de alimentar esse valor em um estágio$setWindowFieldsposterior , como fiz aqui.

Conclusão

As funções de janela são um novo recurso superpoderoso do MongoDB, e eu sei que vou usá-las com muitos tipos diferentes de dados, mas especialmente com dados de séries temporais. Espero que tenha achado este artigo útil!
Para saber mais sobre séries temporais, nossa documentação oficial é abrangente e muito legível. Para saber mais sobre as funções da janela, há um bom post de Guy Harrison sobre a análise de dados cobiçados e, como sempre, o livro de Paul Done Agregações práticas do MongoDB tem um ótimo conteúdo sobre esses tópicos.
Se você estiver interessado em saber mais sobre como os dados de séries temporais são armazenados nos bastidores, confira a postagem no blog muito acessível do meu colega John .
E se você tiver alguma dúvida ou apenas quiser nos mostrar uma coisa legal que criou, confira a MongoDB Community!

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Adição de notificações em tempo real ao Ghost CMS usando MongoDB e eventos enviados pelo servidor


Aug 14, 2023 | 7 min read
Tutorial

Otimize e ajuste o desempenho do MongoDB com índices ocultos


Oct 01, 2024 | 5 min read
Artigo

Por que dados não estruturados são uma boa opção para Java


Sep 16, 2024 | 7 min read
exemplo de código

Filme: exemplo de aplicativo de microsserviços Go


Sep 11, 2024 | 0 min read
Sumário