致谢: 本文摘自以下文章,特此感谢! Source: Chuck Huber, 2020, Stata/Python integration part 8: Using the Stata Function Interface to copy data from Stata to Python, -Link-
Stata/Python 交互系列推文 源自 Stata 公司的统计项目总监 Chuck Huber 博士发表于 Stata 官网的系列博文,一共 9 篇。较为系统地介绍了 Stata 与 Python 的交互方式,包括:如何配置你的软件、如何实现 Stata 与 Python 数据集互通、如何调用 Python 工具包、如何进行机器学习分析等。
Part 1: Setting up Stata to use Python -Link-
Part 2: Three ways to use Python in Stata -Link-
Part 3: How to install Python packages -Link-
Part 4: How to use Python packages-Link-
Part 5: Three-dimensional surface plots of marginal predictions-Link-
Part 6: Working with APIs and JSON data -Link-
Part 7: Machine learning with support vector machines, -Link-
Part 8: Using the Stata Function Interface to copy data from Stata to Python, -Link-
Part 9: Using the Stata Function Interface to copy data from Python to Stata, -Link-
中文编译稿列表如下:
Stata-Python交互-9:将python数据导入Stata
Stata-Python交互-8:将Stata数据导入Python
Stata-Python交互-7:在Stata中实现机器学习-支持向量机
Stata-Python交互-6:调用APIs和JSON数据
Stata-Python交互-5:边际效应三维立体图示
Stata-Python交互-4:如何调用Python宏包
Stata-Python交互-3:如何安装Python宏包
Stata-Python交互-2:在Stata中调用Python的三种方式
Stata-Python交互-1:二者配合的基本设定
目录
1. 在 Stata 中调用 python
2. 使用 sfi 模块读取 Stata 数据
3. 将数据转换为数据框或字典
4. 将 Stata 数据集完全复制
5. 结论
6. 参考资料
7. 附:文中使用的 dofile
8. 相关推文
Stata16 已开发了与 python 交互的功能,本小节我们将介绍如何在 Stata 中调用 python,将 Stata 的数据导入至 python 中。我们熟悉的读取 Stata 数据的 python 命令是pd.read_stata,但本小节我们主要介绍Stata Function Interface(SFI)的模块以导入部分变量或部分观测,从而实现更灵活的 Stata 数据导入。
. set python_userpath C:\Users\Chuck\MyPythonModules\
完成以上设置后,我们就可以在 Stata 中调用 python 了!每次我们只需要在 Stata 的命令框中输入python就可以完成调用,在 Stata 中运行 python 代码,运行后我们只需输入end就可以结束调用。
. python ------------------------------ python (type end to exit) ------ >>> print("Hello Stata, I am Python") Hello Stata, I am Python >>> end ---------------------------------------------------------------
2. 使用 sfi 模块读取 Stata 数据
当我们在 Stata 调用 python 后,我们可能需要在 python 代码中使用到 Stata 的数据集,我们除了可以使用pandas模块中自带的pd.read_stata()函数外,我们还可以使用sfi模块进行更多的操作,我们首先需要在 python 终端安装 sfi模块,即在终端中输入conda install sfi。
完成安装后,我们可以在 Stata 中进行试验,我们以 Stata 自带的美国 1978 年的汽车数据为例,譬如我们想要选取foreign、mpg、rep78变量,我们只导入前十行观测值,我们可以使用如下命令。
我们也可以不对 Stata 数据集进行任何操作,将所有变量不作任何处理导入到 python 中,我们可以使用如下代码进行操作。
clear sysuse auto python from sfi import Data import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np dataraw=Data.getAsDict(None,None,None,valuelabel=False,missingval=np.nan) dataframe=pd.DataFrame(dataraw) dataframe.head() plt.figure(figsize=(9,9)) corr = dataframe.corr() ax = sns.heatmap(corr,annot=True,vmax=1,square=True,cmap="Reds") bottom,top = ax.get_ylim() ax.set_ylim(bottom+0.5,top-0.5) plt.show() end
变量相关性热力图
5. 结论
Stata 与 python 交互使我们可以在同一个软件中实现不同软件的操作,从而使我们处理数据与分析增添了更多的可能,本小节介绍的 Stata 中调用 python 并使用sfi.Data()导入 Stata 数据仅是两种软件交互功能实现的一隅,我们可以查看 python 的sfi文档来了解这一模块的更多功能。总之,Stata 与 python 的交互可以博采众长,我们在学习的道路中也需要拓宽眼界,集众软件之长处,从而为科研学习的路上增添实践利器。
6. 参考资料
Chuck Huber, 2020, Stata/Python integration part 8: Stata/Python integration part 8: Using the Stata Function Interface to copy data from Stata to Python, -Link-
郭李鹏,连享会推文,Stata 交互:Python-与-Stata-对比.
7. 附:文中使用的 dofile
////////////推文:使用Stata Function Interface导入stata数据 ///////python与stata交互,stata16与python交互,可以使用python的数据使用stata处理、或者stata数据由python绘图 ///////读取sfi module自带数据foreign clear sysuse auto python from sfi import Data dataraw=Data.get('foreign') dataraw end
///////读取sfi module自带数据foreign的46-56观测值、mpg、rep78 python from sfi import Data dataraw=Data.get('foreign mpg rep78',range(0,10)) dataraw end
///////定义indicator变量 generate touse = mpg<20 python from sfi import Data dataraw=Data.get('foreign mpg rep78',range(46,56),"touse") dataraw end
//////指定标签 python from sfi import Data dataraw=Data.get('foreign mpg rep78',range(46,56),"touse",valuelabel=True) dataraw end
/////处理缺失值 python from sfi import Data import numpy as np dataraw=Data.get('foreign mpg rep78',range(0,10),"touse",valuelabel=True,missingval=np.nan) dataraw end
/////转换数据格式为DataFrame python from sfi import Data import numpy as np import pandas as pd dataraw=Data.get('foreign mpg rep78',range(0,10),"touse",valuelabel=True,missingval=np.nan) dataframe=pd.DataFrame(dataraw,columns=['foreign','mpg','rep78'],index=[np.arange(1,len(dataraw)+1)]) dataframe end
//////转换数据为dictionary格式 python from sfi import Data import pandas as pd import numpy as np dataraw=Data.getAsDict('foreign mpg rep78',range(0,10),"touse",valuelabel=True,missingval=np.nan) dataraw #obs = len(next(iter(dataraw.values()))) + 1 obs = len(dataraw.values())+1 dataframe = pd.DataFrame(dataraw,index=[np.arange(1, obs)]) dataframe end
/////不做任何处理 sysuse "auto.dta", clear python from sfi import Data import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np dataraw=Data.getAsDict(None,None,None,valuelabel=False,missingval=np.nan) dataframe=pd.DataFrame(dataraw) dataframe plt.figure(figsize=(9,9)) corr = dataframe.corr() ax = sns.heatmap(corr,annot=True,vmax=1,square=True,cmap="Reds") bottom,top = ax.get_ylim() ax.set_ylim(bottom+0.5,top-0.5) plt.show() end