跳到主要內容

python與SAS資料處理入門--資料匯入匯出


為什麼要學程式語言,不能用excel做大型資料的處理
不建議使用excel做大型資料處理的原因有2點,(1)excel行列的限制,2003年以前的版本,最大資料列筆數為65,536行、欄位數最多為256列,2007之後的版本雖然行列都有擴展,最大資料列筆數可達到1,048,576,行、欄位數最多為16,384列,但對於現在隨便動輒幾億筆的資料來說,這真的不算什麼,因此實務上可能會遇到一份資料得分成好幾個sheet儲存的情況。(2)資料量太大,可能會遇到excel執行上耗時的問題。

對於即將跨入大數據的人而言,SPSS雖然也是個不錯的選項,具有操作簡單之優勢,短期內可快速掌握,但也因介面以選單式操作為主,使用彈性相對受限,此外對於大數據處理效率也較差,如果未來工作上需經常面對大數據(例如:醫學資料庫、商業資料庫),建議可以直接選擇學習SASR或是Python

以下就挑選SAS(付費軟體)以及近年很熱門的Python(開源軟體),從基本的資料匯入、匯出開始介紹起。不論SAS或是Python皆可以匯入許多不同類型的檔案格式,本文就挑選幾個可能比較常接觸到的類型做說明。

SAS進行操作
介面
執行SAS會經常使用到的視窗有幾個部分,以下簡述其用途:

(1) 編輯器:指令輸入,未來相關語法的編輯都在該視窗完成。
(2) 日誌:顯示指令執行結果,如果有程式上的執行錯誤,皆顯示於該視窗。
(3) 結果:分析結果的索引,方便使用者管理結果的部分。
(4) 檔案總管:資料集的管理,可於此處點選瀏覽資料內容。

資料匯入(proc import)
²   Excel檔案匯入


proc import datafile="c:\test.xlsx" /*資料匯入的路徑*/
out=test  /*資料匯入後的名稱*/
dbms=xlsx replace; /*輸入檔案的類型*/
sheet=" Sheet"; /*選擇讀取的工作表*/
getnames=YES; /*第一行是否做為欄位名稱,如果不要改為NO*/
run;

Excel2007年後的版本,存檔格式為xlsx,所以如果遇到檔案格式為2003年之前的相容版本(xls)或是逗號分隔(csv)的格式的話,除了在資料匯入的路徑上帶入相對應的副檔名外,dbms的地方也要帶入對應的檔案格式。
檔案格式
dbms
xlsx (Excel2007後版本)
xlsx
xls(Excel2003相容版本)
excel
csv(逗號分隔)
csv

²  Text文字檔案匯入
這部分的匯入基本上也是使用proc import語法,但是必須額外說明的部分為txt檔分隔的方式,這部分在Excel匯入時不需要額外做設定,但是在txt檔讀入的某些情況上就需要做額外的設定了。

proc import datafile="c:\test.txt"
out=test 
dbms=dlm replace;
delimiter=",";  /*如果是用tab做分隔,這段可以省略*/
getnames=YES;
run;

分隔方式
dbms
tab分隔
tab
其他符號做區隔
dlm
如果txt檔分隔的方式為tab,那只需於dbms宣告為tab格式即可,但如果分隔的方式為tab以外的方式,例如:逗號分隔,除了dbms那邊要宣告格式為dlm外,還需要用delimiter來告訴SAS分隔的方式為逗號。








資料匯出(proc export)
² Excel檔案匯出
proc export data= work.test /*準備匯出的資料檔名*/
outfile="c:\test1.xlsx" /*資料匯出的路徑*/
dbms=excel replace; /*匯出的檔案格式*/
sheet=" Sheet"; /*工作表名稱*/
run;

這部分匯出的邏輯跟Excel匯入雷同,所以如果要存成Excel其他格式,dbms同樣要帶入對應的檔案格式。

²  Text文字檔案匯出
proc export data= work.test /*準備匯出的資料檔名*/
outfile="c:\test1.txt" /*資料匯出的路徑*/
dbms=tab replace; /*匯出的檔案格式*/
putnames=YES; /*匯出欄位名稱,如果不要匯出欄為名稱則改為NO*/
run;

Python進行操作
介面
這部分使用Jupyter Notebook進行程式編寫,在使用之前務必先安裝Python,網路上有許多安裝的教學資源可供參考。不過對於剛入門的人可能會有個疑惑,IDLEPython官方的整合開發環境IDEIntegrated Development Environment,為何不直接使用Python程式的IDLE進行編寫就好,還要額外再下載開源軟體?
主要是因為PythonIDLE互動介面雖然讓使用者可輸入一行程式並快速的得到執行結果,但對於需要編寫一段完整或是較為複雜程式的使用者而言,這樣的介面並不這麼合適。因此網路上有許多開源的軟體可供使用者下載使用,例如:Jupyter NotebookPyCharmEric等等,待讀者熟悉後可依照自己的使用習慣選擇適宜的操作介面。
*:IDE為整合編輯器、直譯器編譯器、除錯器之功能的互動式介面

²  開啟Jupyter Notebook
Jupyter Notebook安裝完成後,於命令提示字元(cmd)輸入jupyter notebook後,透過瀏覽器啟動開啟頁面即可開始使用。Jupyter Notebook在操作上相當簡單且便於編寫及儲存。

開啟後於右上角點選NEWàPython3開啟新的Python互動模式

Python互動模式開啟後,操作邏輯相當簡單,主要就2部分,程式輸入區(IN)、結果顯示區(OUT)

資料匯入
處理資料格式(Data Frame)的資料需要使用Pandas套件,因此在開始前需再進行一個步驟,打開命令提示字元(cmd)輸入pip install pandas執行套件安裝。
²  Excel檔案匯入
import pandas
df=pandas.read_excel("C:\\test.xlsx",sheet_name="Sheet")

-透過import宣告使用pandas套件
- read_excel():然後再使用pandas中的read_excel()函數讀取excel檔案,可用相對路徑或絕對路徑,範例使用的為絕對路徑。
-sheet_name:用來設定匯入的工作表名稱,且不論檔案格式是xlsxxls皆可用read_excel()函數讀取

²  CSV檔案匯入
但這邊跟SAS的概念有點稍微不一樣,SAS主要是透過dbms來宣告讀入的版本,但pandas套件則是使用不同的函數來做讀取,因此讀取逗號分隔的csv檔案就需要使用不同的函數。當然不同函數底下的設定也會稍微不同。
     df=pandas.read_csv("C:\\test.csv",encoding="utf8")


編碼問題是這邊要稍微注意的地方,如果檔案有中文在read_csv()讀入時可能會出現無法解碼訊息,透過encoding變更編碼的方式,encoding預設為utf8編碼,這時可修改為cp950。但是如果仍出現無法解碼的問題,可以再試試看在裡面加入engine ="python"

²  Text檔案匯入
txt檔的讀入有2種方式。
方式1:透過read_csv()讀入

df=pandas.read_csv("C:\\test.txt",sep="\t")

透過sep設定分隔的方式。


方式2:透過read_table()讀入
df=pandas.read_table("C:\\Utest.txt",sep="\t ")


資料匯出

²  Excel檔案匯出
import pandas
df.to_excel('C:\\ test1.xlsx', sheet_name="sheet1")

df.to_csv('C:\\ test1.csv',encoding="cp950")


邏輯跟匯入函數很像,就不再贅述了。

²  Text檔案匯出
df.to_csv('C:\\ test1.txt',sep="\t")


變數命名原則
最後要再提到一個觀念,不論是SAS或是Python對於變數命名都有一定的規則,以下做個整理:
規則
SAS
Python
欄位長度限制
不超過32字元
沒有限制
欄位命名原則
1.     開頭須為英文字母或是底線。
2.     欄位名稱不可以包含中文。
3.     不可使用保留字當欄位名稱。
4.     大小寫無區別。

1.     開頭須為英文字母或是底線。
2.     除了開頭以外的字元可為其他英文字母、數字、底線、中文。
3.     不可使用保留字當欄位名稱。
4.     大小寫有區別。
因為變數命名有些限制,所以在匯入時要注意是否有違反規則的情況,以免出現錯誤訊息。

留言

這個網誌中的熱門文章

如何快速註冊統合分析題目~以PROSPERO為例

初步檢索心中的愛 當心目中有一個理想題目時,為避免地球上另一個人也同時跟你想的一樣,而且還比我們早發表,若等我們發表時才發現,當下一定很扼腕,有了註冊系統除了幫自己先占好位子,也可以同時確認這個題目是否已經有人正在做了,不用浪費時間投注在上面。很多人其實不曉得實際上到底要如何註冊,以下一起註冊吧。 什麼是 PROSPERO??   PROSPERO (International prospective register of systematic reviews) 是一個國際前瞻性系統性文獻回顧評價系統,由美國國立衛生研究院 NIHR ( National Institute for Health Research )資助,由英國約克大學 CRD(Centre of Reviews and Dissemination) 創立,針對將已完成的評價或正進行中的計畫做紀錄。 目的:避免重複並減少報告偏見的機會,增加透明性。                 步驟流程 Step 1 :檢索主題 先確認其他人是否對這主題感興趣,有人捷足先登了嗎 ?? 也可以確認目前流行的趨勢是哪類型的研究等。 Step 2 :註冊帳號 ID 先到 PROSPERO 官網 ,填寫基本資料後註冊 ID 。 Step 3 :點選註冊文獻 review 要需先有帳號後才能註冊題目,進入頁面後依指示一步一步操作。 以下是網頁步驟,依研究對象是人群還是動物選擇按鈕點選,一般我們都是人群研究,選紫色。同時須確認以下五步驟是否都經過檢驗了。 第 1 步 檢查納入標準。 第 2 步 確保您的 protocol 處於(接近)最終形式。 第 3 步 搜尋 PROSPERO ,以確保評論尚未被註冊。 第 4 步 搜尋 PROSPERO ,以確保您沒有不必要地重複由另一個團隊進行的審核或先前已註冊的審核 第 5 步 開始註冊 Step 4 :點選相關事前準備工作進度。 這裡有一系列問題須皆回答完,才能進行下一步。 以上填完後,終於可以進入 Stage of review ,這裡依指示點選進度。 Step 5 :填寫註冊表格

Python與SAS資料處理入門-變項合併與名稱修改

將舊有的變項合併創建新變項 在處理大數據時常常會遇到需橫跨多個資料庫間進行資料串連,因此可能會遇到幾個問題 : (1) 不同資料庫間串連的鍵值欄位可能有多個,例如 :ID 與生日相同的資料才可互相串連。 (2) 不同資料庫間串聯的鍵值不盡相同。 (3) 要串聯的檔案之間有名稱相同的欄位,前幾篇文章有提到欄位合併的處理在 SAS 的語法上要注意檔案合併時欄位名稱相同會覆蓋的問題。 針對第 1 跟第 2 個問題,可先依據串聯不同資料庫鍵值的欄位需求先合併成一個 unique id ,後續直接用這個鍵值進行串連。合併後的新鍵值除了做為串檔用外,當資料處理時遇到原先鍵值不 unique 的情況,也會 透過變項合併產生新的 unique id 來取代原先的 id 鍵值 。 對於問題 3 ,檔案合併遇到命名相同的欄位產生 相互覆蓋 的問題,這部分會透過變更名稱的方式來處理。 以簡單例子進行練習 手上有 2 種檔案 : (1) 調查的基本資料,裡面包含 ID 、 Gender 、 Birthday 、 City( 戶籍地 ) 等資訊。 (2) 調查的結果,裡面包含 ID 、 Birthday 、 City( 收案地點 ) 、 Q_date( 受訪日期 ) 以及問卷題項。 問題 1: 鍵值不 unique 觀察第一份資料可以發現 ID 編號為 007 的有兩個且生日不同,因此判定可能是不同的人,編號重複編列,在這樣的情況下如果僅用 ID 串聯結果可能會是這樣。 在基本資料 (A) 的那兩筆 ID 為 007 的資料同時都會與調查結果 (B) 中 ID 為 007 那筆資料串連,但很明顯的是 B 資料的 007 合併生日判斷後可以發現不屬於 A 檔另一筆 007 的數據,因此原本 unique 的 ID 不為 unique ,因此合併 ID 與 Birthday 成為一個新的 unique ID 做為鍵值。 問題 2: 不同檔案有相同的名稱 這兩個檔案中有 2 個欄位名稱相同, Birthday 與 City 。在考量 Birthday 與 ID 將合併為新鍵值後,可暫擱一邊不需特別處理。但 City 部分的問題就比較大了,雖名稱相同但實際上代表的含意不同,如

python與SAS資料處理-歸人與排除重複

  歸人顧名思義就是將一個人多筆的資料整合,每人只留下 1 筆。   通常取得的資料都是原始資料,並未經過整理。例如手上有疑份顧客購物紀錄,裡面有每個顧客在這 1 年內的每筆消費紀錄,這是一份以每次消費紀錄為 1 筆的紀錄形式,所以一個人可以有多筆的消費紀錄。當我們想要知道這些消費紀錄源自於多少顧客的購買時,這時候就需要用到歸人的概念,將資料轉換為每一個人只有 1 筆資料的紀錄形式 ( 如下圖所示 ) 。 以 SAS 進行資料歸人 歸人留 1 筆消費紀錄 proc sort data =cost; by ID time; run ; /* 在規筆前依照 ID 跟消費日期做排序 */ data cost_1; set cost; by ID; if first.id; run ;   /* 保留第一筆資料 */   之前已經有針對 proc sort 的排序語法進行說明,有需要可參考這篇 文章 , SAS 排序的設定值為升冪,也就是說每個人都會從最早那次的紀錄開始往後排序,所以用 first.id 就可以留下每個人最早那次的消費紀錄。 這邊也可以用排除重複的概念保留 1 筆資料 proc sort data =cost out =cost_2 nodupkey ; BY ID; run ; 利用 nodupkey ,將 ID 重複的資料刪除,僅保留每個 ID 第一次出現的該筆紀錄。   歸人累計所有消費金額 proc sort data =cost; by ID time; run ; data cost_1; set cost; by ID; if first.id then count= 0 ;/* 每個人第一筆資料都令 count=0*/ count+NT;/* 同 ID 累計 NT 數值 */ if last.id; run ;   除了要歸人以外,還要累計每個仁所有的消費金額,所以這邊就會創建一個 count 欄位,每一個人的第一筆 ID 令 count=0 ,在同樣 ID 時累加 NT 的數值,最後每個人保留最後一筆 ID ,也就是最後累計的總額。 以 Python 進行資料歸人 歸人留 1 筆消費紀錄 cost.sort_v