Thursday 23 November 2017

Media Móvil Exponencial De Oracle Sql


Si ve este mensaje, su navegador ha inhabilitado o no es compatible con JavaScript. Para utilizar todas las funciones de este sistema de ayuda, como la búsqueda, el navegador debe tener habilitado JavaScript. Promedios móviles ponderados con promedios móviles simples, cada valor de datos en la quotwindow en la que se realiza el cálculo tiene un significado o peso igual. A menudo es el caso, especialmente en el análisis de datos de precios financieros, que más datos cronológicamente recientes deberían tener un peso mayor. En estos casos, a menudo se prefiere la funcionalidad de media móvil ponderada (o media móvil exponencial, véase el tema siguiente). Considere la misma tabla de valores de datos de ventas durante doce meses: Para calcular una media móvil ponderada: Calcule cuántos intervalos de datos están participando en el cálculo del promedio móvil (es decir, el tamaño de la ventana de cálculo). Si se dice que la ventana de cálculo es n, entonces el valor de datos más reciente en la ventana se multiplica por n, el siguiente más reciente multiplicado por n-1, el valor anterior al multiplicado por n-2 y así sucesivamente para todos los valores en la ventana. Divida la suma de todos los valores multiplicados por la suma de los pesos para dar el Promedio móvil ponderado sobre esa ventana. Coloque el valor del Promedio Movido Ponderado en una nueva columna de acuerdo con la posición de promedio de arrastre descrita anteriormente. Para ilustrar estos pasos, considere si se requiere un promedio móvil ponderado de ventas de 3 meses en diciembre (usando la tabla anterior de valores de ventas). El término quot3-monthquot implica que el cálculo quotwindowquot es 3, por lo tanto el algoritmo de cálculo del Promedio Movido Ponderado para este caso debería ser: O, si un promedio móvil ponderado de 3 meses fue evaluado en todo el rango original de datos, los resultados serían : Promedio móvil ponderado de 3 meses Promedio móvil exponencial en T-SQL Las medias móviles exponenciales son similares a las medias móviles ponderadas, ya que asignan menos peso a los cambios hace mucho tiempo y más peso a los cambios recientes. Las medias móviles ponderadas son lineales, pero las medias móviles exponenciales son exponenciales. Es decir, el peso puede expresarse como una curva: hay una gran manera de calcular promedios móviles exponenciales en T-SQL utilizando una característica indocumentada sobre variables y totales en ejecución en SQL Server. En este post de blog voy a mostrar cómo usar ese método para calcular el promedio móvil exponencial en T-SQL, pero también voy a presentar un método que está utilizando las características estándar de SQL Server. Desafortunadamente, eso significa usar un bucle. En los ejemplos calcularé una media móvil exponencial de 9 días. Los ejemplos utilizan la base de datos TAdb. Un script para crear TAdb se puede encontrar aquí. Media móvil exponencial (EMA): Método de los totales corrientes La teoría detrás de las características totales corrientes en las actualizaciones es descrita en detalle por Jeff Moden en su artículo Resolviendo los Problemas de Total de Riesgo y Orden Ordinario. Otros recursos que describen el uso de este método para calcular EMA son el blog Calculando promedios móviles con T-SQL por Gabriel Priester y el foro post Exponential Moving Average Challenge. Tanto en SQL Server Central. Básicamente, en T-SQL puede actualizar variables así como columnas en una instrucción de actualización. Las actualizaciones se realizan fila por fila internamente por SQL Server. Este comportamiento fila por fila es lo que hace posible calcular un total en ejecución. Este ejemplo muestra cómo funciona: Tenga en cuenta que 8220ColumnRunningTotal8221 es un total de 8220ColumnToSum8221. Usando este método podemos calcular EMA9 con este T-SQL: El cálculo de EMA es bastante simple. Utilizamos la fila actual y la anterior, pero con más peso a la fila actual. El peso se calcula mediante la fórmula 2 / (19), donde 822098221 es el parámetro para la longitud de la EMA. Para calcular EMA9 para la fila 10, el cálculo es: En este caso, la fila actual obtiene 20 del peso (2 / (19) 0,2) y la fila anterior obtiene 80 del peso (1-2 / (19) 0.8) . Encontrará este cálculo en la instrucción anterior en la instrucción CASE: EMM (Exponential Moving Average): método de bucle En la medida en que yo sepa, excepto para el método de totales de ejecución descrito anteriormente, no hay forma de calcular EMA utilizando una sentencia SQL basada en conjuntos . Por lo tanto, el T-SQL a continuación utiliza un bucle while para calcular EMA9: Los resultados son los mismos que en el ejemplo de totales en ejecución anterior. Rendimiento Como era de esperar, la versión basada en conjuntos de ejecución de totales es mucho más rápida que la versión de bucle. En mi máquina la solución basada del sistema era cerca de 300 ms, comparada a cerca de 1200 con la versión del lazo. Sin embargo, la versión de bucle se ajusta más a los estándares SQL. Así que la elección entre los métodos depende de lo que es más importante para usted, el rendimiento o los estándares. Uso El promedio móvil exponencial se puede utilizar en el análisis de tendencias, al igual que con los otros tipos de promedios móviles, Promedio móvil simple (SMA) y Promedio móvil ponderado (WMA). También hay otros cálculos en el análisis técnico que utiliza la EMA, MACD por ejemplo. Esta entrada del blog forma parte de una serie sobre análisis técnico, TA, en SQL Server. Vea los otros mensajes aquí. Publicado por Tomas Lind Tomas Lind - Servicios de consultoría como SQL Server DBA y desarrollador de bases de datos en High Coast Database Solutions AB. Media móvil exponencial Hubo una pregunta interesante sobre OTN hoy sobre si hay una función estándar de Oracle para calcular la media móvil exponencial. La respuesta es que no hay tal función, pero con la cláusula modelo, se puede calcular muy fácil. Y es un gran ejemplo de lo que quiero decir con un número variable de cálculos basados ​​en valores calculados, escrito en mi tercera parte del tutorial de cláusula modelo. Antes de hoy, ni siquiera sabía lo que una media móvil exponencial era exactamente. Usted puede leer más sobre él aquí en Wikipedia o aquí con un ejemplo agradable. Desde el primer enlace: Un promedio móvil exponencial (EMA), aplica factores de ponderación que disminuyen exponencialmente. La ponderación de cada uno de los puntos de datos más antiguos disminuye exponencialmente, dando mucha más importancia a las observaciones recientes, mientras que todavía no descarta las observaciones más antiguas por completo. A partir del segundo enlace: La fórmula para calcular un promedio móvil exponencial (EMA) es: X EMA actual (es decir, EMA a calcular) C Valor actual de los datos originales K Constante de suavización P EMA anterior (El primer EMA del rango a calcular es Arbitrario y puede ser el valor de datos original correspondiente o, a menudo, un valor de Media Móvil Simple K Smoothing Constant 2 / (1 n) Y esta fórmula es seguida por un ejemplo que he extendido un poco, usando esta tabla: Los registros del producto A coincide con el ejemplo en el enlace. He inventado los números del producto B. Aquí está la consulta de la cláusula de modelo que implementa la fórmula. Nota cómo la fórmula directamente traducir a la única regla de la cláusula de modelo. La constante de suavizado K es Establecer a .5, sobre la base de una ventana de valores (n) igual a 3. Desafío: intente esto sin la cláusula de modelo y ver si se puede llegar a algo más integral 5 comentarios: 11.2 características en uso con dat as (seleccione 39A39 Fecha del producto 392009-01-0139, 10 cantidad de la unión dual todas seleccionan 39A39, fecha 392009-02-0139, 15 de la unión dual todas seleccionan 39A39, fecha 392009-03-0139, 17 de la unión dual todas seleccionan 39A39, fecha 392009-04-0139, 20 de unión dual todos seleccionan 39A39, fecha 392009-05-0139, 22 de unión dual seleccionan todos 39A39, fecha 392009-06-0139, 20 de unión dual seleccionan todos 39A39, fecha 392009-07-0139 , 25 de unión dual todos seleccionan 39A39, fecha 392009-08-0139, 27 de unión dual seleccionan todos 39A39, fecha 392009-09-0139, 30 de unión dual seleccionan todos 39A39, fecha 392009-10-0139, 35 de doble unión Todos seleccionan 39A39, fecha 392009-11-0139, 37 de la unión dual todos seleccionan 39A39, fecha 392009-12-0139, 40 de la unión dual todos seleccionan 39B39, fecha 392009-01-0139, 0 de la unión dual todo selecto 39B39, fecha 392009-02-0139, 50 de unión dual todos seleccionan 39B39, fecha 392009-03-0139, 10 de unión dual todos seleccionan 39B39, fecha 392009-04-0139, 40 de unión dual seleccionan todos 39B39, fecha 392009-05-0139 , 15 de doble unión todos seleccionan 39B39, fecha 392009-06-0139, 35 de doble unión todos seleccionan 39B39, fecha 392009-07-0139, 30 de doble unión todos seleccionan 39B39, fecha 392009-08-0139, 30 de doble unión Todos selecto 39B39, fecha 392009-09-0139, 20 de la unión dual todo selecto 39B39, fecha 392009-10-0139, 20 de la unión dual todos selecto 39B39, fecha 392009-11-0139, 20 de la unión dual todos selecto 39B39, fecha 392009-12-0139, 20 desde dual), rns as (select dat. . Rownumber () over (partición por pedido de producto por mes) rn -. 2 / (1count () sobre (partición por producto)) k. 0.5k de dat), res (producto, mes, cantidad, rn, x) como (seleccione r. product, r. month, r. amount, r. rn, r. amount x de rns r donde rn 1 union all select Ns. product, ns. month, ns. amount, ns. rn, ns. k (ns. amount - es. x) es. xx de rns ns, res es donde ns. rn es. rn 1 y ns. product es Producto, mes, cantidad, rn, ronda (x, 3) EMA de res orden por producto, mes después de computar la forma cerrada Vine con el siguiente código que si más como una ofuscación de algo completo. La idea es crear múltiplos en ejecución utilizando una concatenación de cadenas y la funcionalidad xml-eval. Las formas cerradas de los casos especiales sólo necesitan sumas corrientes. Hay un caso general y dos casos especiales que son mucho más fáciles: con t1 como (seleccionar el producto, el mes, el importe, el importe ci, el número rownumber () sobre (partición por pedido de producto por mes) rn, --2 / (1 rownumber () Ki 0.5 ki de las ventas), t2 como (seleccionar el producto, el mes, la cantidad, (caso cuando rn 1 entonces 1 else ki end ci) ai, caso cuando rn 1 entonces 1 else (1 (REPLACE (wmconcat (bi) over) (PARTITION BY product ORDER BY MONTH filas ENTRE la línea precedente y ACTUAL sin límite), 39,39, 3939) RETORNAR contenido).getnumberval () mi FROM t2), t4 como (seleccionar producto, mes, cantidad, mi, (ai / mi) xi de t3) SELECT producto, MONTH, amount, round (PARTITION BY product ORDER BY MONTH filas ENTRE fila sin precedentes y ACTUAL), 3) ema FROM t4 Caso especial K 0.5: con t1 como (seleccionar producto, mes, cantidad, rownumber () sobre (partición por pedido de producto por mes) rn (1), 1)) (1) () () () () () () () () () () (2, rn), 3) ema de t1 Caso especial K 2 / (1 i): con t1 como (seleccione el producto, el mes, la cantidad, el número de rownumber ) Sobre (partición por pedido de producto por mes) rn, cantidad rownumber () sobre (partición por pedido de producto por mes) ci de ventas) seleccionar producto, mes, cantidad, ronda Filas entre la fila precedente y actual sin límite) 2 / (rn (rn 1)), 3) ema de t1 I39ll publicar la prueba de la forma cerrada si alguien está interesado en ella. Este es un gran ejemplo de quotfun con SQLquot :-) Una combinación de XMLQuery, el wmconcat indocumentado, y funciones analíticas con la cláusula windowing. Me gusta. Aunque no es tan completo como la variante de cláusula modelo y el Rafu39s recursivo con uno, como usted mismo dijo. Y seguro, me gustaría ver la prueba de la forma cerrada. Abordé otra pregunta: cómo optimizar la constante de suavizado SELECT k - suavización constante. Mse - error medio cuadrado FROM (SELECT FROM ventas MODEL DIMENSION BY (producto. ROWNUMBER () OVER (PARTITION BY producto ORDEN POR mes ASC) rn) MEDIDAS (cantidad - cantidad de ventas mes - mes 0 ASC 0 AS P - 0 AS X. 0 AS SE - error cuadrado - - fila de trabajo y atributos - a) fila de trabajo es producto 39X39, rn 1 - b) atributos de trabajo son los siguientes:. 0 AS SSE - suma SE para todos los productos / meses. 0 AS MSE - significa SSE para todos los productos / meses. 0 AS k - para todos los productos / meses. 0 AS PreMSE - previo k39s MSE para todos los productos / meses. 0 AS diff - entre MSE actual y anterior. 0,1 AS delta - incremento inicial. 0 AS priorpt - punto de partida inicial -) REGLAS ITERATE (99) HASTA (abs (diff39A39,1) lt 0,00010) (Cany, rn amountcv (), cv () K39A39,1 priorpt39A39,1 delta39A39,1. , Rn ORDEN POR producto, rn ASC COALESCE (K39A39,1 Ccv (), cv () (1-K39A39,1) Xcv (), cv () - 1, Ccv (), cv ()) Pproduct, rn Xcv (), Cv () - 1. SEproduct, rn POWER (Ccv (), cv () - Xcv (), cv () - 1, 2) SSE39A39,1 SUM (SE) any, any MSE39A39,1 SUM (SE) any, any / 24. diff39A39,1 CASE iterationnumber CUANDO 0 entonces NULL ELSE preMSE39A39,1 - MSE39A39,1 END. PreMSE39A39,1 MSE39A39,1 delta39A39,1 CASO CUANDO diff39A39,1 lt 0 THEN - abs (delta39A39 , 1/2) ELSE abs (delta39A39,1) ENDpt 39A39,1 K39A39,1)) donde el producto 39A39 y rn 1 / K MSE ---------- --------- - .599999237 174.016094

No comments:

Post a Comment