Python与Stata交互——用Python写Stata代码(os模块的应用):以清洗NCDC数据为例

Python与Stata交互——用Python写Stata代码(os模块的应用):以清洗NCDC气象数据为例

  • 问题和基本思路
    • 问题
    • 基本思路
  • 代码和结果

Stata是计量经济学的最有名的软件,但是其自身存在一些缺陷,特别是,在清洗数据的时候,会显得比较笨重。此时,通过Python的os模块,可以自动生成Stata代码,从而提高效率。此文通过一个亲身经历的案例来对此进行说明。

问题和基本思路

问题

在用Stata清洗数据的时候,往往会碰到如下问题:

  1. 原始数据文件不一定是Stata所能识别的文件类型
    这需要利用Python将Stata不可识别的文件类型转成其可识别的文件类型。我遇到的情况是,原始数据文件没有后缀,这使得该文件类型显示为“文件”。这种没有后缀名的文件,可以用记事本打开,但是无法用Stata进行读取。这时候需要给各个文件加上后缀。加后缀的工作可以手动,但是往往会因为问题2而望而却步。
  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代码如下:

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交互——用Python写Stata代码(os模块的应用):以清洗NCDC数据为例_第1张图片

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

你可能感兴趣的:(笔记,os,python,csv,数据分析)