(数据科学学习手札107)在Python中利用funct实现链式风格编程
本文示例代码已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
链式编程是一种非常高效的组织代码的方式,典型如pandas
与scikit-learn
中的pipe()
,以及R
中的管道操作符%>%
等,它们都可以帮助我们像连接管道一样,将计算过程中的不同步骤顺滑的连接起来,从而取代繁琐的函数嵌套以及避免多余中间变量的创建。
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201828941-1915430149.jpg)
链式编程与常规写法的比较如下例:
# 非链式写法
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
,常见如下面的几个例子:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201831522-1592335474.png)
- 类似numpy风格的规则创建方法
除了从现成的数据中创建Array
之外,我们还可以类似numpy
中的linspace()
等API那样,基于规则批量创建数据,常用的有如下两种方法:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201833969-2140232311.png)
- 创建嵌套Array
既然是建立在列表的基础上,那么funct
对嵌套Array
尤其是不规则嵌套Array
的支持也是很到位的:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201836242-1769796503.png)
但在配合多个numpy
数组构建嵌套Array
时要注意,最后一定要加上toArray()
方法才能彻底完成转换:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201838746-1089201773.png)
2.2 funct.Array的索引
大致介绍完如何创建funct.Array
之后,很重要的一点就是如何对已有Array
进行索引,在funct
中针对Array
设计了如下几种丰富的索引方式:
- 列表式索引
既然继承自列表,自然可以使用Python
原生列表的索引与切片方式:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201840904-1086276051.png)
- 数组式索引
我们都知道Python
原生列表不能传入一系列标号对应的数组来一次性索引出多个值,除非转换为numpy
数组或pandas
的Series
,但这又会在一些应用场景下丢失灵活性,但在Array
中,它可以!
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201843110-1515255879.png)
- Bool值索引
Array
同样支持传入Bool
值索引,使得我们可以将某个条件判断之后的判断结果作为索引依据传入:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201845309-2099963987.png)
- 多层索引
既然Array
是支持嵌套结构的,自然可以进行多层索引,但需要注意的是:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201847312-189024619.png)
2.3 funct.Array的链式骚操作
讲完了如何创建与索引funct.Array
之后,就来到了本文的重头戏——Array
的链式运算上,在funct.Array
中,几乎所有常见的数值与逻辑运算都被封装到方法中,我们来一阶一阶的来看看不同情况下如何组织代码:
- level1:基础的数值运算
首先我们来看看最基础的四则运算等操作在Array
中如何链式下去:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201849512-81480293.png)
这样每一步都很清楚,且每一步都可以独立添加注释,保持了代码的可读性,譬如可用于归一化与标准化的计算上:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201851701-717943684.png)
- level2:配合map方法推广元素级别运算
除了使用内置的基础的运算方法之外,在funct.Array
中还支持配合map()
方法将任意函数应用到每个元素上,从而无限拓宽计算的自由性,譬如我们在前面归一化的基础上对数据进行分箱:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201853764-131899995.png)
- level3:配合zip方法引入其他Array参与运算
当我们想要在链式运算中引入其他数组对象时,就可以用到更高级的zip()
方法,譬如我们想找出多个Array
中相同位置最大值:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201855824-1766587263.png)
- level4:条件分组
在pandas
中我们可以利用groupby()
进行数据分箱并衔接任意形式的运算,在funct.Array
中我们也可以配合groupBy()
方法实现:
![](https://img2020.cnblogs.com/blog/1344061/202102/1344061-20210213201857945-585181570.png)
而除了本文介绍到的这一点API之外,funct
还提供了上百种实用API,并且还具有并行执行与并发执行等高级特性,感兴趣的朋友可以前往官方文档查看( https://github.com/Lauriat/funct )。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
相关文章
- 探索 Python、机器学习和 NLTK 库
- Python快速学习01:Eclipse上配置PyDev & 'Hello World !'
- Python快速学习10: 循环的对象及设计 (生活的规律)
- <深入 Python 3 >学习笔记
- 小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)
- 【学习总结】Python-3-Python数字运算与数学函数
- 过来人教你如何正确学习Python,必须有用!
- Python语言学习:在python中,如何获取变量的本身字符串名字而非其值/内容及其应用(在代码中如何查找同值的所有变量名)
- Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法、如何查询某个函数&关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略
- Python编程语言学习:一行代码利用enumerate函数把纯列表数据转为自带索引的字典数据,字典格式数据应用之key和value相互提取
- Python编程语言学习:在根目录的py文件内调用某叶目录文件内的包/库或者函数(常用在GUI编程)之详细攻略
- Python编程语言学习:python中浅复制/深复制(或浅拷贝/深拷贝)的简介、案例应用注意事项之详细攻略
- Python语言编程学习:numpy中的array格式数据切片与pandas中的dataframe格式数据切片、相互转换
- Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法
- 已解决2. Set PROTOCOL_BUPFERS_PYTHON_iMPLEMENTATION=python (but this will use pure-Python parsing and w
- 【路径规划】基于RRT算法和改进人工势场法的无人机任务规划方法研究(Python代码实现)
- python制作问题搜索解答器,从此学习无忧
- 超全整理:机器学习和 Python 技术路线来了
- 值得学习练手的 5 个 Python 迷你程序(附代码)
- 【阶段三】Python机器学习13篇:机器学习项目实战:支持向量机分类的算法原理
- Python编程:python面向对象
- Python编程:查看python语法中的关键字keyword
- Python学习之四【变量】
- python学习之基本语法---语法学习前的思想认识---编程思想和代码规范(一)day5
- 强化学习笔记:基于价值的学习之价值计算(python实现)