用Python写Stata代码(os模块的应用)
- 问题和基本思路
- 问题
- 基本思路
- 代码和结果
Stata是计量经济学的最有名的软件,但是其自身存在一些缺陷,特别是,在清洗数据的时候,会显得比较笨重。此时,通过Python的os模块,可以自动生成Stata代码,从而提高效率。此文通过一个亲身经历的案例来对此进行说明。
问题和基本思路
问题
在用Stata清洗数据的时候,往往会碰到如下问题:
- 原始数据文件不一定是Stata所能识别的文件类型
这需要利用Python将Stata不可识别的文件类型转成其可识别的文件类型。我遇到的情况是,原始数据文件没有后缀,这使得该文件类型显示为“文件”。这种没有后缀名的文件,可以用记事本打开,但是无法用Stata进行读取。这时候需要给各个文件加上后缀。加后缀的工作可以手动,但是往往会因为问题2而望而却步。 - 原始数据分散在不同的文件夹、一个文件夹里有多个原始数据文件
我清洗的数据,原始数据散落在47个文件夹,而且每个文件夹里面有几百个原始数据文件。虽然Stata有强大的循环语句,但是需要提前定义循环所用的“域”(比如,从1到10循环)。如果散落在各个文件夹中的数据文件的名称统一的或存在一定规律,那么可以直接手动把这个“域”用global定义出来。然而,散落在每文件夹中的数据文件名称并不统一。因此,这个时候并不适合手动,而需要求助其他工具。Python的os模块可以找出目录下的文件夹的名称以及文件的名称,并可以对其进行重命名等操作,因此,我们可以借助它来自动生成Stata代码(关键是生成“域”)。
基本思路
对于每一个文件夹里的数据集,需要先给它们加上后缀,然后进行如下的Stata里的循环代码:
1 2 3 4 5 6 7 8 9 10 11 12 | cd "文件夹的路径" global sites a b c ... [循环域里面所有元素] foreach i of global sites { import delimited `i'.csv, encoding(Big5) clear gen site=`i' save `i'.dta, replace } foreach i of global sites { append using `i'.dta } duplicates drop site v1, force save "保存目录\保存文件名", replace |
这里的关键是找到[循环域里面所有元素],即每个文件夹里面的所有数据文件的名称。
代码和结果
给文件加上后缀(这里加的是.csv)和生成Stata代码的Python代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import os path = "路径" f = open("clean.txt", "w") # 打开txt,开始在里面写Stata代码 dict_year = os.listdir(path) # 路径下的所有文件夹及文件名(我清洗数据的时候,目录下只有文件夹) print(dict_year) # 下面的代码对路径下每个文件中的数据文件进行操作 for item in dict_year: f.write('\n\ncd "路径\%s"' % item) f.write("\nglobal sites ") files = os.listdir("路径\" + item) print(files) # 无后缀文件转为csv for i in files: f.write(i[0:6] + " ") if i[-3:] != "csv": os.rename(path + "\" + item + "\" + i, path + "\" + item + "\" + i + ".csv") f.write("\n") f.write( "foreach i of global sites {\n import delimited `i'-99999-%s.csv, encoding(Big5) clear\n" " gen site=`i'\n save `i'-99999-%s.dta, replace\n}\n" % (item[-4:],item[-4:]) ) f.write( "foreach i of global sites {\n append using `i'-99999-%s.dta\n}\n" % item[-4:] ) f.write('duplicates drop site v1, force\nsave "保存路径\china_isd_lite_%s.dta", replace' % item[-4:]) f.close() |
最终得到了一个写好了Stata代码的txt文件,将txt内容复制到do文档就可以用Stata运行了。最终得到的Stata代码有600+行。下图是生成的Stata代码的一小部分:

如果手动敲,需要敲到猴年马月,而且还不一定能敲对这个巨大的循环“域”。用Python写Stata代码又快又准确,为繁琐的数据清理工作带来了一丝曙光~~