前言:
目前咱们对“pythonpipe”大概比较关心,大家都想要分析一些“pythonpipe”的相关资讯。那么小编在网摘上网罗了一些对于“pythonpipe””的相关内容,希望同学们能喜欢,各位老铁们一起来了解一下吧!全文共3944字,预计学习时长12分钟
今天,小芯给大家带来的是如何使用一个名为pdpipe的小库,通过Pandas 数据帧创建直观且有用的管道。
这是一个很有意思的项目。
事不宜迟,我们开始吧~
基础知识介绍:
Pandas是Python生态系统中一个十分强大的库,它用于数据分析和机器学习领域。它们在Excel/CSV文件和SQL表所在的数据世界,和Sciki-learn或TensorFlow发挥其魔力的建模世界之间搭建起完美的桥梁。
数据科学流通常由一系列步骤构成——数据集必经过清理、缩放和验证,以备强大的机器学习算法使用。
当然,这些任务可以通过Pandas等软件包提供的许多单步函数/方法来完成,但更好的方法是使用管道。几乎所有情况下,管道通过自动执行重复的任务,不仅减少了出错的概率,还节省了时间。
在数据科学领域,R语言中的-dplyr和Python生态系统中的Scikit learn是两个典型实例,用以说明具有管道特征的软件包。
数据科学流通常由一系列步骤构成——必须对数据集进行清理、缩放和验证,以备使用。
此外,Pandas还提供了一个.pipe方法,可用于用户定义函数的类似用途。不过,本文将讨论另一个名为pdpipe的小库,它利用Pandas 数据帧专门解决管道问题。
几乎所有情况下,管道通过自动执行重复的任务,既减少了出错的概率,还节省了时间。
用Pandas创建管道
Jupyter notebook的例子可在笔者的Github repo中找到(Jupyternotebook can be found here in my Github repo)。来看看如何用这个库创建有用的管道。
数据集
出于演示目的,将使用美国房价数据集(从Kaggle下载)。可以在Pandas中加载数据集,其汇总的统计信息显示如下:
但是,数据集还有一个包含文本数据的“Address”字段。
添加大小限定符列
为了方便演示,在数据集中添加一个列来限定房子的大小,代码如下:
之后数据集如下所示,
最简单的管道——一次操作
从最简单的管道开始,由一个操作组成(不要担心,很快就会增加难度)。
假设机器学习团队和该领域专家认为大可忽略掉用于建模的Avg. Area HouseAge数据。那么,就可以从数据集中删除此列。
对于此任务,使用pdpipe中的ColDrop方法创建一个管道对象drop-age,并将数据帧传递至此管道。
import pdpipe as pdp
drop_age = pdp.ColDrop(‘Avg. Area House Age’)
df2 = drop_age(df)
果不其然,生成的数据帧如下所示,
只需添加多个管道链阶
只有能够进入到多个阶段时,管道才有用、实用。有多种方法可以在 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是在独热编码过程中创建而来。
根据行值删除一些行
接下来,可能希望根据行值移除数据行。
具体来说,如果有些地区房价低于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列中的值标记行,
第二种方法是在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)
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所做的那样。
瞧!得到缩放后的数据帧,
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)
生成的数据帧如下所示,
小结
总结一下这个演示中显示的所有操作,如下所示,
所有这些操作都可以在类似的数据集上频繁使用,在数据集准备好进行下一级建模之前,有一组简单的顺序代码块作为预处理操作执行将是非常棒的。
创建管道是实现序列码块统一集合的关键。Pandas是机器学习/数据科学团队在此类数据预处理任务中最广泛使用的Python库,pdpipe提供了一种简单而又强大的方法,可以使用Pandas类型的操作创建管道,这些操作可以直接应用于Pandas数据帧对象。
快来试试吧,为特定数据科学任务创建更强大的管道~
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范
标签: #pythonpipe