日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python和Stata的数据交互

發布時間:2023/12/20 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的歷史數據的過程如下:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助, 群里還有不錯的視頻學習教程和PDF電子書! '''1clear23python:4from sfi import Data5import matplotlib.pyplot as plt6import numpy as np7import tushare as ts89# 定義數據類型 10intList = [np.int8, np.int16, np.int32, np.int64, 11 np.uint8, np.uint16, np.uint32, np.uint64] 12floatList = [np.float16, np.float32, np.float64] 13 14# 獲取數據 15df = ts.get_hist_data('hs300') 16df = df.reset_index() # 將索引轉化為列 17 18# 添加變量 19Data.addObs(df.shape[0]) 20 21for i in range(0, df.shape[1]): 22 if df.iloc[:, i].dtype in intList: 23 Data.addVarInt(df.iloc[:, i].name) 24 elif df.iloc[:, i].dtype in floatList: 25 Data.addVarFloat(df.iloc[:, i].name) 26 else: 27 Data.addVarStrL(df.iloc[:, i].name) 28 29# 存儲數據 30for i in range(0, df.shape[1]): 31 Data.store(df.iloc[:, i].name, None, df.iloc[:, i]) 32 33# 繪制圖形 34df[['close', 'ma5', 'ma10', 'ma20']].plot( 35 kind='line', 36 figsize=(16, 9), 37 grid=True, 38 title='HS300', 39 fontsize=12) 40plt.show() 41 42end 43br

第9~12行用于將int型和float型的數據類型分別放到兩個列表中。
第21~27行用于根據不同的數據類型來創建不同類型的變量;
第33~40行用于繪圖。

獲取數據結果如下:

繪制的圖:

5. 還需要改進的地方

在Stata中運行Python代碼是其一個長足的進步,但就目前來看,仍有許多改進的地方。

首先,SFI中沒有將DataFrame數據直接轉化為Stata可調用數據的相關API,還需要進一步的編程來實現,不是很方便;

其次,Data類中沒有設置時間日期類型變量的方法。這就使得任何時間變量要么以字符串的形式保存,要么轉化為時間戳以整數或浮點數的形式保存(SFI模塊中的Datetime類可以處理此數據),因此,時間日期變量的處理就比較麻煩。

但中肯地說,瑕不掩瑜。

總結

以上是生活随笔為你收集整理的Python和Stata的数据交互的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。