Monday, October 17, 2016

Moving Access Sas By Proc Expand

Im ein SAS Anfänger und Im neugierig, wenn die folgende Aufgabe viel einfacher getan werden kann, wie es gegenwärtig in meinem Kopf ist. Ich habe die folgenden (vereinfachten) Metadaten in einer Tabelle namens userdatemoney: Benutzer - Datum - 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 geordnet, Beispieldaten sieht so aus: Ich möchte nun einen fünftägigen gleitenden Durchschnitt für das Geld berechnen. Ich begann mit der beliebten apprach mit der Funktion lag () wie folgt: Das Problem mit dieser Methode tritt auf, wenn der Datenschritt in einen neuen Benutzer läuft. Aron würde einige verzögerte Werte von Anna bekommen, was natürlich nicht passieren sollte. Nun meine Frage: Ich bin ziemlich sicher, dass Sie den Benutzer wechseln können, indem Sie einige zusätzliche Felder wie laggeduser und durch Rücksetzen der N, Summe und Mean-Variablen, wenn Sie einen solchen Schalter bemerken, aber: Kann dies in einer einfacheren Weise getan werden Vielleicht mit dem BY-Klausel in irgendeiner Weise Vielen Dank für Ihre Ideen und Hilfe Ich denke, der einfachste Weg ist, um PROC EXPAND verwenden: Und wie in Johns Kommentar erwähnt, ist es wichtig, über fehlende Werte (und auch über Anfang und Ende Beobachtungen) zu erinnern. Ive hinzugefügt SETMISS-Option, um den Code, da Sie klar, dass Sie zerofy fehlende Werte wollen, ignorieren sie (Standard-MOVAVE-Verhalten). Und wenn Sie die ersten 4 Beobachtungen für jeden Benutzer ausschließen möchten (da sie nicht genug Vorgeschichte haben, um den gleitenden Durchschnitt 5 zu berechnen), können Sie die Option TRIMLEFT 4 innerhalb von TRANSFORMOUT () verwenden. Beantwortet Dec 3 13 am 15: 29Beginning in Release 6.08 des SAS-System kann PROC EXPAND in SAS / ETS-Software verwendet werden, um eine Vielzahl von Daten-Transformationen zu machen. Diese Transformationen umfassen: Leitungen, Verzögerungen, gewichtete und ungewichtete gleitende Mittelwerte, bewegte Summen und kumulative Summen, um nur einige zu nennen. Viele neue Transformationen wurden in Release 6.12 hinzugefügt, einschließlich getrennter Spezifikationen für zentrierte und rückwärts gerichtete Durchschnitte. Diese neuen Transformationen machten es erforderlich, die Syntax für einige der vor Release 6.12 unterstützten Transformationen zu ändern. Nachfolgend sind Beispiele für die Angabe der Syntax für zentrierte und rückwärts gerichtete Durchschnitte nach Release 6.11 und früher und Release 6.12 und später aufgeführt. PROC EXPAND kann entweder einen zentrierten gleitenden Durchschnitt oder einen rückwärts gleitenden Durchschnitt berechnen. Eine 5-Periode gleitenden Durchschnitt zentriert wird durch Mitteln über insgesamt 5 aufeinander folgenden Werte der Reihe (die aktuelle Periodenwert zusätzlich zu den zwei unmittelbar vorangehenden Werte und zwei Werte unmittelbar nach dem aktuellen Wert) berechnet. Ein 5-Perioden-Rückwärts-Mittelwert wird berechnet, indem der aktuelle Periodenwert mit den Werten aus den 4 unmittelbar vorhergehenden Perioden gemittelt wird. Die folgende Syntax veranschaulicht, wie die TRANSFORM (MOVAVE n) Spezifikation verwendet wird, um einen 5-Perioden-zentrierten gleitenden Durchschnitt mit Release 6.11 oder früher zu berechnen: Um einen n-Perioden-Rückwärts-Durchschnitt mit Release 6.11 oder früher zu berechnen, verwenden Sie die TRANSFORM (MOVAVE N LAG k) Spezifikation, wobei k (n-1) / 2 wenn n ungerade ist oder k (n-2) / 2, wenn n gerade ist. In der folgenden Syntax wird beispielsweise veranschaulicht, wie ein 5-Perioden-Rückwärtsbewegungsdurchschnitt mit Release 6.11 oder früher berechnet wird. Die folgende Syntax veranschaulicht, wie die TRANSFORM (CMOVAVE n) - Spezifikation verwendet wird, um einen 5-Perioden-zentrierten gleitenden Durchschnitt mit Release 6.12 oder Später: Die folgende ähnliche Syntax veranschaulicht, wie die TRANSFORM (MOVAVE n) Spezifikation verwendet wird, um einen 5-Perioden-Rückwärts-Durchschnitt mit Release 6.12 oder höher zu berechnen: Weitere Informationen finden Sie unter Transformationsoperationen im EXPAND-Kapitel des SAS / ETS-Benutzerhandbuchs . Wenn Sie keinen Zugriff auf SAS / ETS haben, können Sie einen gleitenden Durchschnitt im DATA-Schritt berechnen, wie in diesem Beispielprogramm veranschaulicht. Betriebssystem und Freigabeinformationen Die in den Optionen TRANSFORMIN und TRANSFORMOUT verwendbaren Operationen sind in Tabelle 14.1 dargestellt. Operationen werden auf jeden Wert der Serie angewendet. Jeder Wert der Serie wird durch das Ergebnis der Operation ersetzt. In Tabelle 14.1. oder x den Wert der Reihe an einer bestimmten Zeitspanne t vor der Transformation angewendet wird, stellt den Wert des Ergebnisreihen und N die Gesamtzahl der Beobachtungen. Die Notation n gibt an, dass das Argument n optional ist der Standardwert ist 1. Die Notation Fenster als Argument für die beweglichen Statistiken Betreibern verwendet wird, und es zeigt an, dass Sie entweder eine ganze Zahl von Perioden n oder eine Liste von n Gewichte angeben können in Klammern. Die Notation Folge wird als Argument für die Sequenz Operatoren verwendet, und es zeigt an, dass Sie eine Folge von Zahlen angeben müssen. Die Notation s gibt die Länge der Saisonalität an und ist ein erforderliches Argument. Tabelle 14.1 Transformationsoperationen Gleitzeitfenster Operatoren Einige Betreiber berechnen Statistiken für eine Reihe von Werten innerhalb eines gleitenden Zeitfenster diese Zeitfenster Operatoren genannt bewegen. Es gibt zentrierte und rückwärtige Versionen dieser Operatoren. Die zentrierten gleitenden Zeitfenster Operatoren sind CMOVAVE, CMOVCSS, CMOVGMEAN, CMOVMAX, CMOVMED, CMOVMIN, CMOVPROD, CMOVRANGE, CMOVRANK, CMOVSTD, CMOVSUM, CMOVTVALUE, CMOVUSS und CMOVVAR. Diese Operatoren berechnen die Statistik der Werte für Beobachtungen. Die Rückwärtsbewegung Zeitfenster Operatoren sind MOVAVE, MOVCSS, MOVGMEAN, MOVMAX, MOVMED, MOVMIN, MOVPROD, MOVRANGE, MOVRANK, MOVSTD, MOVSUM, MOVTVALUE, MOVUSS und MOVVAR. Diese Operatoren berechnen die Statistik der Werte. Alle beweglichen Zeitfenster Operatoren akzeptieren ein Argument unter Angabe der Anzahl der Perioden im Zeitfenster zu schließen. Zum Beispiel berechnet die folgende Aussage einen Fünf-Perioden-Rückwärtsbewegungsdurchschnitt von X. In diesem Beispiel ist die resultierende Transformation Die folgende Anweisung eine fünfPeriode berechnet durchschnittlich X zentriert bewegt. In diesem Beispiel ist die resultierende Transformation Wenn das Fenster mit einem Zeitfenster Operator zentriert bewegt, ist nicht eine ungerade Zahl ist, noch eine verzögerte Wert als Blei-Wert wird in dem Zeitfenster enthalten. Zum Beispiel ist das Ergebnis der CMOVAVE 4 Operator Sie können durch die Kombination eines Rückwärtsbewegungszeitfenster Operator mit dem REVERSE Bediener eine Vorwärtsbewegung Zeitfenster Betrieb berechnen. Zum Beispiel berechnet die folgende Anweisung einen Fünf-Zeit-Vorwärtsbewegungsdurchschnitt von X. In diesem Beispiel ist die sich ergebende Transformation Einige der Gleitzeitfensteroperatoren Sie ermöglichen eine Liste von Gewichtungswerten zu spezifizieren gewichtete Statistiken zu berechnen. Dies sind CMOVAVE, CMOVCSS, CMOVGMEAN, CMOVPROD, CMOVSTD, CMOVTVALUE, CMOVUSS, CMOVVAR, MOVAVE, MOVCSS, MOVGMEAN, MOVPROD, MOVSTD, MOVTVALUE, MOVUSS und MOVVAR. Um einen gewichteten Bewegungszeitfensteroperator anzugeben, geben Sie nach dem Operatornamen die Gewichtswerte in Klammern ein. Die Fensterbreite ist gleich der Anzahl der Gewichte, die Sie nicht angeben. Zum Beispiel berechnet die folgende Anweisung einen gewichteten fünfperiodischen zentrierten gleitenden Durchschnitt von X. In diesem Beispiel ist die resultierende Transformation Die Gewichtswerte müssen größer als Null sein. Wenn die Gewichte auf 1 summieren nicht, werden die angegebenen Gewichte sind durch ihre Summe dividiert, um die Gewichte zu erzeugen, verwendet, um die Statistik zu berechnen. Ein vollständiges Zeitfenster steht am Anfang der Serie nicht zur Verfügung. Für die zentrierten Operatoren ist auch ein komplettes Fenster am Ende der Serie nicht verfügbar. Die Berechnung der Laufzeitfensteroperatoren wird wie folgt für diese Randbedingungen angepasst. Bei rückwärts bewegenden Fensteroperatoren wird die Breite des Zeitfensters am Anfang der Reihe verkürzt. Beispielsweise sind die Ergebnisse des Operators MOVSUM 3 fehlende Werte Sie können die Länge der Ergebnisserien abschneiden, indem Sie die Operatoren TRIM, TRIMLEFT und TRIMRIGHT verwenden, um Werte am Anfang oder Ende der Serie fehlen zu lassen. Sie können diese Funktionen verwenden, um die Ergebnisse von Laufzeitfensteroperatoren zu trimmen, sodass die Ergebnisserie nur Werte enthält, die aus einem Zeitfenster mit voller Breite berechnet werden. Zum Beispiel berechnen die folgenden Aussagen einen zentrierten Fünfperiodenbewegungsdurchschnitt von X. Und sie setzen auf fehlende Werte an den Enden der Serie, die Mittelwerte von weniger als fünf Werten sind. Normalerweise ignorieren die Bewegungszeitfenster und die kumulativen Statistikoperatoren fehlende Werte und berechnen ihre Ergebnisse für die nichtmissing Werte. Wenn dem Operator NOMISS vorangestellt wird, erzeugen diese Funktionen ein fehlendes Ergebnis, wenn irgendein Wert innerhalb des Zeitfensters fehlt. Der NOMISS-Operator führt keine Berechnungen durch, sondern dient dazu, die Operation des bewegten Zeitfenster-Operators, der ihm folgt, zu modifizieren. Der NOMISS-Operator hat keine Wirkung, es sei denn, es wird von einem beweglichen Zeitfensteroperator gefolgt. Beispielsweise berechnet die folgende Anweisung einen fünfperiodischen gleitenden Durchschnitt der Variablen X, erzeugt aber einen fehlenden Wert, wenn einer der fünf Werte fehlt. Die folgende Anweisung berechnet die kumulative Summe der Variablen X, erzeugt aber für alle Perioden nach dem ersten fehlenden X-Wert einen fehlenden Wert. Ähnlich wie der NOMISS-Operator führt der MISSONLY-Operator keine Berechnungen aus (es sei denn, es folgt die MEAN-Option), jedoch dient er dazu, die Operation des bewegten Zeitfenster-Operators, der ihm folgt, zu modifizieren. Wenn der Operator MISSONLY vorangestellt wird, ersetzen diese Laufzeitfensteroperatoren alle fehlenden Werte durch die sich bewegende Statistik und lassen die nicht-veränderten Werte unverändert. Zum Beispiel ersetzt die folgende Anweisung alle fehlenden Werte der Variablen X durch einen exponentiell gewichteten gleitenden Durchschnitt der vergangenen Werte von X und lässt nicht veränderte Werte unverändert. Die fehlenden Werte werden mit dem angegebenen exponentiell gewichteten gleitenden Durchschnitt interpoliert. (Dies wird auch als einfache exponentielle Glättung bezeichnet.) Die folgende Anweisung ersetzt alle fehlenden Werte der Variablen X mit dem Gesamtmittel von X. Sie können den SETMISS-Operator verwenden, um fehlende Werte durch eine angegebene Zahl zu ersetzen. Beispielsweise ersetzt die folgende Anweisung alle fehlenden Werte der Variablen X durch die Zahl 8.77. Klassische Zerlegungsoperatoren Ist eine saisonale Zeitreihe mit Beobachtungen pro Saison, brechen klassische Zersetzungsmethoden die Zeitreihen in vier Komponenten: Trend, Zyklus, saisonale und unregelmäßige Komponenten. Die Trend - und Taktkomponenten werden oft zu einem Trendkreislauf zusammengefasst. Es gibt zwei grundlegende Formen der klassischen Zersetzung: multiplikativ und additiv, die unten gezeigt werden. Anwendungsbeispiele Die multiplikativen saisonalen Indizes sind 0,9, 1,2. 0,8 und 1,1 für die vier Quartale. Lassen Sie SEASADJ eine vierteljährliche Zeitreihenvariable sein, die saisonbereinigt multiplikativ angepasst wurde. Zur Wiederherstellung der Saisonalität zu SEASADJ verwenden Sie die folgende Transformation: Die additive saisonalen Indizes sind 4,4, -1,1, -2,1 und -1,2 für die vier Quartale. Lassen Sie SEASADJ eine vierteljährliche Zeitreihenvariable sein, die saisonabhängig additiv angepasst wurde. Um die Saisonalität nach SEASADJ wiederherzustellen, verwenden Sie folgende Transformation: Set Operators Für die set Operatoren steht der erste Parameter,, für den zu ersetzenden Wert und der zweite Parameter für den Ersatzwert. Der Ersatz kann am Anfang, an der Mitte oder am Ende der Serie lokalisiert werden. Beispiele für die Verwendung Nehmen wir an, dass ein Geschäft vor kurzem eröffnet wurde und dass die Verkaufsgeschichte in einer Datenbank gespeichert ist, die fehlende Werte nicht erkennt. Obwohl die Nachfrage vor dem Öffnen der Filialen existiert, weist diese Datenbank den Wert Null auf. Das Modellieren der Verkaufsgeschichte kann problematisch sein, da die Verkaufsgeschichte meist Null ist. Um diesen Mangel zu kompensieren, sollten die führenden Nullwerte auf Fehlen gesetzt werden, wobei die verbleibenden Nullwerte unverändert bleiben (keine Nachfrage darstellen). Ebenso wird angenommen, dass ein Geschäft vor kurzem geschlossen wurde. Die Nachfrage kann noch vorhanden sein, und daher ein aufgezeichneter Wert von Null nicht genau widerspiegeln tatsächlichen Nachfrage. Scale OperatorIn diesem Beitrag, zeige ich einen Trick, um gleitende durchschnittliche Berechnung zu tun (kann auf andere Operationen, die Fensterfunktion erweitert werden), die super schnell ist. Häufig müssen SAS-Analytiker eine gleitende Durchschnittsberechnung durchführen und es gibt mehrere Optionen in der Reihenfolge der Präferenz: 1. PROC EXPAND 2. DATENSCHRITT 3. PROC SQL Aber viele Standorte dürfen nicht SAS / ETS verwenden, um PROC EXPAND zu verwenden und gleitenden Durchschnitt zu machen In DATA STEP erfordert eine Codierung und ist fehleranfällig. PROC SQL ist eine natürliche Wahl für Junior-Programmierer und in vielen Business-Fällen die einzige Lösung, aber SAS39s PROC SQL fehlt Fenster-Funktionen, die in vielen DBs verfügbar sind, um gleitende durchschnittliche Berechnung zu erleichtern. Eine Technik, die Menschen in der Regel verwenden, ist CROSS JOIN, das ist sehr teuer und keine praktikable Lösung für auch mittelgroße Datensätze. In diesem Beitrag zeige ich einen Trick, um die gleitende Durchschnittsberechnung durchzuführen (kann auf andere Operationen erweitert werden, die Fensterfunktionen erfordern), die super schnell ist. Man betrachte die einfachste gleitende Durchschnittsberechnung, wo die nachfolgenden K-Beobachtungen in die Berechnung einbezogen werden, nämlich MA (K), hier setzen wir K5. Zuerst erzeugen wir 20 Obsample-Daten, wobei die Variablen-ID für das Fenstering verwendet werden soll und die Variable X für die MA-Berechnung verwendet wird. Anschließend wenden wir den Standard CROSS JOIN an, um zuerst die resultierenden Daten, nicht gruppiert, zu untersuchen Um zu verstehen, wie die Datenstruktur genutzt werden kann. Aus dem resultierenden Datensatz ist es schwer, einen Anhaltspunkt zu finden, jetzt let39s sortieren durch quotbidquot Spalte in diesem Datensatz: Von diesen sortierten Daten ist es klar, dass wir tatsächlich don39t haben, CROSS JOIN den gesamten ursprünglichen Datensatz, Können wir einen Quotequotdatensatz erzeugen, der den Differenzwert enthält und den ursprünglichen Datensatz CROSS JOIN mit diesem viel kleineren Quottendatensatz setzen und alle Daten, die wir für die MA-Berechnung verwenden müssen, dort sein werden. Nun let39s tun es: CROSS JOIN ursprünglichen Daten mit quot Operationquot-Daten, sortieren nach (a. idops), die eigentlich quotbid39 in sortierten Datensatz Beachten Sie, dass in obigen Code ist es notwendig, ax multiplizieren mit b. weight, so dass die Daten Kann zwischengeschleift werden, da sonst der gleiche X-Wert aus der ursprünglichen Tabelle ausgegeben wird und die MA-Berechnung fehlgeschlagen ist. Die explizite Gewichtsvariable fügt der gesamten MA-Berechnung tatsächlich mehr Flexibilität hinzu. Beim Festlegen von 1 für alle obs-Ergebnisse in einer einfachen MA-Berechnung, zuweisen, verschiedene Gewichte wird dazu beitragen, komplexere MA-Computing, wie z. B. geben weitere Beobachtungen weniger Gewicht für ein zerlegtes MA. Wenn unterschiedliche K-Parameter in MA (K) Berechnungen erforderlich sind, muss nur der Betriebsdatensatz aktualisiert werden, was trivialer Job ist. Nun ist die eigentliche Code-Vorlage für MA (K) Berechnung: Mit dieser neuen Methode ist es interessant, sie mit dem teuren Self CROSS JOIN sowie PROC EXPAND zu vergleichen. Auf meiner Workstation (Intel i5 3.8Ghz, 32GB Speicher, 1TB 72K HDD) ist selbst CROSS JOIN prohibitiv lang in der Laufzeit (wenn die Daten groß sind), während die neue Methode nur 2X so viel Zeit wie PROC EXPAND verwendet, sind beide Zeitaufwendungen Trivial Vergleich mit Self CROSS JOIN. Der unten gezeigte Zeitverbrauch ist in Sekunden angegeben. Unten können die Code-Leser laufen und vergleichen Sie sich. Verfasst am 10. Mai 2015 von Liang Xie SAS Programmierung für Data Mining Ich bin etwas neu bei Verwendung und Schreiben von SAS-Code, und ich versuche, eine gleitende Durchschnittsberechnung zu erstellen. Ive gefundene Beispiele und basiert auf, was ich gelesen und versucht habe, kann ich nicht scheinen, meine Daten zu erhalten, um die gewünschten Resultate zu produzieren. Hier ist ein Beispiel für meine Daten. Jahr Monat Verkauf Laufen Summe 2011 Januar 100 100 2011 Februar 250 350 2011 März 200 550 2012 Jan 175 175 2012 Februar 300 475 2012 März 225 700 2013 Januar 150 150 2013 Februar 275 425 2013 März 250 675 Ich habe Jahr, Monat, Verkauf und Eine laufende Summe der monatlichen Verkäufe für jedes Jahr. Ich möchte in der Lage sein, die laufende Summe der Verkäufe durch den gegenwärtigen Monat zu vergleichen und sie mit dem Durchschnitt der letzten Jahre bis desselben Monats zu vergleichen. Ive versucht mit PROC EXPAND, und das scheint zu funktionieren, aber nur, wenn mein Datensatz hat Jahr und Verkauf. Danke für Ihre Hilfe. Es wird sehr geschätzt. 2011 Jan. 100 100. 2011 Feb. 250 350. 2011 März 200 550. (175100) / 2) 2013 Feb. 275 425 413 ((475350) / 2) 2013 März 250 675 625 ((700550) / 2 ) Die durchschnittliche Spalte berechnet die laufende Summe durch jeden Monat und dividiert diese Zahl durch die Anzahl der vorherigen Perioden. Siehe die Berechnungen in Klammern. Im eigentlich versucht, einen Vierjahresdurchschnitt zu berechnen, aber ich weiß, daß ich nicht genügend Daten in meine Probe einschloß, um die vollen vier Jahre zu berechnen. Ich bin in der Lage, PROC EXPAND zu verwenden, um einen gleitenden Durchschnitt zu berechnen, aber ich erhalte nur den Code, um zu arbeiten, als ich die Jahres - und Verkäufe (an kumulativen Gesamt) Spalten in meinem Datensatz hatte. Verkäufe waren für das volle Jahr, nicht gebrochen durch Monat. Für 2011, waren Verkäufe 550. Für 2012 waren Verkäufe 700. So, wie ich den gleitenden Durchschnitt mit mehr als zwei Spalten in meiner Tabelle berechne, hoffe ich, dass diese Erklärung hilft, Ihre Fragen zu beantworten. Danke noch einmal. Eine Lösung (unter anderem) mit Normal DATA STEP. Ich habe Jahre 2014 und 2015 zu sehen, ob ich die Frage verstanden. Daten Thave-Eingabe Jahr Monat Verkaufs-Karten 2011 Januar 100 2011 Feb. 250 2011 Mrz. 2012 Januar 175 2012 Feb. 2012 2012 März 225 2013 Januar 150 2013 Februar 275 2013 März 250 2014 Januar 125 2014 Februar 200 2014 Mrz 175 2015 Januar 105 2015 Februar 210 2015 Mar 275 Daten twant (keepyear Monats-Umsatz Rsum Ravg) gesetzt thave Länge Rsum Ravg 8. behalten Rsum Ravg SSUM Si Crow Array zMth (3) Jahr, wenn first. year tun dann Crow0 Si1 Rsum0 Crow1 RsumSales end if (Si gt 1), dann Ravg Runde (zMth (Crow) / (Si-1), 0,01) sonst Ravg. zMth (Crow) Rsum proc Druck datatwant run 1 Jan. 2011 100 100. 2 Feb 2011 250 350 3 2011 Mar 200 550. 4 Jan. 2012 175 175 100.00 5 Feb 2012 300 475 350,00 6 2012 Mar 225 700 550,00 7 2013 Jan 150 150 137.50 8 2013 Februar 275 425 412.50 9 2013 Mar 250 675 625,00 10 2014 Jan 125 125 141,67 (100.175.150) / 3 11 2014 Februar 200 325 416,67 (350.475.425) / 3 12 2014 Mar 175 500 641,67 (550.700.675) / 3 13 2015 Jan 105 105 137.50 (100.175.150.125) / 4 14 2015 Februar 315 393,75 210 (350.475.425.325) / 4 15 2015 Mar 275 590 606,25 (550.700.675.500) / 4


No comments:

Post a Comment