(数据科学学习手札107)在Python中利用funct实现链式风格编程

本文示例代码已上传至个人Github仓库https://github.com/CNFeffery/DataScienceStudyNotesgit

1 简介

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

图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,常见以下面的几个例子:spa

图2
  • 相似numpy风格的规则建立方法

  除了从现成的数据中建立Array以外,咱们还能够相似numpy中的linspace()等API那样,基于规则批量建立数据,经常使用的有以下两种方法:设计

图3
  • 建立嵌套Array

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

图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 )。


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

相关文章
相关标签/搜索