作者 | Tirthajyoti Sarkar译者 | 清儿爸编辑 | 夕颜来源 | AI科技大本营(ID: rgznai100)

【导读】Pandas 是 Python 生态系统中的一个了不起的库,用于数据分析和机器学习。它在 Excel/CSV 文件和 SQL 表所在的数据世界与 Scikit-learn 或 TensorFlow 施展魔力的建模世界之间架起了完美的桥梁。数据科学流通常是一系列的步骤:数据集必须经过清理、缩放和验证,之后才能被强大的机器学习算法使用。当然,这些任务可以通过 Pandas 等包提供的许多单步函数或方法来完成,但更为优雅的方式是使用管道。在几乎所有的情况下,通过自动执行重复性任务,管道可以减少出错的机会,并能够节省时间。

在数据科学领域中,具有管道特性的软件包有 R 语言的 dplyr 和 Python 生态系统中的 Scikit-learn。要了解它们在机器学习工作流中的应用,你可以读这篇很棒的文章:

https://www.kdnuggets.com/2017/12/managing-machine-learning-workflows-scikit-learn-pipelines-part-1.html

Pandas 还提供了 `.pipe` 方法,可用于类似的用户定义函数。但是,在本文中,我们将讨论的是非常棒的小库,叫 pdpipe,它专门解决了 Pandas DataFrame 的管道问题。

使用 Pandas 的流水线

Jupyter Notebook 的示例可以在我的 Github 仓库中找到:https://github.com/tirthajyoti/Machine-Learning-with-Python/blob/master/Pandas%20and%20Numpy/pdpipe-example.ipynb。让我们看看如果使用这个库来构建有用的管道。

数据集

为了演示,我将使用美国房价的数据集,可从 Kaggle 下载:https://www.kaggle.com/vedavyasv/usa-housing我们可以在 Pandas 中加载数据集,并显示其汇总的统计信息,如下所示:但是,数据集中还有一个“Address”字段,其中包含了文本数据。

添加大小限定符列

在这个演示中,我们在数据集中添加了一个列来限定房屋的大小,代码如下所示:经过此步骤之后,数据集如下所示:

最简单的管道:一次操作

我们从最简单的管道开始,它只包含一次操作(不必担心,我们很快就会增加复杂性的)。让我们假设机器学习团队和领域专家说他们认为我们可以安全地忽略用于建模的数据 `Avg. Area House Age` 。因此,我们将从数据集中删除这一列。对于这个任务,我们使用 pdpipe 中的 `ColDrop` 来创建一个管道对象 `drop_age`,并将 DataFrame 传递给这个管道。

import pdpipe as pdpdrop_age = pdp.ColDrop(‘Avg. Area House Age’)df2 = drop_age(df)

正如预期的那样,生成的 DataFrame 如下所示:

只需添加管道链级

只有当我们能够进行多个阶段时,管道才是有用和实用的。在 pdpipe 中有多种方法可以实现这一点。但是,最简单、最直观的方法是使用 + 运算符。这就像手工连接管道一样!比方说,除了删除 `age` 列之外,我们还希望对 `House size` 的列进行独热编码,以便可以轻松地在数据集上运行分类或回归算法。

pipeline = pdp.ColDrop(‘Avg. Area House Age’)pipeline+= pdp.OneHotEncode(‘House_size’)df3 = pipeline(df)

因此,我们首先使用 `ColDrop` 方法创建了一个管道对象来删除 `Avg. Area House Age` 列。此后,我们只需使用常用的 Python 的 `+=` 语法将 `OneHotEncode` 方法添加到这个管道对象中即可。生成的 DataFrame 如下所示。请注意,附加的指示列 `House_size_Medium` 和 `House_size_Small` 是由独热编码创建的。

根据行值删除某些行

接下来,我们可能希望根据行值来删除它们。具体来说,我们可能希望删除房价低于 25 万的所有数据。我们有 `ApplybyCol` 的方法来讲删除用户蒂尼的函数应用到 DataFrame,还有一个方法 `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` 标签列,清理 DataFrame。毕竟,这个 `Price_tag`列只是临时需要的,用于标记特定的行,在达到目的后就应该将其删除。所有这些都是通过简单地链接同一管道上的各个阶段来完成的!现在,我们可以回顾一下,看看我们的管道从一开始对 DataFrame 都做了什么工作:

  • 删除特定的列。
  • 独热编码,用于建模的分类数据列。
  • 根据用户定义函数对数据进行标记。
  • 根据标记删除行。
  • 删除临时标记列。

所有这些,使用的是以下五行代码:

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)

最近版本更新:直接删除行!

我与包作者 Shay Palachy 进行了精彩的讨论,他告诉我,该包的最新版本可以用 lambda 函数,仅用一行代码即可完成行的删除(满足给定的条件),如下所示:

pdp.RowDrop({‘Price’: lambda x: x <= 250000})
 

Scikit-learn 与 NLTK

还有许多更有用、更直观的 DataFrame 操作方法可用于 DataFrame 操作。但是,我们只是想说明,即使是 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 包中的 `StandardScaler` 估算器来转换数据以进行聚类或神经网络拟合。我们可以选择性地排除那些无需缩放的列,就像我们在本文中对指示列 `House_size_Medium` 和 `House_size_Small` 所做的那样。瞧!我们得到了缩放后的 DataFrame:NLTK 的词法分析器我们注意到,DataFrame 中的 Address 字段现在几乎毫无用处。但是,如果我们可以从这些字符串中提取邮政编码或州名,它们可能对某种形式的可视化或机器学习任务有用。为此,我们可以使用 Word Tokenizer(单词标记器)来实现这一目的。NTLK 是一个流行而强大的 Python 库,用于文本挖掘和自然语言处理,并提供了一系列的标记器方法。在本文示例中,我们客户使用一个这样的标记器来拆分 Address 字段中的文本,并从中提取州名。我们注意到,州名就是地址字符串中的倒数第二个单词。因此,下面的链式管道就可以帮我们完成这项工作:

def extract_state(token):    return str(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

生成的 DataFrame 如下所示:

总结

如果我们对本文这个演示中显示的所有操作进行总结,则如下所示:所有这些操作都可以在类似类型的数据集上频繁使用,并在数据集准备好进入下一级建模之前,能有一组简单的顺序代码块作为预处理操作来执行,将是非常棒的。流水线是实现统一的顺序代码块集的关键。Pandas 是机器学习和数据科学团队中用于这类数据预处理任务的最广泛使用的 Python 库,而 pdpipe 则提供了一种简单而强大的方法,可以使用 Pandas 类型操作构建管道,可以直接应用于 Pandas DataFrame 对象。你可以自己探索这个库,为你的特定数据科学任务构建更强大的管道。原文链接:https://towardsdatascience.com/https-medium-com-tirthajyoti-build-pipelines-with-pandas-using-pdpipe-cade6128cd31

【END】

热 文 推 荐 ☞你抢的不是春节红包而是云☞疫情肆虐下,程序员们都在哪里?☞云计算的 2020:云原生崛起,重新定义软件☞疫情严重,潜伏期也有传染性?科技公司在行动☞区块链 10 年低谷与荣光用开发者的方式共克时艰!

pandas中size方法_如何使用pdpipe与Pandas构建管道?相关推荐

  1. pandas中size方法_eplot,在pandas中流畅的使用pyecharts!

    1 eplot 1.1 eplot简介 eplot 是pyecharts库对pandas的一个接口,通过给DataFrame及Series类添加方法,直接使用DataFrame对象添加的方法来画ech ...

  2. pandas中size方法_pandas基本操作

    一.查看数据 1.查看DataFrame前xx行或后xx行a=DataFrame(data);a.head(6)表示显示前6行数据,若head()中不带参数则会显示全部数据.a.tail(6)表示显示 ...

  3. pandas中dropna函数_快速解释如何使用pandas的inplace参数

    介绍 在操作dataframe时,初学者有时甚至是更高级的数据科学家会对如何在pandas中使用inplace参数感到困惑. 更有趣的是,我看到的解释这个概念的文章或教程并不多.它似乎被假定为知识或自 ...

  4. Pandas中resample方法详解

    Pandas中resample方法详解 Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法.重新取样时间序列数据. 方便的 ...

  5. pandas中drop用法_如何使用drop方法对数据进行删减处理

    在我们进行数据分析时,某些情况下我们会需要对数据作出一系列的删减处理.今天就为大家推荐一下在Python中常用于数据删减的drop方法. 在Pandas 中,以 .drop 开头的方法都与数据的删减有 ...

  6. pandas中sample方法简介

    1    数据切片选取 1.1    pandas.DataFrame.sample 随机选取若干行 1.1.1     功能说明              有时候我们只需要数据集中的一部分,并不需要 ...

  7. origin9语言设置中文_英雄联盟手游怎么设置繁体 LOL手游繁中设置方法?_英雄联盟手游...

    英雄联盟手游终于在海外部分地区上线了,不过玩海外服有一点不好,就是界面都是外文,比如英文.日文.韩文等等.那么英雄联盟手游怎么设置繁体中文呢,这里就来给大家介绍一下LOL手游繁中设置方法,将游戏语言切 ...

  8. kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用

    kotlin调用类中的方法 by Oleksii Fedorov 通过Oleksii Fedorov 一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用 (A stress-free way t ...

  9. java中gettext方法_深入理解Java中方法的参数传递机制

    形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...

最新文章

  1. Makefile的介绍与使用
  2. linux 网络协议栈变化,ZZ Linux网络协议栈学习
  3. __init、__initdata和__exit、__exitdata
  4. ThinkPHP 3.2版本 , 无法读取$_SESSION['verify_code']
  5. 数据算法之希尔排序(shellSort)的Java实现
  6. PCL之平面分割模型
  7. springboot update数据_SpringBoot整合Mybatis+Druid+数据库(注解版)
  8. Centos查看进程命令
  9. Windows10 部分系统无法安装USB转串口驱动问题解决
  10. js打开新页面与关闭当前页面
  11. sumif单列求和_条件求和函数Sumif、Sumifs的超级实用技巧,你真的都掌握吗?
  12. 【数学 博弈论】JZOJ_3339 wyl8899和法法塔的游戏
  13. 火狐浏览器打开发现是2345的网站-----解决方法
  14. factorial of n
  15. 计算机毕业设计Java企业员工考勤系统的设计与实现(源码+系统+mysql数据库+lw文档)
  16. java gif转jpg_Java gif图片转换为jpg格式|chu
  17. 网狐棋牌客户端连接服务器修改方法
  18. 对DllRegisterServer调用失败,错误代码为80004005
  19. Nuke合成基础——笔记
  20. 基于Avaya H323 IP录音系统的解决方案

热门文章

  1. php如何将mysql数据库中的admin字段赋值给session_php实现将Session写入数据库
  2. please reinstall the mysql distribution_php安装扩展mysqli的实现步骤及报错解决办法
  3. 小程序开发语言python_小程序是用什么语言开发的?5种最佳语言分享
  4. 切换dns批处理模板
  5. zookeeper的acl权限控制_Zookeeper 权限控制 ACL介绍
  6. java技术分享主题_Java开发入门:适合新手练手的Java项目(附源码下载)
  7. WINCE6开机进度条
  8. windowsCE异常和中断服务程序初探(=)
  9. mysql怎么回复.from的数据库_mysql怎么回复.from的数据库
  10. 神经网络与深度学习——TensorFlow2.0实战(笔记)(五)(Matplotlib绘图基础<散点图>python)