浅谈使用python处理数据的日常经验
本文作者:张学人
文字编辑:张梦婷
技术总编:张学人
好消息!!!爬虫俱乐部将于2018年11月30日至2018年12月2日在武汉举行Stata编程技术培训。本次培训主要面向财务、会计和金融专业高校教师、硕博生,课程均是采用财务金融领域的案例,旨在帮助财务金融领域的研究者熟悉Stata数据分析技巧,能够通过编程读取不同类型的数据源、实现复杂数据合并、清洗的程序化,通过简单的程序构造复杂的财务金融指标。详细培训大纲及报名方式,请点击文末阅读原文呦~
当一名Python学习者决定要将自己平常的研究工作转移到Python上处理时,转移的成本其实并没有那么地高,这要归功于Python确实是一门用户极端友好型语言,但当我们持续工作一段时间后,我们在文件管理、代码复用方面就会产生许多问题。今天我们用一篇专题来聊一聊如何改善工作中的文件管理等琐碎问题。
请注意,本篇推文更关注的是“人”的问题,而非“工具”的问题。也许你正孜孜不倦地寻找可用的管理工具,但请相信,最好的管理工具就是你自己的良好惯。
1.文件管理
在研究工作中,搜集形形色色的数据、整理再合并是一项日常操作,在如何保存数据文件上,有的人倾向于注重保存每一个时点的数据,以方便当需要调整数据时,可以快速寻回任一时间点的原始数据。但如果你保存数据文件的习惯是扔在一个专门的文件夹里胡乱防着的时候,麻烦就来了,请看示例:
- TFPraw.dta
- TFPtrans2single.dta
- TFPresult0909.dta
- getTFP.py
- balabala...
这个示例是一个典型的工作时产生的数据集列表,它是怎么产生的呢?我们稍微想象一下这个数据保存的那个傍晚:你整理好了一个很宝贵的实验数据,但它还没有转换成回归所需要的那个形式,你考虑到形式转换后,会不可避免损失掉一些信息,如果后期做稳健性检验,可能会用得到,所以...我们保存这个中间文件吧!于是你灵光一闪构思了一个形象的文件名:`数据项名称` + `raw`, 以表示这是一个原始数据。你认为在以后的生活中,一看到这个文件名就能反应到它是什么。过了一周,你将这个原始数据变成了一个回归可用的数据项,但仍旧很不幸,转换出来的形式是一个特例,换句话说,你可以通过`TFPraw.dta`将数据转成另一个形式。数据的形态犹如一棵盘根错节的大树,分岔越来越多,你已经预感到将来会保存更多的关于TFP的各种形态的数据集,但后面的事情后面再说,你将这个数据命名为了`TFPtran2single.dta`,它表明你将TFP数据转换成了`single`这个形态,这可能是一个你当时自认为非常形象的标志词,一语道破这个数据形态的全部特征。再后来,你发现保存的数据形态越来越多,本着忠实存档的初衷,你为它们一一命名,但词汇总有用尽的一天,又或者某两个数据本身就很贴近,于是文件名中开始出现日期,如`0909`,中文名,如`(已剔除A类)`,甚至开始出现语气词,如`修订版`。如果到现在为止,则事情只能称得上琐碎,似乎并没有很糟。但保存文件总是为了使用它,当你未来某天要直接复用某一项数据时,你看到了林林总总各式各样的数据集,它们形态很近但又不同,你想直接找一个能用的,想来想去,于是决定回到脚本源码中(或者do文档中)去看看当时这个数据是如何生成的。以便考虑是不是能用它。但倘若你没有保存生成该数据的代码,那么这个数据集就像是断了枝条的叶子,你再也无法(无心)使用它了。
应对方法
1. 建立数据说明文档,串联起每一个中间态文件
每当我们新保存一个数据集,我们务必要做到一件看似麻烦,其实非常关键的事情:为这个数据集埋下足够多的“锚点”,让以后的自己可以迅速想起这个数据的所有关键特征。数据说明文档就是一个很好的主意,通过一个文本文档,记录每一个数据文件的特征(例如该文件是否经过某一处理,含有哪些关键变量),每当自己过后再次使用它时,则先浏览数据文档,确定是否需要对原数据集做更改。更好的办法是写一个数据生成的即时脚本,对于Stata而言,是书写一个do文件,这个do文件含有从原始数据到成品数据的全部整理、清洗代码。这个方法对于处于数据探索阶段的工作特别适用,因为该阶段往往数据集会频繁更改。
2. 规定统一的命名方法
除了为每一个数据集书写说明文档,在文件命名上也不要太过于随意,我们可以使用较为流行的驼峰命名法来命名文件,也可以直接在文件名书写该数据的主要特征,例如`CoffeeShopIn-latlng-year-shopid.dta`说明了该数据是一个关于咖啡店的数据,其中包含了shopid、经纬度以及年份等变量,可能对于外人来说,这仍旧不够清楚,但既然这个数据是你自己整理的,也足够你明白它是个什么玩意了,当然,这样的命名法,会导致文件名过长,不利于快速理解。
3. 最后的忠告
如果你在为文件起名时,一个英文单词想不起来,不要用一个过于简单的英文代替,更不要用拼音代替,用中文吧,这没什么可耻的,只要能让自己的脑袋清晰起来,用火星文笔者都支持你。
2.代码复用
在我们学习Python等编程语言的时候,不止一次被强调`代码可复用`的重要性,但是在实际coding的过程里,新手并不能很好地遵守这一理念,导致代码体量巨大,臃肿难读,这是因为我们在coding过程中并未站在全局角度考虑问题,仅仅是线性完成当前工作,当任务出现分岔时却不对原线路的部分代码进行抽离复用,而是直接重头再来,时间一久,代码就会臃肿且没有逻辑接。代码复用率低是一种什么样的现象呢?
1. 一个函数只能用一次,或者只固定在一个地方被使用,最令人尴尬的新手代码就像主函数是一个流水账,其中顺序排列着若干子函数,这样的代码可能在容错性上存在着相当大的隐患。
2. 当工程量大时,存在若干功能大致相似的函数,它们本来可以被合成一个函数进行使用,却被分割成若干函数。
3. 代码存在过多的简单的流程控制语句,如if..else,或者try...except,这并不是说它们不该存在,而是说它们本身应当可以是被优良的程序逻辑规避的,当大量出现时,说明程序逻辑存在着相当的问题。
应对方法
1. 对新函数审慎创立
它是否与代码其他部分低耦合且高频率调用,也就是说,函数所完成的部分之于整体更像是一个API,主函数从这个函数中获得所需要的结果,但又不与函数内的代码产生过多的依赖。足够满足这两点特征的部分代码,才适合单独成为一个子函数抽离出整体。
2. 常写注释
与创立数据文件类似,当定义新函数时,我们应当勤写注释,多写注释,用以尽量描述函数。
有问题,不要怕!访问
http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~
爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。