文 / Chuck Huber, Director of Statistical Outreach at StataCorp
導讀
——————————————————————————————————————————————————————
在作者以前的文章中,使用read_stata()
方法將Stata數據集讀入pandas 數據框中。當您想將整個Stata數據集讀入Python時,這很好用。但是有時我們希望從Stata數據集中讀取變量或觀察值的子集,或同時讀取兩者。在本文中,作者將向您介紹Stata Function Interface(SFI)
模塊,并向您展示如何使用它來將部分數據集讀入pandas數據框中。
如果您不熟悉Python,那么在繼續閱讀之前,請閱讀作者的Stata / Python集成系列文章的前四篇文章可能會有所幫助。
設置Stata以使用Python
在Stata中使用Python的三種方法
如何安裝Python套件
如何使用Python套件
使用SFI模塊將數據從Stata移至Python
該SFI 是一個Python模塊,使您可以傳遞信息來回塔塔和Python之間。您可以復制整個或部分數據集,數據框,局部和全局宏,標量和矩陣,甚至全局Mata矩陣。一篇博客文章中沒有太多功能可以顯示給您。因此,今天我將向您展示您可能會使用的功能:將部分Stata數據集讀取到Python中。我們將在以后的文章中探索更多的SFI功能。
讓我們通過使用自動數據集開始下面的代碼塊。接下來,讓我們進入Python環境并從SFI模塊導入Data類。然后,我們將使用Data類中的get()
方法將外部變量復制到名為dataraw的Python列表對象中。get()
方法的第1個參數是放在單引號中的Stata變量列表。
Python輸出向我們顯示,列表對象dataraw包含Stata變量foreign的數據。
指定觀察范圍
get()
方法的第二個參數允許我們指定觀察范圍。我在下面的代碼塊中使用range()
函數來指定觀察值46到56。請注意,我還將mpg
和rep78
添加到了變量列表中。
Python輸出顯示dataraw
僅包含mpg
小于20
的觀察值。
獲取價值標簽而不是數字
在Stata變量的值國外標有“Domestic”
為0
和“foreign”
為1
。
我們的Python列表對象dataraw
僅存儲基礎數字值0和1,但我們可能更喜歡使用標簽。get()
的第四個參數允許我們將Stata變量的值標簽傳遞給Python,而不是數字。我在下面的代碼塊中指定了valuelabel = True
,以將值標簽傳遞給Python。
下面的Python輸出向我們展示了dataraw現在包含單詞“ Domestic”和“ Foreign”。請注意,這些是字符串,而不是帶標簽的數字值。
為缺失值指定一個數字
get()
的第五個參數允許我們為丟失的數據指定一個值?;叵胍幌?,Stata將缺失值存儲為數字存儲類型的zui大可能值。Stata變量rep78
作為雙精度數字變量存儲,zui大值為8.98846567431158e + 307
。浮點數值變量的zui大值為1.70141173319e + 38
,長變量的zui大值為2,147,483,620,int
變量的zuida值為32,740
,字節變量的zui大值為100。因此,a的精確值缺失值取決于變量的存儲類型。
Python不會將這些數字識別為缺失值。Python將8.98846567431158e + 307
解釋為數字。Python中缺少的數字值通常用Numpy
的特殊浮點值“ nan”
表示,該值zui初是由電氣和電子工程師協會在IEEE 754-1985
標準中定義的。通過為get()
的第五個參數指定missingval = np.nan
,我們可以告訴Python 8.98846567431158e + 307
不是“數字”(nan)
。
Python的輸出下面顯示了數8.98846567431158e + 307
dataraw
已被替換numpy
的特殊浮點值“nan”
。
將列表對象轉換為pandas數據框
我們已經使用get()
將我們的Stata數據集的一部分復制到名為dataraw
的Python列表對象中。接下來,讓我們將列表對象轉換為pandas數據框。
我們首先使用別名pd
導入pandas。然后,我們可以通過鍵入dataframe = pd.DataFrame(dataraw)
來創建一個數據框架。
下面的Python輸出顯示數據框dataframe
。標記為0、1和2的列分別是變量foreign
,mpg
和rep78
。左側的未標記列是pandas創建的索引,用于唯1標識每一行。
標記數據框的列
我們可以使用DataFrame()
方法中的columns
選項標記數據框的列。列名列表必須用方括號括起來,并且每個列名都必須用單引號括起來并用逗號分隔。
下面的Python輸出顯示,數據框中的第二,第三和第四列現在分別命名為foreign
,mpg
和rep78
。
從1開始數據幀索引
Python使用從零開始的數組索引,這意味著行數和列數以0而不是1開頭。因此,pandas自動創建了以0開頭的行索引。如果您對索引的開頭感到滿意,則可以跳到下一部分?;蛘?,您可以使用DataFrame()
方法中的index
選項將索引更改為以1開頭。
我們將在Numpy
模塊中使用arange()
方法指定索引。第1個參數是行索引的第1個元素,即1。第二個參數是行索引的Zui后一個元素。我們可以簡單地鍵入6,因為在我們的數據框中有6行。但是,下一次我們運行代碼時,此數字可能會更改。我們可以使用len()
方法來計算列表對象dataraw
的長度。而且我們必須在dataraw
的長度上加1,因為Python從0開始計數。
下面的Python輸出向我們顯示,數據幀的索引現在從1開始,以6結尾。
使用getAsDict()
您還可以使用getAsDict()
將Stata數據復制到Python字典中。參數與get()
相同,并且生成的字典包含Stata變量的名稱。這意味著在將字典轉換為數據框時,我們不必命名列。創建以1開頭的數據幀索引的方法有所不同,因為字典的長度不是Stata觀測值的數量。在下面的代碼塊中,我將obs定義為字典dataraw
中值列表的長度。我使用了next()
和iter()
函數來遍歷字典dataraw中的值。我又加了1,因為Python從0開始計數。
下面的Python輸出顯示,生成的數據框看起來非常類似于我們使用get()
創建的數據框。
只是基礎
也許您不希望限制樣本,也不介意從零開始的索引。您只想將變量集合復制到Python中的pandas數據框中。下面的代碼塊將執行此操作,并將Stata缺失值轉換為Python缺失值。
下面的輸出顯示數據框dataframe
,它準備好進行圖形化或數據分析。
結論
我們做到了!我們使用SFI模塊的Data類中的get()
和getAsDict()
方法將Stata數據集的一部分復制到Python數據框中。我們甚至考慮了丟失的數據。每當我們想將Python合并到我們的數據管理,分析或報告中時,都可以在我們的do文件,ado文件和Python腳本中輕松使用get()
和getAsDict()
。下次,我將向您展示如何使用SFI將數據從Python復制到Stata數據集中。
為了幫助大家更好的了解Stata軟件,特開放試用申請,請自動識別上方二維碼,并確保申請信息的正確性,其中 * 號為必填項,我們將通過您提交的電子郵箱地址發送許可信息,感謝您的支持。
Stata 軟件訂購
北京友萬信息科技有限公司作為Stata軟件在中國大陸的授權經銷商及合作伙伴,希望能給Stata中國用戶提供更多服務與支持,并幫助中國用戶建立完善的軟件售后服務體系。如需Stata V16新版本采購及老版本更新升級請聯系我們,感謝您的支持與關注。手機/微信:18610597626 郵箱: crystal@uone-tech.cn
專注分享商業數據分析、金融數據分析、應用統計分析、知識圖譜、機器學習、計量經濟、人工智能、網絡爬蟲、自動化報告與可重復研究等熱門技術內容。定向培養Stata、Python、R語言數據人才,助力產學研政企商協同發展,為中國大數據產業蓄能。合作熱線:010-56451129 郵箱:info@uone-tech.cn。