国产aV无码片毛片一级韩国,午夜草草视频在线播放,中国人妻少妇精品一区二区,在线视频播放一区二区三区,一区二区三区久久av,日韩人妻系列中文字幕,国产av综合av亚洲av,欧美多人啊啊啊啊污污视频,国产大鸡巴插女生b视频

教育裝備采購網(wǎng)
第八屆圖書館論壇 校體購2

【Stata專欄】如何在Stata16中調(diào)用Python

教育裝備采購網(wǎng) 2019-07-24 13:22 圍觀5004次

  面對大數(shù)據(jù)時代,Stata16推出了Python接口,允許在Stata界面調(diào)用Python。為配合《高級計量經(jīng)濟學(xué)》課程的“編程專題”,本文將對Stata Function Interface(sfi)作簡要介紹,感興趣的同學(xué)可以適當(dāng)嘗試。

  說到軟件交互,其實就是4個事情:

  如何在Stata中啟動Python環(huán)境

  如何將Stata的數(shù)據(jù)類型轉(zhuǎn)化為Python的數(shù)據(jù)類型

  如何將Python的數(shù)據(jù)類型轉(zhuǎn)化為Stata的數(shù)據(jù)類型

  如何將Python函數(shù)封裝在Stata命令中

  先說幾句題外話。我個人認(rèn)為,Stata16的這項新功能意義并不大。一方面,Python早就可以調(diào)用Stata了,我們完全可以將Stata的命令封裝在Python命令中;另一方面,數(shù)據(jù)類型的轉(zhuǎn)化完全可以通過數(shù)據(jù)集的導(dǎo)入導(dǎo)出來實現(xiàn)。正如我們經(jīng)常做的,用Python爬一組數(shù)據(jù),然后保存為Excel工作表,最后用Stata讀取并建模。因此在我看來,Stata16提供Python接口,會將很多Stata鐵粉引向免費的Python,但對同時掌握Stata和Python的用戶卻毫無激勵。來都來了,我們簡單看看這個接口吧。

1 啟動Python環(huán)境

  1.1 配置Stata與Python的關(guān)聯(lián)

  首先,你需要在電腦上同時安裝好Stata和Python。如果你還沒有安裝Python,建議下載Anaconda,版本為3.X。地址如下:

  https://www.anaconda.com/distribution/

  假設(shè)我們將Anaconda安裝在D盤根目錄下,會發(fā)現(xiàn)Python軟件的地址為

  ?D:\Anaconda3\python.exe

  打開Stata16,在命令欄輸入

set python_exec D:\Anaconda3\python.exe

  Stata和Python就算關(guān)聯(lián)好了。

  嘗試一下:在命令欄鍵入python,出現(xiàn)以下結(jié)果就算成功了。

. python
----------------------------------------------- python (type end to exit) ---------------
>>> 

  1.2 進入Python環(huán)境

  在Stata界面下進入Python環(huán)境的方式有3種:

  完全進入

  鍵入python可完全進入Python環(huán)境,命令提示符從.變?yōu)?gt;>>。此后,我們可以自由輸入Python代碼,直到輸入end命令退出該環(huán)境。舉例如下:

. python
----------------------------------------------- python (type end to exit) ---------------
>>> print('Hello NJUPT!')
Hello NJUPT!
>>> city = 'NJUPT'[:2]
>>> print('I LOVE', end=' '); print(city)
I LOVE NJ
>>> end
-----------------------------------------------------------------------------------------

  半完全進入

  鍵入python:可進入Python環(huán)境,但這種進入并不穩(wěn)定,一旦出現(xiàn)錯誤就會回到Stata環(huán)境中。舉例如下:

. python:
----------------------------------------------- python (type end to exit) ---------------
>>> print('I am a teacher.')
I am a teacher.
>>> print(1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
-----------------------------------------------------------------------------------------
r(7102);


  非完全進入

  在python:后直接鍵入一個或多個命令,可以在不跳出Stata環(huán)境的前提下,臨時性地執(zhí)行Python語法。舉例如下:

. python: print('I Love You.'); print('I Love You, too.')
I Love You.
I Love You, too.

  非完全進入非常有用,能使我們在撰寫Stata小程序時直接調(diào)用Python的方法。

  1.3 在Python環(huán)境下調(diào)用Stata

  當(dāng)(半)完全地進入Python環(huán)境時,又如何臨時調(diào)用Stata命令呢?很簡單,使用stata:前綴即可。舉例如下:

. python
----------------------------------------------- python (type end to exit) ---------------
>>> stata: sysuse auto.dta, clear
(1978 Automobile Data)
>>> stata: regress price weight, nohead nocons
------------------------------------------------------------------------------
       price |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
------------- ----------------------------------------------------------------
      weight |   2.041977   .0926943    22.03   0.000     1.857238    2.226717
------------------------------------------------------------------------------
>>> end
-----------------------------------------------------------------------------------------

  1.4 數(shù)據(jù)類型不兼容問題

  剛拿到Stata16,我還無法完全摸清Stata和Python在數(shù)據(jù)類型上的兼容性,比如:

. python
----------------------------------------------- python (type end to exit) ---------------
>>> a = 1 1
>>> stata: display a
a not found
r(111);
>>> stata: scalar x = a
>>> stata: display x
2
>>> end
-----------------------------------------------------------------------------------------

  為了保證代碼執(zhí)行的正確性,我們盡可能在兩種軟件的數(shù)據(jù)類型轉(zhuǎn)換上做到“全手動”。下一節(jié)可以幫助我們了解這種轉(zhuǎn)換的基本規(guī)律。

2 數(shù)據(jù)交互

  本節(jié)介紹如何在Stata的數(shù)據(jù)類型和Python的數(shù)據(jù)類型之間進行轉(zhuǎn)換。其適用情境為:

  數(shù)據(jù)已經(jīng)在Stata內(nèi)存(數(shù)據(jù)編輯器)中,但想要使用Python的方法;比如,我們已經(jīng)加載auto.dta數(shù)據(jù)集,但希望使用Python的matplotlib庫繪制一個以length為橫軸、weight為縱軸、price為尺寸的散點圖,并保存為dpi為300的png格式。

  使用Python獲取數(shù)據(jù)或運算出數(shù)據(jù)結(jié)果,但想要使用Stata的命令;比如,我們通過tushare獲取財經(jīng)數(shù)據(jù),但希望使用Stata進行Garch(1,1)估計,求出長期波動率。

  當(dāng)然更復(fù)雜的是兩者間相互調(diào)用,一方的執(zhí)行結(jié)果決定了另一方的執(zhí)行內(nèi)容,反之亦然。

  2.1 Stata Function Interface (sfi)

  首先必須明確,sfi是一個Python庫,因此我們始終在Python環(huán)境下載入和使用它。sfi的文檔在以下地址中:

  https://www.stata.com/python/api16/

  從功能(而非模塊)上梳理SFI的命令,主要包括以下4類:

  創(chuàng)建數(shù)據(jù)表的命令,主要包括設(shè)置樣本量和添加變量,形式上以add開頭

  將Stata數(shù)據(jù)轉(zhuǎn)化為Python數(shù)據(jù)的命令,形式上以get開頭

  將Python數(shù)據(jù)轉(zhuǎn)化為Stata數(shù)據(jù)的命令,形式上以store或set開頭

  其他命令,比如刪除變量、處理異常、管理內(nèi)存等

  第4類命令其實很奇怪,我們完全不需要使用sfi庫中的相關(guān)命令,轉(zhuǎn)換之后使用Stata或Python自帶的功能處理就好。因此,我們主要介紹前3類。

  2.2 add族

  當(dāng)你希望將Python數(shù)據(jù)集轉(zhuǎn)換為Stata數(shù)據(jù)集時,這一步非常重要。因為此時,Stata內(nèi)存中什么也沒有,沒有數(shù)據(jù)、沒有變量、甚至沒有工作表;因此我們需要先告訴Stata,從Python轉(zhuǎn)過來的數(shù)據(jù)集有怎樣的“長”和“寬”,Stata才能準(zhǔn)確接納該數(shù)據(jù)集。

  假設(shè)我們使用tushare庫獲取了浦發(fā)銀行的日線行情數(shù)據(jù),我們必須先確定要將多長、多寬的數(shù)據(jù)放入Stata;本例中,我們希望放入全部的樣本(索引)和2個變量(trade_date/close),確定工作表大小的代碼如下:

. python
----------------------------------------------- python (type end to exit) ---------------
>>> import tushare as ts
>>> tsToken = 'f***7'
>>> pro = ts.pro_api(tsToken)
>>> df = pro.daily(ts_code='600000.SH')
>>> df.shape
(4000, 11)
>>> end

  我們通過數(shù)據(jù)框的shape屬性了解到df數(shù)據(jù)框中有4000行(樣本)和11列(變量),根據(jù)我們的要求,最終進入Stata的是一個4000×2的數(shù)據(jù)集。接下來,我們就可以通過addObs和addVar*命令新建行列。

. python
----------------------------------------------- python (type end to exit) ---------------
>>> from sfi import Data       # 引入sfi.Data
>>> Data.addObs(len(df))       # 創(chuàng)建與df行數(shù)一致的樣本量
>>> Data.addVarStrL('Date')    # 創(chuàng)建字符串變量Date
>>> Data.addVarFloat('Price')  # 創(chuàng)建浮點型變量Price
>>> end
-----------------------------------------------------------------------------------------

  打開數(shù)據(jù)編輯器,我們會看到工作表中已經(jīng)有兩個變量和4000行了,其中Date是空格,Price是缺失值符號.。其實,這兩步完全可以在Stata環(huán)境下完成,使用Python環(huán)境的優(yōu)勢在于我們有l(wèi)en函數(shù)可以確定df數(shù)據(jù)框的樣本量,這是一個動態(tài)過程。

  2.3 store族

  確定了工作表的長寬后,我們就可以使用store命令將Python數(shù)據(jù)存入Stata中。本例中,我們將df數(shù)據(jù)框中的trade_date列存入Stata的Date列,將df數(shù)據(jù)框中的close列存入Stata的Price列;操作如下:

. python
----------------------------------------------- python (type end to exit) ---------------
>>> Data.store('Date',None,df['trade_date'])
>>> Data.store('Price',None,df['close'])
>>> end
-----------------------------------------------------------------------------------------

  我們來了解一下store命令的參數(shù)。store命令的形式為store(var, obs, val[, selectvar])。參數(shù)var表示目標(biāo)列名稱,可以是數(shù)值/字符串/列表/None;參數(shù)obs表示樣本量,可以是數(shù)值/列表/None,None列示全部樣本;參數(shù)val表示待存入的數(shù)據(jù),要求是數(shù)組。selectvar是一個可選參數(shù),默認(rèn)為None,表示對存入變量的選取。需要特別注意的是obs選項,因為沒有缺省值,我們不能省略None。

  2.4 get族

  get族命令用于Python讀取Stata數(shù)據(jù)(和一些非數(shù)據(jù)內(nèi)容)。根據(jù)讀取的數(shù)據(jù)類型差異,我們分成Data、Scalar、Matrix和Macro這4種主要類型來講:

  Data.get和Data.getAsDict

  因為Python是動態(tài)類型語言,因此不需要先確定數(shù)據(jù)的存儲類型和名稱。以讀取auto數(shù)據(jù)集為例:

. python
----------------------------------------------- python (type end to exit) ---------------
>>> from sfi import Data
>>> lst = Data.get('price weight length')        # 列表形式
>>> lst[0]
[4099, 2930, 186]
>>> dct = Data.getAsDict('price weight length')  # 字典形式
>>> import pandas as pd
>>> df = pd.DataFrame(dct)                       # 轉(zhuǎn)化為數(shù)據(jù)框
>>> df.head(1)
   price  weight  length
0   4099    2930     186
>>> end
-----------------------------------------------------------------------------------------

  get命令提取出的數(shù)據(jù)是列表形式,丟失了列標(biāo)簽;getAsDict命令提取出的數(shù)據(jù)是字典形式,保留了列標(biāo)簽(鍵)。我個人建議使用后者,并及時保存為數(shù)據(jù)框格式。此外,當(dāng)我們只需要數(shù)據(jù)集中的單個值時,可以使用Data.getAt命令,該命令通過變量參數(shù)和索引參數(shù)確定唯一的位置并提取對應(yīng)元素。

  Scalar.getValue和Scalar.getString

  除了數(shù)據(jù)集外,我們還會在Stata中使用一些“單值”,比如常數(shù)、結(jié)果、參數(shù)值等等。我們使用sfi.Scalar模塊來讀取這些內(nèi)容。舉例如下:

. scalar s = "I Love You."
. display s
I Love You.
. quietly regress price weight length
. display e(r2)
.34756307

. python
----------------------------------------------- python (type end to exit) ---------------
>>> from sfi import Scalar
>>> Scalar.getString('s')     # 提取字符串
'I Love You.'
>>> Scalar.getValue('e(r2)')  # 提取數(shù)值
0.3475630724239044
>>> end
-----------------------------------------------------------------------------------------

  當(dāng)我們需要重復(fù)使用Stata命令時,Python迭代可能比Stata自己的循環(huán)效率更高,提取并記錄單值就顯得格外重要。

  Matrix.get

  當(dāng)數(shù)據(jù)結(jié)果為矩陣時,我們使用Matrix.get命令實現(xiàn)提取。舉例如下:(接上例回歸結(jié)果)

. matrix list e(b)
e(b)[1,3]
        weight      length       _cons
y1   4.6990649  -97.960312   10386.541

. python
----------------------------------------------- python (type end to exit) ---------------
>>> from sfi import Matrix
>>> Matrix.get('e(b)')
[[4.699064878412987, -97.9603118181582, 10386.540540844977]]
>>> end
----------------------------------------------------------------------------------------- 

  單使用Matrix.get命令會丟失矩陣的行列名稱,因此Stata還提供了Matrix.getColNames和Matrix.getRowNames來提取行列名稱。與Data.getAt類似,我們也可以通過Matrix.getAt命令提取矩陣中的單個元素,注意該命令的參數(shù)有3個,分別是矩陣名、行和列。

  Macro.getLocal和Macro.getGlobal

  在Stata中,Macro被稱為“宏”,分為局部宏(local)和全局宏(global)兩種;宏名稱在細(xì)分類中不能重復(fù),但局部宏和全局宏的名稱可以相同(實際上只是命名時相同,存儲時并不同)。同樣,我們可以通過Macro.getLocal和Macro.getGlobal獲取宏。舉例如下:

. local x 1 1
. display `x'
2

. python
----------------------------------------------- python (type end to exit) ---------------
>>> from sfi import Macro
>>> Macro.getLocal('x')          # 切記:宏是即用即解的
'1 1'
>>> Macro.getGlobal('e(model)')  # ereturn的宏是全局宏
'ols'
>>> end
-----------------------------------------------------------------------------------------

3 小結(jié)

  正如上文所言,我們的最終目的是將Python的方法封裝到Stata程序中,或者將Stata的命令封裝到Python函數(shù)中。當(dāng)我們實現(xiàn)了數(shù)據(jù)類型的轉(zhuǎn)換后,封裝命令就一點也不難了。

  但以我剛接觸的感受來講,Stata16的SFI真的非常蠢,寫到這里我竟一時間不知道如何解釋下去:

  變量的長度不能自適應(yīng),我們必須先通過set obs或addobs來確定樣本量

  Python的數(shù)據(jù)框(來自pandas)和Stata的數(shù)據(jù)集之間不能直接轉(zhuǎn)換

  變量要先創(chuàng)建再填充,目標(biāo)數(shù)據(jù)類型需要手動設(shè)置,缺少獲取變量名稱列表的函數(shù)

  缺少獲取數(shù)字-文字對照表的函數(shù),也沒有提取全部命令結(jié)果(包括圖形命令結(jié)果)的函數(shù)

  特別地,如果我們希望將Stata數(shù)據(jù)集完整的讀入Python或反過來,我個人建議使用Excel工作表作中介。效率上差一點,但節(jié)約很多代碼。舉例如下:

. python // Stata-> Python
----------------------------------------------- python (type end to exit) ---------------
>>> import pandas as pd
>>> stata: sysuse auto.dta
(1978 Automobile Data)
>>> stata: export excel price weight length using "D:\auto.xlsx" if rep78!=., firstrow(variables) replace
>>> df = pd.read_excel(r'd:\auto.xlsx',header=0)
>>> df.head(1)
   price  weight  length
0   4099    2930     186
>>> end
-----------------------------------------------------------------------------------------

. python // Python -> Stata
----------------------------------------------- python (type end to exit) ---------------
>>> import tushare as ts
>>> import pandas as pd
>>> tsToken = 'f***7'
>>> pro = ts.pro_api(tsToken)
>>> df = pro.daily(ts_code='600000.SH')
>>> df.to_excel(r'd:\quotes.xlsx',header=True,index=False)
>>> stata: import excel "D:\quotes.xlsx", sheet("Sheet1") firstrow
(11 vars, 4,000 obs)
>>> end

-----------------------------------------------------------------------------------------

文章作者: 金融系程老師(微信公眾號)


  最后,啟發(fā)大家去讀一讀SFI的手冊,我留下了set族命令沒有介紹。這是一類在Python中設(shè)定Stata單值、暫元、矩陣等元素的命令,使用方法和get族非常類似,希望同學(xué)們有空去了解一下。

  在這愉快悠長假期里,小伙伴們興高采烈的旅游、聚會、逛街、訪學(xué)、曬娃、美食,并享受其中,還沒有安排適當(dāng)?shù)膶W(xué)習(xí)計劃吧!趁著假期的尾巴,想不想來一場光速學(xué)習(xí)充電之旅呢!

  第三屆Stata用戶大會 & Stata夏季訓(xùn)練營震撼來襲,頂配雙男神|2 1模式,2019現(xiàn)場直擊全程八天(含會議)Stata魔鬼訓(xùn)練營(機器學(xué)習(xí) 計量方法應(yīng)用)。相約上海財經(jīng)大學(xué)不見不散,感興趣的小伙伴一起加入吧!


【Stata專欄】如何在Stata16中調(diào)用Python


點擊進入北京友萬信息科技有限公司展臺查看更多 來源:教育裝備采購網(wǎng) 作者:Uone-Tech 責(zé)任編輯:張肖 我要投稿
校體購終極頁

相關(guān)閱讀

版權(quán)與免責(zé)聲明:

① 凡本網(wǎng)注明"來源:教育裝備采購網(wǎng)"的所有作品,版權(quán)均屬于教育裝備采購網(wǎng),未經(jīng)本網(wǎng)授權(quán)不得轉(zhuǎn)載、摘編或利用其它方式使用。已獲本網(wǎng)授權(quán)的作品,應(yīng)在授權(quán)范圍內(nèi)使用,并注明"來源:教育裝備采購網(wǎng)"。違者本網(wǎng)將追究相關(guān)法律責(zé)任。

② 本網(wǎng)凡注明"來源:XXX(非本網(wǎng))"的作品,均轉(zhuǎn)載自其它媒體,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點和對其真實性負(fù)責(zé),且不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。如其他媒體、網(wǎng)站或個人從本網(wǎng)下載使用,必須保留本網(wǎng)注明的"稿件來源",并自負(fù)版權(quán)等法律責(zé)任。

③ 如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起兩周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

校體購產(chǎn)品