Friday 9 June 2017

Berechnen 3 Monats Gleit Durchschnitt In Sas


Ich habe einen Screenshot enthalten, um zu helfen, mein Problem zu klären: Ich versuche, irgendeine Art von gleitendem Durchschnitt zu berechnen und die Standardabweichung zu bewegen. Die Sache ist, dass ich die Variationskoeffizienten (stdevavg) für den tatsächlichen Wert berechnen möchte. Normalerweise erfolgt dies durch die Berechnung der stdev und avg für die letzten 5 Jahre. Allerdings gibt es manchmal auch Beobachtungen in meiner Datenbank, für die ich nicht die Informationen der letzten 5 Jahre habe (vielleicht nur 3, 2 usw.). Thats, warum ich einen Code wünsche, der das avg und stdev berechnet, selbst wenn es keine Informationen für die ganzen 5 Jahre gibt. Auch, wie Sie in den Beobachtungen sehen, manchmal habe ich Informationen über mehr als 5 Jahre, wenn dies der Fall ist, brauche ich irgendeinen gleitenden Durchschnitt, der mir erlaubt, das avg und stdev für die letzten 5 Jahre zu berechnen. Wenn also ein Unternehmen 7 Jahre lang Informationen hat, brauche ich irgendeine Art von Code, der das avg und stdev berechnen wird, sagen wir 1997 (von 1991-1996), 1998 (von 1992-1997) und 1999 (1993-1998). Als ich nicht sehr vertraut mit sas Befehlen es aussehen sollte (sehr sehr grob) wie: Oder so etwas, ich habe wirklich keine Ahnung, Im gonna versuchen und es herauszufinden, aber es lohnt es, es zu schreiben, wenn ich es nicht selbst finden werde SAS Anfänger und Im neugierig, wenn die folgende Aufgabe viel einfacher gemacht werden kann, wie es derzeit in meinem Kopf ist. Ich habe die folgenden (vereinfachten) Metadaten in einer Tabelle namens userdatemoney: User - Date - Geld mit verschiedenen Benutzern und Daten für jeden Kalendertag (für die letzten 4 Jahre). Die Daten werden von User ASC und Date ASC bestellt, Beispieldaten sehen so aus: Ich möchte nun einen fünftägigen gleitenden Durchschnitt für das Geld berechnen. Ich begann mit dem ziemlich populären apprach mit der lag () Funktion wie folgt: Wie Sie sehen, das Problem mit dieser Methode tritt auf, wenn es wenn der Datenschritt in einen neuen Benutzer läuft. Aron bekam einige hintere Werte von Anna, was natürlich nicht passieren sollte. Nun meine Frage: Ich bin mir ziemlich sicher, dass du mit dem User-Switch umgehen kannst, indem du einige zusätzliche Felder wie laggeduser hinzufügst und die N-, Summen - und Mean-Variablen zurücksetzest, wenn du einen solchen Schalter kennst, aber das kann man einfacher machen BY Klausel in irgendeiner Weise Danke für deine Ideen und Hilfe Ich denke, der einfachste Weg ist, PROC EXPAND zu verwenden: Und wie in Johns Kommentar erwähnt, ist es wichtig, sich an fehlende Werte zu erinnern (und auch über Anfangs - und Endbeobachtungen). Ive hat die SETMISS-Option zum Code hinzugefügt, da du klar gemacht hast, dass du zerofy fehlende Werte willst, ignorierst sie nicht (Standard-MOVAVE-Verhalten). Und wenn du die ersten 4 Beobachtungen für jeden Benutzer ausschließen willst (da sie nicht genug Vorgeschichte haben, um den gleitenden Durchschnitt zu berechnen), kannst du die Option TRIMLEFT 4 innerhalb von TRANSFORMOUT () verwenden. Antwortete am 3. dezember um 15: 29moving durchschnittlich mit Datumsbereich gleitender Durchschnitt mit Datumsbereich gleitender Durchschnitt mit Datumsbereich Im neu in SAS, und ich habe einige Probleme mit der Berechnung der gleitenden Durchschnitt auf der Grundlage von Daten und Gruppierungen innerhalb des Datensatzes. Grundsätzlich versuche ich, den gleitenden Durchschnitt für jede Beobachtung auf der Grundlage der letzten 90 Tage zu berechnen. Jede Beobachtung hat ein Datum. Ich muss sie auch gruppieren, damit der gleitende Durchschnitt nur auf der Gruppe basiert. Mit anderen Worten, wenn ich es mit Früchten gruppiert hätte, hätten Äpfel nur einen gleitenden Durchschnitt und Ornamente, etc. Ich weiß, dass ich den Datensatz zuerst sortieren muss, dann benutze eine Beilegung. Ich dachte eigentlich daran, ein Makro zu machen. Ich habe das angefangen, aber ich kann nicht daran teilnehmen. Kann mir jemand helfen, ich weiß, wie man die Sortierung macht, aber ich weiß auch, wie man den Durchschnitt bekommt, aber seine Gruppierung nicht richtig. Es gibt mir nur den Wert der Beobachtung. Ich habe dann versucht, es mit SQL zu tun, aber es funktioniert auch nicht. Dies ist, was ich kam mit. Proc sql create table data. movingavg als select a., Mean (basis) als Verschieben von xx wo verunreinigte Gruppe nach Produkt RE: gleitender Durchschnitt mit Datumsbereich dies funktioniert auch nicht. Data new set old von id beibehalten base if date90 dann avg mean (basis) run RE: gleitender Durchschnitt mit Datumsbereich Hier ist ein Beispiel für meinen Datensatz. Produkt Datum Basis Apfel may20 4 Orangen march2 3 Apfel April 3 Bananen Jan 33 33 Apfel Feb13 88 Apfel Dezember 12 Was ich brauche ist ein laufender Gleitender Durchschnitt der letzten 90 Tage nach Produkt auf der Grundlage der Basis Menge. Entschuldigung für die mehrfache Post, aber nachdem ich meinen früheren Post gelesen hatte, schien es verwirrend, was ich versuche zu tun. Danke RE: gleitender Durchschnitt mit Datumsbereich klaz2002 (Programmierer) 25 Sep 07 16:00 Ich muss anfangen, danke für diese Frage zu sagen. Weil es mir keine Ruhe gab, bis ich es lösen konnte. Lassen Sie mich sagen, was ich glaube, ist Ihre Anforderung nur so dass Sie und ich sind auf der gleichen Seite. Req 1) Sie wollen einen gleitenden Durchschnitt der letzten 90 Tage Daten nach Produktnamen haben. Bedeutet, dass für ein einziges Produkt (zB Apfel) Sie nur an den Basiswerten dieses Produktes interessiert sind, die 90 Tage zurückgehen. 2) Ich habe davon ausgegangen, dass Sie eine (1) Aufzeichnung pro Produkt pro Tag haben. Das heißt, Sie haben nie mehr als einen Basiswert pro Produkt pro Tag. (Der Code behandelt jetzt nicht mehr) Um das Historieproblem zu lösen (Werte, die 90 Tage zurückgehen) habe ich die Lagx () benutzt und die Tage 1-90 in Variablen gelegt und dann zu einem ARRAY hinzugefügt. Da die Variable in das Array aufgenommen werden muss, habe ich ein kleines Makro erstellt, das die Codezeilen erzeugt hat, die ich benötigte. MACRO DAS SCHAFFT 270 VARIABLEN FÜR 90 TAGE DER GESCHICHTE Makro SetVars do i1 bis 90 prodampi lagampi (product) dateampi lagampi (date) baseampi lagampi (basis) end mend ERSTES SORTIEREN DURCH PRODUKT UND DATUM Proc sortieren Daten Ihre Daten aus datiert nach Produktdatum Laufdaten Endgültiger Satz nach Produktdatum sortiert prod1-prod90 7 date1-date90 basis1-basis90 mysum 8 array aktuelles mysum array prod prod1-prod90 array dt date1-date90 array bs basis1-base90 SetVars SET DATUM 90 TAGE AGO TO CHECK DateMinus90 date-90 Bctr 1 mysum 0 LOOP DURCH ALLE MÖGLICHEN TAGE ICH ICH WERDE AUSNAHME FÜR ERSTEN FALL IN DER PRODUKTGRUPPE WIE ES IST KEIN LAG JETZT, wenn das erste. Produkt, das sich dann bewegt, für jeden Fall, )) Trim (upcase (Produkt)) und dt dateminus90 dann mache IF FOUND DANN HINZUFÜGEN, SOLLEN SICH VAR mysum sum (mysum, basis, bs) KEEP A COUNT von WIE VIELE DATAPOINTS GEFUNDEN bctr 1 End Ende IF NONE GEFUNDEN DANN DEN AKTUELLEN BASISWERT SOLLTE VERWENDET WERDEN, wenn mysum 0 dann myavg Basis sonst myavg mysumbctr laufen proc print dataFINAL var Produkt Datum dateminus90 Basis myavg Format Datum dateminus90 mmddyy10. Ich hoffe, dass dir das hilft. Du solltest das wirklich so aussehen, wie ich das wirklich ohne umfangreiche Kontrolle gemacht habe. Es kann viele Einschränkungen für diesen Code so hüten. In diesem Beitrag zeige ich einen Trick, um gleitende durchschnittliche Berechnung zu machen (kann auf andere Operationen erweitert werden, die Fensterfunktionen benötigen), das ist super schnell. Oft müssen SAS-Analysten gleitende durchschnittliche Berechnungen durchführen und es gibt mehrere Optionen in der Reihenfolge der Präferenz: 1. PROC EXPAND 2. DATA STEP 3. PROC SQL Aber viele Websites können nicht SASETS lizenziert werden, um PROC EXPAND zu verwenden und gleitenden Durchschnitt in DATA zu machen STEP erfordert einige Codierung und ist fehleranfällig. PROC SQL ist eine natürliche Wahl für Junior-Programmierer und in vielen Business Cases die einzige Lösung, aber SAS39s PROC SQL fehlt Fenster-Funktionen, die in vielen DBs zur Verfügung stehen, um die gleitende durchschnittliche Berechnung zu erleichtern. Eine Technik, die man gewöhnlich benutzt, ist CROSS JOIN, was sehr teuer ist und keine lebensfähige Lösung für sogar mittelgroße Datensätze ist. In diesem Beitrag zeige ich einen Trick, um eine gleitende Durchschnittsberechnung durchzuführen (kann auf andere Operationen erweitert werden, die Fensterfunktionen benötigen), die super schnell sind. Man betrachte die einfachste gleitende Durchschnittsrechnung, bei der die nachfolgenden K Beobachtungen in die Berechnung einbezogen werden, nämlich MA (K), hier setzen wir K5. Wir erzeugen zunächst 20 Sample-Daten, bei denen Variable ID für die Fensterung verwendet werden soll und die Variable X in der MA-Berechnung verwendet werden soll, und dann wenden wir den Standard-CROSS JOIN an, um zunächst die resultierenden Daten, Non-Grouped, zu untersuchen Zu verstehen, wie man die Datenstruktur nutzen kann. Aus dem daraus resultierenden Datensatz ist es schwer, einen Hinweis zu finden, jetzt lasst man in diesem Datensatz nach der Quinth-Spalte sortieren: Aus diesen sortierten Daten ist klar, dass wir eigentlich den ganzen Originaldatensatz nicht vergeben müssen, Können wir einen quotatenquot datensatz erzeugen, der den differenzwert enthält, und lassen Sie die ursprüngliche datenmenge CROSS JOIN mit diesem viel kleineren quotoperationquot datensatz und alle daten, die wir für MA berechnen müssen, sind dort. Jetzt lassen Sie es jetzt: CROSS JOIN Original-Daten mit quotoperation quot Daten, sortieren nach (a. idops), die eigentlich quotbid39 in sortierten Datensatz ist Hinweis, dass in oben Code, ist es notwendig, ax multiplizieren mit b. weight, so dass die Daten Kann verbleibend sein, sonst wird der gleiche X-Wert aus der ursprünglichen Tabelle ausgegeben und die MA-Berechnung wird fehlgeschlagen. Die explizite Gewichtsvariable fügt der gesamten MA-Berechnung tatsächlich mehr Flexibilität hinzu. Während Sie es auf 1 setzen für alle obs Ergebnis in einer einfachen MA-Berechnung, zuordnen unterschiedliche Gewichte wird dazu beitragen, komplexere MA-Computing zu lösen, wie geben weitere Beobachtungen weniger Gewicht für eine verfallene MA. Wenn ein anderer K-Parameter in MA (K) Berechnungen erforderlich ist, muss nur der Betriebsdatensatz aktualisiert werden, was trivialer Job ist. Nun wird die aktuelle Codevorlage für die MA (K) - Rechnung sein: Mit dieser neuen Methode ist es interessant, sie mit dem teuren Selbst-CROSS JOIN sowie mit PROC EXPAND zu vergleichen. Auf meiner Arbeitsstation (Intel i5 3.8Ghz, 32GB Speicher, 1TB 72K HDD), ist Self CROSS JOIN ununterbrochen lang in Laufzeit (wenn Daten groß sind), während die neue Methode nur 2X so viel Zeit wie PROC EXPAND verwendet, sind beide Zeitaufwendungen Trivialen Vergleich zu Selbst CROSS JOIN. Der nachstehend angegebene Zeitverbrauch liegt im Quantenbereich. Unten ist der Code-Leser laufen und vergleichen können. Geschrieben am 10. Mai 2015 von Liang Xie SAS Programmierung für Data Mining

No comments:

Post a Comment