社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Stata-Python交互:将Stata数据导入Python

连享会 • 2 月前 • 160 次点击  

👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:2024 政策优化和机制分析专题
主讲老师:杨海生 (中山大学)
课程时间:2024 年 8 月 8-10 日 (三天)
授课地点:西安 · 西北工业大学 (线下授课)

本期课程为大家提供了一些进行政策评价的新视角和新工具。我们不再满足于验证政策是否有效,还可以分析政策的作用机制、政策公平性和政策的可迁移性等,以便让政策分析更有弹性和深度。核心内容如下:

  • 政策的作用机制:如何检验和分析?
    • 逐步检验法 | 双重纠偏 Lasso | 敏感性分析
    • 因果路径分析 | 连续型中介变量 | 多重中介检验
    • 渠道相关性检验 | 中介渠道相对重要性分析
  • 政策优化和政策公平性
    • 当前政策如何优化?政策学习 | 政策迁移学习
    • 如何兼顾效率和公平性?
    • 政策绩效评估:基于多臂 Qini 曲线
    • 基于网络的政策学习:溢出效应和同伴效应
  • 分析工具:DID 分析的新范式
    • 纽曼正交框架下的 DID
    • 匹配框架下的 DID
    • 多期 DID:假设条件和检验方法

作者:吕卓阳(厦门大学)
E-Mail:lvzy20@163.com

致谢: 本文摘自以下文章,特此感谢!
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 数据导入。

1. 在 Stata 中调用 python

我们首先简单介绍一下如何在 Stata 中调用 python,首先,我们需要在电脑上安装 python,我们建议初学者安装 anaconda,这是一个 python 的集成环境,大部分包已包含在内,对于初学者而言使用起来十分便捷,我们可以在anaconda 的官网上进行下载。其次,我们需要查找 python 的位置,我们可以使用python search这一命令来查找。

. python search
---------------------------------------------------------------
 Python environments found:
 C:\Users\Chuck\AppData\Local\Programs\Python\Python38\python.exe
 C:\Users\Chuck\anaconda3\python.exe
---------------------------------------------------------------

其次,我们可以使用python_exec设置 Stata 中调用的 python 路径。

. set python_exec C:\Users\Chuck\AppData\Local\Programs\Python\Python38\
> python.exe

此外,我们可以使用set python_userpath来调用 python 的其他路径,譬如个人的 python 模块的文件夹。

. 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 年的汽车数据为例,譬如我们想要选取foreignmpgrep78变量,我们只导入前十行观测值,我们可以使用如下命令。

. python
------------------------------ python (type end to exit) ------
>>> from sfi import Data
>>> dataraw=Data.get('foreign mpg rep78',range(0,10))
>>> dataraw
[[0223], [0173], [0228.98846567431158e+307], [0203], [0154], [018
> , 3], [0268.98846567431158e+307], [0203], [0163], [0193]]
>>> end
---------------------------------------------------------------

我们同样可以定义新变量touse来筛选数据,也可以使用valuelabel这一参数来定义是否显示标签,此外,我们注意到存在缺失值8.98846567431158e+307的情况,我们可以使用missingval这一参数来处理缺失值,使其显示为np.nan

. generate touse = mpg<20

. python
------------------------------ python (type end to exit) -------------
>>> from sfi import Data
>>> import numpy as np
>>> dataraw=Data.get('foreign mpg rep78',range(0,10),"touse",valuelabel=True,missingval
> =np.nan)
>>> dataraw
[['Domestic'173], ['Domestic'154], ['Domestic'183], ['Domestic'163], ['
> Domestic'
193]]
>>> end
----------------------------------------------------------------------

3. 将数据转换为数据框或字典

将 Stata 数据导入 python 后,我们接下来可以将其转换为 python 中常见的数据格式,譬如数据框和字典格式,我们可以使用pd.DataFrame()函数或Data.getAsDict函数来进行数据转换。

> python
------------------------------ python (type end to exit) -------------
>>> 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
    foreign  mpg  rep78
1  Domestic   17      3
2  Domestic   15       4
3  Domestic   18      3
4  Domestic   16      3
5  Domestic   19      3
>>> end
----------------------------------------------------------------------

我们可以使用getAsDict()将 Stata 数据复制到 python 字典中,我们可以创建以 1 开头长度为字典的值观测值长度的 index,我们使用next()iter()来遍历字典的值,从而获取字典值观测值的长度作为 index。

> python
------------------------------ python (type end to exit) -------------
>>> from sfi import Data
>>> import pandas as pd
>>> import numpy as np
>>> dataraw=Data.getAsDict('foreign mpg rep78',range(0,10),"touse",valuelabel=True,miss
> ingval=np.nan)
>>> dataraw
{'foreign': ['Domestic''Domestic''Domestic''Domestic''Domestic'], 'mpg': [171
5181619], 'rep78': [34333]}
>>> obs = len(next(iter(dataraw.values()))) + 1
>>> dataframe = pd.DataFrame(dataraw,index=[np.arange(1, obs)])
>>> dataframe
    foreign  mpg  rep78
1  Domestic   17      3
2  Domestic   15      4
3  Domestic   18      3
4  Domestic   16      3
5  Domestic   19      3
>>> end
----------------------------------------------------------------------

4. 将 Stata 数据集完全复制

我们也可以不对 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

8. 相关推文

Note:产生如下推文列表的命令为:
lianxh Stata Python +
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 专题:Stata入门
    • 使用 Jupyter Notebook 配置 Stata\Python\Julia\R
  • 专题:Stata程序
    • Stata程序:是否有类似-Python-中的-zip()-函数
  • 专题:文本分析-爬虫
    • VaR 风险价值: Stata 及 Python 实现
    • 支持向量机:Stata 和 Python 实现
  • 专题:Python-R-Matlab
    • Stata交互:Python-与-Stata-对比
    • Python+Stata:批量制作个性化结业证书
  • 专题:其它
    • ES 期望损失: Stata 及 Python 实现


🍓 课程推荐:2024 政策优化和机制分析专题
主讲老师:杨海生 (中山大学)
课程时间:2024 年 8 月 8-10 日 (三天)
授课地点:西安 · 西北工业大学 (线下授课)

New! Stata 搜索神器:lianxh 和 songbl GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
   . ssc install lianxh
  . ssc install songbl
👉 使用:
  . lianxh DID 倍分法
  . songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/172594
 
160 次点击