传统的经济学研究处理的数据通常是统计数据或者调查数据,这些规模通常仅有M级的数据很容易存储,因此对于研究者来说,无论是用excel,还是Stata、SPSS等统计软件支持的格式进行存储,都不成问题。
然而,随着大规模微观数据和网络爬虫技术的普及,越来越多的学者开始接触G级,甚至数十、数百G的数据量。因此分析的工具也逐渐变成更擅长处理大数据的R、Python等“新贵”。进行数据处理和数据分析的前提是,必须要用合适的方法来存储数据。本文将告诉你,学习Python来处理(大)数据,需要学习哪些数据存储方面的知识?
这里提到的小规模,是指万级以下记录数的数据集,而且只有一两张表。这样的数据集一般不用Python也能轻松处理,例如用Excel处理xlsx、xls文件。而数据量再往上去的话,可能会有数据处理慢,甚至文件打开失败的情况。
xlsx、xls大家都是大家耳熟能详的文件格式了。而csv,大家可以理解为没有单元格格式的Excel文件,其数据类型只有“文本”。图一
例如图一就是一个标准的csv文件内部结构,每个数据都由逗号隔开,不同行的数据用换行符隔开。科普园地 /Science Park
一个文件中的内容里是没有换行这种概念的,都是一圈一圈的记录在磁盘上。我们看到的文章有换行,是因为文本阅读器帮我们将换行符“翻译”了过来
在Python下:
(1)对于csv格式的数据,用csv库或者pandas中的read_csv函数都能轻松处理;(2)对于xlsx、xls格式的数据,由于读写要用不同的库,xlrd、xlwt等等,比较麻烦,所以推荐使用pandas中的read_excel函数。
图二
json是 JavaScript Object Notation 的首字母缩写,单词的意思是“javascript对象表示法”。它是一种与语言无关的数据交换的格式。对象格式:{"key1":obj,"key2":obj,"key3":obj...}
数组/集合格式:[obj,obj,obj...]
(1)非常轻量,只有几个方括号和花括号会占用额外空间。(图二中的空格是为了展示方便,不是json中必须的符号)
(2)json能够无限拓展数据的关系层次,就像树状图,树的根部能无止境的分叉。这就很大程度解决了csv、xlsx这种只有行列两个维度的局限性,非常适合现在复杂关系的数据存储。在Python中,json格式的文件可以用json库或者pandas中的read_json来处理。作者推荐用json库,因为跟Python的基础数据结构无缝连接。
图三
yaml是一个对所有编程语言都很友好的数据序列化标准,其结构与json差不多。易读性比json要好,因为yaml中的分隔符是制表符、换行符、空格等,用文本编辑器打开就是图三中的样子。(不同的是,图三中的空格都是用来区分数据层次的,不是想去掉就能去掉的。)在Python中,yaml格式的文件可以用pyyaml来处理,转化为Python的基础数据结构。
如果你看过以前的文章,你肯定对html有印象,而xml跟html结构相同,只不过标签的命名等会更加自由而已。html即HyperText Markup Language,超文本标记语言。如果你是初学者,那么html你可以这么理解。所有<>内的东西,都只是“备注”而已。这些“备注”,本身就不是设计来给人看的,是给firefox,google chrome这样的浏览器看的。浏览器“看”了以后,才能正确地把数据以开发者想要的方式展现出来。而<>之间夹的文本,才是真正这个文件所保存的数据。
在Python中,处理html与xml的库很多,可以选择lxml、bs4等,也可以选择万能的正则表达式。他们的处理效率与编程难度成正比,为正则表达式 > lxml > bs4。bs4会将html解析为自身的一个soup对象,所以会浪费不少的时间,只推荐不打算深入学习Python的人使用。
由于使用文件存储数据读写效率极低,文件之间的关系无法有效保存,所以上世纪60年代后,数据库的概念慢慢的出现,从层次数据库、网状数据库,一直发现到如今的关系数据库,技术上已经非常成熟。
在Python中,已经有了一个异常强大的关系型数据库综合包,SQLalchemy。他能完美兼容所有主流的Python数据库包,并且提供了无需SQL语句的纯Python数据库处理框架(SQL语句是指专门用来操作数据库的语言)。但是学习难度比较大,初学者建议还是从SQL语句和以下的几个数据库入手。
SQLite,是一款轻型的嵌入式数据库,是遵守ACID的关系型数据库管理系统,目前已经发展到了SQLite3。他是安卓,IOS系统作为数据存储的首选(SQLite就是随着安卓的流行而流行起来的,它只占用几百KB的内容,功能不多却比其他大型数据库更加节约性能)。
有初学者在处理百万级的数据时也是保存在csv中,先用Python读进内存,然后处理。但这样会有两个主要问题:
(1)如果机器内存不够大,数据全部读取到内存,内存不够用,甚至虚拟内存都把硬盘占了一大半(如果处理数据时用到了虚拟内存,处理效率会极大的降低)。此时当然也可以考虑将数据分块处理,但是编程难度大大提高。
(2)如果涉及到两个表的匹配(如专利信息表和工商数据表),一个百万级数据,一个千万级的数据。都分块做匹配的话,麻烦而且很容易出错。 、如果机器内存不够大,数据全部读取到内存,内存不够用,甚至虚拟内存都把硬盘占了一大半(如果处理数据时用到了虚拟内存,处理效率会极大的降低)。此时当然也可以考虑将数据分块处理,但是编程难度大大提高。
更优的选择是,把所有的临时数据(例如几个处理过的数据集),都存到SQLite的db文件中。预览方便、转移方便、合并方便、读写也方便,一举多得。
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。他最大的优点就是功能完善且免费,兼容多个操作系统,兼容所有主流的编程语言。可以说是所有准备学习SQL数据库的朋友的首选。
在Python中,有多个库支持MySQL,例如pymysql、 mysql-connector-python、 MySQL-python。当然,需要会使用SQL语句才能正常使用。
Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系型数据库管理系统。可以说Oracle数据库系统是目前世界上最流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。Oracle的SQL语句是甲骨文公司自己开发的PL/SQL,除了SQL正式国际标准中的内容,甲骨文公司还另外加入不少自己开发的函数,学习成本略高但是更加方便使用(事实上绝大部分数据库都会有自己开发的函数)。由于Oralce对机器性能的消耗较多,所以不推荐在低配的电脑上安装(即使安装了,不用的时候也建议将Oracle的服务关掉,不然会有很明显的卡顿)。此外,企业版Oralce还会有专业的售后服务(MySQL被收购之后也有了,但需要另外花钱)。在Python中,Oracle公司专门开发了cx_oralce包,以供Python程序员使用。而cx_oralce包本身对其他的Oralce组件有依赖,所以最好使用pip来安装,避免不必要的麻烦。
NoSQL是对不同于传统的关系数据库的数据库管理系统的统称。
两者存在许多显著的不同点,其中最重要的是NoSQL不使用SQL作为查询语言。其数据存储可以不需要固定的表格模式,也经常会避免使用SQL的JOIN操作,一般有水平可扩展性的特征。当代典型的关系数据库在一些数据敏感的应用中表现了糟糕的性能,例如为巨量文档创建索引、高流量网站的网页服务,以及发送流式媒体。关系型数据库的典型实现主要被调整用于执行规模小而读写频繁,或者大批量极少写访问的事务。 NoSQL数据库在读写速度与扩展性方面深得人心,被广泛应用于大型网络爬虫、网站运维等领域。Python中已经有了不少第三方包对主流的NoSQL数据库提供了支持。——维基百科
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
什么是Key-Value?Python中的字典就是Key-Value数据结构。那么,为什么还需要redis呢?(1)单台机器,单进程的程序,确实不用Redis。但是,一个进程根本无法将计算机的所有性能发挥出来。更多的,我如果需要多台机器处理同一个需求,就更加麻烦了。所以一些临时的小数据,例如爬虫程序中获取到的网址,就可以存在Redis中(关系型数据库也可以,不过效率会有所降低,代码量也更多)。(2)有的人也会觉得,存在json里面不就好了?那么有个问题,怎么区分哪些数据是用过的。我们可以给用过的数据做标记,也可以删掉。但无论如何,我们都是在对这个json文件进行“写”操作。一个进程在“写”的时候,这个文件时被锁定的,其他进程就必须等待。这样同样也降低了效率。在Python中,有python-redis可以来操作redis来完成所需操作。
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。——菜鸟教程
MongoDB不是SQL数据库,但是如果你去了解过它与SQL数据库,就能发现很多SQL数据库的影子。MongoDB扩展功能极为强大,还原生支持分布式存储(就是在多台电脑上存同一批数据)。MongoDB所用的数据格式为Bson,一个json的衍生物,但是远远比json文件来的高效。其灵活多变的特性也能使用各种复杂维度的数据存储。云计算巨头亚马逊模仿MongoDB发布了自己的数据存储系统DocumentDB,可见MongoDB对数据存储市场的影响力。在Python中,可以通过pymongo来操作MongoDB来完成所需操作。
图四是今年10月份的各个数据库的使用情况,可见数据库三大头依然是关系型数据库。但非关系型数据库的势力已经不可小视。
图片来自于http://www.pc6.com/infoview/Article_184038.html
PS:我们最近发现有很多老师同学都在用微软的Access。若要使用Python调用Access,需要安装严格版本对应的Access Database Engine,并要会用Access的API或者ODBC,所以不推荐。若要使用图形化界面,可用Navicat + SQLite代替。
总结一下,随着Python的不断推广,越来越多的数据库开始支持Python。主流关系型数据库可以用SQLalchemy来统一管理,也可以单独调用对应的Python包,而非关系型数据库则需要各自编写各自的代码。
若要做好数据存储,学会各个数据库的语法、理解他们的工作模式才是重点。并且,特别是到了大型数据集(TB级以上),Python效率是不够看的,需要服务器集群来处理(例如Hadoop下的一些工具),要在数据库里做完一些基础的筛选合并再交给Python。
那么问题来了,为什么不用数据库完成所有需求呢?因为数据库不方便处理复杂的业务逻辑(存储过程也许能胜任,但是编程难度较大)。这时候就可以交给Python,通过软件之间的配合,将所有数据处理步骤联系起来,才能又好又快地完成我们的任务。
►一周热文
发布丨精准搜索我们公众号和文章
数据呈现丨划重点 ! 经济学学Python 需要学哪些内容?——数据可视化呈现必知必会的知识点
数据资源丨35个国内外社会科学数据网站资源汇总
统计计量丨工具变量法(三):IV真的外生吗?
软件应用丨经济学专业学习Python之数据处理工具大集合
统计计量丨古老而神秘的因子分析(三)
数据呈现 | 让文稿shinly起来!地图绘制
这里是大数据、分析技术与学术研究的三叉路口
作者:Dyson审阅:杨奇明、江东(刘良东)编辑:青酱