Friday, 14 July 2017

คำนวณ เคลื่อนไหว ค่าเฉลี่ย ใน Sas


ในโพสต์นี้ฉันแสดงเคล็ดลับการคำนวณค่าเฉลี่ยเคลื่อนที่ (สามารถขยายไปยังการดำเนินการอื่น ๆ ที่ต้องใช้ฟังก์ชัน windowing) ซึ่งเร็วเกินไป บ่อยครั้งที่นักวิเคราะห์ของ SAS จำเป็นต้องคำนวณค่าเฉลี่ยเคลื่อนที่และมีหลายทางเลือกตามลำดับความชอบ: 1. PROC EXPAND 2. ขั้นตอนของข้อมูล PROC SQL แต่หลายไซต์อาจไม่ได้รับอนุญาต SASETS ใช้ PROC EXPAND และทำค่าเฉลี่ยเคลื่อนที่ใน DATA ขั้นตอนต้องมีการเขียนโค้ดและมีข้อผิดพลาดเกิดขึ้น PROC SQL เป็นทางเลือกที่เป็นธรรมชาติสำหรับโปรแกรมเมอร์รุ่นจูเนียร์และในหลายกรณีทางธุรกิจจะเป็นทางออกเดียว แต่ SAS PROC SQL ของ SAS ไม่มีฟังก์ชันการทำ Windowing ที่มีอยู่ในหลาย Ds เพื่อช่วยในการคำนวณค่าเฉลี่ยเคลื่อนที่ คนเทคนิคหนึ่งมักใช้คือ CROSS JOIN ซึ่งมีราคาแพงมากและไม่ใช่โซลูชันที่ทำงานได้สำหรับชุดข้อมูลที่มีขนาดปานกลาง ในโพสต์นี้ฉันแสดงเคล็ดลับการคำนวณค่าเฉลี่ยเคลื่อนที่ (สามารถขยายไปยังการดำเนินการอื่น ๆ ที่ต้องใช้ฟังก์ชัน windowing) ซึ่งเร็วเกินไป พิจารณาการคำนวณค่าเฉลี่ยเคลื่อนที่ที่ง่ายที่สุดที่มีการสังเกตการณ์ K ต่อท้ายรวมอยู่ในการคำนวณ ได้แก่ MA (K) ที่นี่เรากำหนด K5 เราสร้างข้อมูลตัวอย่าง 20 ครั้งแรกซึ่งใช้ตัวแปร ID สำหรับหน้าต่างและตัวแปร X จะใช้ในการคำนวณ MA และจากนั้นเราจะใช้ CROSS JOIN มาตรฐานเพื่อตรวจสอบข้อมูลที่ได้ก่อนไม่ได้จัดกลุ่มไว้ เพื่อทำความเข้าใจวิธีใช้โครงสร้างข้อมูล จากชุดข้อมูลที่เป็นผลลัพธ์มันเป็นการยากที่จะหาเงื่อนงำตอนนี้ให้เรียงตามคอลัมน์ quotbidquot ในชุดข้อมูลนี้: จากข้อมูลที่เรียงลำดับนี้เป็นที่แน่ชัดว่าเราไม่มีข้อมูล CROSS JOIN ทั้งชุดข้อมูลเดิม แต่ใช้ CROSS JOIN, เราสามารถสร้างชุดข้อมูล quotoperationquot ที่มีค่าความแตกต่างได้และให้ชุดข้อมูลต้นฉบับ CROSS JOIN กับชุดข้อมูล quotoperationquot ขนาดเล็กมากนี้และข้อมูลทั้งหมดที่เราต้องการใช้สำหรับการคำนวณ MA จะอยู่ที่นั่น ตอนนี้ให้ทำ: CROSS JOIN ข้อมูลเดิมที่มีข้อมูล quotoperationquot จัดเรียงตาม (a. idops) ซึ่งเป็นจริงในชุดข้อมูล sortbid39 ตามที่ระบุไว้ในโค้ดด้านบนมีความจำเป็นต้องมีขวานคูณด้วย b. weight เพื่อให้ข้อมูล สามารถเป็นแบบ inter-leaved ได้มิเช่นนั้นค่า X เดียวกันจากตารางต้นฉบับจะถูกส่งออกและการคำนวณ MA จะล้มเหลว ตัวแปรน้ำหนักอย่างชัดเจนจะเพิ่มความยืดหยุ่นในการคำนวณ MA ทั้งหมดได้มากขึ้น ในขณะที่การตั้งค่าให้เป็น 1 สำหรับผลการปฏิบัติงานทั้งหมดในผลการคำนวณ MA แบบธรรมดาให้กำหนดน้ำหนักที่แตกต่างกันจะช่วยในการแก้ไขปัญหาการประมวลผลแบบ MA ที่ซับซ้อนมากขึ้นเช่นให้ข้อสังเกตเพิ่มเติมเกี่ยวกับน้ำหนักที่น้อยลงสำหรับ MA ที่ผุกร่อน ถ้าจำเป็นต้องมี K parameter ที่แตกต่างกันในการคำนวณ MA (K) จะต้องมีการปรับปรุงชุดข้อมูลการทำงานซึ่งเป็นงานที่ไม่สำคัญ ตอนนี้แม่แบบรหัสจริงสำหรับการคำนวณ MA (K) จะเป็น: ด้วยวิธีการใหม่นี้เป็นที่น่าสนใจเพื่อเปรียบเทียบกับ CROSS JOIN รวมทั้ง PROC EXPAND บนเวิร์กสเตชันของฉัน (Intel i5 3.8Ghz หน่วยความจำ 32GB และฮาร์ดดิสก์แบบ 1TB 72K) CROSS JOIN มีความยาวมากในการทำงาน (ถ้าข้อมูลมีขนาดใหญ่) ในขณะที่วิธีการใหม่ใช้เวลาในการ PROC EXPAND เพียง 2 เท่าใช้เวลาทั้งสอง เล็กน้อยเมื่อเทียบกับตนเองเข้าร่วม การบริโภคเวลาที่แสดงด้านล่างอยู่ใน quotsecondquot ด้านล่างนี้ผู้อ่านโค้ดสามารถเรียกใช้และเปรียบเทียบตัวเองได้ โพสต์เมื่อ 10 พฤษภาคม 2015 โดย Liang Xie SAS Programming สำหรับ Mining ข้อมูลฉันรวมภาพหน้าจอเพื่อช่วยชี้แจงปัญหาของฉัน: Im พยายามคำนวณค่าเฉลี่ยเคลื่อนที่และค่าส่วนเบี่ยงเบนมาตรฐานเคลื่อนที่ สิ่งที่ฉันต้องการคำนวณค่าสัมประสิทธิ์ของการเปลี่ยนแปลง (stdevavg) สำหรับค่าจริง โดยปกติจะทำโดยการคำนวณ stdev และค่าเฉลี่ยสำหรับ 5 ปีที่ผ่านมา แต่บางครั้งจะมีการสังเกตในฐานข้อมูลของฉันซึ่งฉันไม่มีข้อมูลในช่วง 5 ปีที่ผ่านมา (อาจจะมีเพียง 3, 2 ฯลฯ ) Thats ทำไมฉันต้องการรหัสที่จะคำนวณเฉลี่ยและ stdev แม้ว่าจะไม่มีข้อมูลสำหรับทั้ง 5 ปี นอกจากนี้ตามที่คุณเห็นในข้อสังเกตบางครั้งฉันมีข้อมูลมากกว่า 5 ปีเมื่อเป็นกรณีนี้ฉันต้องมีค่าเฉลี่ยเคลื่อนที่ซึ่งจะช่วยให้ฉันสามารถคำนวณค่าเฉลี่ยและเฉลี่ยได้ในช่วง 5 ปีที่ผ่านมา ดังนั้นหาก บริษัท มีข้อมูลเป็นเวลา 7 ปีฉันต้องการรหัสบางประเภทซึ่งจะคำนวณค่าเฉลี่ยและค่าเฉลี่ยสำหรับปี 1997 (โดย 1991-1996), 1998 (โดย 1992-1997) และ 1999 (1993-1998) เป็น im ไม่คุ้นเคยกับคำสั่ง sas ควรดู (มากมากประมาณ) เช่น: หรือบางอย่างเช่นนี้ผมมีเงื่อนงำไม่ Im gonna พยายามและคิดออก แต่มูลค่าการโพสต์ได้ถ้าฉันเคยชินพบว่าตัวเองเฉลี่ย. มีช่วงเฉลี่ยของช่วงวันที่มีช่วงค่าเฉลี่ยของช่วงวันที่กับช่วงวันที่ Im ใหม่กับ SAS และฉันมีปัญหาบางอย่างกับการคำนวณค่าเฉลี่ยเคลื่อนที่ตามวันที่และกลุ่มภายในชุดข้อมูล โดยทั่วไปฉันพยายามคำนวณค่าเฉลี่ยเคลื่อนที่สำหรับการสังเกตแต่ละครั้งในช่วง 90 วันที่ผ่านมา การสังเกตแต่ละครั้งมีวันที่ ฉันยังต้องจัดกลุ่มพวกเขาเพื่อให้ค่าเฉลี่ยเคลื่อนที่จะขึ้นอยู่กับกลุ่มเท่านั้น กล่าวอีกนัยหนึ่งถ้าฉันจัดกลุ่มตามผลไม้แอปเปิ้ลจะมีค่าเฉลี่ยเคลื่อนที่และ orages ฯลฯ ฉันรู้ว่าฉันจะต้องจัดเรียงข้อมูลก่อนจากนั้นใช้คำสั่ง retain ฉันกำลังคิดที่จะทำมาโครด้วย ฉันเริ่มต้นนี้ แต่ดูเหมือนจะไม่มีส่วนใดในการทำงาน คนสามารถช่วยฉันได้หรือไม่? ฉันรู้วิธีการเรียงลำดับ แต่ฉันยังรู้วิธีหาค่าเฉลี่ย แต่ไม่ได้จัดกลุ่มอย่างถูกต้อง มันเป็นเพียงการให้ฉันค่าของการสังเกต ฉันก็พยายามที่จะทำกับ SQL แต่ไม่ได้ทำงานอย่างใดอย่างหนึ่ง นี่คือสิ่งที่ฉันเกิดขึ้น proc sql create table data. movingavg as a., mean (basis) as moving จาก xx ตามวันที่กลุ่มผลิตภัณฑ์ RE: ค่าเฉลี่ยเคลื่อนที่โดยใช้ช่วงวันที่ที่ไม่ทำงานอย่างใดอย่างหนึ่ง ข้อมูลใหม่ชุดเก่าโดย id retain basis ถ้า date90 แล้วเฉลี่ยเฉลี่ย (basis) run RE: ค่าเฉลี่ยเคลื่อนที่โดยใช้ช่วงวันที่นี่คือตัวอย่างของชุดข้อมูลของฉัน วันที่ของผลิตภัณฑ์แอปเปิลอาจ 20 4 march2 สีส้ม 3 apple april 3 กล้วย jan31 33 apple feb13 88 apple dec2 12 สิ่งที่ฉันต้องการคือค่าเฉลี่ยเคลื่อนที่ที่ใช้งานของ 90 วันที่ผ่านมาของผลิตภัณฑ์ขึ้นอยู่กับจำนวนพื้นฐาน ขอโทษสำหรับโพสต์หลาย แต่หลังจากที่ฉัน reread โพสต์ก่อนหน้าของฉันดูเหมือนสับสนเป็นสิ่งที่ฉันพยายามที่จะทำ ขอบคุณครับ RE: ค่าเฉลี่ยเคลื่อนที่ที่มีช่วงวันที่ klaz2002 (โปรแกรมเมอร์) 25 Sep 07 16:00 ฉันต้องเริ่มต้นด้วยการกล่าวขอบคุณสำหรับคำถามนี้ เพราะมันทำให้ฉันไม่มีเวลาพักผ่อนจนกว่าฉันจะสามารถแก้ปัญหาได้ ให้ฉันระบุสิ่งที่ฉันเชื่อว่าเป็นความต้องการของคุณเพียงเพื่อให้คุณและฉันอยู่ในหน้าเดียวกัน ต้องการ 1) คุณต้องการมีค่าเฉลี่ยเคลื่อนที่ของ 90 วันที่ผ่านมาของข้อมูลตามชื่อผลิตภัณฑ์ ความหมายว่าสำหรับผลิตภัณฑ์ชิ้นเดียว (เช่นแอปเปิ้ล) คุณสนใจเฉพาะค่าพื้นฐานของผลิตภัณฑ์นั้นที่จะย้อนกลับไป 90 วัน 2) ฉันคิดว่าคุณมีหนึ่ง (1) เร็กคอร์ดต่อผลิตภัณฑ์ต่อวัน นั่นหมายความว่าคุณไม่มีมูลค่าพื้นฐานมากกว่าหนึ่งครั้งต่อผลิตภัณฑ์ต่อวัน เมื่อต้องการแก้ปัญหาประวัติ (ค่าที่จะย้อนกลับไป 90 วัน) ฉันใช้ lagx () และใส่วันที่ 1-90 ในตัวแปรแล้วเพิ่มลงในอาร์เรย์ เนื่องจากตัวแปรต้องถูกรวมไว้ในอาร์เรย์ฉันจึงสร้างมาโครขนาดเล็กที่สร้างบรรทัดของรหัสที่ฉันต้องการ MACRO ที่สร้าง 270 ตัวแปรสำหรับ 90 วันของประวัติศาสตร์แมโคร SetVars ทำ i1 ถึง 90 ผลิตภัณฑ์โปรโมชั่น lagampi (ผลิตภัณฑ์) dateampi lagampi (วันที่) basisampi lagampi (พื้นฐาน) สิ้นสุดการซ่อม SORT ครั้งแรกโดยผลิตภัณฑ์และวันที่ proc จัดเรียงข้อมูล yourdata out datasorted ตามวันที่ข้อมูลการเรียกใช้ผลิตภัณฑ์ ชุดข้อมูลสุดท้ายที่จัดเก็บตามวันที่ของผลิตภัณฑ์ prod1-prod90 7 date1-date90 basis1-basis90 mysum 8 อาร์เรย์ปัจจุบันอาร์เรย์ mysum prod prod1-prod90 array dt date1-date90 อาร์เรย์ bs basis1-basis90 SetVars กำหนดวันที่ 90 วันเพื่อตรวจสอบ DateMinus90 date-90 bctr 1 mysum 0 วนรอบวันที่เป็นไปได้ทั้งหมดทำ i1 ถึง 90 ข้อยกเว้นสำหรับกรณีแรกในกลุ่มผลิตภัณฑ์ตามที่มีอยู่ไม่ช้าถ้า first. product แล้ว moveavg พื้นฐานตรวจสอบชื่อผลิตภัณฑ์เดียวกันและภายใน 90 วันอื่นถ้าตัด (upcase (แยง) )) ตัด (upcase (ผลิตภัณฑ์)) และ dt dateminus90 แล้วทำถ้าพบแล้วใส่ลงใน SUM VAR mysum sum (mysum, basis, bs) เก็บจำนวน CODE ของเอกสารจำนวนมากที่พบ bctr 1 end end ถ้าไม่พบค่าพื้นฐานปัจจุบัน ควรใช้ ถ้า mysum 0 แล้ว myavg พื้นฐานอื่น myavg mysumbctr รัน proc พิมพ์ dataFINAL var วันที่ผลิตภัณฑ์ dateminus90 พื้นฐาน myavg วันที่รูปแบบ dateminus90 mmddyy10 วิ่งฉันหวังว่านี้จะช่วยให้คุณ จริงๆคุณควรมองเรื่องนี้มากกว่าที่ฉันได้นี้จริงๆโดยไม่ต้องตรวจสอบอย่างกว้างขวาง อาจมีข้อ จำกัด หลายประการในโค้ดนี้ดังนั้นโปรดระวังโค้ดตัวอย่างบนแท็บรหัสเต็มแสดงวิธีคำนวณค่าเฉลี่ยเคลื่อนที่ของตัวแปรผ่านชุดข้อมูลทั้งหมดในช่วงการสังเกตการณ์ครั้งล่าสุดในชุดข้อมูลหรือในช่วง N ข้อสังเกตภายในกลุ่ม BY ไฟล์ตัวอย่างและตัวอย่างโค้ดเหล่านี้มีให้โดย SAS Institute Inc. และไม่มีการรับประกันใด ๆ ไม่ว่าจะโดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เพียงการรับประกันโดยนัยของความสามารถในเชิงพาณิชย์และความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ผู้รับยอมรับและยอมรับว่า SAS Institute จะไม่รับผิดชอบต่อความเสียหายใด ๆ ที่เกิดขึ้นจากการใช้วัสดุนี้ นอกจากนี้ SAS Institute จะให้การสนับสนุนสำหรับเอกสารที่มีอยู่ในเอกสารฉบับนี้ ไฟล์ตัวอย่างและตัวอย่างโค้ดเหล่านี้มีให้โดย SAS Institute Inc. และไม่มีการรับประกันใด ๆ ไม่ว่าจะโดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เพียงการรับประกันโดยนัยของความสามารถในเชิงพาณิชย์และความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ผู้รับยอมรับและยอมรับว่า SAS Institute จะไม่รับผิดชอบต่อความเสียหายใด ๆ ที่เกิดขึ้นจากการใช้วัสดุนี้ นอกจากนี้ SAS Institute จะให้การสนับสนุนสำหรับเอกสารที่มีอยู่ในเอกสารฉบับนี้ คำนวณค่าเฉลี่ยเคลื่อนที่ของตัวแปรผ่านชุดข้อมูลทั้งหมดในช่วงการสังเกตการณ์ครั้งล่าสุดในชุดข้อมูลหรือการสังเกตการณ์ N ครั้งล่าสุดภายในกลุ่ม BY

No comments:

Post a Comment