Productos secos 丨 Tutorial del motor de sección transversal DolphinDB para la base de datos de series de tiempo

Al procesar datos de transmisión en tiempo real, no solo es necesario realizar un cálculo de agregación vertical según el tiempo ( motor de agregación de series de tiempo ), sino también realizar una comparación horizontal y un cálculo de los datos más recientes, como encontrar el percentil de la última cotización de todas las acciones en finanzas, propiedad industrial Calcule la temperatura promedio de un lote de equipos en la red. La base de datos DolphinDB proporciona un motor de agregación transversal que puede realizar operaciones de agregación en los datos más recientes de todos los grupos en la transmisión de datos.

El cuerpo principal del motor de sección transversal se divide en dos partes: la tabla de datos de sección transversal y el motor de cálculo. Los datos de sección transversal son la tabla interna del motor de sección transversal, que guarda los datos de sección más recientes de todos los grupos. El motor de cálculo es un conjunto de expresiones y desencadenadores de cálculo agregados El sistema desencadena la operación de agregación de una manera específica y el resultado del cálculo se envía a otra tabla.

1. Uso básico

En la base de datos DolphinDB, cree un motor de agregación de sección transversal a través de createCrossSectionalAggregator. Devuelve una tabla de datos de sección transversal, que guarda los últimos datos de sección transversal de todos los grupos. Escribir datos en esta tabla significa que estos datos ingresan al motor de agregación de sección transversal para el cálculo. El uso específico es el siguiente:

createCrossSectionalAggregator (nombre, [métricas], dummyTable, [outputTable], keyColumn, [triggeringPattern = "perBatch"], [triggeringInterval = 1000])
  • name es una cadena que representa el nombre del motor de agregación de sección transversal y es el identificador único del motor de agregación de sección transversal. Puede contener letras, números y guiones bajos, pero debe comenzar con una letra.
  • Las métricas son metacódigos. Puede ser una función integrada del sistema o definida por el usuario, como <[suma (cantidad), promedio (precio)]>, puede usar expresiones para los resultados de la agregación, como <[promedio (precio1) -avg (precio2)]>, También puede realizar operaciones de agregación en columnas calculadas, como <[std (precio1-precio2)]>. Para obtener más información, consulte la metaprogramación.
  • DummyTable es un objeto de tabla, no necesita contener datos, pero su estructura debe ser la misma que la tabla de datos de transmisión suscrita.
  • outputTable es un objeto de tabla que se utiliza para guardar los resultados de los cálculos. El número de columnas en la tabla de salida es el número de métricas + 1, la primera columna es del tipo TIMESTAMP, que se utiliza para almacenar la marca de tiempo del cálculo, y los tipos de datos de otras columnas deben ser coherentes con los tipos de datos de los resultados devueltos por las métricas.
  • keyColumn es una cadena que especifica una columna de dummyTable como clave del motor de agregación de sección transversal. Cada clave de la columna especificada keyColumn corresponde a una fila única en la tabla.
  • triggeringPattern es una cadena que representa el método de activación del cálculo. Puede tener los siguientes valores:
    • "perRow": se activa un cálculo cada vez que se inserta una fila de datos
    • "perBatch": se activa un cálculo cada vez que se insertan datos
    • "intervalo": activa el cálculo en un intervalo de tiempo determinado
  • triggeringInterval es un número entero. Solo tiene efecto cuando el valor de triggeringPattern es interval, que indica el intervalo de tiempo para activar el cálculo. El valor predeterminado es 1000 milisegundos.

2. Ejemplo

A continuación, se muestra un ejemplo para ilustrar la aplicación del motor de agregación de sección transversal. En las transacciones financieras, a menudo es necesario conocer el último valor promedio de todas las acciones, la suma del volumen de negociación más reciente y el volumen de negociación de la transacción más reciente en tiempo real. El motor de agregación transversal de DolphinDB combinado con las funciones de suscripción de transmisión de datos puede realizar estas tareas fácilmente.

(1) Cree una tabla de transacciones en tiempo real

La tabla de negociación en tiempo real de operaciones de acciones contiene los siguientes campos principales:

sym: código de stock 
tiempo: tiempo 
precio: precio de transacción 
cantidad: volumen de transacción

Siempre que se produzca una transacción, los datos en tiempo real se escribirán en la tabla de operaciones. El script para crear la tabla de operaciones es el siguiente:

compartir streamTable (10: 0, `time`sym`price`qty, [TIMESTAMP, SYMBOL, DOUBLE, INT]) como operaciones

(2) Cree un motor de agregación transversal

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

tradesCrossAggregator es una tabla de datos de sección transversal, que está agrupada por código de acciones, y cada acción tiene una y solo una fila. Cuando los datos ingresen a la tabla, se calculará el promedio (precio), la suma (cantidad) y la suma (precio * cantidad) de cada acción. Se dispara un cálculo cada vez que se inserta un dato.

(3) Tabla de transacciones en tiempo real de suscripción a tabla de datos de sección transversal

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

A través de la función de suscripción de transmisión de datos, los datos en tiempo real se escriben en la tabla de datos de sección transversal.

(4) Generación de datos de simulación

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) 
   insertar valores en las operaciones (timev, symv, pricev, qtyv) 
} 
writeData (4);

Consulte la tabla de transacciones en tiempo real, hay 4 datos en total.

seleccione * de 
la cantidad de precio del 
símbolo del tiempo de operaciones 
----------------------- --- ----- --- 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

Consulte la tabla de datos transversales, que guarda los dos registros de transacciones recientes de las dos acciones A y B.

seleccione * de 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 la tabla de salida del motor de sección transversal. Debido a que el motor de sección transversal usa la frecuencia de perRow para activar los cálculos para cada fila, el motor de agregación realizará un cálculo cada vez que se escriba una fila de datos en la tabla de sección transversal, por lo que hay 4 registros en total.

seleccionar * de 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

Vea el estado del motor de sección transversal a través de la función getAggregatorStat.

getAggregatorStat (). CrossSectionalAggregator 
nombre estado de usuario lastErrMsg numRows numMetrics metrics triggeringPattern triggeringInterval 
------------------ ----- ------ ------- --- ------- ---------- ------------------ ------------ ----- ------------------ 
Invitado de CrossSectionalDemo OK 2 3 [prom (precio), su ... perRow 1000

Retire el motor de sección transversal mediante la función removeAggregator.

removeAggregator ("CrossSectionalDemo")

3. Varias formas de activar cálculos

El motor de sección transversal tiene tres formas de activar cálculos: perRow, perBatch e interval. En el ejemplo anterior, se activa un cálculo cada vez que se inserta una fila de datos. Aquí hay otras dos formas de activar cálculos.

  • por Lote

El parámetro perBatch significa que se activa una escritura cada vez que se agrega un lote de datos. El siguiente ejemplo habilita el motor de sección transversal en el modo perBatch. El script genera un total de 12 registros y los escribe en tres lotes. Se espera que la tabla de salida tenga 3 registros.


qtyv) } 
// Escriba tres lotes de datos, se espera que se activen tres cálculos y se generen tres resultados de agregación. 
writeData (4);
writeData (4);
writeData (4);

Vea la hoja de datos de la sección transversal.

seleccionar * de 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

Ver la tabla de salida. Se insertan tres lotes de datos, por lo que hay 3 registros en la tabla de salida.

seleccionar * de 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

Cuando el método de cálculo del disparador es el intervalo, debe especificar triggeringInterval, lo que significa que el cálculo se dispara cada triggeringInterval milisegundos. En el siguiente ejemplo, se escriben 12 registros en 6 veces con un intervalo de 500 milisegundos. Configure el motor de sección transversal para activar un cálculo cada 1000 milisegundos y se espera que se generen 3 registros.

compartir streamTable (10: 0, `time`sym`price`qty, [TIMESTAMP, SYMBOL, DOUBLE, INT]) como operaciones 
outputTable = table (1: 0,` time`avgPrice`sumqty`Total, [TIMESTAMP, DOUBLE, INT, DOUBLE]) 
tradesCrossAggregator = createCrossSectionalAggregator ("CrossSectionalDemo", <[avg (precio), suma (cantidad), suma (precio * cantidad)]>, intercambios, outputTable, `sym,` interval, 1000) 
subscribeTable (, " trades "," tradesCrossAggregator ", - 1, append! {tradesCrossAggregator}, verdadero) 
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) 
   insertar valores en las operaciones (timev, symv, pricev, qtyv) 
} 
a = ahora ()  
writeData (2);
dormir (500) 
writeData (2); 
sleep (500) 
writeData (2); 
sleep (500) 
writeData (2); 
sleep (500) 
writeData (2); 
sleep (500) 
writeData (2); 
dormir (500) 
b = ahora () 
seleccionar recuento (*) de la salida Tabla 

3

Si vuelve a ejecutar select count (*) from outputTable, encontrará que la cantidad de registros en la tabla de salida seguirá creciendo con el tiempo. Esto se debe a que en el modo de intervalo, el cálculo se activa regularmente de acuerdo con el tiempo real y no depende de si ingresan nuevos datos.

4. Uso independiente de la hoja de datos de la sección transversal

Como puede verse en el ejemplo anterior, aunque la tabla de sección transversal es una tabla de datos intermedia proporcionada para el cálculo de agregación, en realidad puede desempeñar un papel de forma independiente en muchas ocasiones. Por ejemplo, necesitamos actualizar el último precio de negociación de una determinada acción con regularidad. De acuerdo con la idea convencional, seleccionamos las acciones por código de la tabla de negociación en tiempo real y sacamos el último registro. El volumen de datos de la tabla de negociación aumenta rápidamente con el tiempo. Si lo hace con frecuencia Esta consulta no es una buena práctica en términos de consumo de recursos del sistema o rendimiento de la consulta. La tabla de sección transversal siempre solo guarda los últimos datos de transacciones de todas las acciones, y el volumen de datos es estable, lo que es muy adecuado para este tipo de escenario de sondeo de tiempo.

Si desea utilizar solo la tabla de sección transversal, debe establecer las métricas y outputTable en nulo al crear el motor de sección transversal.

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


Enlaces relacionados:

Tutorial de transmisión de datos

Tutorial del motor de series temporales

Tutorial del motor de detección de anomalías


Supongo que te gusta

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