sas sql 读取最后一行数据_Python 与 Stata 配合批量转换数据

d59a36384afdbdae2d1c2c0754dc048c.png
作者:胡国恒 (武汉大学社会保障中心)
Stata 连享会: 知乎 | 简书 | 码云 | CSDN | StataChina公众号
连享会最新专题直播

057536505f8ea478854f18035b357e24.png
提要: 数据处理过程中,研究者常会遇到收集的数据与预期采用的工具不匹配问题。目前,常用的方式是 Datatransfer 等数据格式转换器,通过导入及导出实现数据格式的转换,缺点是软件收费以及当代转换的数据多时,耗时耗力。鉴于此,本文借助于 python 以及 python 与 Stata 相结合的方法提出两种可实现批量数据格式快速转换的方案。

方案一:python 批量转换数据格式

思路 1

首先借助于 python 中 os 库实现对电脑存储下的文件进行调用和处理,生成文件的路径。其次,借助于 python 中强大的 pandas 库读取文件路径( pandas 支持 Stata、SAS、CSV、JSON、SQL 等 15 中常见的数据格式)。最后,借助 pandas 将读取的文件存储为研究者想要的格式即可。

具体介绍 1

python 中 os 是常见的路径操作的模块,可实现对系统下文件的读取、写入以及创建文件等多种操作。本文用到的是 os.listdir(path='.') ,该函数可实现提取路径 (path) 下所有文件的文件名(此处的文件名包括数据格式),并将其作为列表储存。获得路径下所有文件的文件名后,借助 for 循环列表将文件名依次取出并与路径相结合形成具体文件的路径,以便后续 pandas 的读取。文件路径的合并采用的函数是 os.path.join(path,*paths) ,该函数可智能的连接一个或多个路径组件。形成具体文件路径后,借助 pandas 读取,可依据文件格式选择 pandas 的 os tool 中的读存方式即可(多种格式数据的读存方式见下图 1 )。

c64c927eb8d3626d878a7b64cd0fce8d.png

图片来源: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html

案例 1

作者收集数据为 CHNS ,该数据原版数据为 SAS 格式。笔者长期采用的数据分析软件为 Stata ,需将 SAS 数据转换为Stata数据,格式由 sas7bdat 转换为 dta 。按照具体介绍,作者预先设置 FindPath 为原SAS数据存储的路径,然后借助 listdir() 查询路径下所有文件名,并将其返回列表 FileNames 存储。其次,遍历 FileNames ,提取 FindPath 路径下每一文件名与 FindPath 路径连接。合成具体文件的路径fullfilename 后,开始借助 pandas 进行读取,因原文件是 sas7bdat 格式,故采用 read_sas() ,预转换格式为 dta ,所有存储方式为 .to_stata() 。在存储过程中本文用到了切片,原因在于 listdir() 提取的 filename 是包括文件名的格式的,因此在存储时要把原文件名的后缀格式去除,因 .sas7bdat 是 9 位数,所以切片为 [:-9] 。另外在保存数据过程中,如不设置,默认保存,如需设置,可在保存时加入保存路径即可。

上述方案的优点是执行速度快,免去手动拖拽的麻烦与时间消耗。作者实践 49 个 SAS 转 Stata 文件仅需数秒。缺点是原文件中对数据名的标签会丢失,针对比较熟悉的数据,可忽略此缺陷。针对此缺点,目前作者尚未寻找 python 的解决办法。

具体代码如下:

import pandas as pd 
import os
FindPath = 'C:/Users/nuonu/Desktop/abc/'  #python中路径表示与常规路径不同
FileNames = os.listdir(FindPath)   #返回指定路径下的文件和文件夹列表
for file_name in FileNames:
    fullfilename=os.path.join(FindPath,file_name)    
    df=pd.read_sas(fullfilename)
    df.to_stata(file_name[:-9]+'.dta') #切片是为了去除原格式(.sas7bdat)

借鉴链接: @ 小_小_杨_ os 库pandas库

借鉴内容: @小小杨:某文件夹下所有文件名的提取。 OS 库与 pandas 库的命令操作语法。

缺陷:原文件中的 label 信息会丢失

保存路径也可自行设置,如:

df.to_stata('C:/Users/nuonu/Desktop/Stata/'+file_name[:-9]+'.dta')

方案二: python 和 Stata 联合转换数据格式

思路 2

鉴于方法 1 数据转换中无法保存数据名 label 的现实问题,作者发现 Stata16 中可导入 Excel、SPSS、SAS、CSV 等多种格式文件,并且能有效保存数据的 label 。因此,笔者想到可借助 python 批量产生 Stata 导入和导出数据的命令,然后放入 Stata 的 do_file 中 ctrl+D 执行,以期实现数据的转换与 label 的保存。

具体介绍 2

因具体介绍 1 中已介绍 OS 模块中 listdir() 的功能,故不在赘述。importsave 是 Stata 中导入和导出的命令,常规的命令规范是 import sas [using] filename ,其中 sas 表示的是数据文件,如果导入是 excel 则替换为 excelfilename 是要导入的文件名。导入后,存储为 Stata 数据时,可直接 save,replace 或指定路径进行存储。如果需存储为其他数据格式,可使用 export 格式,目前支持 SAS、CSV 等格式。导出命令举例: export delimited using "H:a.csv", replacedelimited 是需要导出的数据文件类型 H: 为存储路径,a 为文件名称。

案例 2

与案例 1 目的一致,仍是 SAS 转 Stata 数据。因需导入 Stata 进行数据转换,考虑到 Stata 与 python 绝对路径表达方式的不同,故采用转义符 表示, 生成结果时,会只保留一个 。如案例 1 ,先设置文件夹路径 FindPath 。其次,借助 listdir() 查询文件夹中文件名,返回列表。接着,将未添加文件绝对路径的导入命令 import sas using "C:UsersnuonuDesktopSAS 赋值为 a ,将未添加文件保存路径save "C:UsersnuonuDesktopStata 赋值为 b 。最后,遍历循环文件名并分别与 a,并加闭合双引号和 ,clear 形成文件导入文件绝对路径;将 b 与去除文件格式后的遍历文件名相加,并加预保存的文件格式名与闭合双引号。可运行程序,即可形成可放入 Stata 中执行的命令,如图 3 。

具体操作如下:

import os
FindPath = 'C:UsersnuonuDesktopSAS'
FileNames = os.listdir(FindPath)   #返回指定路径下的文件和文件夹列表
for file_name in FileNames:
    a='import sas using "C:UsersnuonuDesktopSAS'
    b='save "C:UsersnuonuDesktopStata'
    print(a+file_name+'"',',clear') 
    print(b+file_name[:-9]+'.dta'+'"')

借鉴链接: @ 小_小_杨_ os 库pandas库

借鉴内容: @小小杨:某文件夹下所有文件名的提取。OS 库与 pandas 库的命令操作语法。

执行后结果如图:

7578b8458ba86037b4d95653666ba055.png

将执行结果 copy 后,放入 do 文档;注意:在执行 do 文档时,先导入一次 SAS 文件,目的是让 Stata 设置 import 的默认路径;否则会报错。

f3ad3aa3403caadeffd07b5c5da2af5c.png

Ctrl+D 执行;即可;结果如下图:

a35fa904ef3a2682e24a4f17f818c1d0.png

总结

上述两种办法皆是基于 python 实现的数据转换。方案一是以 python 为基础,借助 pandas 对数据的读存进行转换。其优点是读存速度快,几行代码一站式解决数据转换;缺点是数据原有 label 会消失,导致数据分析时存在变量识别障碍。方案二是以 python+ Stata 为基础,借助 python 生成 Stata 命令,在 Stata 中执行。其优点是数据保存完整;缺点是耗时长,须命令腾挪。二者的共同之处是不同数据的转换只需变化 python 中的数据格式即可。

参考资料:

  1. https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html
  2. https://docs.python.org/3/library/os.html?highlight=listdir#os.listdir
  3. https://blog.csdn.net/u012235274/article/details/51315214
关于我们
  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 欢迎赐稿: 欢迎赐稿至StataChina@163.com。录用稿件达 三篇 以上,即可 免费 获得一期 Stata 现场培训资格。
  • 往期精彩推文: Stata绘图 | 时间序列+面板数据 | Stata资源 | 数据处理+程序 | 回归分析-交乘项-内生性
  • 连享会最新专题直播

c01d12997fba90c9ff62399833d043bf.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据分析,数据科学及AI算法是当前最热门的职业。这些职业有着共同的特点:面向数字的,针对编程的以及采取分析手段的。 这些当代热点特性使得在就业市场上对以上职位需求激增也就不足为奇了。但是,市场上提供这方面的大型综合的培训课程是有限,如果说有,大多是知识范围狭窄且非综合性的,而且大多培训都缺乏方法论与实务结合。一般的情况是讲师讲述某种语言的一堆代码,学生听完后甚至连使用方法及代码的前提都不清楚,更别提实际应用场景了。这里,掌握一门数据分析软件本身没错,但仅通过单一的编程培训很难获得聘用为数据分析师或数据科学家所需的技能。那我的解决方案是什么呢?首先,我把所有数据分析中的典型问题都归类总结出来,再结合相应的实际问题,数据以及案例,同时采用世界上最流行的两种数据分析软件:PYTHONSAS去解决这些问题,并将这些解决方法传授给学生。学生在完成培训后更重要的收获是知道每一问题从产生直至解决的前因后果和应用场景,这是因为我在每一课程章节最前都会交代方法论,知识要点及应用场合。SASPYTHON可以一起学吗?当然可以。因为我就是这样做到的。具体步骤是,我在课程当中安排了一系列主题,然后使用两种编程语言解决同样的问题。我总结出这样做的好处是边学习边比较,最后在不知不觉当中掌握了两门语言的精华和数据分析的通用方法或模式。过程虽有点长,但十分有趣。最后,为了巩固已学的知识和技能,我还专门安排了针对PYTHONSAS的中小型项目及详细代码讲解。另外,课程当中使用的全部编程代码及数据文件都将免费地提供给注册的学生。
PythonStata都是数据分析领域常用的工具,它们各有优缺点,具体使用哪个要根据具体需求而定。下面是两者的比较: 1. 功能方面 Python是一门通用编程语言,可以用来进行数据分析、机器学习、Web开发等多种应用。Python有大量的数据分析库,如NumPy、Pandas、Scipy和Matplotlib等,还有一些强大的机器学习框架,如TensorFlow、Keras和PyTorch等。 Stata则是专业的统计分析软件,主要用于数据清洗、可视化和统计分析。Stata有丰富的数据操作和统计分析功能,特别擅长于面板数据分析和处理,也有一些可视化工具和机器学习功能。 2. 学习成本 Python作为一门通用编程语言,学习曲线相对较长,需要掌握基本的编程概念和语法,但是Python的社区非常活跃,有很多在线教程和课程,学习资源非常丰富。 Stata相对来说学习成本较低,因为它的语法比较简单明了,上手较快。同时Stata也有自己的官方文档和社区支持,可以帮助用户快速上手。 3. 数据处理速度 Python数据处理速度相对较慢,特别是在处理大规模数据时,需要使用一些优化技巧,如向量化和并行计算等。 Stata数据处理速度方面比较快,尤其是在数据清洗和面板数据分析方面表现出色。 综上所述,Python适合进行复杂的数据分析和机器学习任务,而Stata则适合进行简单的数据清洗和统计分析任务。但是,在实际应用中,两者也可以结合使用,根据具体需求选择不同的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值