本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  链式编程是一种非常高效的组织代码的方式,典型如pandasscikit-learn中的pipe(),以及R中的管道操作符%>%等,它们都可以帮助我们像连接管道一样,将计算过程中的不同步骤顺滑的连接起来,从而取代繁琐的函数嵌套以及避免多余中间变量的创建。

图1

  链式编程与常规写法的比较如下例:

# 非链式写法
func4(func3(func2(func1(A)))) # 链式写法
A.func1().func2().func3().func4()

  哪一种写法更简洁明了,想必大家一眼就看得出来,而今天的文章就将带大家认识如何借助funct的力量,来改造Python原生列表,赋予其链式计算的能力。

2 利用funct.Array实现链式计算

  funct的设计理念就是类似Python列表但更棒,它借鉴了numpy的很多特点,配合功能丰富的各种链式计算方法,使得我们在使用它完成计算任务编写代码如丝般顺滑时~

  利用pip install funct完成安装(本文演示版本为0.9.2)之后,下面我们来认识它的一些优秀特性吧~

2.1 funct.Array的创建

  funct中类比列表和numpy中的数组,创造了Array这种特别的数据结构,常用的有如下几种创建方式:

  • 从其他数据结构创建

  最常规的方式是从现有的其他数据结构,转换到Array,常见如下面的几个例子:

图2

  • 类似numpy风格的规则创建方法

  除了从现成的数据中创建Array之外,我们还可以类似numpy中的linspace()等API那样,基于规则批量创建数据,常用的有如下两种方法:

图3

  • 创建嵌套Array

  既然是建立在列表的基础上,那么funct对嵌套Array尤其是不规则嵌套Array的支持也是很到位的:

图4

  但在配合多个numpy数组构建嵌套Array时要注意,最后一定要加上toArray()方法才能彻底完成转换:

图5

2.2 funct.Array的索引

  大致介绍完如何创建funct.Array之后,很重要的一点就是如何对已有Array进行索引,在funct中针对Array设计了如下几种丰富的索引方式:

  • 列表式索引

  既然继承自列表,自然可以使用Python原生列表的索引与切片方式:

图6

  • 数组式索引

  我们都知道Python原生列表不能传入一系列标号对应的数组来一次性索引出多个值,除非转换为numpy数组或pandasSeries,但这又会在一些应用场景下丢失灵活性,但在Array中,它可以!

图7

  • Bool值索引

  Array同样支持传入Bool值索引,使得我们可以将某个条件判断之后的判断结果作为索引依据传入:

图8

  • 多层索引

  既然Array是支持嵌套结构的,自然可以进行多层索引,但需要注意的是:

图9

2.3 funct.Array的链式骚操作

  讲完了如何创建与索引funct.Array之后,就来到了本文的重头戏——Array的链式运算上,在funct.Array中,几乎所有常见的数值与逻辑运算都被封装到方法中,我们来一阶一阶的来看看不同情况下如何组织代码:

  • level1:基础的数值运算

  首先我们来看看最基础的四则运算等操作在Array中如何链式下去:

图10

  这样每一步都很清楚,且每一步都可以独立添加注释,保持了代码的可读性,譬如可用于归一化与标准化的计算上:

图11

  • level2:配合map方法推广元素级别运算

  除了使用内置的基础的运算方法之外,在funct.Array中还支持配合map()方法将任意函数应用到每个元素上,从而无限拓宽计算的自由性,譬如我们在前面归一化的基础上对数据进行分箱:

图12

  • level3:配合zip方法引入其他Array参与运算

  当我们想要在链式运算中引入其他数组对象时,就可以用到更高级的zip()方法,譬如我们想找出多个Array中相同位置最大值:

图13

  • level4:条件分组

  在pandas中我们可以利用groupby()进行数据分箱并衔接任意形式的运算,在funct.Array中我们也可以配合groupBy()方法实现:

图14

  而除了本文介绍到的这一点API之外,funct还提供了上百种实用API,并且还具有并行执行并发执行等高级特性,感兴趣的朋友可以前往官方文档查看( https://github.com/Lauriat/funct )。


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

(数据科学学习手札107)在Python中利用funct实现链式风格编程的更多相关文章

  1. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

  2. (数据科学学习手札126)Python中JSON结构数据的高效增删改操作

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...

  3. (数据科学学习手札136)Python中基于joblib实现极简并行计算加速

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...

  4. (数据科学学习手札53)Python中tqdm模块的用法

    一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...

  5. (数据科学学习手札54)Python中retry的简单用法

    一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...

  6. (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...

  7. (数据科学学习手札49)Scala中的模式匹配

    一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...

  8. (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  9. (数据科学学习手札25)sklearn中的特征选择相关功能

    一.简介 在现实的机器学习任务中,自变量往往数量众多,且类型可能由连续型(continuou)和离散型(discrete)混杂组成,因此出于节约计算成本.精简模型.增强模型的泛化性能等角度考虑,我们常 ...

随机推荐

  1. Python-Flask搭建Web项目

    最近因项目需要,学习了用flask搭建web项目,以下是自己的使用感悟 Flask框架结构 static:存储一些静态资源 templates:存储对应的view app.py:涉及到页面的跳转,以及 ...

  2. JVM有哪些垃圾回收器

    JVM 的垃圾回收器 目录 JVM 的垃圾回收器 经典垃圾收集器 Serial 收集器 ParNew 收集器 Parallel Scavenge 收集器 Serial Old 收集器 Parallel ...

  3. RPC 实战与原理 精简版

    什么是 RPC? RPC 有什么作用? RPC 步骤 为什么需要序列化? 零拷贝 什么是零拷贝? 为什么需要零拷贝? 如何实现零拷贝? Netty 的零拷贝有何不同? 动态代理实现 HTTP/2 特性 ...

  4. 消息队列扫盲(RocketMQ 入门)

    消息队列扫盲 消息队列顾名思义就是存放消息的队列,队列我就不解释了,别告诉我你连队列都不知道似啥吧? 所以问题并不是消息队列是什么,而是 消息队列为什么会出现?消息队列能用来干什么?用它来干这些事会带 ...

  5. java创建线程的多种方式

    java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...

  6. 面向对象编程(UDP协议)

    UDP协议 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无 ...

  7. Apache-三种工作模式(prefork/ worker/Event)

    Apache-两种工作模式(prefork/ worker/Event) Apache 2.X  支持插入式并行处理模块,称为多进程处理模块(MPM).在编译apache时必须选择也只能选择一个MPM ...

  8. cisco 4500X 交换机限速

    一.配置步骤 1.定义ACL以匹配数据流 ip access-list extended aclname 2.配置流量分类和策略 class-map [match-all(默认:完全符合)/Match ...

  9. 封装打包Python脚本

    1.前言 封装打包Python的好处,节省了安装各种各样包依赖的问题,同时可以加强我们代码隐私的安全性,这里我的演示环境是Python3.6 ,CentOS7的系统,同时打包工具采用pyinstall ...

  10. 每个开发人员都应该知道的WebSockets知识

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/deep-dive-into-websockets- ...