Stata是计量经济学的最有名的软件,但是其自身存在一些缺陷,特别是,在清洗数据的时候,会显得比较笨重。此时,通过Python的os模块,可以自动生成Stata代码,从而提高效率。此文通过一个亲身经历的案例来对此进行说明。
问题和基本思路
问题
在用Stata清洗数据的时候,往往会碰到如下问题:
- 原始数据文件不一定是Stata所能识别的文件类型
这需要利用Python将Stata不可识别的文件类型转成其可识别的文件类型。我遇到的情况是,原始数据文件没有后缀,这使得该文件类型显示为“文件”。这种没有后缀名的文件,可以用记事本打开,但是无法用Stata进行读取。这时候需要给各个文件加上后缀。加后缀的工作可以手动,但是往往会因为问题2而望而却步。 - 原始数据分散在不同的文件夹、一个文件夹里有多个原始数据文件
我清洗的数据,原始数据散落在47个文件夹,而且每个文件夹里面有几百个原始数据文件。虽然Stata有强大的循环语句,但是需要提前定义循环所用的“域”(比如,从1到10循环)。如果散落在各个文件夹中的数据文件的名称统一的或存在一定规律,那么可以直接手动把这个“域”用global定义出来。然而,散落在每文件夹中的数据文件名称并不统一。因此,这个时候并不适合手动,而需要求助其他工具。Python的os模块可以找出目录下的文件夹的名称以及文件的名称,并可以对其进行重命名等操作,因此,我们可以借助它来自动生成Stata代码(关键是生成“域”)。
基本思路
对于每一个文件夹里的数据集,需要先给它们加上后缀,然后进行如下的Stata里的循环代码:
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代码如下: