及吾无身

V1

2022/05/01阅读:288主题:自定义主题1

Stata17 新特性之 Pystata 的配置与应用



引言:每一门程序语言都有自己的特点,或者说有其擅长的领域,对于同一项工作的不同部分,如果我们能够合理搭配使用不同的程序语言或者软件,就可以极大提高我们的工作效率。从计量统计分析的角度来说,我们可以将这一项工作分为数据处理统计分析两个部分,在数据处理方面 Python 是一个不错的工具,而在统计分析方面使用 Stata 显然会更加方便,因此如果能够找到一个在二者之间进行交互的方法,将极大提高我们的数据分析效率。基于以上考虑,从 Stata16 以来,StataPython 的交互功能就开始日益完善,现在我们可以使用 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:

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

分类:

数学

标签:

数学建模

作者介绍

及吾无身
V1