Monday 13 February 2017

Gleitender Durchschnitt Vb Net

Ich habe vor kurzem benötigt, um mit gleitenden Durchschnitten auf einem groß-ish Datensatz (ca. 10.000 Zeilen x 10 Spalten) arbeiten, und aus Gründen, die ich in der nächsten Post beschreiben, entschieden, dass eine benutzerdefinierte Funktion (UDF) nützlich wäre. Das Schreiben der UDF war einfach genug, aber wegen der großen Anzahl von Datenübertragungen zwischen der Kalkulationstabelle und VBA war es schmerzhaft langsam. Glücklicherweise ist es einfach, eine UDF als Array-Funktion zu schreiben, die es ermöglicht, alle Daten in einem Schritt zu übertragen, die Verarbeitung innerhalb von VBA auszuführen und dann die Ergebnisse in einem Arbeitsschritt wieder in die Tabelle zu schreiben. Dies verbessert im Vergleich zu meinem 100.000 Zelldatensatz die Leistung nahezu augenblicklich. Die Prozedur in der Gliederung lautet: Deklarieren Sie die Eingabedatarrage (n) und die Funktion selbst als Varianten. Konvertieren Sie den Eingabebereich von einem variantrange-Objekt in ein Array von Varianten mit der Anweisung: DataRange DataRange. value2 Dimension eines Arrays der erforderlichen Größe für die Ergebnisse : Dim ResA (1 bis numrows, 1 bis numcols) als double Führen Sie die erforderlichen Berechnungen durch und ordnen Sie die Ergebnisse ResA zu. Ordnen Sie das Ergebnisarray dem Funktionsrückgabewert zu: FunctionName ResA That8217s all Wenn Sie die Funktion in der Kalkulationstabelle in der üblichen Weise eingeben, wird nur der Inhalt der Arrayposition (1,1) angezeigt. Um das vollständige Array anzuzeigen: Geben Sie die Funktion in einer Zelle in der üblichen Weise ein. Wählen Sie einen Bereich aus, der groß genug ist, um das gesamte Array zu halten, mit der eingegebenen Funktion in der oberen linken Ecke. Drücken Sie die Edit-Taste (F2) Drücken Sie Strg-Shift-Enter. Die Array-Werte werden in den ausgewählten Bereich übertragen. Code für eine gleitende Array-Funktion wird unten gezeigt. Dies hat die folgenden Vorteile gegenüber der integrierten Average () - Funktion oder dem 8220moving-Durchschnitt wizard8221 im Datenanalyse-Add-In: Die Anzahl der zu durchschnittlichen Werte wird als Variable angegeben, anstatt dass die Formel erneut benötigt wird Aufrechtzuerhalten. Es kann jede beliebige Anzahl von Spalten bis zu der Kalkulationsblattbegrenzung verarbeiten. Es kann leicht verfeinert werden, um zusätzliche Funktionalität bereitzustellen, beispielsweise gewichtete gleitende Mittelwerte, wie es im nächsten Beitrag beschrieben wird. Beachten Sie, dass dies eine vereinfachte Funktion ohne Fehlerprüfung ist, Und Leerzellen, die als Null behandelt wurden. Funktion MovAv1 (AvData als Variant, Schritte so lang) Als Variant Dim MovAvA () As Variant, NumRows So Lang, NumCols So Lang Dim I So Lang, J So Lang, MovSum Als Double AvData AvData. Value2 NumRows UBound (AvData) NumCols UBound (1, 2) ReDim MovAvA (1 Zu NumRows, 1 Zu NumCols) Für j 1 Zu NumCols MovSum 0 Für i 1 Zu Schritte MovSum MovSum AvData (i, j) MovAvA (i, j) CVErr (xlErrNA) I - 1, j) MovSum Schritte für i Schritte 1 bis NumRows MovSum MovSum (AvData (i, j) - AvData (i - Schritte, j)) MovAvA (i, j) Funktion Gleitender Durchschnitt Funktion Sehr nett, Dank für das Entsenden dieses Doug. Ich werde einige Zeitreihen-Analyse über die nächsten paar Wochen, die dies in sehr praktisch für 8211 kommen wird es sparen eine Menge Zeit in der Lage, eine Array-Funktion verwenden, um alle Mittelwerte, die ich zu schaffen. Normalerweise I8217d dies alles in SAS, aber es8217s viel einfacher, die Datenpunkte in SAS erstellen und die Analyse in Excel. Cheers Geoff 8211 froh, dass Sie es nützlich fanden, und ich schätze, das Feedback. I8217ll eine Option für die gewichteten Durchschnitte in den nächsten Tagen hinzufügen, sowie ignorieren Text und Leerzellen, und auch optional ignorieren Nullen. BTW, I8217ve begann gerade in Python in meiner Freizeit (sollte jeder kommen), so I8217ll Blick auf die Python auf Ihrer Website, wenn ich in sie. Hallo: Ich bin aus Guadalajara, Mxico und möchte für alle Ihre interessanten Kommentare und Dateien in diesem Blog, vor allem diese vba-Funktion danken. Grüße von Mxico. That8217s wirklich nützlich. Btw Ich versuche, die zentrierte MA zu berechnen, das bedeutet, traslated hinter durch die Hälfte der Anzahl der Schritte, gibt es jemanden, der meThread helfen können: berechnen Sie eine einfache rollenden gleitenden Durchschnitt mit VB 2010 berechnen Sie eine einfache rollenden gleitenden Durchschnitt mit VB 2010 mein Code produziert Eine Variable mit einer Spalte von Zahlen wie folgt: Was ich tun möchte, ist VB verwenden, um mir den Durchschnitt für jede x Anzahl der Zeilen, und speichern Sie dann in einem anderen var, und dann VB drucken die MAX und MIN dieser Mittelwerte . Zum Beispiel, wenn ich den Durchschnitt für alle 10 Zeilen zu berechnen: 5248 5249 5258 5251 5247 5246 525 5228 5235 525 5246 5241 5245.7 5240 5244.5 5261 5245.7 so können Sie sehen, dass ab dem 10. Datensatz der Durchschnitt berechnet wird Für Datensätze 1-10, dann 2-11, dann 3-12, dann 4-13, dann 5-14, dann 6-15 Der MAX-Durchschnitt ist 5246,4 und der MIN ist 5243,7, wenn ich den Durchschnitt für jede 5 erhalten wollte (ZB), dann würde der erste Durchschnitt den Durchschnitt von 1-5, dann 2-6, dann 3-7 und so weiter, was ist der beste Weg, um dies zu kalkulieren, um den gleitenden Durchschnitt und finden Sie auch die MAX Und MIN von diesem Durchschnitt Re: Berechnen einer einfachen rollenden gleitenden Durchschnitt mit VB 2010 Er meinte genau das, was er sagte: Er hat eine einzelne Zeichenfolge Variable mit all jene Werte in ihm durch NewLine Zeichen getrennt. Es wäre möglich, diese Variable und Split auf der Newline nehmen, um es in eine Reihe von Zahlen in einer Reihe von Zeichenfolgen, die dann in eine Reihe von ganzen Zahlen umgewandelt werden könnte brechen, aber ich denke immer noch, es wäre besser, nicht zu haben Variable zu beginnen. Meine normale langweilig Signatur: Nothing Re: Berechnung einer einfachen rollenden gleitenden Durchschnitt mit VB 2010 zustimmen mit shaggy, id verwenden eine Liste (von Integer) anstelle einer Variablen mit mehreren Zeilen mit 1 Integer pro Zeile. Die Liste wäre am vielseitigsten es würde mit dem Code funktionieren würde ich gepostet. Re: Berechnen einer einfachen gleitenden gleitenden Durchschnitt mit VB 2010 Ich habe eine Schleife, um die Zeichenfolge mit den Zahlen kommen in wie die Daten aufgerufen wird nun der Code sieht wie folgt aus: Das Problem mit dem Code ist 1) Ich kann nicht erhalten M60c zu existieren Außerhalb der Schleife (zeigt nur den letzten Wert, und 2) Ich weiß nicht, wie diese Daten zu speichern, wie es kommt als eine Reihe von Ganzzahlen, wenn ich manuell Werte eingeben, wo ist der Code funktioniert sonst ist es nicht mehr Einblick Dank für die replyMoving Durchschnittliche Berechnung Gleitende Durchschnittsberechnung Gleitende Durchschnittsberechnung Ich versuche, einen gleitenden Durchschnitt für eine Reihe von Daten zu berechnen. Ich möchte den gleitenden Durchschnitt für jeden Punkt innerhalb der Daten generieren, um in einem Diagramm zu zeigen. Wie auch immer, unten ist ein Beispiel von MS Support. Ich habe den Brief gefolgt, aber mir gibt nicht einen gleitenden Durchschnitt. Es wiederholt den gleichen Datenpunkt über und über (der erste Datenpunkt). So glaube ich nicht, dass die Funktion das startdate in der MyRST. Seek Linie findet, also gerade die Rückgabe des ersten Datenpunktes. Schließlich (vielleicht macht dies wirklich einfach) Ich bin verwirrt darüber, wie die Indizes funktionieren. Ich dachte, Sie könnten nur einen Primärschlüssel haben, aber anscheinend können Sie mehrere Feldbeschränkungen erstellen. Ich habe versucht, dies mit der folgenden Datendefinitionsabfrage zu tun: ALTER TABLE Table1 ADD CONSTRAINT NoDupes UNIQUE (CurrencyType, TransactionDate) Sorry über die Länge dieses Beitrags. Ich schätze Ihre Hilfe. Die folgende Beispielfunktion berechnet Bewegungsdurchschnitte basierend auf einer Tabelle mit einem Mehrfachfeld-Primärschlüssel. Für dieses Beispiel werden die wöchentlichen Werte der Fremdwährungen verwendet. Gehen Sie folgendermaßen vor, um die Beispielfunktion zu erstellen: Erstellen Sie die folgende Tabelle, und speichern Sie es als Table1: Tabelle: Table1 --------------------------- -------------- Feldname: CurrencyType Primärschlüssel Datentyp: Text Feldgröße: 25 Feldname: TransactionDate Primärschlüssel Datentyp: DateTime Format: Kurzdatum Feldname: Datentyp: Währung Dezimalstellen: 4 Zeigen Sie die Tabelle in der Datenblattansicht an und geben Sie die folgenden Werte ein: CurrencyType TransactionDate Rate ------------------------------- ------------- Yen 8693 0.0079 Yen 81393 0.0082 Yen 82093 0.0085 Yen 82793 0.0088 Yen 9393 0.0091 Mark 8693 0.5600 Mark 81393 0.5700 Mark 82093 0.5800 Mark 82793 0.5900 Mark 9393 0.6000 Öffnen Sie ein neues Modul und geben Sie die folgende Funktionen: Funktion MAvgs (Perioden As Integer, Startdatum, Type-Name) Dim MyDB Als DATABASE, MyRST Als Recordset, MySum As Double Dim i, Satz x MyDB CurrentDb () Set MyRST MyDB. OpenRecordset (Tabelle 1) On Error Resume Next MyRST. Index PrimaryKey x Periods - 1 ReDim Store (x) MySum 0 Für i 0 Zu x MyRST. MoveFirst MyRST. Seek, TypeName, StartDate Diese beiden Variablen sollten in der gleichen Reihenfolge sein wie die Primärschlüsselfelder in Ihrer Tabelle. Store (i) MyRSTRate If i lt x Then StartDate StartDate - 7 Die 7 hier nimmt wöchentliche Daten 1 für Tagesdaten an. Wenn StartDate lt 8693 Dann wird MAvgs Null: Exit Function 8693 durch das früheste Datum der Daten in Ihrer Tabelle ersetzt. MySum-Speicher (i) MySum Next i MAvgs MySum-Perioden MyRST. Close-Endfunktion Erstellen Sie die folgende Abfrage auf der Grundlage der Tabelle1-Tabelle: Query: Query1 --------------------- ---------------------------------- Feld: CurrencyType Feld: TransactionDate Feld: Ratenfeld: Expr1: MAvgs (3 , TransactionDate, CurrencyType) HINWEIS: Diese Abfrage erzeugt einen dreiwöchigen gleitenden Durchschnitt der Rate-Daten. Um einen längeren oder kürzeren gleitenden Durchschnitt zu berechnen, ändern Sie die Zahl 3 in der Spalte Ausdrücke 1 von Spalte auf den Wert, den Sie berechnen möchten. Führen Sie die Abfrage aus. Beachten Sie, dass Sie die folgenden drei Wochen gleitenden Durchschnitt für jede Währung sehen. Ein Null-Wert zeigt an, dass nicht genug frühere Werte vorhanden sind, um diesen Wochenmittelwert zu berechnen. CurrencyType Transaction Rate Expr1 Mark 080.693 0,5600 Mark 081.393 0,5700 Mark 082.093 0,5800 0,57 Mark 082.793 0,5900 0,58 Mark 090.393 0.6000 0.59 Yen 080.693 0,0079 Yen 081.393 0,0082 Yen 082.093 0,0085 0,0082 Yen 082.793 0,0088 0,0085 Yen 090.393 0,0091 0,0088 RE: Moving Average Berechnung dhookom (Programmierer) 28 Jun 10 21:15 Wie alt ist dieser Code Es doesnt explizit verwenden DAO und nicht erwähnen, dass dies nicht mit verknüpften Tabellen arbeiten. Dim MyDB als DAO. Database, MyRST als DAO. Recordset. Ich würde eine Unterabfrage anstatt ein Re-Cord-Set verwenden. Es könnte etwa so aussehen: SELECT CurrencyType, Transaction, Rate (SELECT Avg (Rate) FROM Tabelle1 B WHERE A. CurrencyType B. CurrencyType UND A. TransactionDate ZWISCHEN B. TransactionDate - 14 UND B. TransactionDate) FROM Tabelle1 A RE: Umzug Durchschnittliche Berechnung Das ist wirklich perfekt. Ich schätze deine Hilfe sehr. Allerdings ist der Code, den Sie gaben die Berechnung der vorwärts 14 Tage gleitenden Durchschnitt (Platzierung der gleitenden Durchschnitt in den Datensatz für Tag 1 des Durchschnitts, wo ich wollte, dass es ein rückwärts gerichteter Durchschnitt, platziert in Rekord 14). Ich änderte nur etwas zu den folgenden und es scheint zu funktionieren SELECT A. CurrencyType, A. TransactionDate, A. Rate, (SELECT Avg (Rate) FROM Tabelle1 B WHERE A. CurrencyType B. CurrencyType UND B. TransactionDate ZWISCHEN A. TransactionDate - 14 AND A. TransactionDate) AS Expr1 FROM Tabelle1 AS Wie Sie sehen können, war alles, was ich tat Austausch A für B in der where-Klausel. Dies ist eine wirklich große Hilfe für mich und ich schätze es wirklich. Ich habe nicht gesehen Codierung wie diese vor, und ehrlich, ich nicht wirklich verstehen. Ich weiß nicht, wie die SQL versteht, was B und A sind. Ich gehe davon aus, dass sie eine Art von alternativen Verweis auf Tabelle1 erstellen. Wenn Sie irgendeine Anleitung geben können, würde ich es wirklich schätzen. Auch, vielleicht ein Hinweis auf Material, das ich sehen konnte bin ich immer sehr aufgeregt, um etwas Neues über VBASQL lernen, und ich wirklich schätzen Ihre Hilfe RE: Moving Average Calculation PHV (MIS) 29 Jun 10 12:22 versteht, was B und A Sind sie alias es RE: Moving Average Calculation Vielen Dank, PHV. Es macht besser Sinn bereits RE: Moving Average Berechnung joshery420 (TechnicalUser) 6 Jul 10 15:06 Wow, nie sah SQL-Sicht vor. Äußerst hilfreich. Ich versuche, diesen Code zu bekommen, um in meinem eigenen Datensatz zu funktionieren und ich bin auf eine bestimmte Frage geheilt. Pd2004, nicht sicher, ob der neue Unterabfrage-Code arbeitete die gleiche wie Ihre alten VBA-Code oder nicht, aber mit meinen Daten zeigt es immer noch den gleitenden Durchschnitt, auch wenn es arent genug Tage, um die Länge eines durchschnittlichen erstellen. z. B. Wenn Im einen 7-Tage-Rolling-Durchschnitt durchführt, zeigt Tag 1 dieselben Daten in der Spalte 7DayAvg wie in der Tagesdatenspalte an. Tag 2 würde zeigen, den Durchschnitt der Tage 1 und 2, etc. Einer von euch Jungs wissen, wie man dies durch Zufall zu beheben Auch danke für die große Code-Tipp PHV. RE: Verschieben der Mittelwertberechnung joshery420 (TechnicalUser) 6 Jul 10 15:08 Woops, gemeint zum Dank dhookom für den Code-Tipp, nicht PHV. Aber hey, danke euch beiden. XD RE: Moving Average Calculation Ich werde die besten Lösungen für die Fachleute hier verlassen, aber Sie können in meinem ursprünglichen Post sehen, wie das Microsoft-Hilfe-Beispiel versucht, das zu behandeln. Hier ist der Code: Wenn StartDate lt 8693 Dann MAvgs Null: Exit Function 8693 wird durch das früheste Datum der Daten in Ihrer Tabelle ersetzt. Sie sind nur verlassen die Funktion, wenn das Datum nicht die Kriterien passt. Ich weiß nicht, ob Sie so etwas in den Alias-Code von dhookem zur Verfügung stellen könnte. Ich dont wie ihre Art, dies zu behandeln, und ich vermute, dass dhookem wird eine viel elegantere Lösung. Für meine Zwecke die Frage, die Sie beschreiben, ist kein Problem, aber ich werde daran interessiert, alle Lösungen zu sehen. RE: Moving Average Berechnung Dhookom (Programmer) 6 Jul 10 17:05 Sie könnten versuchen, mit IIf (), um für eine Zählung der Anzahl der Datensätze zu testen. Achtung: es wird ein nicht getestetes Notepad-Code ausgeführt: SELECT A. CurrencyType, A. TransactionDate, A. Rate, IIF (SELECT Count (Rate) FROM Tabelle1 C WHERE A. CurrencyType C. CurrencyType AND C. TransactionDate BETWEEN A. TransactionDate - 14 AND A. TransactionDate), NULL) AS Expr1 FROM Tabelle1 AS A RE: Gleitende Durchschnittsberechnung


No comments:

Post a Comment