Media Móvil Postgresql


PostgreSQL Re: Calculando una media móvil ¿Por qué no utilizar un cursor Un promedio móvil se verá mucho mejor si usted Hahn las colas. Para hacer una media móvil normal de 7 puntos, toma (xi xi1 xi2 xi3 xi4 xi5 xi6) / 7 como punto xprimei y (yi yi1 yi2 yi3 yi4 yi5 yi6) / 7 como punto yprimei. Pero cuando empieces, deja que x0, y0 sea el primer punto, y entonces media el siguiente 2 para el segundo punto. Hasta llegar a 7 y luego hacer lo mismo en el otro extremo. De lo contrario, se obtiene una curva de aspecto muy extraño. De: pgsql-general-ownerpostgresql. org En nombre de Vanole, Mike Enviado: Miércoles 19 de Enero de 2005 13:34 A: pgsql-generalpostgresql. org Asunto: GENERAL Calculando un promedio móvil necesito calcular una media móvil y I Quisiera hacerlo con SQL, o una función Pg construida para este propósito. I39m en la Pg 7.4. ¿Es esto posible en Pg sin un manojo de uno mismo junta, o hay una función disponible? Jim C. Nasby También, si usted don39t necesita un promedio móvil exacto, usted puede ser que considere una media ponderada. Algo así como: mean mean 0.9 newvalue 0.1 Mucho más fácil de mantener que una media móvil. - Jim C. Nasby, consultor de la base de datos decibeldecibel. org Déle a su computadora un poco de caramelo del cerebro distributed. net Equipo 1828 Windows: ¿dónde usted quiere ir todayquot Linux: quotWhere usted quiere ir tomorrowquot FreeBSD: quot ¿Usted está viniendo, o whatquot El 21 de enero de 2005 a las 5:09 am También, si usted don39t necesita un promedio móvil exacto, usted podría considerar una media ponderada. Algo así como: mean mean 0.9 newvalue 0.1 Mucho más fácil de mantener que una media móvil. El jueves, 20 de enero 2005 a las 08:40:24 PM -0800, Dann Corbit escribió: ¿Por qué no utilizar un cursor Un promedio móvil se verá mucho mejor si usted Hahn las colas. Para hacer una media móvil normal de 7 puntos, toma (xi xi1 xi2 xi3 xi4 xi5 xi6) / 7 como punto xprimei y (yi yi1 yi2 yi3 yi4 yi5 yi6) / 7 como punto yprimei. Pero cuando empieces, deja que x0, y0 sea el primer punto, y entonces media el siguiente 2 para el segundo punto. Hasta llegar a 7 y luego hacer lo mismo en el otro extremo. De lo contrario, se obtiene una curva de aspecto muy extraño. De: pgsql-general-ownerpostgresql. org En nombre de Vanole, Mike Enviado: Miércoles 19 de Enero de 2005 13:34 A: pgsql-generalpostgresql. org Asunto: GENERAL Calculando un promedio móvil necesito calcular una media móvil y I Quisiera hacerlo con SQL, o una función Pg construida para este propósito. I39m en la Pg 7.4. ¿Es esto posible en Pg sin un montón de uno mismo se une, o hay un funtion disponible - Jim C. Nasby, consultor de la base de datos decibeldecibel. org Déle a su computadora algún caramelo del cerebro distributed. net Equipo 1828 Windows: quotWhere usted quiere ir todayquot Cálculo de una media móvil en PostgreSQL En nuestra serie Metrics Maven, el científico de datos de Composes comparte las funciones de base de datos, consejos, trucos y código que puede utilizar para obtener Las métricas que necesita de sus datos. En este artículo, mira bien cómo calcular una media móvil en PostgreSQL. Este artículo se basa en nuestros dos artículos anteriores sobre las funciones de ventana y marcos de ventana en PostgreSQL. Bueno aprovechar las características de ventanas weve antes discutido para calcular un promedio móvil y también mirar a un método alternativo. ¿Qué es un promedio móvil? Un promedio móvil es exactamente lo que suena, un promedio que se mueve continuamente en función del cambio de entrada. Por ejemplo, es posible que desee tomar el promedio de algún valor para las 100 primeras entradas o para los 30 días anteriores. Porque usted recibirá nuevas entradas en su base de datos o porque cada nuevo día es otra fecha, el promedio cambiará. El término promedio móvil también es sinónimo de media móvil o promedio de ejecución, pero hay algunos tipos diferentes de promedios móviles. En este artículo iban a centrarse en el promedio móvil simple para conseguir nuestros pies mojados y bien también revisar brevemente el promedio móvil acumulativo al final del artículo. Un futuro artículo cubrirá promedios móviles ponderados y exponenciales. La razón para usar una media móvil para sus métricas es facilitar la detección de tendencias. Es una técnica comúnmente utilizada en analíticas de finanzas y negocios para suavizar baches y picos que pueden ocurrir en los datos para que las tendencias verdaderas puedan ser identificadas a lo largo de las series cambiantes. Averiguar cómo realizar el cálculo como los cambios de datos puede ser un poco intimidante, sin embargo, si youve nunca lo hizo. Una vez que aprendes un método que te gusta, sin embargo, (bien cubrir dos) es fácil de hacer y youll encontrar muchos usos para que en su seguimiento e informes. Hagámoslo. Los datos Lo primero es lo primero: bien necesitamos una tabla que contenga los valores que queremos valorar. En la práctica en Compose, a menudo encontramos que los datos básicos que necesitamos no están ya bien definidos en una tabla. Por esa razón tenemos algunas tablas agregadas que extraen los datos que necesitamos juntos. Estas son las tablas base a las que aplicaremos cálculos más avanzados, como un promedio móvil. En algunos casos se trata de tablas derivadas que existen temporalmente para la ejecución de la consulta principal. En otros casos, podríamos usar una vista o una vista materializada. Por lo tanto, sin embargo usted consigue en él, usted necesitará una tabla que contiene los valores que usted quiere al promedio y cualquier dimensión (s) que usted quiere pedir los datos cerca. Para nuestro ejemplo, supongamos que se nos ha pedido que creemos un promedio móvil de 30 días para las descargas de aplicaciones del Ejemplo Co. Los datos de descarga de la aplicación se rellenan diariamente en una tabla denominada appdownloadsbydate y la parte más reciente parece: En este ejemplo, Ordenar por fecha será importante ya que queremos calcular un promedio de 30 días de balance sobre la serie anterior de fechas. Debido a esto, es importante que tengamos una fila para cada fecha. En nuestro caso lo hacemos, pero si tiene vacíos en sus datos donde no hay valores para ciertas fechas, puede utilizar generateseries al construir su tabla base para asegurarse de que tiene todas las filas que necesita. Observe cómo este rango de fechas contiene descargas fluctuantes de aplicaciones de 35 a 7. Es muy difícil ver una tendencia de estos datos: Introduzca la media móvil. Usando marcos de ventanas para un promedio móvil simple Si te acuerdas de nuestro artículo anterior en esta serie. Marcos de ventana se utilizan para indicar el número de filas alrededor de la fila actual la función de ventana debe incluir. Crean un subconjunto de datos para que funcione la función de ventana. Dependiendo de sus datos y sus necesidades, su cálculo del promedio móvil puede incluir filas tanto anteriores como posteriores a la fila actual, pero para nuestros propósitos, nuestro promedio móvil utilizará las filas anteriores y la fila actual porque queremos generar un nuevo valor de media móvil para Cada nueva fecha. Nuestra consulta se parece a esto: Utilizamos ORDER BY en nuestro campo de fecha para asegurar que nuestros datos estarán en el orden que esperamos y hemos especificado ROWS ENTRE 29 PREDETERMINADOS Y CORRIENTES ROW para establecer el marco de ventana para el cálculo de AVG. A medida que avanza el marco de ventana para cada fecha, sólo se usan las 29 filas anteriores y la actual (30 días totales) para el cálculo: Ya que no estamos mostrando fechas en nuestra tabla base antes del 26 de mayo para este ejemplo, vamos a enfocar nuestra revisión De los resultados en las fechas en las que mostramos las 29 filas precedentes. Tomemos el 30 de junio, por ejemplo. Nuestro marco de ventana enfoca nuestra agregación de AVG en las descargas de la aplicación sólo desde junio, esta parte de nuestra tabla base: Así, ahora, si calculamos el promedio de rodadura calculado, podemos ver que los datos se suavizan y hay una tendencia al alza A través de la primera semana de junio, a continuación, una tendencia a la baja más volátil después de eso: Dado que esto es mostrar sólo un mes de datos no es muy revelador para un informe analítico, pero esperamos que le ayuda a entender cómo calcular un promedio móvil puede ser útil para las empresas análisis. Un consejo sobre no incluir la fila actual Si por alguna razón usted no quiere incluir la fila actual para su función de ventana y está usando sólo PRECEDING o sólo siguientes ajustes para su marco de ventana, una manera fácil de hacerlo es usar x PRECEDING o Y SIGUIENTE dos veces en sus FILAS ENTRE. cláusula. Por ejemplo, decimos que queríamos usar 30 filas que preceden a nuestra fila actual, pero no incluir la fila actual en el marco de la ventana. Podríamos escribir esa cláusula como esta: FILAS ENTRE 30 ANTERIORES Y 1 ANTERIOR. Del mismo modo, podemos excluir la fila actual, pero hacer 30 filas siguientes como sigue: FILAS ENTRE 1 SIGUIENTE Y 30 SIGUIENTES. Un método alternativo para un promedio móvil simple Antes de PostgreSQL 9.0, no teníamos las opciones de marco de ventana x PRECEDING o y FOLLOWING disponibles para nosotros. Para calcular una media móvil sin usar un marco de ventana, podemos usar dos alias de tabla de nuestra tabla base. Utilice bien un alias para operar sobre el otro utilizando un intervalo de fecha. Compruébelo: Usando este método podemos lograr los mismos resultados que se describen arriba con el marco de la ventana. Si está operando sobre grandes cantidades de datos, la opción de marco de ventana va a ser más eficiente, pero esta alternativa existe si desea usarla. Calculando un promedio móvil acumulado Ahora que hemos revisado un par de métodos para calcular un promedio móvil simple, cambie nuestro ejemplo de marco de ventana para mostrar cómo también puede hacer un promedio móvil acumulativo. Los mismos principios se aplican, pero en lugar de tener un marco de ventana que cambia continuamente por un intervalo, el marco de la ventana simplemente se extiende. Por ejemplo, en lugar de hacer un promedio móvil de 30 días, se va a calcular un promedio móvil del año hasta la fecha. Para cada nueva fecha, su valor se incluye simplemente en el cálculo promedio de todas las fechas anteriores. Echemos un vistazo a este ejemplo: Debido a que nuestra tabla base comienza el 1 de enero para el año en curso, utilizamos UNBOUNDED PRECEDING para establecer nuestro marco de ventana. Los resultados que obtenemos para este cálculo acumulativo son los siguientes: Si trazamos estos resultados, podemos ver que la ventaja de la media móvil acumulativa es una suavización adicional de los datos, de modo que sólo los cambios significativos de datos aparecen como tendencias. Ahora vemos que hay una ligera tendencia al alza año a la fecha: Envoltura Ahora que usted sabe un par de diferentes tipos de promedios móviles que puede utilizar y un par de métodos diferentes para calcularlos, puede realizar análisis más perspicaces y crear más Informes efectivos. En nuestro próximo artículo de Metrics Maven, mira bien algunas opciones sobre cómo hacer que los datos sean lo bastante para que en lugar de valores como 20.4184782608695652, vean bien 20.42. Véase la próxima vez que copia 2016 ComposePostgreSQL Cálculo de una media móvil El viernes, 21 de enero 2005 a las 12:53:45 AM -0500, Greg Stark escribió: quotVanole, Mikequot ltMike. Vanolecingulargt escribe: Necesito calcular una media móvil y me gustaría Para hacerlo con SQL, o una función Pg construida para este propósito. I39m en la Pg 7.4. ¿Es esto posible en Pg sin un montón de autojoins, o hay una función disponible? Desafortunadamente, los promedios móviles caen en una clase de funciones, llamadas funciones analíticas (por lo menos eso es lo que Oracle les llama) que son intrínsecamente difíciles de modelar eficientemente en SQL. Postgres no tiene ningún soporte especial para este conjunto de funciones, por lo que se atasca haciendo las maneras ineficientes que permite SQL estándar. Creo que esto es incluso difícil de implementar correctamente con el soporte de función extremadamente extensible de Postgres39s. Incluso si lo implementaste en Perl o Python, no creo que haya ninguna forma de asignar un área de almacenamiento estático temporal para un sitio de llamada determinado. Así que su función de promedio móvil se comportaría extrañamente si lo llamó dos veces en una consulta determinada. Pero si puede trabajar dentro de esa advertencia debería ser sencillo implementarlo de manera eficiente en Perl o Python. Alternativamente, puede escribir una función plpgsql para calcular el promedio móvil específico que necesita que haga la selección en sí. Si te sientes aventurero, podrías ver la documentación de Oracle en sus funciones analíticas y ver si puedes encontrar algo genérico para PostgreSQL. Incluso si sólo haces una función de media móvil sería un buen comienzo. - Jim C. Nasby, consultor de la base de datos decibeldecibel. org Déle a su computadora un poco de caramelo del cerebro distributed. net Equipo 1828 Windows: ¿dónde usted quiere ir todayquot Linux: quotWhere usted quiere ir tomorrowquot FreeBSD: quot ¿Usted está viniendo, o whatquot Greg Stark Creo que la parte difícil de hacer incluso una implementación simple es precisamente el punto que planteé sobre hacerlo en Perl o Python. De alguna manera usted tiene que asignar un área de almacenamiento estática específica para el sitio de llamada. Se parece a una llamada de función agregada, excepto por supuesto que usted va a devolver un dato para cada registro. Para una implementación más completa hay mucho más detalles. Si entiendo correctamente en Oracle se llega a especificar una cláusula ORDER BY y el equivalente de una cláusula GROUP BY en el A menos que I39m groseramente malentendido el problema creo que un disparador escrito en PL / pgsql funcionaría bien. Algo como esto: CREATE TABLE foo (fooid SERIAL clave principal, foo TEXT) CREATE TABLE barra (fooid INTEGER referencias foo, barid SERIAL clave principal, barra DOBLE PRECISION NOT NULL) CREATE TABLE baravg ) CREAR O REEMPLAZAR FUNCIÓN getbaravg () RETURNS TRIGGER AS 39 DECLARAR barcord RECORD x INTEGER y DOUBLE PRECISION: 0 COMIENZAR TGOP 3939INSERT3939 THEN y: y NEW. bar x: 1 PARA barrecord IN SELECT FROM bar LOOP SI NEW. fooid barrecord. fooid THEN y: y barrecord. bar x: x 1 END SI FIN LOOP y: y / x SI EXISTE (SELECCIONE desde baravg WHERE fooid NEW. fooid) ENTONCES UPDATE baravg SET baravg. baravg y WHERE fooid NEW. fooid ELSE INSERT INTO baravg VALUES (NEW. fooid, y) END SI RETURN NUEVO ELSIF TGOP 3939DELETE3939 ENTONCES x: 0 PARA barrecord IN SELECT FROM bar LOOP SI OLD. fooid barrecord. fooid Y OLD. barid ltgt barrecord. barid THEN y: y barrecord. bar x: x 1 END SI END LOOP SI x ltgt 0 ENTONCES y: y / x END SI UPDATE baravg SET baravg. baravg y WHERE foide OLD. fooid RETURN OLD ELSE y: y NEW. bar x: 1 PARA barrecord IN SELECT FROM bar LOOP SI OLD. barid ltgt barrecord. barid ENTONCES y: y barrecord. bar x: x 1 FINALIZAR SI END LOOP y: y / x UPDATE baravg SET baravg. baravg y WHERE fooid OLD. fooid RETORNO NUEVO FIN SI FIN 39 IDIOMA plpgsql CREATE TRIGGER getbaravg ANTES INSERTAR O BORRAR O ACTUALIZAR EN BAR PARA CADA RUTA EJECUTAR PROCEDIMIENTO getbaravg () Eso debería funcionar, Citando quotJim C. Nasbyquot ltdecibeldecibel. orggt: El Vie, 21 de enero de 2005 a las 12:53:45 AM -0500, Greg Stark escribió: quotVanole, Mikequot ltMike. Vanolecingulargt escribe: Necesito calcular una media móvil y me gustaría hacerlo con o una función Pg construida para este propósito. I39m en la Pg 7.4. ¿Es esto en Pg sin un montón de auto-uniones, o hay una función disponible? Desafortunadamente, los promedios móviles caen en una clase de funciones, llamadas funciones analíticas (por lo menos eso es lo que Oracle les llama) que son intrínsecamente difíciles de modelar eficientemente en SQL. Postgres no tiene ningún soporte especial para este conjunto de funciones, por lo que se atasca haciendo las maneras ineficientes que permite SQL estándar. Creo que esto es incluso difícil de implementar correctamente con el soporte de función extremadamente extensible de Postgres39s. Incluso si lo implementaste en Perl o Python, no creo que haya ninguna forma de asignar un área de almacenamiento estático temporal para un sitio de llamada determinado. Así que su función de promedio móvil se comportaría extrañamente si lo llamó dos veces en una consulta determinada. Pero si puede trabajar dentro de esa advertencia debería ser sencillo implementarlo de manera eficiente en Perl o Python. Alternativamente, puede escribir una función plpgsql para calcular el promedio móvil específico que necesita que haga la selección en sí. Si te sientes aventurero, puedes ver la documentación de Oracle en sus funciones analíticas y ver si puedes encontrar algo genérico para PostgreSQL. Incluso si sólo haces una función de media móvil sería un buen comienzo. - Jim C. Nasby, consultor de la base de datos decibeldecibel. org Déle a su computadora algún cerebro del caramelo distributed. net Equipo 1828 Windows: ¿dónde usted quiere ir todayquot Linux: quotWhere usted quiere ir tomorrowquot FreeBSD: quot¿Usted viene, o whatquot --------------------------- (final de la emisión) ------------------ --------- TIP 2: puede salir de todas las listas a la vez con el comando unregister (enviar quotunregister YourEmailAddressHerequot a majordomopostgresql. org) Alban Hertroys Veo a la gente hacer esto de vez en cuando. Sólo por curiosidad, se considera que este buen estilo de codificación, o se considera quotlazynessquot I39m no estoy seguro de qué pensar de él. Si yo hubiera escrito esto, hubiera habido 3 disparadores w / o el cheque en TGOP. ¿Hay algún inconveniente importante en hacerlo? ¿Hay algún documento sobre el estilo de codificación quotpreferredquot en PL / PGSQL? Sí, I39m es un poco purista. - Recuerdos, Alban Hertroys MAG Productions T: 31 (0) 53 4346874 F: 31 (0) 53 4346876 E: Yo personalmente uso 3 gatillos separados en la mayoría de las ocasiones, dependiendo de lo diferente que la acción de cada acción es, Más fácil para mí y mi gente para distinguir lógicamente las funciones de esa manera, pero el ejemplo en la documentación de 7.4 para los disparadores se da usando el formulario en el que escribí esta función, y es útil cuando los procedimientos de disparo para las 3 acciones son más o menos iguales Cosa, también hace que la edición del código sea un poco más fácil en esta situación. Citar Russell Smith ltmr-russpws. augt: El Lun, 24 Jan 2005 20:32, Alban Hertroys escribió: mstoryuchicago. edu escribió: CREAR O REEMPLAZAR FUNCIÓN getbaravg () RETURNS TRIGGER AS 39 DECLARAR barrecord RECORD x INTEGER y DOUBLE PRECISION: 0 COMIENCE SI TGOP 3939INSERT3939 ENTONCES y: y NEW. bar. RETURN NUEVO ELSIF TGOP 3939DELETE3939 ENTONCES x: 0. RETURN OLD ELSE y: y NEW. bar. RETURN NUEVO FIN SI FIN 39 IDIOMA plpgsql Veo a la gente hacer esto de vez en cuando. Sólo por curiosidad, se considera que este buen estilo de codificación, o se considera quotlazynessquot I39m no estoy seguro de qué pensar de él. Si yo hubiera escrito esto, hubiera habido 3 disparadores w / o el cheque en TGOP. ¿Hay algún inconveniente importante en hacerlo? ¿Hay algún documento sobre el estilo de codificación quotpreferredquot en PL / PGSQL? Sí, I39m es un poco purista. Dado que usted tiene que definir una función para cada disparador, mi opinión es por qué escribir más funciones. Junto con esto. Como programador C, haría unas cuantas pruebas IF más en una función, en lugar de escribir otra. Me parece que los disparadores como este son un bloqueo funcional y todos van juntos. Luego, cuando actualiza la función, está todo en un solo lugar. Otros pueden tener otras razones por las que lo hacen de la manera que lo hacen. Pero son mías. --------------------------- (final de la emisión) ------------------ --------- TIP 7: don39t olvidarse de aumentar su espacio libre mapa de los ajustes El miércoles, 26 de enero de 2005 a las 23:12:25 0100, PFC escribió: ¿Cómo hacer un auto-join en un subselección Como SELECT a. xb. x FROM (subselect) a, (subselect) b WHERE a. id b. id10 pero sin realizar el subselecto dos veces. Debe escribir el subselecto dos veces si desea combinar diferentes filas. En algunos casos podría valer la pena hacer una copia en una tabla temporal. Para subselects simple donde hay un índice en id, dejarlo como es debe funcionar bien.

Comments