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. 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 10. Mai 2015 von Liang Xie SAS Programmierung für Data MiningI enthalten einen Screenshot zu helfen, klären mein Problem: Ich versuche, eine Art von gleitenden Durchschnitt zu berechnen und bewegte Standardabweichung. 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). Da 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 zu veröffentlichen, wenn ich es nicht selbst finden werde 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 gibt viele Einschränkungen für diesen Code, also hüte dich. Der Beispielcode auf der Registerkarte Vollständige Code veranschaulicht, wie man den gleitenden Durchschnitt einer Variablen durch einen ganzen Datensatz, über die letzten N Beobachtungen in einem Datensatz oder über dem letzten N berechnet Beobachtungen innerhalb einer BY-Gruppe. Diese Beispieldateien und Codebeispiele werden von SAS Institute Inc. zur Verfügung gestellt, wie es ohne jegliche Gewährleistung, weder ausdrücklich noch stillschweigend, einschließlich, aber nicht beschränkt auf die implizierten Garantien der Marktgängigkeit und Eignung für einen bestimmten Zweck ist. Die Empfänger bestätigen und stimmen zu, dass das SAS-Institut nicht für irgendwelche Schäden haftbar ist, die sich aus der Verwendung dieses Materials ergeben. Darüber hinaus wird das SAS-Institut die hierin enthaltenen Materialien nicht unterstützen. Diese Beispieldateien und Codebeispiele werden von SAS Institute Inc. zur Verfügung gestellt, wie es ohne jegliche Gewährleistung, weder ausdrücklich noch stillschweigend, einschließlich, aber nicht beschränkt auf die implizierten Garantien der Marktgängigkeit und Eignung für einen bestimmten Zweck ist. Die Empfänger bestätigen und stimmen zu, dass das SAS-Institut nicht für irgendwelche Schäden haftbar ist, die sich aus der Verwendung dieses Materials ergeben. Darüber hinaus wird das SAS-Institut die hierin enthaltenen Materialien nicht unterstützen. Berechnen Sie den gleitenden Durchschnitt einer Variablen durch einen ganzen Datensatz, über die letzten N Beobachtungen in einem Datensatz oder über die letzten N Beobachtungen innerhalb einer BY-Gruppe.
Comments
Post a Comment