前沿科技创业的驱动者

Pandas中的链式方法

2016-09-01 10:53 阅读(141)    评论(0)   

链式方法是当前比较流行的一种语法规则。 在过去的几个版本中,我们已经提到了几个支持链式方法的函数:

  • assign (0.16.0): 用于往 DataFrame 中增加新变量(类似于 dplyr 中的 mutate 函数)
  • pipe (0.16.2): 用于包含用户自定义的链式方法
  • rename (0.18.0): 用于改变轴名称
  • Window methods (0.18): 利用类似于 groupby 的 API 接口调用 pd.rolling* 和 pd.expanding* 顶层函数的 NDFrame 方法。

本文将从一个简单的例子说起:

1.1png

1.2

2

我觉得链式方法的代码非常易读,但是有些人却并了解它。它并不像重嵌套函数那样循环调用参数,它的所有代码和流程都是自上而下运行的,这大大增强了代码的可读性。

我最喜欢的示例来自 Jeff Allen,比较以下这两段功能相同但风格迥异的代码:

3

4

对比上述两种风格的代码,你会发现即使你不知道 R 语言中管道符号 %>% 的功能,你也能很轻易地看懂第二段代码。而对于第一段代码而言,你需要弄清楚代码的执行顺序以及如何处理相应的函数参数。

作为读者,你可能会说你不会写出类似于重嵌套风格的代码,但是大多数情况下你的代码应该是如下所示:

5

我非常不喜欢这个风格的代码,因为我需要花费很多时间来思考如何对变量进行命名。这是非常令人困扰的事情,因为我们根本不关心 on_hill 这些中间变量。

上述代码的第四种实现方法是可行的,假设你拥有一个 JackAndJill 对象并且你可以自定义一些方法。那么你可以实现类似于 R 语言中的管道功能:

6

但是这种方法的问题在于如果的数据不是 ndarray 或者 DataFrame 或者 DataArray,那么上述的方法就不存在了。而且我们很难对 DataFrame 的子类进行拓展从而来适应自定义的方法。同时,你所创建的从 DataFrame 中继承的子类可能仅适用于你自己的代码,无法和其他方法进行交互操作,因此你的代码将会非常零散。

或者你可以往 pandas 的项目中提交新的 pull request,从而实现自己的方法。但是你需要说服该项目的维护者,你的新方法值得加入到该项目中并维护之。而且 DataFrame 目前已经拥有超过 250 种的方法,因此我们不愿意增加更多的方法。

7

DataFrame.pipe 的第一个参数是 DataFrame,我们只需要指明后续的参数即可。

成本

过长的链式代码的缺点是调试比较麻烦。由于没有生成中间变量值,所以如果代码出问题了,我们无法直接定位出问题在哪。Python 中的生成器也有类似的问题,借助生成器机制我们可以降低计算机内存消耗,但是此时我们比较难调试程序。

就我常用的探索分析过程而言,这并不是一个大问题。我平常处理的都是不会再更新的数据集,而且对原始数据集进行加工的步骤也不多。

对于规模较大的工作流程,你可能需要借助 pandas 的其他功能,比如 Airflow 或者 Luigi。 对于需要重复运行的中等规模 ETL 工作流程,我将借助装饰器来审查 DataFrame 每个工作步骤所产生的属性日志。

8

借助我之前制作的一个用于验证管道中数据集有效性的软件库 engarde,我们可以很好地完成工作。

Inplace?

大多数 pandas 的方法都有一个默认值为 False 的关键词 inplace。通常来说,你不应该做 inplace 运算。

首先,如果你喜欢用链式规则来写代码的话,你肯定不会用 inplace 运算,因为这会导致最终返回的结果是 None,并中断相应的管道链。

其次,我怀疑存在一个适合 inplace 运算的构思模型。也就是说,最终结果并不会被分配到额外的存储器中。但实际上这可能是不真实的,pandas 中还存在许多下述用法:9

最后,类似于 ibis 或者 dask 这种类型的项目 inplace 运算并没有任何意义,因为此时你需要处理表达式或者建立可执行的 DAG 任务,而不仅仅是处理数据而已。

我觉得到此为止我并没有怎么写代码,更多的是在介绍一些额外的东西,我对此感到非常抱歉。接下来,让我们做一些探索性分析吧。

10

一架一天执行多趟航班执飞任务的飞机“堵机”了,会导致靠后的航班延误更长时间吗?

11

12

一天中较晚起飞的航班会延误更长时间吗?

13

14

我们将延误超过十小时的数据视为异常值并将其剔除掉。

15

16

接下来,我们仅考虑确实发生延误的航班数据。

17

18

哪个航班的延误情况最严重呢?

19 20

哪个航空公司的延误情况最严重呢?

21 22

B6 是美国捷蓝航空公司。

I wanted to try out scikit-learn’s new Gaussian Process module so here’s a pretty picture.

23 24 25 26 27 28

 

谢谢阅读本文!由于我们更多地讨论了关于代码风格的问题而不是介绍实际案例操作,所以本文所介绍的内容比较抽象。谢谢你们的包容,下次我将介绍一个偏实务的话题!

公司二维码

分享到:

相关推荐

  • 466565322506816195

    SME助力|深圳&广州 TOP互联网公司遵循的数据驱动法则沙龙

    每一个互联网人员都应当接触的数据应用前沿实战案例: -如何对每个用户的行为轨迹了如指掌? -如何快速发现客户流失在哪一步? -如何精准划分用户群体,轻松实现千人千面精准营销? -窥视BAT如何利用用户画像平台实现商业变现。 -直击TOP互联网公司如何通过数据分析驱动产品改进与运营...

  • Use R

    R语言中的t检验丨数析学院

    问题 在R中,我们如何检验从总体中抽样得到的两组样本是否有不同的均值,或是通过总体中的某一组样本检验总体均值与某一理论均值间的差异。 指南 示例数据 我们选择内置的sleep数据集作为示例数据。 接下来,我们将sleep数据集处理为宽数据;在之前发布的教程中,我们曾谈到过数据集长宽转换的方法...

  • QQ截图20160905115633

    3Doodler PRO:现实版“神笔马良”

      内容摘要 2013年,WobbleWorks公司推出一款3D打印笔3Doodler,日前,这家公司又在2016年的柏林国际电子消费品展览会(IFA)带来了一款新品,一款据称是准专业级的3D打印笔--3Doodler PRO。   大家还是否记得此前的3Doodler,它是WobbleWorks公司推出的一款3D打印笔,堪...

  • QQ截图20160913095532

    焦虑魔方来了!帮你赶走负能量

      内容摘要 对于一个容易烦躁焦虑的人来说,在无聊的时候总会找一些事情来打发时间,比如把用过的纸杯撕成碎片,或是仔细的涂涂指甲油,要不就转转笔什么的,貌似学生党最爱这些掌上小游戏。当然挤泡泡这种高大上的小游戏想必大家都很喜欢吧。   Mark和Matthew McLachl...

  • QQ截图20160902113657

    3D打印让妈妈们提前触摸未出生宝宝

      内容摘要 日前,波兰一家3D打印公司成立了一个名为“无障碍的等待”的项目,目的就是通过3D打印技术将母亲子宫中的宝宝“复刻”出来,这样父母就能提前触摸自己的宝贝,真实感十足。   3D打印技术大展到今天技术已经是非常的成熟了,据国外媒体报道,一家名为“我是一个妈...

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

SME 前沿科技创业的驱动者