Une implémentation de moyenne mobile simple en Java Plusieurs fois, j'ai voulu calculer des mesures simples dans mes applications Java, par exemple le nombre de visites par heure ou les erreurs sur une période donnée. Bien que le calcul de métriques simples ne soit pas terriblement difficile, son travail et son ID ne passent pas le temps sur le domaine du problème. J'ai été surpris de ne pas trouver de solutions largement acceptées pour les statistiques en Java. J'ai trouvé Metrics, mais il semblait un peu trop compliqué et pas bien documenté - Tout ce que je voulais vraiment était de calculer une moyenne mobile. J'ai réfléchi un peu plus au problème et décidé que ce n'était pas un problème difficile. Heres my solution Cela fonctionne en créant un tableau de taille de fréquence de mise à jour de fenêtre, puis un thread définit le compte à l'index suivant dans le tableau sur la fréquence de mise à jour. Le comptage de l'intervalle est simplement arrayi-arrayi1, qui est le dernier comptage moins le comptage le plus ancien. Pour un intervalle de 10 minutes, le compte le plus ancien (i1) a exactement 10 minutes. Pour ajouter une moyenne mobile à notre code d'abord bien besoin d'un compteur, en utilisant AtomicLong. Ce compteur doit être incrémenté en fonction des événements intéressés par le calcul (par exemple, les demandes POST pour un service REST). Nous devons fournir la mise en œuvre avec accès au compteur et cela est accompli grâce à l'interface GetCount. Ici Ill créer une moyenne mobile avec une fenêtre de 5 minutes qui met à jour toutes les secondes. Et pour obtenir la moyenne courante, nous appelons simplement la méthode getAverage: Un détail d'implémentation clé est la façon dont la taille du tableau est déterminée: en divisant la fenêtre par la fréquence de mise à jour. Ainsi, une grande fenêtre avec une fréquence de mise à jour fréquente peut consommer une quantité importante de mémoire. Dans cet exemple, la taille du tableau est raisonnable 300. Toutefois, si nous avons créé une moyenne mobile de 24 heures avec un intervalle de 1 seconde la taille serait 86400 Une fréquence de mise à jour plus raisonnable pour une période de 24 heures pourrait être toutes les 5 minutes (taille du tableau 288 ). Une autre considération du choix de la fenêtre et la fréquence de mise à jour est la fenêtre doit être divisible par la fréquence. Par exemple, une fenêtre de 2 minutes avec une fréquence de mise à jour de 6 secondes est correcte, mais une fréquence de mise à jour de 7 secondes n'est pas, puisqu'elle n'est pas divisible par 120. Une exception IllegalArgumentException est lancée si la fréquence de mise à jour du module de fenêtre n'est pas nulle. Cette implémentation nécessite un thread par moyenne mobile, ce qui n'est pas très efficace. Une meilleure solution serait de partager un thread à travers de nombreuses moyennes. Mettre à jour . Ive a mis à jour le code pour partager un thread ici. Enfin, il ya un problème d'état initial: nous n'avons pas encore de données pour la fenêtre entière. Par exemple, si vous avez une fenêtre de 5 minutes et seulement 15 secondes de données. Cette mise en œuvre renvoie null jusqu'à ce que nous ayons 5 minutes de données. Une autre approche consiste à estimer la moyenne. Supposons que nous ayons un compte de 10 en 30 secondes, alors nous pouvons estimer la moyenne de 40 en 2 minutes. Cependant, il existe un risque d'erreur significative en extrapolant des données incomplètes. Par exemple, si nous avons eu un éclat de 20 coups en 2 secondes, wed être estimant 1200 par 2 minutes, ce qui est très probablement loin. J'ai besoin de garder une trace des 7 derniers jours de travail dans une boucle de lecture de fichier plat. Il est utilisé pour mesurer la fatigueabilité des listes de travail. En ce moment j'ai quelque chose qui fonctionne, mais il semble plutôt verbeux et je ne sais pas si theres un modèle thats plus succinct. Actuellement, j'ai une classe Java avec un tableau statique pour contenir les dernières données x jours, alors que je lis à travers le fichier, je coupe le premier élément et déplacer les autres 6 (pour un total de roulement semaine) en arrière par un. Le traitement de ce tableau statique est fait dans sa propre méthode c'est-à-dire. Ma question: est-ce une approche de conception raisonnable, ou est-il quelque chose d'aveuglante évidente et simple à faire cette tâche Merci les gars a demandé Août 30 11 at 14:33 Merci beaucoup les gars: J'ai reçu le message: utiliser un objet de niveau supérieur et d'exploiter le Les méthodes pertinentes ou un tampon circulaire. De grandes réponses, toutes. Quand vous pensez à cela, vous avez toujours besoin d'accès à l'ensemble du tableau afin que vous puissiez vous débarrasser de cette première entrée - dont je n'étais pas sûr de moi-même. I39m soulagé que je hadn39t raté un liner 1 et a été fondamentalement sur une voie raisonnable, sinon efficace et concis C'est ce que j'aime sur ce site: de haute qualité, des réponses pertinentes de personnes qui connaissent leur sht. Ndash Pete855217 Aug 30 11 at 15:05 Pourquoi initialisez-vous runningTotal to null Quelle est son type Où il est déclaré Il ferait bien si vous mettez des exemples de code qui ressemblent au code Java réel. Je poursuis, ma critique serait la suivante: votre fonction fait trop. Une fonction ou une méthode doit être cohérente. Plus précisément, ils devraient faire une chose et une seule chose. Pire encore, ce qui se passe dans votre boucle for lorsque x 5 Vous copiez runningTotal6 en runningTotal5. Mais alors vous avez deux copies de la même valeur à la position 5 et 6. Dans votre conception, votre movessouffles fonction des éléments de votre tableau calcule le total imprime des choses à l'erreur standard renvoie le total Il fait trop. Ma première suggestion est de ne pas déplacer les choses dans le tableau. Au lieu de cela, implémentez un tampon circulaire et utilisez-le au lieu du tableau. Il simplifiera votre conception. Ma deuxième suggestion est de décomposer les choses en fonctions cohérentes: avoir une structure de données (un buffer circulaire) qui vous permet d'y ajouter (et qui supprime la plus ancienne entrée quand elle atteint sa capacité). Interator ont une fonction qui calcule le total sur l'itérateur (vous ne vous inquiétez pas si vous calculez le total d'un tableau, liste ou bufer circulaire.) Ne l'appellent pas total. Appelez-le somme, qui est ce que vous êtes l'informatique. Thats ce que je fais :) C'est une petite partie de la fonctionnalité de la classe, et il serait excessif d'ajouter trop de code pour le rendre parfait. Vous êtes techniquement correct, et je comprends mon code fait beaucoup39 mais dans le même temps il est parfois préférable d'errer sur le côté de plus petit, code plus clair que d'aller à la perfection. Étant donné mes compétences Java, même faire le pseudocode que vous décrivez compiler aurait me souffler mon budget sur ce (), mais merci pour la description claire. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, ce n'est pas sur la perfection, mais sur les pratiques industrielles établies que nous connaissons depuis les 3 dernières décennies. Le code propre est toujours celui qui est partitionné. Nous avons des décennies de preuves qui indiquent que c'est la voie à suivre dans le cas général (en termes de rentabilité, de réduction des défauts, de compréhension, etc.). Sauf s'il s'agit d'un code déchiré pour un type unique de chose. Il n'est jamais coûteux de le faire quand on commence une analyse de problème de cette manière. Codage 101, décomposer le problème et le code suit, ni overkill ni difficile) ndash luis. espinal Aug 31 11 at 15:55 Votre tâche est trop simple et l'approche que vous avez adopté est certainement bon pour le travail. Cependant, si vous voulez utiliser une meilleure conception, vous devez vous débarrasser de tout ce mouvement de nombre vous mieux utiliser une file d'attente FIFO et faire bon usage des méthodes push et pop de cette façon le code ne reflètera pas n'importe quel mouvement de données, De nouvelles données et de supprimer les données de plus de 7 jours. Réponse 30 août à 14: 49Calculate exponentielle moyenne mobile sur une file d'attente en C J'ai une classe simple pour calculer la moyenne mobile des valeurs que je lui ajouter. Je l'utilise comme ceci: Je voudrais étendre cette classe pour retourner également l'ExponentialMovingAverage. Comment pourriez-vous écrire retourner la moyenne exponentielle des éléments en file d'attente dans les guillemets Je me rends compte que vous devrez ajouter une propriété Alpha à la classe, mais Im ne sais pas comment faire pour compléter le calcul pour le calcul. Qu'en est-il de LINQ: return Quotes. DefaultIfEmpty ().Aggregate ((ema, nextQuote) gt alpha nextQuote (1 - alpha) ema) Je voudrais souligner que pour les données financières en temps réel, cela est très inefficace. Un bien meilleur serait de mettre en cache la valeur EMA précédente et de le mettre à jour sur une nouvelle quote avec la formule de récurrence ci-dessus (constant-time). Cet article répertorie une formule. Est-ce que ça aide en. wikipedia. orgwikiMovingaverageExponentialmovingaverage Related post Im essayant de mettre en œuvre une moyenne mobile exponentielle (EMA) sur postgres, mais comme je vérifier la documentation et y penser plus j'essaie le plus confus je suis. La formule pour EMA (x) est: EMA (x1) x1 EMA (xn) xn (1 -) EMA (xn-1) Il semble que j'ai une valeur continue pour laquelle Id veut calculer une moyenne mobile exponentielle. Normalement Id juste utiliser la formule standard pour cela: Sn Y (1-) Sn-1 où Sn est la nouvelle moyenne, est l'alpha, Y est l'échantillon, et Sn-1 est le précédent a J'ai une moyenne mobile exponentielle qui Est appelée des millions de fois, et est donc la partie la plus chère de mon code: double exponentielle (double prix, double smoothingValue, int dataSetSize) CREATE DEFINER ninjadba PROCEDURE adb. MACD12 (x int) LANGUAGE SQL DETERMINISTIC READS DONNEES SQL SQL SECURITY DEFINER COMMENTAIRE BEGIN MACD12: DEBUT DECLARE z FLOAT DECLARE y FLOAT par défaut 56.41 DECLARE w float WHILE x lt 10 faire INSERT J'ai une série temporelle sous la forme d'un SortedListltdateTime, doublegt. Je voudrais calculer une moyenne mobile de cette série. Je peux le faire en utilisant des boucles simples. Je me demandais s'il existe une meilleure façon de faire cela en utilisant linq. Ma version: usin Si je dispose de données de séries chronologiques - une liste de paires - et que vous souhaitez lisser, je peux utiliser une moyenne mobile exponentielle comme: EMAdata, alpha: .1: Transpose amp email160protected Comment vous implémente essentiellement Ont un tableau de valeurs comme celui-ci: 0,25, 0,24, 0,27, 0,26, 0,29, 0,34, 0,32, 0,36, 0,32, 0,28, 0,25, 0,24, 0,25. Le tableau ci-dessus est simplifié, Im recueillant 1 valeur par milliseconde dans mon code réel et J'ai besoin de traiter la sortie o Je veux créer un rapport chronologique qui montre, pour chaque date dans la chronologie, une moyenne mobile des derniers points de données N dans un ensemble de données qui a certaines mesures et les dates où ils ont été mesurés. J'ai une table de calendrier peuplée avec tous les jours à prov Hi. Je suis nouveau à SharePoint 2010. J'ai l'exigence pour afficher des données comme un diagramme de la base de données de SQL pour ceci J'ai créé une partie de Web de diagramme de données d'affaires et choisi Données de données d'entreprise Source de données. Dans le graphe deux séries de données que j'ai créé x-Ill donner un certain contexte, il est donc logique. Im captage des évaluations de clients pour les produits dans une table (évaluation) et que vous voulez être en mesure de retourner une moyenne mobile cumulative des cotes en fonction du temps. Un exemple de base suit la prise d'une note par jour: 02 FEB J'essaie de calculer la moyenne mobile exponentielle sur les barres de 15 jours, mais je veux voir l'évolution de la barre de 15 jours EMA sur chaque (fin de) daybar. Donc, cela signifie que j'ai 15 barres jours. Quand de nouvelles données arrivent sur une base quotidienne, je voudrais recalculat Je veux calculer une moyenne mobile des derniers, disons 20, des nombres d'une colonne. Un problème est que certaines des cellules de la colonne peuvent être vides, ils doivent être ignorés. Exemple: A 175 154 188 145 155 167 201 Une moyenne mobile des trois derniers serait Im toujours travailler sur groaking la chose F - essayer de travailler sur la façon de penser dans F plutôt que de simplement traduire d'autres langues que je connais. Ive récemment pensé aux cas où vous n'avez pas une carte 1: 1 entre avant et après. Ce week-end, j'ai décidé d'essayer ma main à Scala et Clojure. Im compétent avec la programmation orientée objet, et donc Scala était facile à prendre comme langue, mais voulait essayer la programmation fonctionnelle. C'est là que ça a duré. Je juste cant se Im essayant de mettre en œuvre une moyenne mobile exponentielle variable sur une série chronologique de données intraday (c'est-à-dire 10 secondes). Par variable, je veux dire que la taille de la fenêtre incluse dans la moyenne mobile dépend d'un autre facteur (c'est-à-dire la volatilité). J'étais thinki en utilisant le tableau ci-dessous, comment obtiendrait une colonne pour la moyenne mobile de 5 périodes, la moyenne mobile de 10 périodes, la moyenne mobile exponentielle de 5 périodes. -------------------- prix datadate -------------------- 122.29 2009-10-08 122.78 2009 -10-07 Bonjour J'ai un problème. Je sais comment calculer la moyenne mobile des 3 derniers mois en utilisant les fonctions analytiques oracle. Mais ma situation est un peu différent Mois ----- Type de produit ----- Ventes ---------- Moyenne (TROUVER CETTE) 1 --------- A-- ------------- 10 1 Je suis à la recherche d'une fonction pour calculer la somme mobile exponentielle dans numpy ou scipy. Je veux éviter d'utiliser des boucles python parce qu'ils sont vraiment lents. Pour être précis, j'ai deux séries A et T. Ti est l'horodatage de valeur Ai. Je définis un demi-de
No comments:
Post a Comment