zoukankan      html  css  js  c++  java
  • (数据科学学习手札107)在Python中利用funct实现链式风格编程

    本文示例代码已上传至我的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 )。


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

  • 相关阅读:
    HDU-1527 取石子游戏
    HDU-1846 Brave Game
    HDU-1850 Being a Good Boy in Spring Festival
    HDU-2509 Be the Winner
    HDU-1907 John
    HDU-1969 Pie
    HDU-1501 Zipper
    HDU-2289 Cup
    最大子矩阵和
    HDU3466(01背包变种)
  • 原文地址:https://www.cnblogs.com/feffery/p/14400938.html
Copyright © 2011-2022 走看看