(数据科学学习手札107)在Python中利用funct实现链式风格编程
本文示例代码已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
链式编程是一种非常高效的组织代码的方式,典型如pandas
与scikit-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
数组或pandas
的Series
,但这又会在一些应用场景下丢失灵活性,但在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实现链式风格编程的更多相关文章
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札126)Python中JSON结构数据的高效增删改操作
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一期文章中我们一起学习了在Python ...
- (数据科学学习手札136)Python中基于joblib实现极简并行计算加速
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...
- (数据科学学习手札53)Python中tqdm模块的用法
一.简介 tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条,本文就将针对tqdm的基本用法进行介绍. 二.基本 ...
- (数据科学学习手札54)Python中retry的简单用法
一.简介 retry是一个用于错误处理的模块,功能类似try-except,但更加快捷方便,本文就将简单地介绍一下retry的基本用法. 二.基本用法 retry: 作为装饰器进行使用,不传入参数时功 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- (数据科学学习手札25)sklearn中的特征选择相关功能
一.简介 在现实的机器学习任务中,自变量往往数量众多,且类型可能由连续型(continuou)和离散型(discrete)混杂组成,因此出于节约计算成本.精简模型.增强模型的泛化性能等角度考虑,我们常 ...
随机推荐
- Mybatis解决字段与属性不匹配的问题、链表查询、嵌套查询、#{}和${}的区别
1.使用接口结合xml映射文件 创建一个接口,该接口要和映射文件匹配(接口中方法名要和映射文件中的id相同) 映射文件中命名空间要和接口全类名相同 测试: 创建一个与src同级的源文件夹resourc ...
- Matlab GUI学习总结
从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件 2. 使用 GUIDE 快速的生成GUI界面显然第二种可视化编辑方法算更适合 ...
- CAP理论解读
经历过技术面试的小伙伴想必对这个两个概念已经再熟悉不过了! 我当年参加面试的时候,不夸张地说,只要问到分布式相关的内容,面试官几乎是必定会问这两个分布式相关的理论. 并且,这两个理论也可以说是小伙伴们 ...
- Okio Okio源码分析
概述 Okio 作为 Okhttp 底层 io 库,它补充了 java.io 和 java.nio 的不足,使访问.存储和处理数据更加容易.Okio 的特点如下: okio 是一个由 square 公 ...
- 洛谷 P4999
题目链接: P4999 烦人的数学作业 题目大意 详见题目 solution 有一个显而易见的结论 发现 \(ans_{l, r} = ans_{1. r} - ans_{1, l - 1}\) 那只 ...
- MSSQL 注入笔记
前置知识: 登录名:登录sql server服务器的用户,而不是操作"数据库用户名". 固定服务器角色:就是上面登录名所属的权限组.其中重要的就是"sysadmin&qu ...
- Spring5源码,@Autowired
一.@Autowired所具有的功能 二.在Spring中如何使用@Autowired 三.@Autowired注解背后的工作原理 一.@Autowired所具有的功能 @Autowired是一个用来 ...
- hadoop(集群)完全分布式环境搭建
一,环境 主节点一台: ubuntu desktop 16.04 zhoujun 172.16.12.1 从节点(slave)两台:ubuntu server 16.04 hadoop2 ...
- Spark-1.6.1 Hadoop-2.6.4 VMware Ubuntu 分布式集群搭建 全过程
本文从头开始零基础完全配置,适合小白. 本文在vmware中配置三台虚拟机,一台做Master,两台Worker,hadoop 和spark只需要在Master上配置,然后cp到worker上,包括配 ...
- 将将List json 转成List<?>实体
package TestJson; import java.util.ArrayList; import java.util.List; import java.util.Map; import ne ...