查看原文
其他

软件应用丨经济学专业学习Python之数据处理工具大集合

Dyson 数据Seminar 2021-06-03


有意栽花花不发,无心插柳柳成荫。


大家有没有这种经历:我要的数据,永远都不是我想要的样子

写论文的时候,想要的数据永远都是费尽心机弄到手,然后还需一顿精雕细琢才能够使用。我们公众号推过一篇根据企业注册地址数据,清理企业所在县级行政规划的代码的文章忘了的小伙伴可以点这里复习

如果你是对数据要求不高的人,那就可以简单通过企业注册地址是否包含“某个城市或县市区名”来确定企业所在地。但细想起来,可能并不是这么简单:

 

比如我们要筛选注册在宁波的所有企业,需要检索“宁波”而不是“宁波市”,为什么呢?因为就是有人填写地址的时候不把这个“市”字填进去。

如果这个还是小问题可以克服,那么你又会发现其他一些情况不容许你这么简单就解决问题,比如,我们杭州市拱墅区有一条路叫做“宁波路”。这就彻底意味着,你在企业注册地址中检索到“宁波”二字未必意味着这家企业就在宁波。

所以,数据处理环节稍有不慎就可能犯下大错,而正确的数据预处理能避免数据有漏甚至完全错误,将直接决定后续研究项目的成败
那么,如果要用Python来处理这些需要做清洗才能用于研究的数据,到底需要学习哪些知识呢




1. 数据处理工具



1.1 字符串处理

Python中的字符串包含了很多方法,以下是几个常用的操作字符串的方法。

切片处理:切片即截取字符串中指定位置的几个字符,使用方括号[]来完成。

替换字符:替换字符串中的某个字符为指定字符时使用replace()。

移除空格:移除字符串首尾空格,直接使用strip()、lstrip()、rstrip();移除字符串中间的空格可以使用replace替换为空字符。

拆分字符串:将一个字符串拆分为多个字符串时,可以使用split(),按照某个字符进行拆分。

定位字符:想要确定某个字符在字符串中位置的时候,可以使用find()。

…………

Python字符串的方法有很多,掌握这些方法,基本就能满足所有的处理字符串的工作。



1.2 正则表达式

正则表达式是一套非常成熟、全能的文本匹配规则,是进阶数据处理的必经之路。很多高大上的文本处理包的源码中都有正则表达式的影子,例如json包(图一)、jieba分词(图二)。

图一

图二
但是,就跟Python里很多使用简单的包一样,正则表达式有个致命的缺陷就是工作效率相对较低。所以,能用Python其他内置函数的情况下,尽量不要选用正则表达式。
正则表达式的语法比较简单,一般勤动手动脑的话,一个下午就可以入门。但是要将其真正与业务相结合,就得充分发挥自己的想象力才行。为什么这么说呢,因为写正则表达式,其实是一个找文本规律的活,也就是将你找到的规律用计算机看得懂的方式(即正则表达式)告诉计算机。这一步在技术上并不难,难在找出一个精确有逻辑的规律。依然是文章开头的例子,我们不能告诉计算机“请找出地址在宁波市的企业”,这里的“宁波市”并不是一种规律,而“包含‘宁波’”这样的规律又不够精确。
关于如何使用正则表达式来解决这个问题,请参考我们关于企业注册地县码清洗的推文(再次提醒小伙伴们可以点这里复习嗷~)。


1.3 Pandas

Pandas是基于numpy(Python中用于科学计算的包)的一种工具,该工具是为了解决数据分析任务而制作出来的的。由于在做数据分析之前,也会需要做一些常规的数据处理。例如常规的去重、空值处理等等,在Pandas中都可以“一键完成”。加之其方方正正的二维数据表格模式,所以Pandas也可以用来做一些数据的预处理。

由于本公众号已有不少用到Pandas的文章,所以这里不再具体展开了(但是可以在公众号内发送暗语“Pandas”进行复习喔~)。总之,用过的人都说好。



1.4 编码


在Python2中,中文编码问题是众多Python程序员的痛。Python3将默认编码统一为了Unicode,极大地增加了Python对中文的兼容性,降低了我们遇到编码BUG的概率。
了解计算机中字符串的存储方式,有利于我们处理不同来源的数据。例如,Stata 14以前,都是用的latin-1编码方式。如果我们不了解编码,就几乎不可能使用Python从.dta文件中读出中文数据。

引自企研数据内部培训资料

部分原文:

https://blog.csdn.net/csywwx2008/article/details/17137097

主流的编码有以下几种:

ASCII:American Standard Code for Information Interchange,用来表示英文,它使用1个字节表示,其中第一位规定为0,其他7位存储数据,一共可以表示128个字符。(Python2的默认编码格式)

GBK/GB2312/GB18030:表示汉字。GBK/GB2312表示简体中文,GB18030表示繁体中文。(GB2312 是对 ASCII 的中文扩展;GBK 兼容ASCII ,兼容 GB2312,是GB2312的扩展 )

Unicode:包含世界上所有的字符,占2个字节,是一个字符集。同一个Unicode 码,在不同的语言中表示不同的字符,由其他软件根据语言环境来进一步转换。(又称统一码、万国码、单一码)

UTF-8:8-bit Unicode Transformation Format,即通用转换格式,是Unicode字符的实现方式之一。它是可变长短的 ,从英文字母的一个字节,到中文的通常的三个字节,再到某些生僻字的六个字节。更多的,他兼容了老大哥ASCII编码,在一些古老的软件上也能用。(Python3的默认编码格式)

一言以蔽之:Unicode是内存编码表示方案(是规范),而UTF是如何存储和传输Unicode的方案(是实现)这也是UTF与Unicode的区别。


图三是Python3中的编码转换方式:

图三

图片来自https://www.cnblogs.com/shengxinjack/p/7735729.html



1.5 存储过程


科普园地 /Science Park

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

——百度百科

存储过程与Python无关,他属于数据库编程,但是可以通过Python调用。
数据库的存储过程与数据库函数,是很多数据公司清洗数据的主要方式。他们不需要各种复杂函数支持,只需要完成一系列的去重、缺失值处理、格式转换、简单的逻辑纠错即可。由于Python处理数据库中的数据,是需要先读出来,处理完了以后再写回去,这个过程会浪费大量的时间。加之用作数据存储的服务器数据处理能力也比一般的台式机或者虚拟机高,所以这类情况可以优先考虑使用数据库的存储过程来完成一部分我们计划近期出一篇有关于数据存储的文章,敬请关注!甚至全部的数据清洗。




2. 效率提升工具



2.1 算法

算法比较抽象,我这里以三个函数为例:

import timelist0 = list(range(2,20000)) * 2 + [1]
def singleNumber1(nums): gen = filter(lambda num0: nums.count(num0)==1, nums) return next(gen)
def singleNumber2(nums): dict0 = {} for num0 in nums: if num0 in dict0: dict0.pop(num0) else: dict0[num0]=1 return list(dict0.keys())[0]
def singleNumber3(nums): output = 0 for num0 in nums: output = output^num0 return output

左右滑动查看更多

这是LeetCode(国外著名刷编程题目的网站)上的一道题。大意是——

 

我有一大堆的数字,除了某一个以外,其他的都是成双成对出现的。请找出这个单独的数字。

就我代码里这个特例而言,2到20000之间每个数字各两个,只有一个1。以上三种算法中,第一种需要17秒(因为存在大量重复工作),第二种0.00398秒,第三种0.00199秒(用到了比较专业的“位运算”)。
所以,优秀的数据处理算法,能极大增加代码效率,已经越超“事半功倍”这种程度了。



2.2 多线程与多进程

若我们需要将一批上亿吨材料通过铁路运输到另一个城市,我们怎么能够在最短时间内完成呢?
关于多线程,举个例子说明,如果我们用火车运材料,为了最大化利用每一辆火车的动力,会尽可能多配备车厢,一次尽可能多运输材料。
然后,由于每条铁路能承载的火车数量有限,我们可以征用其他铁路来完成这次运输。这就是多进程。
多线程和多进程都是操作系统层次上的概念,总体来说:
  • 计算密集型的项目,适合多进程;
  • IO密集型(可以理解为读写频繁的那种)的项目,适合多线程。
了解这些概念,可以充分利用计算机的硬件资源,从而缩短开发周期,更快完成任务。
在Python中,我们使用threading和multiprocessing来实现多线程与多进程。




3. 结语


以上介绍的工具比较适合规模不是特别大的数据集。如果要处理的数据量动辄PB级(1拍字节(pb)=1024太字节(tb)),则已经不是Python或一台计算机能够有效处理的了。好在现在大数据技术已经逐渐成熟,我们也可以利用hadoop集群等更加强大的工具来提升数据处理效率(目前hadoop已经支持Python调用)。此外,数据处理的工具方面,我们团队也有在尝试使用机器学习来处理一些长文本数据,取得了一定的成效。未来有机会再跟大家交流。

总之,数据处理并没有一种常规的套路,需要我们勤思考、多总结。套路选取的标准就是精确、实用、高效,也不必迷信于所谓的前沿。我们可以利用一些比较前沿的技术辅助修正数据逻辑,也可以使用爬虫从另一个数据源找来数据填补空值,这些都取决于实战的需要。










►一周热文

数据呈现丨小白学数据可视化:一个ggplot2画图完整实例

老姚专栏丨均值回复及其对实证研究的启示

数据呈现丨R语言做多变量可视化分析?

统计计量丨工具变量法(二): 弱工具变量

数据呈现丨R语言机器学习中数据可视化的杀手锏

数据资源丨划重点 ! 经济学专业学习Python之爬虫篇

统计计量丨古老而神秘的因子分析(二)






数据Seminar

这里是大数据、分析技术与学术研究的三叉路口


作者:Dyson审阅:杨奇明、江东(刘良东)编辑:青酱







    欢迎扫描👇二维码添加关注    


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

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