Sunday, January 8, 2017

Moyenne Mobile Linq

Mon objectif est d'obtenir une moyenne pondérée d'une table, basée sur une autre clé primaire de tables. J'ai besoin d'obtenir une moyenne pondérée basée sur la longueur d'un segment et je dois ignorer les valeurs de -1. Je sais comment faire cela en SQL, mais mon objectif est de le faire dans LINQ. Il ressemble à ceci dans SQL: Je suis encore assez nouveau pour LINQ, et ayant du mal à comprendre comment je traduirais ceci. La moyenne pondérée des résultats devrait atteindre environ 55,3. Je vous remercie. J'ai fait assez que j'ai créé une méthode d'extension pour LINQ. Après avoir obtenu votre sous-ensemble de données l'appel ressemble à ceci. Cela est devenu extrêmement pratique car je peux obtenir une moyenne pondérée de tout groupe de données basées sur un autre champ dans le même enregistrement. Je vérifie maintenant pour la division par zéro et jetez une exception plus détaillée au lieu de retourner 0. Permet à l'utilisateur de saisir l'exception et de la gérer si nécessaire. Si vous êtes certain que pour chaque clé étrangère dans Table2 il ya un enregistrement correspondant dans Table1, alors vous pouvez éviter la jointure juste faire un groupe par. Dans ce cas, la requête LINQ est comme ceci: C'est la façon dont vous pouvez obtenir le wheightedAverage pour une clé étrangère spécifique. La méthode ToList appelée lors de la récupération des enregistrements consiste à éviter d'exécuter la requête deux fois lors de l'agrégation des enregistrements dans les deux opérations de Somm. Pour obtenir une performance asymptotique de O (n) (comme la solution codée manuellement), vous Pourrait utiliser la fonction Aggregate comme dans La valeur cumulée (implémentée en tant que type anonyme) contient deux champs: Résultat contient la liste de résultats compilée jusqu'à présent. Le travail contient les derniers éléments de période-1. La fonction agrégat ajoute la valeur courante à la liste de travail, construit la moyenne courante et l'ajoute au résultat, puis supprime la première valeur (c'est-à-dire la plus ancienne) de la liste de travail. La graine (c'est-à-dire la valeur de départ pour l'accumulation) est construite en mettant les premiers éléments de la période-1 dans le résultat Travailler et initialisant dans une liste vide. En conséquence, l'agrégation commence par la période d'élément (en sautant les éléments de période-1 au début). En programmation fonctionnelle, c'est un modèle d'utilisation typique pour la fonction d'agrégat (ou de pli), btw. La solution n'est pas fonctionnellement propre en ce que les mêmes objets de liste (Working et Result) sont réutilisés à chaque étape. Je ne sais pas si cela pourrait causer des problèmes si certains futurs compilateurs essaient de paralléliser la fonction agrégat automatiquement (d'autre part Im aussi pas sûr, si c'est possible après tout.). Une solution purement fonctionnelle devrait créer de nouvelles listes à chaque étape. Notez également que C manque d'expressions de listes puissantes. Dans un pseudocode python-C-mixte hypothétique on pourrait écrire la fonction d'agrégation comme ce qui serait un peu plus élégant à mon humble avis :) Notez le temps de fonctionnement de O (n2). Puisque vous avez besoin de sauter de plus en plus d'éléments à chaque étape (et afaik Skip (i) doit appeler IEnumerator. MoveNext i fois). Voir ma réponse pour une solution en temps O (n). (Je viens de remarquer le commentaire des OP ci-dessous que heshe sera éventuellement obtenir les valeurs d'un DB SQL à l'avenir. Dans ce cas, je serais fortement décourager de cette solution) ndash MartinStettner Mar 3 11 à 0:53 Pour la manière la plus efficace possible Pour calculer une moyenne mobile avec LINQ, vous ne devriez pas utiliser LINQ Au lieu de cela, je propose de créer une classe d'aide qui calcule une moyenne mobile de la manière la plus efficace possible (en utilisant un tampon circulaire et causal moyen mobile filtre), puis une méthode d'extension pour le rendre accessible À LINQ. Premièrement, la moyenne mobile Cette classe fournit une implémentation très rapide et légère d'un filtre MovingAverage. Il crée un tampon circulaire de longueur N et calcule une addition, une soustraction et une multiplication par point de données ajouté, par opposition aux N multiplications par point pour la mise en œuvre de la force brute. Les méthodes d'extension ci-dessus enveloppent la classe MovingAverage et permettent l'insertion dans un flux IEnumerable. Pour ce faire d'une manière plus fonctionnelle, youd besoin d'une méthode de balayage qui existe dans Rx, mais pas dans LINQ. Nous allons regarder comment il ressemblerait si wed ont une méthode de balayage Et voici la méthode de balayage, pris et ajusté à partir d'ici: Cela devrait avoir de meilleures performances que la méthode de force brute puisque nous utilisons un total courant pour calculer le SMA. Pour commencer, nous devons calculer la première période que nous appelons semence ici. Ensuite, chaque valeur subséquente que nous calculons à partir de la valeur de la graine accumulée. Pour ce faire, nous avons besoin de l'ancienne valeur (c'est-à-dire delta) et de la valeur la plus récente pour laquelle on fixe ensemble la série, une fois depuis le début et une fois décalée par le delta. À la fin, nous faisons un certain nettoyage en ajoutant des zéros pour la longueur de la première période et en ajoutant la valeur initiale d'amorçage. J'ai répondu 19 juin à 22: 58 J'ai un montant de 4000 données de stock, et tring pour calculer la moyenne mobile pour toutes les valeurs de données, mais puisque la moyenne mobile est basée sur les données précédentes et je ne peux pas calculer le SMA de 15 jours pour la première 14 jours, sauter les 14 premiers jours et calculer le SMA sur le reste des données. Et il doit utiliser LINQ pour accomplir. Est-ce que n'importe qui peut donner un échantillons ou un indice comment à l'aide de LINQ pour calculer la moyenne mobile La sortie pour les valeurs moyennes sont toutes autour de 500s je ne comprends vraiment pas comment est-ce possible pour obtenir cette valeur élevée. Déplacement moyenneur avec des sommes tableau: 06072012 562,49 571,72 06082012 565,84 580,32 06112012 568,56 571,17 06122012 569,55 576,16 06132012 570,56 572,16 06142012 570,63 571,53 06152012 571,21 574,13 06182012 572,78 585,78 06192012 573,79 587,41 06202012 574,23 585,74 06212012 574,22 577,67 06222012 575,63 582,10 06252012 576,06 570,77 06262012 576,68 572,03 06272012 576,88 574.50 06282012 576.7 569.05 06292012 576.95 584.00 07022012 578.37 592.52 07032012 579.92 599.41 07032012 581.74 599.41 Leemx 021434 02:59 Lisa Zhu Microsoft contingent personnel 051434 07:38 linq related (De: Visual C Général) Pour créer une moyenne mobile, je commencerais par créer Une plage de 0 à (longueur de la liste de données - durée de la période de déplacement), puis pour chaque valeur dans la plage, sélectionnez les éléments x à x 43 la longueur de la période de déplacement et calculez la moyenne. Tout en un LINQ belle déclaration: Notez que ce n'est pas très efficace, car vous itérativement essentiellement sur la liste de données pour chaque valeur dans la gamme .. Hé, regardez Ce système permet des signatures de plus de 60 cha Arno Brouwer 091434 04:42 Alexander Sun 231434 02:44 091434 04:41 Un exemple de votre instruction LINQ serait utile. QuotPtimature d'optimisation est la racine de tout le mal. quot - Knuth 021434 03:35 ce que vous entendez par l'instruction LINQ 021434 03:49 Microsoft a fourni une belle ressource pour l'apprentissage LINQ. Si vous voulez quelque chose que vous n'avez jamais eu, vous devez faire quelque chose youve jamais fait. Tout le monde (pas seulement le starter) doit prendre le temps de marquer les messages utiles, de proposer des réponses et de marquer les réponses aux questions. 021434 05:51 De votre description, je voudrais déplacer ce post vers le forum le plus lié. Il ya plus d'experts dans cet aspect, donc vous obtiendrez un meilleur soutien et peut-être plus de chance obtenir des réponses. Merci pour votre compréhension. 051434 07:37 Ive a cherché autour peu de peu et a trouvé quelques discussions concernant votre problème. Jetez un oeil, peut-être qu'il peut vous aider. S'il vous plaît marquez comme réponse si aidé. Pour créer une moyenne mobile, je commencerais par créer une gamme de 0 à (longueur de la liste de données - longueur de la période de déplacement) , Puis pour chaque valeur dans la plage sélectionnez les éléments x à x 43 longueur de la période mobile et calculez la moyenne. Tout en un LINQ belle déclaration: Notez que ce n'est pas très efficace, car vous itérativement essentiellement sur la liste de données pour chaque valeur dans la gamme .. Hé, regardez Ce système permet des signatures de plus de 60 cha Arno Brouwer 091434 04:42 Alexander Dim 231434 02:44 091434 04:41


No comments:

Post a Comment