一、任务

在jupyter内进行数据分析,大家都有一种流水线的感觉。从上往下,每一行(坨)代码会解决一个小问题,最终联合在一起解决一个大问题。

例如文本分析,这里仅以text一句话为例,完整的预处理流程

  1. 大写转小写
  2. 剔除回车
  3. 剔除开头结尾的空格

这个预处理任务很简单, 实现方法有以下三种


二、实现方法

  1. 一坨代码一锅端
  2. 只为你量身定做一个函数
  3. 可拆可组装的流水线

2.1 一坨代码一锅端

刚刚学编程,写数据分析代码都是这种style, 可阅读性差,代码扩展性最差。如果遇到的任务像今天这样简单,是最高效的解决办法。但是如果任务变复杂,可扩展性就降低了,会返回造轮子。

text = " Python is powerful, so let's go!\n "

#大写转小写
text = text.lower()

#剔除回车
text = text.replace('\n', '')

#剔除开头结尾的空格
text = text.strip()

text

Run

"python is powerful, so let's go!"

2.2 一个函数搞定

相比一坨代码,一个函数的可阅读性更高一些。代码能够复用的可能,但是遇到复杂任务时, 可扩展性依然较低。

text = " Python is powerful, so let's go!\n"

def clean(text):
    #大写转小写
    text = text.lower()
    #剔除回车
    text = text.replace('\n', '')
    #剔除开头结尾的空格
    text = text.strip()
    return text

clean(text)

Run

"python is powerful, so let's go!"

2.3 设计成流水线

拆解成三个环节函数,并组织成一个流水线。可读性和代码可扩展性大大提高,能轻松应对不同复杂度任务。代价仅仅是多写几行代码。首先需要安装一个实现流水线功能的fastcore库。

安装命令

!pip3 install fastcore

设计的三个环节函数,使用fastcore库的Pipeline来组织成一个流水线。代码

from fastcore.transform import Pipeline


def lower(text):
    #变小写
    return text.lower()

def remove_(text):
    #剔除回车
    return text.replace('\n', '')

def strip(text):
    #剔除开头结尾的空格
    return text.strip()

text = " Python is powerful, so let's go!\n"

#将环节函数组织成一个流水线
pipe = Pipeline([lower, remove_, strip])
pipe(text)

Run

"python is powerful, so let's go!"

三、快速响应

如果预处理任务只需要lower和strip, 新的流水线可以快速装配需要的环节函数, 以应对新的预处理任务。

text = " Python is powerful, so let's go!"

#将环节函数组织成一个流水线
pipe2 = Pipeline([lower, strip])
pipe2(text)

Run

"python is powerful, so let's go!"

广而告之