Wednesday, 22 February 2017

Calculer Exponentielle Mobile Moyenne Sql

La partie la plus problématique de votre tâche est le calcul du produit agrégé en pure SQL (comme FYI: il existe de nombreuses fonctions agrégées standard, comme Sum (), Min (), Max (), etc., mais pas de produit P ()). Une solution possible décrite dans: La fonction de produit agrégé étend SQL (codeprojectTips137564Aggregate-Product-function-extends-SQL) est basée sur l'équation mathématique: qui a traduit dans l'instruction SQL suivante: Vous pouvez appliquer cette solution à votre problème. Afin de calculer l'avg en cours d'exécution (déplacement), vous pouvez construire l'auto-jointure de la table de données et appliquer le calcul pour toutes les lignes précédant le courant. L'implémentation réelle dépendra de la base de données que vous utilisez. La moyenne mobile exponentielle dans T-SQL Les moyennes mobiles exponentielles sont semblables aux moyennes mobiles pondérées en ce qu'elles assignent moins de poids aux changements il ya longtemps, et plus de poids aux changements récents. Les moyennes mobiles pondérées sont linéaires, mais les moyennes mobiles exponentielles sont exponentielles. C'est-à-dire que le poids peut être exprimé sous la forme d'une courbe: Il existe un excellent moyen de calculer des moyennes mobiles exponentielles dans T-SQL en utilisant une fonctionnalité non documentée sur les variables et les totaux en cours d'exécution dans SQL Server. Dans ce billet de blog je vais montrer comment utiliser cette méthode pour calculer la moyenne mobile exponentielle dans T-SQL, mais je vais également présenter une méthode qui utilise des fonctionnalités standard dans SQL Server. Malheureusement, cela signifie utiliser une boucle. Dans les exemples, je calculerai une moyenne mobile exponentielle de 9 jours. Les exemples utilisent la base de données TAdb. Un script pour créer TAdb peut être trouvé ici. Moyenne mobile exponentielle (EMA): Méthode des totaux courants La théorie qui sous-tend les fonctionnalités totales courantes des mises à jour est décrite en détail par Jeff Moden dans son article Résoudre les problèmes d'ordre total et Ordinal Rank. D'autres ressources qui décrivent l'utilisation de cette méthode pour calculer EMA sont le blog Calculer des moyennes mobiles avec T-SQL par Gabriel Priester et le forum post exponentiel Défi mobile moyen. À la fois sur SQL Server Central. Fondamentalement, dans T-SQL, vous pouvez mettre à jour les variables ainsi que les colonnes dans une déclaration de mise à jour. Les mises à jour sont effectuées ligne par ligne en interne par SQL Server. Ce comportement ligne par ligne est ce qui rend le calcul d'un total courant possible. Cet exemple montre comment cela fonctionne: Notez que 8220ColumnRunningTotal8221 est un total de 8220ColumnToSum8221. En utilisant cette méthode nous pouvons calculer EMA9 avec ce T-SQL: Le calcul d'EMA est assez simple. Nous utilisons la ligne courante et la précédente, mais avec plus de poids à la ligne courante. Le poids est calculé par la formule 2 (19), où 822098221 est le paramètre pour la longueur de l'EMA. Pour calculer EMA9 pour la ligne 10 ci-dessus, le calcul est: Dans ce cas, la ligne courante obtient 20 du poids (2 (19) 0,2) et la rangée précédente obtient 80 du poids (1-2 (19) 0.8). Vous trouverez ce calcul dans l'instruction ci-dessus dans l'instruction CASE: Moyenne mobile exponentielle (EMA): Méthode de boucle Pour autant que je sache, à l'exception de la méthode des totaux en cours décrite ci-dessus, il n'y a aucun moyen de calculer EMA en utilisant une instruction SQL . Par conséquent, le T-SQL ci-dessous utilise une boucle while pour calculer EMA9: Les résultats sont les mêmes que dans l'exemple de totaux en cours ci-dessus. Performance Comme prévu, la version des totaux en cours d'exécution est beaucoup plus rapide que la version en boucle. Sur ma machine, la solution basée sur l'ensemble était d'environ 300 ms, comparativement à environ 1200 avec la version de boucle. La version de boucle est plus conforme aux normes de SQL cependant. Donc, le choix entre les méthodes dépend de ce qui est le plus important pour vous, la performance ou les normes. La moyenne mobile exponentielle peut être utilisée dans l'analyse des tendances, comme pour les autres types de moyennes mobiles, la moyenne mobile simple (SMA) et la moyenne mobile pondérée (WMA). Il ya aussi d'autres calculs dans l'analyse technique qui utilise l'EMA, MACD par exemple. Ce billet de blog fait partie d'une série sur l'analyse technique, TA, dans SQL Server. Voir les autres messages ici. Publié par Tomas Lind Tomas Lind - Services de conseil en tant que SQL Server DBA et développeur de bases de données chez High Coast Database Solutions AB. Im essayant de mettre en œuvre une moyenne mobile exponentielle (EMA) sur postgres, mais comme je vérifier la documentation et y réfléchir plus j'essaie Plus je suis confus. La formule pour EMA (x) est: Il semble être parfait pour un agrégateur, en gardant le résultat du dernier élément calculé est exactement ce qui doit être fait ici. Cependant, un agrégateur produit un seul résultat (comme réduire, ou plier) et ici nous avons besoin d'une liste (une colonne) de résultats (en tant que carte). J'ai vérifié comment les procédures et les fonctions fonctionnent, mais AFAIK ils produisent une seule sortie, pas une colonne. J'ai vu beaucoup de procédures et de fonctions, mais je ne peux pas vraiment comprendre comment cela interagit avec l'algèbre relationnelle, surtout quand on fait quelque chose comme ça, un EMA. Je n'ai pas eu la chance de chercher les Internets jusqu'à présent. Mais la définition d'un EMA est assez simple, j'espère qu'il est possible de traduire cette définition en quelque chose qui fonctionne dans postgres et qui est simple et efficace, car passer à NoSQL va être excessif dans mon contexte. Est-ce le calcul de l'agrégation qui produit le résultat dans chaque ligne pour chaque sous-liste des données d'entrée? Parce qu'il ressemble à l'utilisation de l'agrégateur jusqu'à la ligne n, en retournant le résultat, puis en allant à la rangée 0 pour calculer l'agrégation jusqu'à la ligne n1 encore. Existe-t-il une façon d'utiliser l'accumulation ou une variable statique (comme en C) de sorte que cela doit être calculé une fois Merci. Ndash Trylks Jan 20 12 at 11:59 Non, il utilise la valeur accumulée. Si vous exécutez la requête avec la commande quotraise infoquot non commentée, vous pourrez voir que la fonction n'est appelée qu'une fois pour chaque sortie de ligne. Postgresql fournit la valeur d'état sur chaque ligne (s'il y avait un définitif défini, qui serait appelé pour transformer l'état en une valeur de sortie). ErwinBrandstetter: J'ai rétabli la plupart des changements - dans le cas du format de la première partie (ancre) de la requête, EMA (x1) peut être clairement représentée avec une seule ligne - ceci Corespnds à la ligne unique la définissant dans la question. Dans le cas de la partie récursive de la requête, j'ai utilisé mn - 1 dans la condition de jointure pour indiquer l 'équivalence de la relation avec EMA (xn - 1) dans la question, même si celle - ci sera moins performante si la performance est un , Le PO peut changer la condition de jointure pour être comme vous l'avez suggéré. Ndash Mark Bannister Jan 16 12 à 9:27


No comments:

Post a Comment