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