查看原文
其他

Stata与Python等价命令

连享会 连享会 2022-06-12

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

连享会 · 效率分析专题

作者:刘欣妍 (香港中文大学)
邮箱:liuxinyan@link.cuhk.edu.hk

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

编者按:本文主要参考自「Stata to Python Equivalents」,特此致谢!


目录

  • 1. 写在前面

  • 2. 数据导入与导出

  • 3. 样本选择

  • 4. 数据描述性统计

  • 5. 变量操作

  • 6. bysort 函数

  • 7. 面板数据

  • 8. 数据的合并

  • 9. reshape 命令

  • 10. 计量中常用命令

  • 11. 画图

  • 12. 缺失值以及浮动点

  • 13. 相关推文



1. 写在前面

在 Python 中编码与在 Stata 中编码有很多不同的。

首先,在 Stata 中,内存中有一个数据集。这个数据集是一个矩阵,每一列都是一个具有唯一名称的 “变量”,每一行都有一个数字 (特殊变量 _n)。Stata 中的所有东西都是围绕这个范式建立的。

对比来看,Python 是一种通用的编程语言,此时的 “变量” 不再只是一列数据。变量可以是任何东西,一个数字,一个矩阵,一个列表,一个字符串等等。Pandas 包有一种叫做 DataFrame 的数据格式,其作用很像 Stata 中的单一数据集。它是一个矩阵,每一列和每一行都有一个名字。

与 Stata 不同,DataFrame 本身就是一个变量,你可以同时处理任意数量的 DataFrame,也可以把 DataFrame 中的每一列看作是一个变量 (就像在 Stata 中一样)。当你引用一列时,你需要先指定 DataFrame,然后再进行引用。

2. 数据导入与导出

接下来,笔者将通过表格的形式对比 Stata 与 Python 在数据导入、导出中常用的命令,以及两者命令的相互替换。

StataPython
log using <file>Python 不像 Stata 那样自动显示结果。你必须明确地调用 print 函数。
因此使用 Jupyter 笔记本是最类似的形式。
help <command>help(<command>) or <command>?
cd some/other/directoryimport os
os.chdir('some/other/directory')
use my_fileimport pandas as pd
df = pd.read_stata('my_file.dta')
use var1 var2 using my_filedf = pd.read_stata('my_file.dta', columns=['var1', 'var2'])
import excel using <excelfile>df = pd.read_excel('<excelfile>')
import delimited using my_file.csvdf = pd.read_csv('my_file.csv')
save my_file, replacedf.to_stata('my_file.dta') OR
df.to_pickle('my_file.pkl')
outsheet using my_file.csv, commadf.to_csv('my_file.csv')
export excel using <excel_name>df.to_excel('<excel_name>')

3. 样本选择

这一模块介绍了 Stata 常用的样本选择代码,以及其对应的 Python 代码。

StataPython
keep if <condition>df = df[<condition>]
keep if a > 7df = df[df['a'] > 7]
drop if <condition>df = df[~(<condition>)]
keep if _n == 1df.first() OR
df.iloc[0, :] 这里需要注意的是,Python 是以 0 开始的索引语言。所以在计算列表和数组的元素时,我们需要从从 0 开始而不是 1。
keep if _n == _Ndf = df.last() OR
df = df.iloc[-1, :]
keep if _n == 7df = df.iloc[6, :] 记得 Python 是从 0 开始计算的
keep if _n <= 10df = df.iloc[:9, :]
keep vardf = df['var']
keep var1 var2df = df[['var1', 'var2']]
keep varstem*df = df.filter(like='varstem')
drop vardel df['var'] OR
df = df.drop('var', axis=1)
drop var1 var2df = df.drop(['var1', 'var2'], axis=1)
drop varstem*df = df.drop(df.filter(like='varstem*').columns, axis=1)

4. 数据描述性统计

StataPython
describedf.info()  OR
df.dtypes
describe vardf['var'].dtype
countdf.shape[0] OR
len(df).
count if <condition>df[<condition>].shape[0] OR
(<condition>).sum()
summ vardf['var'].describe()
summ var if <condition>df[<condition>]['var'].describe() OR
df.loc[<condition>, 'var'].describe()
summ var [aw = <weight>]目前来说,Python 中需要手动计算加权的汇总统计。Statsmodels 软件包中有需要的内容。
summ var, ddf['var'].describe() plus df['var'].quantile([.1, .25, .5, .75, .9])
tab vardf['var'].value_counts()
tab var1 var2pd.crosstab(df['var1'], df['var2'])
df.groupby(['var1', 'var2'])  
.size()  
.unstack('var2')
tab <var1> <var2>, summarize(<func>)df.groupby(['var1', 'var2'])  
.agg(<func>)  
.unstack('var2')

5. 变量操作

StataPython
gen newvar = <expression>df['newvar'] = <expression>
gen newvar = oldvar + 7df['newvar'] = df['oldvar'] + 7
gen newvar = <expression> if <condition>df.loc[<condition>, 'newvar'] = <expression>
与 Stata 一样,不满足条件的将变成缺失值
replace var = <expression> if <condition>df.loc[<condition>, 'var'] = <expression>
rename var newvardf = df.rename(columns={'var': 'newvar'})
inlist(var, <val1>, <val2>)df['var'].isin((<val1>, <val2>))
inrange(var, <val1>, <val2>)df['var'].between((<val1>, <val2>))
subinstr(<str>, " ", "_", .)df['var'].str.replace(' ', '_')
egen newvar = count(var)newvar = df['var'].notnull().sum()
egen <newvar> = max(var)<newvar> = df['var'].max()
egen <newvar> = mean(var)<newvar> = df['var'].mean()
egen <newvar> = total(var)<newvar> = df['var'].sum()
egen <newvar> = group(var1 var2)<newvar> = econtools.group_id(df, cols=['var1', 'var2])
egen newvar = <stat>(var), by(groupvar1 groupvar2)df['newvar'] = df.groupby(['groupvar1', 'groupvar2'])
['var'].transform('<stat>')
collapse (sd) var (median) var ///
(max) var (min) var ///,
by(groupvar1 groupvar2)
df.groupby(['groupvar1', 'groupvar2'])['var']
.agg(['std', 'median', 'min', 'max', 'sum'])
collapse (<stat>) var [iw = <weight>]目前来说,Python 中需要手动计算加权的汇总统计。
Statsmodels 软件包中有需要的内容。
collapse (mean) var1, var2, by(groupvar1 groupvar2)df.groupby(['groupvar1', 'groupvar2'])[['var1', 'var2']].mean()

6. bysort 函数

Stata 里的 bysortegen 命令可以在 Python 中使用 groupby.agggroupby.transform 进行转换。

StataPython
bys group_var1 group_var2: gen
group_sum = sum(var)
df['group_sum'] = df.groupby(['group_var1', 'group_var2'])['var'].transform('sum')
df['group_sum'] = df.groupby(['group_var1', 'group_var2'])['var'].transform(np.sum)
bys group_var1 group_var2 (sort_var):
keep if _n==1
1. df['group_sum'] = (df
   .sort_values(['group_var1', 'group_var2', 'sort_var1'])
  .drop_duplicates(['group_var1', 'group_var2'], keep='first'))
2. df['group_sum'] = (df
   .sort_values(['group_var1', 'group_var2', 'sort_var1'])
   .groupby(['var1', 'var2']).first())
bys group_var1 group_var2
(sort_var): keep if _n==j,其中 j 是任意数
df['group_sum'] = (df.sort_values(['group_var1', 'group_var2', 'sort_var1'])
   .groupby(['var1', 'var2']).apply(lambda x: x.iloc[j, :]))
bys group_var1 group_var2 (sort_var):
gen jth_val = var[j],其中 j 是任意数
df['jth_val'] = (df.sort_values(['group_var1', 'group_var2', 'sort_var1'])
   .groupby(['var1', 'var2'])['var'].transform(lambda x: x.iloc[j]))

7. 面板数据

在 Python 中没有直接与 Stata 的 tsset 一致的命令,但是你可以利用 Python 中的 Index 来解决这个问题。

StataPython
tsset panelvar timevardf = df.set_index(['panelvar', 'timevar'])
L.vardf['var'].shift()
L2.vardf['var'].shift(2)
F.vardf['var'].shift(-1)

8. 数据的合并

在 Python 中并不需要指名是一对一或者一对多,Pandas 会根据你要合并的变量是否是唯一来解决这个问题。

StataPython
append using <filename>df_joint = df1.append(df2)
merge 1:1 <vars> using <filename>df_joint = df1.join(df2) if <vars> are the DataFrames' indexes, or
df_joint = pd.merge(df1, df2, on=<vars>)

9. reshape 命令

Stata 里的 reshape 命令在 Python 中基本是通过采用 stackunstack 命令来解决。

StataPython
reshape <wide/long> <stubs>, i(<i_vars>) j(<j_var>)wide: df.unstack(<level>)
long: df.stack('j_var')
see also df.pivot

10. 计量中常用命令

StataPython
ttest var1, by(var2)from scipy.stats import ttest_ind
ttest_ind(array1, array2)
xi: i.varpd.get_dummies(df['var'])
i.var2#c.var1pd.get_dummies(df[var2]).multiply(df[var1])
reg yvar xvar if <condition>, rimport econtools.metrics as mt
results = mt.reg(df[<condition>], 'yvar', 'xvar', robust=True)
reg yvar xvar if <condition>, vce(cluster cluster_var)results = mt.reg(df[<condition>], 'yvar', 'xvar', cluster='cluster_var')
areg yvar xvar1 xvar2, absorb(fe_var)results = mt.reg(df, 'yvar', ['xvar1', 'xvar2'], fe_name='fe_var')
predict newvar, residnewvar = results.resid
predict newvar, xbnewvar = results.yhat
_b[var], _se[var]results.beta['var'], results.se['var']
test var1 var2results.Ftest(['var1', 'var2'])
test var1 var2, equalresults.Ftest(['var1', 'var2'], equal=True)
lincom var1 + var2econtools.metrics.f_test
ivreg2econtools.metrics.ivreg
outreg2econtools.outreg

11. 画图

StataPython
binscatterecontools.binscatter
maptile使用 Cartopy
coefplotax.scatter(results.beta.index, results.beta)
twoway scatter y_var x_vardf.scatter('x_var', 'y_var')
twoway scatter y_var x_var if <condition>df[<condition>].scatter(x_var, y_var)
twoway <connected/line/area/bar/rarea>推荐直接使用 matplotlibseaborn 函数

12. 缺失值以及浮动点

缺失值的不同:在 Python 中,缺失值是一个 “非数字” 的对象,并且用 np.nan 表示。在 Stata 中,缺失值 (.) 比每个数字都大,所以 10 < . 返回的结果为 True。在 Python 中,np.nan 从不等于任何东西。任何涉及 np.nan 的比较都是假的,甚至是 np.nan == np.nan。在 Python 中缺失值对应的代码有以下两种:

  • df[<varname>].isnull() 对每一行返回一个真或假的值;
  • df[<varname>].notnull()df[<varname>].isnull() 的补充集。

浮动点:在 Stata 中,十进制数字永远不等于任何东西,例如 3.0 == 3 是假的。在 Python 中,只要浮点误差在公差范围内,上述相等检查就会返回 True

13. 相关推文

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

  • 专题:数据分享
    • Python+Stata:如何获取中国气象历史数据
  • 专题:Stata入门
    • 使用 Jupyter Notebook 配置 Stata\Python\Julia\R
  • 专题:Stata教程
    • 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:二者配合的基本设定
  • 专题:Stata程序
    • Stata程序:是否有类似-Python-中的-zip()-函数

课程推荐:因果推断实用计量方法
主讲老师:丘嘉平教授
🍓 课程主页https://gitee.com/lianxh/YGqjp

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

🍏 关于我们

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


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存