12.24 使用“pdpipe”,通过Pandas快速建立管道

全文共3944字,预计学习时长

12分钟

使用“pdpipe”,通过Pandas快速建立管道

图源:Unsplash

今天,小芯给大家带来的是如何使用一个名为pdpipe的小库,通过Pandas 数据帧创建直观且有用的管道。

这是一个很有意思的项目。

事不宜迟,我们开始吧~

使用“pdpipe”,通过Pandas快速建立管道

基础知识介绍:

Pandas是Python生态系统中一个十分强大的库,它用于数据分析和机器学习领域。它们在Excel/CSV文件和SQL表所在的数据世界,和Sciki-learn或TensorFlow发挥其魔力的建模世界之间搭建起完美的桥梁。


数据科学流通常由一系列步骤构成——数据集必经过清理、缩放和验证,以备强大的机器学习算法使用。


当然,这些任务可以通过Pandas等软件包提供的许多单步函数/方法来完成,但更好的方法是使用管道。几乎所有情况下,管道通过自动执行重复的任务,不仅减少了出错的概率,还节省了时间。


在数据科学领域,R语言中的-dplyr和Python生态系统中的Scikit learn是两个典型实例,用以说明具有管道特征的软件包。


数据科学流通常由一系列步骤构成——必须对数据集进行清理、缩放和验证,以备使用。

使用“pdpipe”,通过Pandas快速建立管道

图源:Unsplash

此外,Pandas还提供了一个.pipe方法,可用于用户定义函数的类似用途。不过,本文将讨论另一个名为pdpipe的小库,它利用Pandas 数据帧专门解决管道问题。


几乎所有情况下,管道通过自动执行重复的任务,既减少了出错的概率,还节省了时间。

使用“pdpipe”,通过Pandas快速建立管道

用Pandas创建管道


Jupyter notebook的例子可在笔者的Github repo中找到(Jupyternotebook can be found here in my Github repo)。来看看如何用这个库创建有用的管道。


数据集


出于演示目的,将使用美国房价数据集(从Kaggle下载)。可以在Pandas中加载数据集,其汇总的统计信息显示如下:

使用“pdpipe”,通过Pandas快速建立管道

但是,数据集还有一个包含文本数据的“Address”字段。


使用“pdpipe”,通过Pandas快速建立管道

添加大小限定符列


为了方便演示,在数据集中添加一个列来限定房子的大小,代码如下:

使用“pdpipe”,通过Pandas快速建立管道

之后数据集如下所示,


使用“pdpipe”,通过Pandas快速建立管道

最简单的管道——一次操作


从最简单的管道开始,由一个操作组成(不要担心,很快就会增加难度)。


假设机器学习团队和该领域专家认为大可忽略掉用于建模的Avg. Area HouseAge数据。那么,就可以从数据集中删除此列。


对于此任务,使用pdpipe中的ColDrop方法创建一个管道对象drop-age,并将数据帧传递至此管道。


import pdpipe as pdp

drop_age = pdp.ColDrop(‘Avg. Area House Age’)

df2 = drop_age(df)

果不其然,生成的数据帧如下所示,


使用“pdpipe”,通过Pandas快速建立管道

只需添加多个管道链阶


使用“pdpipe”,通过Pandas快速建立管道

图源:Unsplash

只有能够进入到多个阶段时,管道才有用、实用。有多种方法可以在 pdpipe中执行此操作。不过,最简单且最直观的方法是使用运算符“+”。这就像用手连接管道一样!


比方说,除了删除age列之外,我们还想对House_size列进行独热编码 (one-hot-encode),以便可以在数据集上轻松运行分类算法或回归算法。


pipeline = pdp.ColDrop(‘Avg. Area House Age’)

pipeline+= pdp.OneHotEncode(‘House_size’)

df3 = pipeline(df)

因此,首先使用ColDrop方法创建一个管道对象,用以删除Avg.Area House Age列。此后,只需通过常用的Python+=语法将OneHotEncode方法添加到此管道对象即可。


生成的数据帧如下所示。请注意,附加指示符列House_size_Medium和House_size_Small是在独热编码过程中创建而来。


使用“pdpipe”,通过Pandas快速建立管道

根据行值删除一些行


接下来,可能希望根据行值移除数据行。

使用“pdpipe”,通过Pandas快速建立管道

图源:Unsplash

具体来说,如果有些地区房价低于25万,可能要全部删除该地区的数据。使用applybycol方法将任一用户定义的函数应用于数据帧,再使用ValDrop方法根据特定值删除行。可以很容易地将这些方法链接到管道中,便能有所选择地删除行(仍添加至现有的管道对象,它已经完成了列删除和独热编码的工作)。


def price_tag(x):

if x>250000:

return 'keep'

else:

return'drop'pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)

pipeline+=pdp.ValDrop(['drop'],'Price_tag')

pipeline+= pdp.ColDrop('Price_tag')

第一种方法是通过应用用户定义的函数Price_tag(),根据Price列中的值标记行,


使用“pdpipe”,通过Pandas快速建立管道

第二种方法是在Price_tag列中查找字符串drop并删除匹配的行。


最后,第三种方法是删除Price_tag列,清理数据帧。毕竟,这个Price_tag列只是临时用于标记特定的行,应该在用完后删除。


所有这些只需把多个操作阶段链接到同一管道上即可!


现在,可以回顾一下管道一开始对数据帧做了些什么,


•删除特定列

•对一个用于建模的分类数据列进行编码

•基于用户定义函数的标签数据

•根据标签删除行

•删除临时标记栏


这些都使用以下五行代码,


pipeline = pdp.ColDrop('Avg. Area House Age')

pipeline+= pdp.OneHotEncode('House_size')

pipeline+=pdp.ApplyByCols('Price',price_tag,'Price_tag',drop=False)

pipeline+=pdp.ValDrop(['drop'],'Price_tag')

pipeline+= pdp.ColDrop('Price_tag')df5 = pipeline(df)

使用“pdpipe”,通过Pandas快速建立管道

Scikit-learn和NLTK阶段

有许多更有用且更加直观的方法可用于数据帧操作。不过,本文只需证明,连Scikit learn和NLTK软件包中的一些操作也包含在 pdpipe 中,可用于生成非常棒的管道。

Scikit-learn中的缩放估计器

创建机器学习模型最常见的任务之一就是数据的缩放。Scikit-learn提供了几种不同的缩放类型,如最值缩放或标准化缩放(减去数据集的平均值,然后除以标准差)。


可以在管道中直接链接此种缩放操作。下面的代码演示了它的用法,


pipeline_scale=

pdp.Scale('StandardScaler',exclude_columns=['House_size_Medium','House_size_Small'])df6= pipeline_scale(df5)

在此,应用Scikit-learn包中的标准缩放尺度估计器将数据转换为聚类或神经网络拟合。可以有选择地排除不需要此种缩放的列,就像对指示列House_size_Medium和House_size_Small所做的那样。


瞧!得到缩放后的数据帧,


使用“pdpipe”,通过Pandas快速建立管道

NLTK中的标记解析器 (Tokenizer)


可以注意到,数据帧中的地址字段现在毫无用处。但是,如果可以从这些字符串中提取压缩码或状态,这些字段可能对某种可视化或机器学习任务有用。


为此,可以使用单词标记解析器 Word Tokenizer。


NLTK是用于文本挖掘和自然语言处理(NLP)的常用且强大的Python库,它提供了一系列的标记解析器方法。此处,可以使用一个这样的标记解析器来分割地址字段中的文本,并从中提取状态的名称。可以看到,状态的名称是地址字符串中倒数第二个单词。因此,以下链式管道做这项工作,


def extract_state(token):

returnstr(token[-2])pipeline_tokenize=pdp.TokenizeWords('Address')pipeline_state =pdp.ApplyByCols('Address',extract_state,

result_columns='State')pipeline_state_extract = pipeline_tokenize +pipeline_statedf7 = pipeline_state_extract(df6)

生成的数据帧如下所示,

使用“pdpipe”,通过Pandas快速建立管道

使用“pdpipe”,通过Pandas快速建立管道

小结


总结一下这个演示中显示的所有操作,如下所示,


使用“pdpipe”,通过Pandas快速建立管道

所有这些操作都可以在类似的数据集上频繁使用,在数据集准备好进行下一级建模之前,有一组简单的顺序代码块作为预处理操作执行将是非常棒的。


创建管道是实现序列码块统一集合的关键。Pandas是机器学习/数据科学团队在此类数据预处理任务中最广泛使用的Python库,pdpipe提供了一种简单而又强大的方法,可以使用Pandas类型的操作创建管道,这些操作可以直接应用于Pandas数据帧对象。

使用“pdpipe”,通过Pandas快速建立管道

图源:Unsplash

快来试试吧,为特定数据科学任务创建更强大的管道~

使用“pdpipe”,通过Pandas快速建立管道

我们一起分享AI学习与发展的干货


分享到:


相關文章: