Saturday 3 June 2017

Gleitender Durchschnitt Linq

Mein Ziel ist es, einen gewichteten Durchschnitt aus einer Tabelle, basierend auf einem anderen Tabellen-Primärschlüssel zu erhalten. Ich muss einen gewichteten Durchschnitt basierend auf der Länge eines Segments zu erhalten, und ich muss Werte von -1 ignorieren. Ich weiß, wie dies in SQL zu tun, aber mein Ziel ist, dies in LINQ zu tun. Es sieht so aus in SQL: Ich bin noch ziemlich neu für LINQ, und mit einer harten Zeit herauszufinden, wie ich das übersetzen würde. Das Ergebnis gewichteter Durchschnitt sollte sich auf etwa 55,3. Vielen Dank. Ich habe genug, dass ich eine Erweiterung Methode für LINQ erstellt. Nachdem Sie Ihre Teilmenge von Daten erhalten, sieht der Anruf so aus. Dies ist äußerst praktisch geworden, weil ich einen gewichteten Durchschnitt einer beliebigen Gruppe von Daten erhalten kann, die auf einem anderen Feld innerhalb desselben Datensatzes basiert. Ich überprüfe jetzt für die Division durch Null und werfen Sie eine ausführlichere Ausnahme anstatt 0 zurückzugeben. Erlaubt Benutzer, die Ausnahme zu fangen und zu behandeln, wie gebraucht. Wenn Sie sicher, dass für jeden Fremdschlüssel in Tabelle2 gibt es einen entsprechenden Datensatz in Tabelle1, dann können Sie vermeiden, dass der Beitritt nur eine Gruppe durch. In diesem Fall lautet die LINQ-Abfrage folgendermaßen: So können Sie das wheightedaverage für einen bestimmten Fremdschlüssel erhalten. Die ToList Methode aufgerufen, wenn die Datensätze zu holen, ist die Abfrage zweimal zu vermeiden Ausführung, während die Datensätze in der zwei separate Summe aggregiert operations. In um eine asymptotische Leistung von O (n) (wie die von Hand codiert Lösung der Fall ist), Sie zu erreichen Könnte die Aggregate-Funktion wie in Der akkumulierte Wert (implementiert als anonymer Typ) enthält zwei Felder: Ergebnis enthält die Ergebnisliste bis so weit aufgebaut. Das Arbeiten enthält die letzten Perioden-1 Elemente. Die Aggregatfunktion fügt den aktuellen Wert der Arbeitsliste hinzu, baut den aktuellen Durchschnitt auf und fügt sie dem Ergebnis hinzu und entfernt dann den ersten (d. H. Ältesten) Wert aus der Arbeitsliste. Das Saatgut (d. h. der Anfangswert für die Akkumulation) wird aufgebaut, indem die ersten Perioden-1-Elemente in die Arbeits-und Initialisierungsergebnis zu einer leeren Liste gebracht werden. Folglich beginnt die Aggregation mit der Elementperiode (durch Überspringen (Perioden-1) - Elemente am Anfang). In der Funktionsprogrammierung ist dies ein typisches Verwendungsmuster für die Aggregat - (oder Falz-) Funktion, btw. Die Lösung ist nicht funktional sauber, da die gleichen Listenobjekte (Arbeit und Ergebnis) in jedem Schritt wiederverwendet werden. Im nicht sicher, wenn das Probleme verursachen könnte, wenn einige zukünftige Übersetzer versuchen, die Aggregate-Funktion automatisch zu parallellisieren (auf der anderen Seite Im auch nicht sicher, wenn das möglich ist, nachdem alle.). Eine rein funktionale Lösung sollte bei jedem Schritt neue Listen anlegen. Beachten Sie außerdem, dass C keine leistungsfähigen Listenausdrücke aufweist. In einigen hypothetischen Python-C-gemischten Pseudocode könnte man die Aggregationsfunktion schreiben, die in meiner bescheidenen Meinung ein wenig eleganter wäre :) Beachte die Laufzeit von O (n2). Da Sie bei jedem Schritt immer mehr Elemente überspringen müssen (und afaik Skip (i) I mal IEnumerator. MoveNext aufrufen muss). Siehe meine Antwort für eine Lösung in O (n) Zeit. (Ich habe gerade bemerkt, die OPs unter dem Kommentar heshe möglicherweise die Werte aus einer SQL-DB in der Zukunft zu erhalten. In diesem Fall würde ich jeden stark von dieser Lösung entmutigen) ndash MartinStettner 3. März 11 bei 0.53 Für die effizienteste Art und Weise möglich ein gleitender Durchschnitt mit LINQ zu berechnen, sollten Sie nicht LINQ verwenden Sie stattdessen eine Erweiterungsmethode, um es zugänglich ich schlage vor, eine Hilfsklasse zu schaffen, die möglichst in der effizienteste Weg, um einen gleitenden Durchschnitt berechnet (Gleitmittelungsfilters einen Ringpuffer und kausale verwendet wird), dann Zu LINQ. First up, der gleitende Durchschnitt Diese Klasse bietet eine sehr schnelle und leichte Implementierung eines MovingAverage-Filters. Es erzeugt einen kreisförmigen Puffer der Länge N und berechnet eine Addition, eine Subtraktion und eine Multiplikation pro angehängten Datenpunkt, im Gegensatz zu den N Multiplikations-Adds pro Punkt für die Brute-Force-Implementierung. Die oben genannten Erweiterungsmethoden wickeln die MovingAverage-Klasse und ermöglichen die Einfügung in einen IEnumerable-Stream. Um dies in einer funktionalen Weise zu tun, benötigen Sie eine Scan-Methode, die in Rx, aber nicht in LINQ. Lets schauen, wie es aussehen würde, wenn wed haben eine Scan-Methode Und heres die Scan-Methode, genommen und angepasst von hier: Dies sollte eine bessere Leistung als die Brute-Force-Methode haben, da wir eine laufende Summe verwenden, um die SMA berechnen. Um zu beginnen, müssen wir die erste Periode berechnen, die wir hier Samen nennen. Dann wird jeder nachfolgende Wert aus dem akkumulierten Samenwert berechnet. Dazu benötigen wir den alten Wert (das ist t-delta) und der neueste Wert, für den wir die Serie reihen, einmal von Anfang an und einmal durch das Delta verschoben. Am Ende führen wir einige Bereinigung durch Hinzufügen von Nullen für die Länge der ersten Periode und das Hinzufügen der anfänglichen Seed-Wert. 22 beantwortet 19 13 Jun: 58I haben eine 4000 Menge Daten von Lager und Tring den gleitenden Durchschnitt für alle Datenwerte zu berechnen, aber da der gleitende Durchschnitt auf früheren Daten basiert und ich die 15-Tage-SMA nicht berechnen kann, zum ersten 14 Tage, überspringen Sie die ersten 14 Tage und berechnen die SMA auf den Rest der Daten. Und es ist zu LINQ verwenden, um zu erreichen. Kann jemand eine Probe geben oder Hinweis, wie man mit LINQ zu berechnen gleitenden Durchschnitt Die Ausgabe für die durchschnittlichen Werte sind alle um 500s Ich wirklich nicht verstehen, wie ist, dass möglich, dass hohe Wert zu bekommen. Verschieben Mittelwertbildner mit Summen-Array: 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 06.282.012 576,7 569,05 574,50 576,95 584,00 06.292.012 07.022.012 578,37 592,52 579,92 599,41 07.032.012 07.032.012 581,74 599,41 Leemx 021.434 2.59 Lisa Zhu Microsoft Kontingent Mitarbeiter 051.434 7.38 Linq (von: Visual C Allgemein) einen gleitenden Durchschnitt zu erstellen, würde ich beginnen, indem Einen Bereich von 0 bis (Länge der Datenliste - Länge der Bewegungsperiode), dann für jeden Wert im Bereich Auswahlelemente x bis x 43 Länge der Bewegungszeit und berechnen den Mittelwert. in einer schönen LINQ-Anweisung All: Beachten Sie, dass dies nicht sehr effizient ist, da man im Grunde über die Datenliste iterieren für jeden Wert im Bereich .. Hey, schauen Dieses System ermöglicht Unterschriften von mehr als 60 cha Arno Brouwer 091.434 4.42 Alexander Sun 231434 02:44 091434 04:41 Ein Beispiel für Ihre LINQ-Anweisung würde helfen. Was bedeutet das mit der LINQ-Anweisung 021434 03:49 Microsoft stellte eine schöne Ressource für das Lernen von LINQ zur Verfügung. Wenn Sie etwas wollen, das Sie nie hatten, müssen Sie etwas tun, das Sie nie getan haben. Jeder (nicht nur der Thread-Starter) sollte sich die Zeit nehmen, um hilfreiche Beiträge zu markieren, Antworten vorzuschlagen und Antworten auf Fragen zu markieren. 021434 05:51 Aus Ihrer Beschreibung würde ich gerne diesen Beitrag zu den am meisten verwandten Forum zu verschieben. Es gibt mehr Experten in diesem Aspekt, so erhalten Sie bessere Unterstützung und können mehr Glück bekommen Antworten. Danke für dein Verständnis. 051434 07:37 Ive suchte um wenig und fand einige Diskussionen über dein Problem. Werfen Sie einen Blick, vielleicht kann es helfen. Bitte als Antwort markieren, wenn geholfen. Besuchen Sie auch meinen Blog msguy. net Alexander Sun 071434 01:42 Alexander Sun 231434 02:44 051434 12:47 Um einen gleitenden Durchschnitt zu erstellen, würde ich anfangen, indem ich einen Bereich von 0 bis (Länge der Datenliste - Länge der bewegten Periode) , Dann für jeden Wert in den Bereich Auswahl Elemente x bis x 43 Länge der bewegenden Periode und berechnen den Durchschnitt. Alle in einem schönen LINQ-Anweisung: Beachten Sie, dass dies nicht sehr effizient ist, da Sie im Grunde iterieren über die Datenliste für jeden Wert im Bereich .. Hey, Look Dieses System erlaubt Signaturen von mehr als 60 cha Arno Brouwer 091434 04:42 Alexander Sun 231434 02:44 091434 04:41


No comments:

Post a Comment