及吾无身
2022/05/01阅读:288主题:自定义主题1
Stata17 新特性之 Pystata 的配置与应用

引言:每一门程序语言都有自己的特点,或者说有其擅长的领域,对于同一项工作的不同部分,如果我们能够合理搭配使用不同的程序语言或者软件,就可以极大提高我们的工作效率。从计量统计分析的角度来说,我们可以将这一项工作分为数据处理与统计分析两个部分,在数据处理方面 Python
是一个不错的工具,而在统计分析方面使用 Stata
显然会更加方便,因此如果能够找到一个在二者之间进行交互的方法,将极大提高我们的数据分析效率。基于以上考虑,从 Stata16
以来,Stata
与 Python
的交互功能就开始日益完善,现在我们可以使用 Stata17 中的 PyStata
来便捷地完成这一项工作。
目录:
1. PyStata 的基本介绍
1.1 PyStata 简介
PyStata 是 Stata17 中引入的一个新概念,它涵盖了所有 Stata 和 Python 的交互方式。事实上从 Stata16 开始,我们就可以在 Stata 中调用 Python 代码,并通过 Stata 函数接口( sfi 模块)实现 Python 与 Stata 核心功能的交互;但 Stata17 通过允许我们通过导入一个新的 Python 包(pystata)从一个独立的 Python 环境中调用 Stata ,这大大扩展二者的交互功能,使我们可以在基于或支持 IPython 内核的环境中(例如:Jupyter Notebook 、Jupyter Lab 、Spyder 、PyCharm 、VScode 等)更加方便地调用 Stata 和 Mata。
1.2 使用条件
ⅰ. 安装正版 Stata17 软件(必须具备有效的许可证,否则无法调用)
ⅱ. 拥有基于或支持 IPython 内核的 Python 环境(建议使用 Jupyter Lab 或 VScode)
1.3 配置步骤
-
step 01:在 Python 环境中安装 stata_setup 模块
# 安装stata_setup模块
pip install --upgrade --user stata_setup
-
step 02:在 Python 环境中导入 stata_setup 模块,并关联 Stata17
# 导入stata_setup模块
import stata_setup
# 通过stata_setup.config关联 Stata17(在选择项中填入 Stata17 的本地路径及版本类型)
stata_setup.config(r"D:\ProgramData\Stata17", "se")

2. PyStata 交互的实现方式
2.1 使用魔法指令实现交互
2.1.1 cell magic 基本指令
注意: cell magic 指令需要放在 cell 中的第一行才会生效
在一个 cell 的第一行输入魔法指令 %%stata
,接着在该 cell 中就可以直接运行 Stata 语句了
%%stata
sysuse auto, clear
list
2.1.2 line magic 基本指令
如果你只是想在某一行运行一个单独的 Stata 语句,而在其他行运行 Python 语句,那么就可以使用line magic 指令,只需在某一行输入魔法指令 %stata
,后面跟上想要运行的 Stata 语句即可。
%stata sysuse auto, clear
2.1.3 cell magic 指令的参数功能
2.1.3.1 -eret
、-ret
与 -sret
(可实现数据传递)
%%stata
magic 命令提供了几个参数,可用于控制 Stata 命令的执行以及在 Stata 和 Python 之间传递数据
例如:我们可以使用
-eret
、-ret
或-sret
参数将 Stata 运行结果中的e()
、r()
或s()
结果传递到 Python 变量中;但需要注意的是,此命令默认保存和传递的是 Stata 中最后一条命令的运行结果。
%%stata -eret myeret -ret myret -sret mysret
sysuse auto, clear
reg mpg price i.foreign
ds
# 上一条命令是指将 Stata 语句中的e()、r() 和 s()传递到 Python 变 myeret、myret和mysret中,我们可以输出一下这三个变量,看看获取到了哪些信息
myeret
myret
mysret

该指令默认获取和传递的数据将以字典列表的形式储存,我们可以指定索引直接调用其中的任意一项数据。
# 调用从 Stata 语句中获取到的运行结果
e_b = myeret['e(b)']
e_b

运用实例: 获取当前 Stata 所使用数据集中的所有变量名,然后通过stata.pdataframe_from_data()
函数将 Stata 数据集输出到 Python 中
%%stata -eret myeret -ret myret -sret mysret
ds
# 把stata数据集全部输出到pd.df
var_list = myret['r(varlist)']
df_stata=stata.pdataframe_from_data(var_list)
df_stata

2.1.3.2 -d
(加载外部数据到 Stata )
我们也可以通过指定 %%stata
magic 指令的 -d
参数,将 NumPy
数组或 pandas DataFrame
加载到 Stata 中,使其成为当前的工作数据集
注意:此数据集会替换当前 Stata 内存中的数据集,并在下一个cell中仍然可用
应用实例: 导入一个 df
数据集,并使用 Python 中的 df
数据集作为当前的 Stata 数据集。
# 导入一个外部数据到 Python 中
from sklearn import datasets
bos = datasets.load_boston()
boston = pd.DataFrame(bos.data)
boston.columns = bos.feature_names
boston['MEDV'] = bos.target
boston.head()
%%stata -d boston
describe

2.1.3.3 -f
(加载多个外部数据到 Stata 中的不同 Frame)
我们还可以通过指定 -f
参数一次将多个 NumPy
数组或 pandas DataFrame
加载到 Stata 中,这会将使得每个数组或 DataFrame
加载到 Stata 中的单独Frame
中
注意:此数据集会替换当前 Stata 内存中的数据集,并在下一个cell中仍然可用
应用实例:
CHAS0 = boston[boston['CHAS']==0]
CHAS1 = boston[boston['CHAS']==1]
CHAS0
CHAS0
%%stata -f CHAS0,CHAS1
frames dir
2.2 使用 pystata.stata
函数实现交互
# 导入 pystata.stata 模块
from pystata import stata
2.2.1 单行 stata 指令运算
stata.run('sysuse auto, clear')
2.2.2 多行 stata 指令运算
stata.run('''
summarize
reg mpg price i.foreign
ereturn list
''')
2.2.3 pystata.stata
中的交互函数
2.2.3.1 get_return()
、get_ereturn()
和 get_sreturn()
(参数传递)
可以使用 get_return()
、get_ereturn()
和 get_sreturn()
函数将 Stata 的 r()
、e()
和 s()
结果存储为 Python 中的字典。
应用实例:
stata.run('sysuse auto, clear')
myret = stata.get_return()
myeret = stata.get_ereturn()
mysret = stata.get_sreturn()
df_myeret = pd.DataFrame.from_dict(myeret,orient='index')
df_myret = pd.DataFrame.from_dict(myret,orient='index')
df_mysret = pd.DataFrame.from_dict(mysret,orient='index')
df_myeret
df_myret
df_mysret
2.2.3.2 stata.pdataframe_from_data()
(导出 Stata 当前数据集到 Python)
也可以使用 stata.pdataframe_from_data()
将 Stata 数据集作为 Numpy
数组或 pandas DataFrames
传递到 Python 中
应用实例:
stata.run('sysuse auto, clear')
# 1、默认传递当前 stata 所使用的整个数据集
myauto = stata.pdataframe_from_data()
myauto.head()
# 2、指定参数选择当前 stata 所使用数据集的子集
# 例如,我们可将变量 mpg 和 price 的前10个观测值存储到 pandas DataFrame 中
myauto1 = stata.pdataframe_from_data('mpg price', range(10))
myauto1
2.2.3.3 stata.pdataframe_to_data()
(加载外部数据到 Stata )
还可以使用 stata.pdataframe_to_data()
将数据从 Python 读取到 Stata 中,使其成为当前数据集或将其加载到 Stata 中的特定 Frame
中
应用实例:
将上面的 pd.df
数据集 myauto
加载到 Stata 中,使其成为当前数据集,并列出前三个观测值(此处参数 force=True
指的是在加载 Frame
之前清空 Stata 的当前内存)
stata.pdataframe_to_data(myauto, force=True)
stata.run('list in 1/3')
2.2.3.4 其他 pystata.stata
函数介绍
具体函数 | 功能 |
---|---|
run (cmd[, quietly, echo, inline]) |
运行一行或一组 Stata 命令。 |
nparray_to_data (arr[, prefix, force]) |
将 Numpy 数组加载到 Stata 的内存中,使其成为当前数据集。 |
pdataframe_to_data (df[, force]) |
将 pandas DataFrame 加载到 Stata 的内存中,使其成为当前数据集。 |
nparray_from_data ([var, obs, selectvar, …]) |
将当前 Stata 数据集中的值导出到 Numpy 数组中。 |
pdataframe_from_data ([var, obs, selectvar, …]) |
将当前 Stata 数据集中的值导出到 pandas DataFrame 。 |
nparray_to_frame (arr, stfr[, prefix, force]) |
将 Numpy 数组加载到 Stata 中的指定 Frame 中。 |
pdataframe_to_frame (df, stfr[, force]) |
将pandas DataFrame 加载到 Stata 中的指定Frame 中。 |
nparray_from_frame (stfr[, var, obs, …]) |
将值从 Stata Frame 中导出到 Numpy 数组中。 |
pdataframe_from_frame (stfr[, var, obs, …]) |
将值从Stata Frame 中导出到 pandas DataFrame 。 |
get_return () |
检索当前的 r() 结果并将其存储在 Python 字典中。 |
get_ereturn () |
检索当前的 e() 结果并将其存储在 Python 字典中。 |
get_sreturn () |
检索当前的 s() 结果并将其存储在 Python 字典中。 |
官方文档: https://www.stata.com/python/pystata/notebook/Quick%20Start0.html
2.3 Stata Function Interface(sfi)
简介
2.3.1 sfi
接口函数简介
sfi
模块允许用户将 Python 的功能与 Stata 的核心功能进行交互。该模块可以交互使用,也可以在 do
文件和 ado
文件中使用,在模块中,定义了 Class
用来访问 Stata 特征、当前数据集、Frame、日期和时间、宏、标量、矩阵、值标签、全局Mata矩阵、缺失值等。
Class Summary:
-
Characteristic (sfi.Characteristic) -
Data (sfi.Data) -
Datetime (sfi.Datetime) -
Frame (sfi.Frame) -
Macro (sfi.Macro) -
Mata (sfi.Mata) -
Matrix (sfi.Matrix) -
Missing (sfi.Missing) -
Platform (sfi.Platform) -
Preference (sfi.Preference) -
Scalar (sfi.Scalar) -
SFIToolkit (sfi.SFIToolkit) -
StrLConnector (sfi.StrLConnector) -
ValueLabel (sfi.ValueLabel)
Exception Summary:
官方文档: https://www.stata.com/python/api17/index.html
2.3.2 常用 sfi.Data
函数实示例
%stata sysuse auto, clear
price = Data.get(var='price')
price
price1 = pd.Series(price)
price1
Data.renameVar('mpg', 'MileagePerGallon')
%stata list
Data.dropVar("make")
%stata list
Data.keepVar("MileagePerGallon")
%stata list
作者介绍