查看原文
其他

使用Python接口读取CSMAR数据

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张学人,武汉大学经济与管理学院

本文编辑:王子一

技术总编:张馨月

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元
国泰安CSMAR数据库是中国目前规模最大、信息最精准全面的经济金融研究型数据库之一,是无数经管学者的研究数据来源。2020年12月8日,国泰安对已有数据做了维护升级,添加了使用STATA、R、Matlab获取CSMAR数据的接口方法,同时升级了Python数据接口。本文将对CSMAR的Python数据接口进行评测,力图帮助读者们使用这一接口完成数据获取工作。

安装

根据CSMAR官网文档指引(https://www.gtarsc.com/#/support/doc),CSMARAPI目前仅支持Windows系统。用户在使用接口前,有两个安装步骤需要执行。
第一,请先确认本地计算机安装了如下依赖
pip install urllib3pip install websocketpip install websocket_clientpip install prettytable
第二,下载CSMAR官网提供的Python第三方库(名为csmarapi)
官方下载包见链接:https://www.gtarsc.com/static/csmarapi.rar
需要说明的是,由于CSMAR并未将该第三方库上传至Pypi(Python软件包索引官网),因此无法通过pip install pkgname的方式下载。请大家以官网下载包为准。在下载完毕后,将压缩包中的内容放于csmarapi文件夹中,并将该文件夹放置于本地计算机python的site-package文件夹中。如果使用者的Python是通过Anaconda一起安装的,那么文件树结构如下:
Anaconda |-pip |-pkgs |-etc |-... |-Library |-libs |-Lib |-json |-... |-site-packages |-...(其它第三方库) |-csmarapi |-__pycache__ |-__init__.py |-config.ini |-CsmarService.py |-ReportUtil.py |-UrlUtil.py
完成上述步骤后,打开任意一个Python环境,输入import csmarapi,如果正常导入无报错,即说明安装成功。

获取账号

使用者通过Python接口调用CSMAR数据库时,需要使用有效的CSMAR账户,包含有正式的账户名与对应的密码。如果使用者平时使用的CSMAR账户是所在学校的机构账户,则可以通过CSMAR官网右上角的注册按钮,以学校邮箱为用户名,或者上传相应证明材料获得有效CSMAR账户。

获取基本信息

1.当用户使用相关接口时,首先引入相关库并创建会话对象。
from csmarapi.CsmarService import CsmarServicefrom csmarapi.ReportUtil import ReportUtilcsmar = CsmarService()
2.其次,输入你的用户名以及密码,以便获得相关数据库权限。
csmar.login('134*****383', 'g*****9')
3.我们可以通过getListDbs()查询已购买的数据库列表,返回值database为json格式数据,为使输出结果美观,我们可以通过ReportUtil函数将数据格式化输出(下同):
database = csmar.getListDbs()ReportUtil(database)
此时在控制台我们可以看到下表,表中的每一行均为数据库名称
+----------------------------------+------------+------------+| databaseName | startTime | endTime |+----------------------------------+------------+------------+| CSMAR 中国上市公司财务中报数据库 | 1900-01-01 | 2018-09-25 || CSMAR 中国上市公司财务季报数据库 | 1900-01-01 | 2018-09-25 || CSMAR 中国上市公司财务年报数据库 | 1900-01-01 | 2018-09-25 || EVA专题 | 1900-01-01 | 2018-09-25 || Fama-French因子 | 1900-01-01 | 2018-09-25 || 上市公司与子公司专利 | 1900-01-01 | 2018-09-25 || 上市公司人物特征 | 1900-01-01 | 2018-09-25 || 上市公司研发创新 | 1900-01-01 | 2018-09-25 || ............... | | 首次公开发行(A股) | 1800-10-01 | 2022-09-30 || 首次公开发行(B股) | 1800-10-01 | 2022-09-30 || 香港金融市场 | 1800-10-01 | 2022-09-30 || 黄金市场交易 | 1800-10-01 | 2022-09-30 |+----------------------------------+------------+------------+
4.我们可以通过getListTables(databaseName)查看数据库中的数据表,其中databaseName数据库名称数据库名称可从上一步骤获取。与此同理,我们还可以通过getListFields(tableName)查询某个数据表的字段信息。
5.在已知表名和字段的情形下,我们可以使用query函数查询数据,例如我们从IPO_Cobasic表中获取['Stkcd','Stknme','Regadd']三项字段,时间设定为2010-01-01到2012-12-31。
data = csmar.query(['Stkcd','Stknme','Regadd'], "", 'IPO_Cobasic','2010-01-01','2012-12-31')ReportUtil(data)
上述代码的第二项参数为条件参数(condition),使用类似SQL语句对观测值进行筛选,如"Stkcd='000001'",如果为空则表示查询全体数据。代码获得如下表格信息:
+--------+----------+------------------------------------------------------------------------------------+| Stkcd | Stknme | Regadd |+--------+----------+------------------------------------------------------------------------------------+| 300041 | 回天胶业 | 湖北省襄樊市国家高新技术开发区清河路33号 || 300037 | 新宙邦 | 深圳市龙岗区坪山沙坣同富裕工业区 || 300042 | 朗科科技 | 深圳市南山区高新区中国科技开发院孵化大楼六楼 || 300038 | 梅泰诺 | 北京市西城区新街口外大街28号主楼302室(德胜园区) || 300039 | 上海凯宝 | 上海市工业综合开发区沪杭公路1542号 || 300040 | 九洲电气 | 黑龙江省哈尔滨市南岗区哈平路162号 || 300043 | 星辉车模 | 汕头市澄海区广益街道登峰路广峰工业区14号厂房 |
| .....................................................................................................|| 300356 | 光一科技 | 江苏省南京市江宁经济技术开发区胜太路88号 |+--------+----------+------------------------------------------------------------------------------------+
6.如果我们想将数据下载为压缩包形式的文件,则可以使用getPackResultExt函数。
csmar.getPackResultExt(['Cuntrycd','Stkcd','Stknme','Conme'], "Stkcd like'3%'", 'TRD_Co','2010-01-01','2012-12-31')
当运行该语句时,控制台会弹出如下信息,从最后一句提示可以看到,压缩包文件生成在了c:\csmardata\zip\路径下。
Wed 09 Dec 2020 19:56:55 CsmarService.py INFO packaging return code:signCode=786320487244402688Wed 09 Dec 2020 19:56:55 CsmarService.py INFO downloading...
|▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇|100%
Wed 09 Dec 2020 19:56:57 CsmarService.py INFO Package successfully. File size is:5.8KBD:\Anaconda\lib\site-packages\urllib3\connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning)Wed 09 Dec 2020 19:56:57 CsmarService.py INFO Generate the local file path as :c:\csmardata\zip\786320487244402688.zip

将所获得数据转为DataFrame类型变量

在Python中进行数据分析,绕不开的有力工具即是pandas,但是目前国泰安的CSMAR接口仅提供json形式的数据,不过,我们使用DataFrame构造函数读入json字符串,即可直接获得DataFrame数据对象。以上一节第5点获取的信息为例,转变方法为:
import pandas as pdimport numpy as np
data = csmar.query(['Stkcd','Stknme','Regadd'], "Stkcd like'3%'", 'IPO_Cobasic','2010-01-01','2012-12-31')
df = pd.DataFrame(data)df.head()
显示结果为:
Regadd Stkcd Stknme0 湖北省襄樊市国家高新技术开发区清河路33号 300041 回天胶业1             深圳市龙岗区坪山沙坣同富裕工业区       300037    新宙邦2 深圳市南山区高新区中国科技开发院孵化大楼六楼 300042 朗科科技3 北京市西城区新街口外大街28号主楼302室(德胜园区) 300038 梅泰诺4          上海市工业综合开发区沪杭公路1542号        300039   上海凯宝

如何获知每个表及其字段

从上文中关于接口的基本信息介绍可知,如果我们需要查询一个具体的表的数据,那么一定需要事先知道表的英文名称与它含有的字段,而接口为我们提供了getListDbs()getListTables(databaseName)getListFields(tableName) 三个接口函数分别查看数据库以及字段的信息。那么,有没有其它获取这些信息的途径呢?
经笔者测试,getListDbs()所提供的数据库名称与CSMAR官网的操作页面并不完全相和,因此如果我们需要知道目前账户拥有的数据库,则只能使用接口函数查看。getListTables(databaseName)所显示的表名称亦为用户从CSMAR官网下载打包数据时获取的文件名称。因此用户可以查看以往自己下载的历史数据,即可知道所需要的数据的表名称。getListFields(tableName)所提供的表的字段可以直接从CSMAR官网相应的表的字段说明与样本数据选单中查看。如下图:




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
列表生成式|让你的代码简洁又美观
Stata中变量观测值的亲密伙伴——levelsof命令

爬虫俱乐部开发的命令更新及常见问题说明

Seminar | 道德培训真的有用吗?

网络爬虫入门之requests 库的基本使用——以亚马逊图书界面为例
reduce()函数和filter()函数闪亮登场
“环环”入扣之foreach命令

统计年鉴数据整理小技巧

Seminar | 作为飞行员,我比别的CEO多了什么?

利用TensorFlow构建前馈神经网络

推文合集(1)| Stata学习者必看的n篇推文!

Seminar | 诚信的价值

利用tushare获取股票数据及实现可视化

从Excel到Stata的“摆渡车”——import excel命令

光阴十载,见证了《经济研究》中的“高被引”

利用tushare获取股票数据

         在Python中实现Stata的stack功能

这些年,经管类C刊都在研究什么?

Seminar | 眼见为实吗?高管面部可信度、审计师任期与审计费用

Seminar | 恐怖袭击与CEO薪酬

代码补全,主题更换,Jupyter Notebook原来可以这样用?

关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

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

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