Python和Stata的数据交互
最近拿到了Stata的船新版本——Stata16,就迫不及待地玩了兩天。總的來說,Stata16不論在UI上,還是在功能上,都比之前的版本進步了許多。
特別值得一說的是,Stata終于牽手Python了——用戶可以在直接進入Python的交互模式,或者運行Python的腳本。這樣就可以借他山之石以攻玉。比如說,我們用Python爬取的數據,然后交由Stata進行處理;或者將Stata中的數據交由Python的Matplotlib庫繪制三維圖像等。這是Stata發展歷程中的一大進步。
當然,Stata與Python的結合過程中仍然存在大量問題,需要Stata的開發人員持續改進。這一篇我們將結合Stata的Python開發文檔(鏈接:https://www.stata.com/python/api16/index.html),來介紹二者之間的數據交互問題。
1. 進入Python交互模式
首先,你得確保的電腦上已經安裝了Python,并且Stata中執行Python的路徑設置正確。然后,你可以通過在命令窗口輸入:
python接著你就進入了如下圖的Python交互模式:
1for i in range(1, 10): 2 for j in range(1, i+1): 3 print("%d*%d=%-4.0d" % (j, i, i*j), end="") 4 print("")注意縮進!!Python對于縮進有嚴格規定。結果如下:
最后,你可以輸入end以結束Python交互模式。
2. 從Tushare獲取數據
Tushare是一個免費、開源的python財經數據接口包,在此向大家安利這個包,大家可以通過這個鏈接(https://tushare.pro/register?reg=224853)去注冊使用。當然不注冊也可以用。
由于Stata的Python API文檔中關于Data類的介紹中已經舉了一些使用Python獲取Stata中數據的例子(鏈接https://www.stata.com/python/api16/Data.html#examples)。
因此,在這里,我就只介紹如何使用Python獲取的數據存儲到Stata中。這里我們主要使用的是sfi(Stata Function Interface)模塊中的Data類。
Data類中add族方法用于向當前Stata數據集中添加觀察值或變量;get族方法用于獲取當前Stata數據集中的觀察值;set族方法用于設置當前數據集的一些屬性;store族方法用于將數據保存到當前Stata數據集中。
看下面代碼:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! '''1# 獲取Tushare存款利率數據2clear3python:4from sfi import Data5import tushare as ts67# 創建數據集和變量8df = ts.get_deposit_rate()9Data.addObs(df.shape[0]) 10Data.addVarStrL('date') 11Data.addVarStrL('deposit_type') 12Data.addVarStrL('rate') 13 14# 存儲數據 15Data.store('date', None, df.iloc[:,0]) 16Data.store('deposit_type', None, df['deposit_type']) 17Data.store('rate', None, df['rate']) 18 19end 20br第3行,用于進入Python交互模式;
第4~5行,導入相關的包;
第8行,從Tushare上獲取存款基準利率;
第9行,調用Data類中的addObs()方法,用于給當前Stata數據集(空)中創建若干個觀察值,相當于Stata中的命令set obs 100。df.shape[0]將返回數據的行數。
第10~12行,由于我已經知道了df中有3列數,且它們的類型都是object,因此這里將使用addVarStrL()方法創建3個字符串變量,變量名分別為date,deposit_type和rate。盡管已經創建了變量,但此時Stata數據集中仍然沒有存儲數據。
第15~17行,將df中的數據使用store()方法存儲到剛才創建的變量中。
第19行,退出Python交互模式。
結果如下:
3. 多個變量
上述數據中只有3列數據,所以可以不辭辛苦地對每一個變量分別進行處理,那么如果變量很多呢?一個個地設置變量類型,然后存儲數據,那將太麻煩了。因此,要寫個循環。
代碼如下:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! '''1clear2python:3from sfi import Data4import tushare as ts56# 創建數據集和變量7df = ts.day_boxoffice()8Data.addObs(df.shape[0])9for i in range(0, df.shape[1]): 10 Data.addVarStrL(df.iloc[:, i].name) 11 12# 存儲數據 13for i in range(0, df.shape[1]): 14 Data.store(df.iloc[:, i].name, None, df.iloc[:, i]) 15 16end 17br上述代碼,是用于獲取當日票房的數據的。比較簡單,就不贅述了,結果如下:
4. 多數據類型
也許你發現了,我們存到Stata中的數據都是字符串形式,這是因為上述df中的數據類型都是object類型,只能將其處理成字符串形式。那如果有些數據中包含整數或者浮點數呢?
在這里需要知道,Pandas庫是基于Numpy庫進行構建的。因此Pandas中的DataFrame的基本數據類型就是Numpy的基本數據類型,如下:
基于此,獲取滬深300的歷史數據的過程如下:
第9~12行用于將int型和float型的數據類型分別放到兩個列表中。
第21~27行用于根據不同的數據類型來創建不同類型的變量;
第33~40行用于繪圖。
獲取數據結果如下:
繪制的圖:
5. 還需要改進的地方
在Stata中運行Python代碼是其一個長足的進步,但就目前來看,仍有許多改進的地方。
首先,SFI中沒有將DataFrame數據直接轉化為Stata可調用數據的相關API,還需要進一步的編程來實現,不是很方便;
其次,Data類中沒有設置時間日期類型變量的方法。這就使得任何時間變量要么以字符串的形式保存,要么轉化為時間戳以整數或浮點數的形式保存(SFI模塊中的Datetime類可以處理此數據),因此,時間日期變量的處理就比較麻煩。
但中肯地說,瑕不掩瑜。
總結
以上是生活随笔為你收集整理的Python和Stata的数据交互的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 各种卡类说明
- 下一篇: 教育APP开发的特点体现