從工程師到數據科學家:SAS 編程基礎(2)——語言概述

技術大咖—— SAS 北京研發中心商業智能和可視化分析產品部技術總監巫銀良先生,今天繼續跟大家分享如何從工程師成為一名數據科學家!小夥伴們,繼續開啟 SAS 編程之旅吧!

TIOBE 指數是用來反映某種編程語言的流程程度的指標,根據2016年12月份最新數據顯示,SAS 編程語言占比1.380%,排名22位。 編程語言本質上是人類用來與機器溝通,並在人類之間分享思維的工具,與它所需要解決的問題領域緊密相關。世界上也沒有哪一種語言能夠解決所有問題。所以盡管計算機領域出現了超過上千種編程語言,但終究只有少數強大語言能生存下來,SAS 便是其中之一。

SAS 語言入門容易精通難

SAS 語言要入門很快,但要精通則需要較長時間,尤其是要掌握 SAS 特有的,在普通編程語言裡面沒有的一些功能。SAS 作為領域特定的第四代編程語言(4GL),與廣泛流行的第三代編程語言 C,C++,Java,C#,Javascript 不同,它專門為數據分析和報告提供非常複雜的數據操作、圖形圖表製作以及文檔編寫功能。

SAS 語言是面向過程的計算機語言

SAS 語言總體上是面向過程的計算機語言,有著傳統編程語言的基本結構。但它不支持面向對象,盡管從 SAS 9 開始提供兩個預定義的對象:Hash 和 HIter(Hash Iterator)並提供類似面向對象的語法,但用戶至今不能用 SAS 語言創建自定義類。SAS 提供強大的互操作能力,可以調用 Java 對象和 Win32 API 函數來做到各種複雜功能。SAS 語言也並不像 Python/Perl 等嚴格意義上的腳本式編程語言,具有真正的腳本/流控制構造。

SAS 語言擁有兩種基本的數據類型

SAS 語言中只有兩種基本的數據類型:字符型和數值型。從外部數據到 SAS 內部數據存儲表達之間,可以使用 INFORMAT 和 FORMAT 進行讀/寫轉換。然而,在一些 PROC 步中,SAS 也提供特定的數據類型來覆蓋這兩種基本類型,比如 PROC FCMP(從 SAS 9.1開始)中類似C語言的結構體,以及 PROC IML 中的矩陣。與傳統編程語言支持各種各樣的基本數據類型(比如布爾/整數/浮點/字符…)不同,統計學上的數據類型根據計量尺度只有定類(如性別)、定序(如年級)、定距(如溫度)以及定比(重量)等四種需要考慮。

SAS 語言擁有強大的預處理器功能

SAS 語言提供非常強大預處理器,做到編譯前的宏替換功能。它允許 SAS 程序在編譯和運行期間,動態改變程序自身,並可做到遞歸調用宏本身。使用 SAS 語言的統計分析人員經常讚嘆 SAS 語言的強大功能,而不熟悉 SAS 語言的編程人員有時也會為它與第三代編程語言的不同而困惑不解,迷失在宏與非宏的代碼陷阱裡。

SAS 語言是一門複雜的計算機語言

SAS 語言是一門比較複雜的計算機語言,甚至它到底是編譯執行還是解釋執行有時候連有經驗的 SAS 開發人員也會感到困惑。由於 SAS 語言包含靈活的語言元素,SAS Macro 宏是由解釋器展開,但是 DATA Step 和 Proc Step 則以步為單位進行一次編譯,然後統一執行而非逐語句進行解釋執行。SAS 是兼具編譯和解釋的混合型計算機語言,因此維基百科的分類中也很難將 SAS 語言歸入編譯還是解釋類別(Compiled_language v.s Compiled_language)。

SAS 語言提供完備細致的數據訪問

SAS 語言最強大的能力是為分析編程人員提供了完備細致的數據訪問,而不用太考慮數據的存儲格式和存儲位置,比如最常用的 DATA Step 和 PROC SQL 就提供了各種各樣的數據操作能力,而豐富的 PROC Step 支持則讓分析人員專注於分析本身和參數設定。一旦 SAS 編程入門,則只有不懂的統計類型,沒有不會使用的 PROC Step。

從傳統語言編程基礎轉換到 SAS 語言編程,首先要記得如下一些 SAS 語言的核心規則:

  • SAS 程序由一系列 SAS 語句組成,所有的語句都以分號 ; 結束。

  • SAS 代碼中也可以包含數據行,但數據行不作為語句,不以分號結尾。

  • 一個 SAS 語句可以跨行,多個 SAS 語句也可以在一行上;SAS 語句可以從一行中的任意位置開始,代碼縮進並非必需。

  • SAS 語句中的關鍵字是以空格分隔的,通常由「關鍵字」或「關鍵字=參數」系列組成;某些語句可以在必選項和可選項之間用 / 分隔。

  • SAS 語言不區分大小寫,你可以使用大寫/小寫以及它們的混合。但字符變量的值是區分大小寫的。比如 「Hello World」 和 「HELLO WORLD」 為不同的兩個值。

  • SAS 代碼中標識符長度較短:邏輯庫引用/文件引用(libref/fileref)名稱最長不超過8字節、數據表/數據列(即變量)名稱最多不超過32字節。

  • SAS 代碼提供強大的 SAS 宏系統支持,包含 % 和 & 符的文本會在編譯前觸發宏展開。SAS 提供語言級的宏支持,包括變量、函數以及分支/循環等完備的流程控制。

SAS 程序主要由一系列的 Steps 構成,而 Step 由一些列的 Statements  構成。每一個 Step 都有開始和結束的邊界,SAS 根據 Step 邊界獨立編譯和執行。

一個所謂的步(Step)由 DATA 或 PROC 語句開始,默認結束於下一個 DATA/PROC 步的開始處。但我們通常用 RUN 語句來執行前面輸入的 SAS 語句,並顯式標識 DATA/PROC 步的邊界;另外有一些資源依賴的 PROC 則需要以 QUIT 語句來結束當前 PROC,比如 PROC SQL、PROC CAS 等可以包含多個 RUN 語句,但只有當 QUIT 語句執行才釋放資源真正返回 SAS 。

1全局語句

在 DATA/PROC 步之外,用於指定全局的選項或者其他全局性的功能。比如 TITLE 語句用來指定輸出報告的標題,最多達11級。

TITLE “The title of my first report”; /*設置輸出報告的標題*/

TITLE2 “Author: Yinliang Wu”;  

各種 SAS 選項(SAS Options)語句也屬於全局語句,功能上類似於操作系統的環境變量,用來指定當前 SAS 會話有關的系統設置。

options ls=80 ps=24 nocenter; /*設置輸出為 24 X 80 左對齊*/

2DATA 步(Data Step)

SAS 程序只包含兩種類型的步 DATA 步和 PROC 步,DATA 步負責為後續數據步/過程步準備數據,基本語法為:

DATA MYDATA; 

<STATEMENT and/or DATA>;

RUN;

比如:如下代碼創建一行5列的數據,其中 Name 和 Sex 是字符變量,而其他3個為數值變量。


DATA MyData; 

  input Name $ Sex $ Age Height Weight;

  datalines;

YINLIANG M 30 175 83.5 

RUN;

3PROC 步(PROC Step)

過程步是執行特定任務的 SAS 語句的集合,以 PROC 語句開始,直到下一個 RUN 語句結束。


每個過程步有自己特定的 SAS 語句和命令,但也也有很多過程步有相同的 SAS 語句和命令。

PROC PRINT DATA=MyData;

    VAR Name Height;

RUN;

PROC CONTENTS DATA=MyData;

RUN;

DATA=MyData 是 PROC PRINT 和 PROC CONTENTS 語句特定的參數(也叫選項),所有的 PROC 步都有 DATA= 選項。如果沒有指定,則系統默認為執行過程中最近創建的那個數據集。

4程序註釋

  • 塊註釋:SAS 支持 C、C++ 和 Java 等廣泛使用的塊註釋  /* … 註釋 … */ 功能,註釋可以是任何長度,可包括分號但不能嵌套使用塊註釋;

/* …

 *

…註釋…;

 *

 */

PROC CONTENTS DATA=MyData;

RUN;

  • 行註釋:以星號 * 開始,以往後的第一個分號 ; 結束。比如:

* …註釋…;

PROC CONTENTS DATA=MyData;

* …註釋…;

  * …註釋…;

RUN;

註釋通常用於說明程序的功能、標註非執行文本或者用於文檔目的,可以在代碼調試過程中將調好的代碼暫時隔離。SAS 運行時註釋中的代碼會被忽略,但註釋也會被寫入日志文件。 需要特別注意的一點是,在 SAS Macro 宏代碼要謹慎使用行註釋,以免導致不期望的宏展開。

5推薦代碼規範

雖然 SAS 代碼格式具有極強的靈活性,但良好的格式化能提高代碼的可讀性和可維護性。


  • 通常 DATA/PROC/RUN 語句開始於第一列,而其他子語句則採用縮進,以顯示結構關係。

  • SAS 步之間通常用空白列隔離,以示 SAS 代碼的編譯邊界,從而方便代碼調試。

  • 全局語句與頂級語句 DATA/PROC/RUN 平齊。


SAS 的 DATA 步和 PROC 步是 SAS 語言對數據分析工作的精妙抽象和完美封裝,DATA 步解決數據結構和準備問題,而 PROC 步解決對特定分析流程的做到和封裝。你可以把它對應成傳統編程中的數據結構和算法設計,分別負責數據和邏輯的做到。

本文作者:巫銀良,目前擔任 SAS 北京研發中心商業智能和可視化分析產品部技術總監。

感謝巫銀良先生對本文內容的支持,也歡迎大家積極投稿,與小夥伴分享您的獨特見解和卓越技術。投稿郵箱:[email protected]

長按二維碼,可閱讀原文

關於更多SAS乾貨資料,您可以閱讀:
從工程師到數據科學家:SAS 編程基礎(1)
【玩轉地球】如何用SAS繪制現代化數字地圖
【乾貨分享】運用SAS文本分析,海量資料秒分析
更多關於SAS新聞,您可以閱讀:
SAS被Gartner評為數據質量工具魔力象限主管者
SAS被The Forrester Wave™評為企業級洞察平台套件唯一主管者
大數據分析強力助推數字化轉型
欲了解更多信息,請點擊閱讀原文訪問SAS中國官網 www.sas.com.cn

本文作者:巫銀良,如有轉載,請註明出處。
訂閱:

添加好友 搜號碼【saschina】
查找公眾帳號【SAS數據分析】
如果您的微信是最新版本,也可以:


分享:

點擊右上角「分享文章到朋友圈」
點擊右上角「發送給好友」