Thursday, February 23, 2017

Moving Average Function In Sql

Dans ce post, je montre un truc pour faire le calcul de la moyenne mobile (peut être étendu à d'autres opérations nécessitant des fonctions de fenêtrage) qui est super rapide. 1. PROC EXPAND 2. DATA ETAPE 3. PROC SQL Mais de nombreux sites peuvent ne pas autoriser SASETS à utiliser PROC EXPAND et faire la moyenne mobile dans DATA STEP nécessite un certain codage et est sujet à erreurs. PROC SQL est un choix naturel pour les programmeurs juniors et dans de nombreux business cases la seule solution, mais SAS39s PROC SQL manque des fonctions de fenêtrage qui sont disponibles dans de nombreux DB pour faciliter le calcul de la moyenne mobile. Une technique que les gens utilisent habituellement est CROSS JOIN, ce qui est très coûteux et pas une solution viable pour les ensembles de données même de taille moyenne. Dans ce post, je montre un truc pour faire le calcul de la moyenne mobile (peut être étendu à d'autres opérations nécessitant des fonctions de fenêtrage) qui est super rapide. Considérons le calcul de la moyenne mobile le plus simple où les observations K à la traîne sont incluses dans le calcul, à savoir MA (K), ici nous mettons K5. On génère d'abord une donnée d'échantillon de 20 obs, où l'ID de variable doit être utilisée pour le fenêtrage et la variable X doit être utilisée dans le calcul MA, puis on applique le CROSS JOIN standard pour examiner d'abord les données résultantes, non groupées, Pour comprendre comment tirer parti de la structure de données. À partir de l'ensemble de données résultant, il est difficile de trouver un indice, maintenant let39s trier par quotbidquot colonne dans cet ensemble de données: à partir de ces données triées, il est clair que nous don39t ont effectivement à CROSS JOIN ensemble ensemble de données originales, Nous pouvons générer un ensemble de données quotoperationquot qui contient la valeur de différence et laisser l'ensemble de données d'origine CROSS JOIN avec cet ensemble de données quotoperationquot beaucoup plus petit et toutes les données que nous devons utiliser pour le calcul MA seront là. Maintenant let39s le faire: CROSS JOIN données originales avec quotoperationquot données, trier par (a. idops), qui est en fait quotbid39 dans le jeu de données triées Notez que dans le code ci-dessus, il est nécessaire d'avoir ax multiplier par b. weight de sorte que les données Peut être intercalaire, sinon la même valeur X de la table d'origine sera sortie et le calcul MA sera échoué. La variable de poids explicite ajoute en fait plus de souplesse à l'ensemble du calcul MA. Bien que la définition de 1 pour tous obs résultent en un simple calcul de MA, affecter des poids différents aidera à résoudre le calcul MA plus complexes, comme donner d'autres observations moins de poids pour un MA décomposé. Si un paramètre K différent dans les calculs MA (K) est nécessaire, seul l'ensemble des données opérationnelles doit être mis à jour, ce qui est un travail triviale. Maintenant, le modèle de code réel pour le calcul MA (K) sera: Avec cette nouvelle méthode, il est intéressant de le comparer à l'auto coûteux CROSS JOIN ainsi qu'à PROC EXPAND. Sur mon poste de travail (Intel i5 3.8Ghz, 32 Go de mémoire, 1 To 72K HDD), auto CROSS JOIN est prohibitivement long en temps de fonctionnement (si les données sont grandes) alors que la nouvelle méthode utilise seulement 2X autant de temps que PROC EXPAND, les deux consommations de temps sont Trivial comparant à l'auto CROSS JOIN. La consommation de temps indiquée ci-dessous est en quotsecondquot. Ci-dessous les lecteurs de code peuvent exécuter et comparer vous-mêmes. Publié le 10 mai 2015 par Liang Xie Programmation SAS pour l'exploration de donnéesMobile moyenne en T-SQL Un calcul courant dans l'analyse des tendances est la moyenne mobile (ou mobile). Une moyenne mobile est la moyenne des, par exemple, les 10 dernières rangées. La moyenne mobile montre une courbe plus lisse que les valeurs réelles, plus avec une période plus longue pour la moyenne mobile, ce qui en fait un bon outil pour l'analyse des tendances. Ce blog affichera comment calculer la moyenne mobile dans T-SQL. Différentes méthodes seront utilisées en fonction de la version de SQL Server. Le graphique ci-dessous montre l'effet de lissage (ligne rouge) avec une moyenne mobile de 200 jours. Les cours boursiers sont la ligne bleue. La tendance à long terme est clairement visible. T-SQL Déplacement Avergage 200 jours La démonstration ci-dessous nécessite la base de données TAdb qui peut être créée avec le script situé ici. Dans l'exemple à venir, nous calculons une moyenne mobile pour les 20 derniers jours. Selon la version de SQL Server, il y aura une méthode différente pour effectuer le calcul. Et, comme nous le verrons plus loin, les nouvelles versions de SQL Server ont des fonctions permettant un calcul beaucoup plus efficace. SQL Server 2012 et versions ultérieures Moyenne mobile Cette version utilise une fonction de fenêtre agrégée. Quoi de neuf dans SQL 2012 est la possibilité de restreindre la taille de la fenêtre en spécifiant le nombre de lignes précédant la fenêtre doit contenir: lignes précédentes est 19, car nous allons inclure la ligne actuelle ainsi dans le calcul. Comme vous pouvez le voir, le calcul de la moyenne mobile dans SQL Server 2012 est assez simple. La figure ci-dessous illustre le principe de fenêtrage. La ligne courante est marquée en jaune. La fenêtre est marquée d'un fond bleu. La moyenne mobile est simplement la moyenne de QuoteClose dans les lignes bleues: T-SQL Fenêtre de moyenne mobile. Les résultats des calculs dans les anciennes versions de SQL Server sont identiques, de sorte qu'ils ne seront pas affichés à nouveau. SQL Server 2005 8211 2008R2 Moyenne mobile Cette version utilise une expression de table commune. Le CTE est auto-référencé pour obtenir les 20 dernières lignes pour chaque ligne: Moyenne mobile avant SQL Server 2005 La version antérieure à 2005 utilisera une jointure externe gauche à la même table pour obtenir les 20 dernières lignes. Comparaison des performances Si nous exécutons les trois méthodes différentes simultanément et vérifions le plan d'exécution résultant, il existe une différence spectaculaire de performance entre les méthodes: Comparaison de trois Différentes méthodes pour calculer la moyenne mobile Comme vous pouvez le constater, les améliorations apportées aux fonctions de fenêtrage dans SQL 2012 font une énorme différence dans les performances. Comme mentionné au début de ce post, les moyennes mobiles sont utilisées comme un outil pour illustrer les tendances. Une approche commune consiste à combiner des moyennes mobiles de différentes longueurs, afin de repérer respectivement les variations des tendances à court, moyen et long terme. Un intérêt particulier est le franchissement des lignes de tendance. Par exemple, lorsque la courte tendance se déplace sur la tendance à long ou à moyen terme, cela peut être interprété comme un signal d'achat dans l'analyse technique. Et quand la tendance courte se déplace sous une ligne de tendance plus longue, cela peut être interprété comme un signal de vente. Le graphique ci-dessous présente les devis, Ma20, Ma50 et Ma200. T-SQL Ma20, Ma50, Ma200 acheter et vendre des signaux. 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 Je travaille avec SQL Server 2008 R2, en essayant de calculer une moyenne mobile. Pour chaque enregistrement à mon avis, je voudrais collecter les valeurs des 250 enregistrements précédents, puis calculer la moyenne pour cette sélection. Mes colonnes de vue sont comme suit: TransactionID est unique. Pour chaque TransactionID. Je voudrais calculer la moyenne de la valeur de la colonne, au cours des 250 derniers enregistrements. Donc, pour TransactionID 300, collecter toutes les valeurs des 250 lignes précédentes (affichage est trié en descendant par TransactionID) et puis dans la colonne MovAvg écrire le résultat de la moyenne de ces valeurs. Je cherche à recueillir des données dans une gamme d'enregistrements. A demandé Oct 28 14 at 20:58


No comments:

Post a Comment