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


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

  • 相关阅读:
    UVALive 5983 MAGRID DP
    2015暑假训练(UVALive 5983
    poj 1426 Find The Multiple (BFS)
    poj 3126 Prime Path (BFS)
    poj 2251 Dungeon Master 3维bfs(水水)
    poj 3278 catch that cow BFS(基础水)
    poj3083 Children of the Candy Corn BFS&&DFS
    BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
    洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
    洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
  • 原文地址:https://www.cnblogs.com/feffery/p/14400938.html
Copyright © 2011-2022 走看看