Produtos secos 丨 Tutorial do mecanismo de seção transversal DolphinDB para banco de dados de série temporal

Ao processar dados de streaming em tempo real, não é apenas necessário fazer cálculo de agregação vertical de acordo com o tempo ( mecanismo de agregação de série temporal ), mas também fazer comparação horizontal e cálculo dos dados mais recentes, como encontrar o percentil da última cotação de todas as ações em finanças, propriedade industrial Calcule a temperatura média de um lote de equipamentos na rede. O banco de dados DolphinDB fornece um mecanismo de agregação transversal que pode realizar operações de agregação nos dados mais recentes de todos os grupos nos dados de streaming.

O corpo principal do mecanismo de seção transversal é dividido em duas partes: a tabela de dados da seção transversal e o mecanismo de cálculo. Os dados de seção transversal são a tabela interna do mecanismo de seção transversal, que salva os dados de seção mais recentes de todos os grupos. O mecanismo de cálculo é um conjunto de disparadores e expressões de cálculo agregado. O sistema dispara a operação de agregação de uma maneira especificada e o resultado do cálculo é enviado para outra tabela.

1. Uso básico

No banco de dados DolphinDB, crie um mecanismo de agregação de seção cruzada por meio de createCrossSectionalAggregator. Ele retorna uma tabela de dados de seção cruzada, que salva os dados de seção cruzada mais recentes de todos os grupos. Gravar dados nesta tabela significa que esses dados entram no mecanismo de agregação de seção cruzada para cálculo. O uso específico é o seguinte:

createCrossSectionalAggregator (name, [metrics], dummyTable, [outputTable], keyColumn, [triggeringPattern = "perBatch"], [triggeringInterval = 1000])
  • name é uma string que representa o nome do mecanismo de agregação de seção transversal e é o identificador exclusivo do mecanismo de agregação de seção transversal. Ele pode conter letras, números e sublinhados, mas deve começar com uma letra.
  • Métricas são metacódigos. Pode ser uma função integrada do sistema ou definida pelo usuário, como <[sum (qty), avg (price)]>, você pode usar expressões para os resultados de agregação, como <[avg (price1) -avg (price2)]>, Você também pode executar operações de agregação em colunas calculadas, como <[std (price1-price2)]>. Para obter detalhes, consulte a meta programação.
  • DummyTable é um objeto de tabela, não precisa conter dados, mas sua estrutura deve ser a mesma da tabela de dados de streaming assinada.
  • outputTable é um objeto de tabela, usado para salvar resultados de cálculos. O número de colunas na tabela de saída é o número de métricas + 1, a primeira coluna é do tipo TIMESTAMP, usada para armazenar o carimbo de data / hora do cálculo, e os tipos de dados de outras colunas devem ser consistentes com os tipos de dados dos resultados retornados por métricas.
  • keyColumn é uma string que especifica uma coluna de dummyTable como a chave do mecanismo de agregação de seção cruzada. Cada chave na coluna especificada keyColumn corresponde a uma linha única na tabela.
  • triggeringPattern é uma string que representa o método de cálculo de disparo. Pode ter os seguintes valores:
    • "perRow": um cálculo é acionado sempre que uma linha de dados é inserida
    • "perBatch": um cálculo é acionado sempre que os dados são inseridos
    • "intervalo": aciona o cálculo em um determinado intervalo de tempo
  • triggeringInterval é um número inteiro. Ele tem efeito apenas quando o valor de triggeringPattern é intervalo, que indica o intervalo de tempo para o cálculo de disparo. O valor padrão é 1000 milissegundos.

2. Exemplo

Aqui está um exemplo para ilustrar a aplicação do mecanismo de agregação de seção transversal. Em transações financeiras, geralmente é necessário saber o valor médio mais recente de todas as ações, a soma do volume de negociação mais recente e o volume de negociação da transação mais recente em tempo real. O mecanismo de agregação de seção transversal do DolphinDB combinado com funções de assinatura de dados de streaming pode realizar facilmente essas tarefas.

(1) Crie uma tabela de transações em tempo real

As negociações de ações da mesa de negociação em tempo real contêm os seguintes campos principais:

sym: código de estoque 
tempo: tempo 
preço: preço de transação 
qty: volume de transação

Sempre que ocorre uma transação, os dados em tempo real são gravados na tabela de negociações. O script para criar a tabela de negociações é o seguinte:

compartilhar streamTable (10: 0, `time`sym`price`qty, [TIMESTAMP, SYMBOL, DOUBLE, INT]) como negociações

(2) Criar um mecanismo de agregação transversal

tradesCrossAggregator = createCrossSectionalAggregator ("CrossSectionalDemo", <[avg (price), sum (qty), sum (price * qty)]>, trades, outputTable, `sym,` perRow)

tradesCrossAggregator é uma tabela de dados transversal, que é agrupada por código de estoque, e cada estoque tem uma e apenas uma linha. Quando os dados entram na tabela, avg (preço), soma (qty) e soma (preço * qty) de cada ação serão calculados. Um cálculo é acionado sempre que um dado é inserido.

(3) Tabela de transações em tempo real de assinatura de tabela de dados de seção transversal

subscribeTable (, "trades", "tradesCrossAggregator", - 1, append! {tradesCrossAggregator}, true)

Por meio da função de assinatura de dados de streaming, os dados em tempo real são gravados na tabela de dados de seção transversal.

(4) Geração de dados de simulação

def writeData (n) { 
   timev = 2000.10.08T01: 01: 01.001 + timestamp (1..n) 
   symv = take (`A`B, n) 
   pricev = take (102,1 33,4 73,6 223, n) 
   qtyv = take (60 74 82 59, n) 
   inserir em valores de negociações (timev, symv, pricev, qtyv) 
} 
writeData (4);

Verifique a tabela de transações em tempo real, há 4 dados no total.

selecione * da 
quantidade de preço do sistema de tempo de negociações 
----------------------- --- ----- --- 
2000.10.08T01: 01: 01.002 A 102,1 60  
2000.10.08T01: 01: 01.003 B 33,4 74  
2000.10.08T01: 01: 01.004 A 73,6 82  
2000.10.08T01: 01: 01.005 B 223 59

Verifique a tabela de dados de seção transversal, que salva os dois registros de transações recentes das duas ações A e B.

select * from tradesCrossAggregator 
time sym price qty 
----------------------- --- ----- --- 
2000.10.08T01: 01: 01.004 A 73,6 82  
2000.10.08T01: 01: 01.005 B 223 59

Verifique a tabela de saída do mecanismo de seção transversal. Como o mecanismo de seção transversal usa a frequência de perRow para acionar cálculos por linha, o mecanismo de agregação realizará um cálculo sempre que uma linha de dados for gravada na tabela de seção transversal, portanto, há 4 registros no total.

select * from outputTable 
time avgPrice sumqty Total   
----------------------- -------- ------ ----- - 
2019.07.08T10: 04: 41.731 102,1 60 6126    
2019.07.08T10: 04: 41.732 67,75 134 8597,6  
2019.07.08T10: 04: 41.732 53,5 156 8506,8  
2019.07.08T10: 04: 41.732 148,3 141 19192,2

Visualize o status do mecanismo de seção cruzada por meio da função getAggregatorStat.

getAggregatorStat (). CrossSectionalAggregator 
nome do usuário status lastErrMsg numRows numMetrics metrics triggeringPattern triggeringInterval 
------------------ ----- ------ ------- --- ------- ---------- ------------------ ------------ ----- ------------------ 
CrossSectionalDemo guest OK 2 3 [média (preço), su ... perRow 1000

Remova o mecanismo de seção transversal por meio da função removeAggregator.

removeAggregator ("CrossSectionalDemo")

3. Várias maneiras de acionar cálculos

O mecanismo de seção cruzada tem três maneiras de acionar cálculos: perRow, perBatch e intervalo. No exemplo acima, um cálculo é disparado sempre que uma linha de dados é inserida. Aqui estão duas outras maneiras de acionar cálculos.

  • perBatch

O parâmetro perBatch significa que uma gravação é acionada sempre que um lote de dados é adicionado. O exemplo a seguir ativa o mecanismo de seção transversal no modo perBatch. O script gera um total de 12 registros e os grava em três lotes. A tabela de saída deve ter 3 registros.


qtyv) } 
// Grave três lotes de dados, espera-se que três cálculos sejam acionados e três resultados de agregação sejam produzidos. 
writeData (4);
writeData (4); 
writeData (4);

Visualize a folha de dados da seção transversal.

select * from tradesCrossAggregator 
time sym price qty 
----------------------- --- ----- --- 
2000.10.08T01: 01: 01.002 A 73,6 82  
2000.10.08T01: 01: 01.003 B 33,4 59

Visualize a tabela de saída. Três lotes de dados são inseridos, portanto, há 3 registros na tabela de saída.

select * from outputTable 
time avgPrice sumqty Total   
----------------------- -------- ------ ----- - 
2019.07.08T10: 14: 54.446 148,3 141 19192,2 
2019.07.08T10: 14: 54.446 148,3 141 19192,2 
2019.07.08T10: 14: 54,446 148,3 141 19192,2
  • intervalo

Quando o método de cálculo do acionador é intervalo, você precisa especificar triggeringInterval, o que significa que o cálculo é acionado a cada triggeringInterval milissegundos. No exemplo a seguir, 12 registros são gravados em 6 vezes com um intervalo de 500 milissegundos. Configure o mecanismo de seção transversal para acionar um cálculo a cada 1000 milissegundos e espera-se que 3 registros sejam produzidos.

compartilhar streamTable (10: 0, `time`sym`price`qty, [TIMESTAMP, SYMBOL, DOUBLE, INT]) as negociações 
outputTable = table (1: 0,` time`avgPrice`sumqty`Total, [TIMESTAMP, DOUBLE, INT, DOUBLE]) 
tradesCrossAggregator = createCrossSectionalAggregator ("CrossSectionalDemo", <[avg (price), sum (qty), sum (price * qty)]>, trades, outputTable, `sym,` interval, 1000) 
subscribeTable (, " trades "," tradesCrossAggregator ", - 1, append! {tradesCrossAggregator}, true) 
def writeData (n) { 
   timev = 2000.10.08T01: 01: 01.001 + timestamp (1..n) 
   symv = take (` A`B, n) 
   pricev = take (102,1 33,4 73,6 223, n) 
   qtyv = take (60 74 82 59, n) 
   inserir em valores de negociação (timev, symv, pricev, qtyv) 
} 
a = now ()  
writeData (2);
sleep (500) 
writeData (2); 
dormir (500) 
writeData (2); 
dormir (500) 
writeData (2); 
dormir (500) 
writeData (2); 
dormir (500) 
writeData (2); 
dormir (500) 
b = agora () 
selecionar contagem (*) da tabela de saída 

3

Se você executar select count (*) from outputTable novamente, verá que o número de registros na tabela de saída continuará a crescer com o tempo. Isso ocorre porque no modo de intervalo, o cálculo é acionado regularmente de acordo com a hora real e não depende da entrada de novos dados.

4. Uso independente de folha de dados de seção transversal

Como pode ser visto no exemplo acima, embora a tabela de seção transversal seja uma tabela de dados intermediária fornecida para cálculo de agregação, ela pode realmente desempenhar uma função independente em muitas ocasiões. Por exemplo, precisamos atualizar o último preço de negociação de uma determinada ação regularmente. De acordo com a ideia convencional, selecionamos as ações por código na mesa de negociação em tempo real e retiramos o último registro. O volume de dados da mesa de negociação aumenta rapidamente com o tempo. Se você fizer isso com frequência Essa consulta não é uma boa prática em termos de consumo de recursos do sistema ou desempenho de consulta. A tabela de seção transversal sempre salva apenas os dados de transação mais recentes de todos os estoques, e o volume de dados é estável, o que é muito adequado para este tipo de cenário de sondagem de tempo.

Se quiser usar a tabela de seção cruzada sozinha, você precisa definir as métricas e outputTable para vazio ao criar o mecanismo de seção cruzada.

tradesCrossAggregator = createCrossSectionalAggregator ("CrossSectionalDemo",, trades ,, `sym,` perRow)


Links Relacionados:

Tutorial de streaming de dados

Tutorial do mecanismo de série temporal

Tutorial do mecanismo de detecção de anomalias


Acho que você gosta

Origin blog.51cto.com/15022783/2596733
Recomendado
Clasificación