TowardsDataScience-博客中文翻译-2020-三十七-
TowardsDataScience 博客中文翻译 2020(三十七)
数据对话:熊猫数据操作实用教程
了解如何使用 Kickstarter 项目数据集处理和操作数据。

来源: Kickstarter
数据无处不在
直到互联网的诞生,数据才真正对我们的生活产生重大影响,并彻底改变了商业运作的方式。这些天,我们有几乎所有的数据,从我们最喜欢的麦片品牌,你最好的朋友毕业的学校,到你下午 2 点的心率。现在说数据已经融入到我们的基因里,大概不为过。
收集、组织、构建和分析大规模数据的能力可能是最重要的特质…
medium.com](https://medium.com/scidex/data-is-everything-and-everyone-is-data-1886cfce2d92)
无论是在日常生活中还是在商业环境中,为了我们自己的利益利用这些数据都不是一件容易的事情。为什么?处理数据不仅需要相关领域的知识,还需要对数学或计算机科学(仅举几个例子)的技术理解,这对任何没有技术背景的人来说都是一个挑战。
希望能帮助初学者消除这个入门障碍,我正在写这个系列,叫做数据会谈。它将介绍处理数据的必要工具,更重要的是,讲述数据语言的“词汇和语法”。
该系列将包括三个部分:
- 第 1 部分:熊猫的数据操作
- 第 2 部分:使用 Matplotlib 实现数据可视化(即将推出)
- 第 3 部分:使用 Google Data Studio 进行数据报告(即将推出)
为了演示这些技术,我将使用来自 Kaggle 的 Kickstarter 项目数据集 。ka ggle是一个非常有用的网站,拥有大量数据集、竞赛和其他资源,可以帮助您提高数据科学技能。

来源: Kickstarter
这是给谁的?
这个系列适合完全初学者。一些关于 Python 的先验知识会有所帮助,但并不是必须遵循的。即使您熟悉所介绍的工具,您仍然可以找到一些提示和技巧来升级您的武器库。
开始之前
- 基本 Python :我们将在第 1 部分和第 2 部分使用的工具在 Python 中。Python 是一种流行而强大的编程语言,有很多应用,尤其是在数据科学领域。Python 很容易上手,所以如果你不熟悉这种编程语言,可以看看下面的文章。
首先,Python 是什么?根据它的创造者吉多·范·罗苏姆的说法,Python 是一种:
medium.com](https://medium.com/the-renaissance-developer/learning-python-from-zero-to-hero-8ceed48486d5)
- Google 账号:使用 GoogleColab—我们的编码环境和 GoogleData Studio。
Google Colab 是一个编码环境,你可以在其中运行 Python 代码,无需任何预先设置。很整洁,不是吗?它也是以互动的形式开发的,允许你轻松地写笔记,使它成为学习者的理想工具。
要创建新笔记本,请进入 Google Colab 然后点击新笔记本。

你会看到如下界面:

- 代码单元:这些是你编写和执行代码的地方。
- 文本单元格:你可以在这些单元格中写笔记/标题。**
熊猫
Pandas 是一个强大的 Python 库,用于处理和分析数据。它能够处理大型数据集(不像 Excel)和处理复杂的数据操作任务。在本文的剩余部分,将向您介绍 Pandas 的基本特性,以及如何在 Kickstarter 项目数据集中应用它们。
这篇文章中没有提到熊猫的许多特征。我建议你在图书馆工作时参考熊猫文档。
导入库
Pandas 没有自带 Python,所以我们首先需要将这个库导入到我们的笔记本中。幸运的是,Colab 的环境中预装了 Pandas,所以我们不必担心安装步骤。
pd是熊猫的常用别名。****
注意pd是我们为熊猫设置的别名(即昵称)。从现在开始,无论何时我们想使用这个库,我们都可以简单地调用pd。****
读取数据
Pandas 支持各种输入数据源,如 csv 文件、Excel 电子表格、SQL 查询等。在本例中,我们将从 csv 文件导入 Kickstarter 项目数据集。
我们首先需要让 Colab 笔记本访问我们的 Google Drive,这是我们存储 csv 文件的地方。
运行上面的代码将生成一个链接,您可以点击它。用你的 Google 帐户登录,然后将授权码复制到运行代码后你会在 Colab 笔记本上看到的输入框中。
为了从 csv 文件中读取数据,我们使用 Pandas 方法 pamdas .read_csv()。
方法.read_csv()将文件的路径作为参数。您可能需要根据您放置 csv 文件的位置进行更改。数据将被读取并保存到数据帧(我将把它保存到一个名为data的变量中)。数据帧和系列、是 Pandas 中使用的两种主要数据结构。
- ****数据帧是二维数组。这些就像你的 Excel 表格,有多列和多行,因此是二维的。
- ****系列是数据框架中的“列”。这些对象只是一维的,每个对象只能包含一种数据类型(如字符串、浮点、日期时间等)。)
查看数据
****
data.info()的输出
方法.info()为我们提供了数据的汇总报告,包括行数、非空值的数量、每个系列的数据类型以及数据帧的内存使用情况。这通常是我们导入数据后做的第一件事。
为了显示数据,我们可以简单地在代码单元中写下data(或者你给变量起的名字)并执行/运行代码单元。您可以使用快捷键 shift-enter 来完成此操作。
或者,我们可以用方法.sample(n)显示一些随机样本。n是我们想要显示的样本数量。例如,下面的代码打印出 Kickstarter 项目数据集中的 10 个随机行。
同样,您可以使用.head(n)和.tail(n)分别显示第一行和最后一行的和。
为了只选择一个或一些系列(列),我们可以将系列名称放在数据帧 data后面的方括号[]中。
清理数据

我们处理的数据几乎从未为直接分析做好充分准备。有时,可能会有丢失或不准确的值,这会打乱我们的计算。在其他情况下,我们将需要执行进一步的处理和工程,以进行更有意义的分析。
处理缺失数据
Pandas 有几个内置函数来处理丢失的数据。例如,方法.isnull()过滤掉丢失的值。结合聚合方法.sum(),这将得出每个序列中缺失值的总数。

data.isnull()的输出。总和()
在我们的例子中,序列name中有 4 个缺失值。我们可以通过应用过滤器来进一步研究这些值是什么。

数据的输出[数据['名称']。isnull()]
data['name'].isnull()过滤掉name系列中缺失的值。当放在数据框data后面的方括号[]内时,它被用作步进器。NaN代表非数字,它是一种特殊的数值数据类型,代表未识别或缺失的值。
既然我们已经确定了丢失的值,下一步就是决定如何处理它们。最简单的方法是删除包含丢失数据的行。然而,这种方法通常应该避免,因为它减少了我们拥有的数据总量,并可能导致我们分析中的偏差。如果缺失数据在数据集中占很大比例,这种偏差可能非常显著。查看下面的文章,了解更多处理丢失数据的方法。
“归罪的想法既诱人又危险”(R.J.A .利特& D.B .鲁宾)
towardsdatascience.com](/how-to-handle-missing-data-8646b18db0d4)
对于我们的例子,name对于我们的分析来说不是一个非常有用的序列,所以我们可以安全地用某个任意值替换这个序列中缺失的值,或者简单地从数据帧中删除这个序列。先说第一种方法。
data['name']选择系列name。方法.fillna()用指定值替换所选系列中缺失的数据。参数inplace = True告诉 Pandas 直接修改原始数据帧data。将参数inplace = False保留为默认值将返回一个填充了缺失值的新序列,而不是将更改应用到实际的数据帧data。
下降系列
有时我们可能想排除一些不必要的系列。这样做的一个原因是它可以提高性能,特别是当我们处理大型数据集时。但是,在决定删除哪个系列时应该仔细考虑,因为您可能会删除有用的信息。
我们还包括参数inplace = True来直接修改data。
处理错误
在我们的数据中出现错误并不罕见,它可能由于多种原因而发生,从人为错误到系统故障。无论如何,我们都需要适当地处理它们,以便我们的分析更加准确。然而,识别和修复这些错误通常非常具有挑战性,因为它们不仅需要技术技能,还需要对数据集的深刻理解。
数字数据:数字数据中的错误需要各种各样的统计技术,这对于这篇介绍性文章来说可能太难了。
分类数据:检测分类数据错误的最快方法是打印出所有唯一值。

数据输出['国家']。唯一()
稍微好一点的方法是使用熊猫的方法.value_counts(),它打印出唯一的值和它们的频率。

数据输出['国家']。值计数()
这个系列讲述了 Kickstarter 上的一个项目是从哪里来的。有一个奇怪的值N,0",好像是个错误。让我们看看它们是什么。

数据的输出[data[' country ']= ' N,0 ']。样本(10)
这些值是数据收集期间的错误(未定义状态和 0 支持者),由于它们只占整个数据集的 1%,我们可以删除它们。
处理日期时间数据
日期时间数据通常需要不同类型的处理。例如,我们可能想要计算两个日期之间的持续时间,或者提取时间部分(月、年、小时、分钟等。).Pandas 通过内置的日期时间函数使这些任务变得简单。
首先,我们需要转换 datetime 序列,以更正其正确的数据类型。

将截止日期和启动日期系列转换为日期时间后的输出 data.info()
为了提取任何日期时间成分,我们使用子模块dt。
上面的代码在我们的数据框架中创建了一个关于项目启动年份的新系列。有了它,我们可以很容易地发现这个系列中的一个错误。
这段代码返回 1970 年,这没有任何意义,因为 Kickstarter 是在 2008 年成立的!这显然是一个错误,因此我们可以从数据框架中排除任何启动年份小于 2008 年的行。
为了计算项目的持续时间,我们可以取deadline和launched系列的差值。
这将在两个 datetime 序列之间执行元素减法,并返回一个 timedelta 序列,我们可以将它转换为月或日这样的时间组件。
我们这里需要numpy的帮助。Numpy 是另一个非常强大的 Python 库,它增加了对数组和矩阵的支持。Pandas 构建在 Numpy 之上(还记得 DataFrame 是一个二维数组或矩阵吗?)所以这两个库配合得很好。要将时间增量转换为月份,请将'D'转换为'M',或者如果您想转换为小时,请选择'h'。点击阅读更多。**
完整的笔记本
你可以在这里 找到本文 中的数据和包含代码的 Colab 笔记本。
下一步是什么?
在接下来的几年里,熟练使用数据将成为一项基本技能。Pandas 是帮助你处理数据的一个很好的工具,尤其是当数据变得更大更复杂的时候。
在数据会谈系列的第二部分,我将讨论数据分析项目的下一步,即探索数据和提取见解。有了它,我将介绍 Matplotlib ,一个用于数据可视化的 Python 库。
- ****第 2 部分:使用 Matplotlib 进行数据可视化(待更新)
- ****第 3 部分:使用 Google Data Studio 进行数据报告(待更新)
数据—数据科学之旅的起点
数据为什么重要?有哪些类型的数据?我们如何在数据科学预测中使用数据?
什么是数据科学?
关于数据科学的有趣的事情是,它是一个年轻的领域,从教科书到报纸到白皮书,定义可能会有所不同。一般的定义是,数据科学是多种工具、算法和机器学习原则的混合物,目的是发现数据中隐藏的模式。这与已经存在并使用多年的统计数据有何不同?答案在于解释和预测的区别。

数据科学过程
数据科学由七个主要步骤组成。它们中的每一个对模型的准确性都很重要。我们来看看每一步都包含了什么。

商业理解
如果我们想创建一个数据科学项目,我们需要理解我们试图解决的问题。因此,在这一步中,我们必须得到以下问题的答案:
多少人?
哪个类别?
哪个小组?
这很奇怪吗?
-应考虑哪个选项?
基于对这些问题的回答,我们可以得出哪些变量应该被预测的结论。
数据挖掘
下一步是找到正确的数据。数据挖掘是从不同来源寻找和收集数据的过程。我们需要回答以下问题:
-项目需要哪些数据?
-我在哪里可以找到这些数据?
-如何获取数据?
-存储和访问数据的最有效方式是什么?
如果数据在一个地方,这个过程对我们来说会很容易。通常情况下,情况并非如此。
数据清理
这是最复杂的一步,需要 50%到 80%的时间。数据收集后,我们必须清理它。数据可能包含丢失的值,或者在一列中可能不一致。这就是为什么我们需要清理和组织我们的数据。
数据探索
在数据被清理之后,我们将试图在其中找到一个隐藏的模式。该步骤包括提取子集、分析和可视化子集。在此之后,我们得到了每个数据点背后的完整图像。
特征工程
在机器学习中,特征被解释为被观察到的现象的属性。例如,如果我们正在观察一个学生的成绩——一个可能的属性可能是学生获得的睡眠时间。该步骤分为两个子步骤。第一个是特征选择。在这一步中,我们可以删除一些特征,以减少可能导致模型复杂的维度。此外,我们想要删除的功能通常会带来比有用信息更多的干扰。第二个子步骤是要素构建-这意味着我们可以在现有要素的基础上构建一个新要素。
预测建模
这是我们最终建立模型的步骤。在这里,我们决定我们将使用哪个模型——基于我们在第一步获得的答案。这不是一个容易的决定,也不总是有一个答案。模型及其准确性取决于数据——数据的大小、数据的类型以及数据的质量。模型训练完成后,我们必须评估精度,确定模型是否成功。
数据可视化
在我们从模型中获得信息后,我们需要以不同的方式将它们可视化,以便被项目中的每个人理解。
商业理解
一旦一切都完成了,我们就返回到第一步,检查模型是否满足最初的需求。如果我们在生命周期的第一次迭代中遇到了新的见解(我确信我们会遇到),我们现在可以将这些知识输入到下一次迭代中,以产生更强大的见解,并释放数据的力量,为项目提取非凡的结果。
什么是数据?
我们可以看到,几乎每一步都需要数据。我们可以看到,上一部分的五个步骤中有四个是与数据相关的。因此,我们可以假设数据在数据科学项目中起着至关重要的作用。什么是数据?数据是如何定义的?这看起来似乎是一个不重要的定义,但它是。每当我们使用“数据”这个词时,我们指的是一组有组织或无组织的信息。
基本数据类型
根据上一部分的定义,有两种格式:
o 结构化(有组织的)数据:按行/列结构分类的数据,其中每一行代表一个观察值,每一列代表该观察值的特征
o 非结构化(无组织)数据:自由形式的数据,通常是文本或原始音频/信号,必须进一步解析才能变得有组织。
当我们谈论数据时,我们首先需要回答的是数据是定量的还是定性的。当我们谈论定量数据时,我们通常会想到结构化数据集。这两种数据类型可以定义如下:
o 量化数据:当数据可以用数字来描述,并且在集合上可以进行基本的数学运算,包括加法。
o 定性数据:当数据无法用数字和基础数学描述时。这些数据通常使用自然类别和语言来描述。
数据
定量数据可以是:
o 离散数据:描述被计数的数据。它只能呈现特定的值。离散定量数据的例子包括掷骰子,因为它只能取六个值,以及咖啡店的顾客数量,因为你不能有一个真实的人群范围。
o 连续数据:描述测量的数据。它存在于无限的价值范围内。
数据的四个层次
一般认为,结构化数据的特定特征(特征/列)可以分为四个数据级别。这些级别如下:
o 名义水*
o 序数级别
o 区间水*
o 比率水*
让我们更深入地了解每一个层次,并解释每一个层次。
名义水*
该级别包含由名称或类别描述的数据。比如性别,名字,物种等等。这些数据不能用数字来描述,所以它是定性数据,因此我们不能对这些数据进行数学运算,如加法或除法。我们可以在这个级别上执行的操作是等式和设置隶属函数。此外,我们不能使用中心的度量——中心的度量被解释为向我们显示数据趋向于什么的数字,有时它被称为数据的*衡点。为什么我们不能使用中心的测量?解释很简单——通常,当我们使用这种方法时,我们使用众数、中位数或*均值。但是,在名义水*上,我们不能使用数学运算,所以这些措施没有意义。总之,这一层由分类数据组成,我们必须小心使用这些数据——因为它可能包含对我们非常有用的见解。
序数级别
当我们谈论数学运算时,名义水*不是很灵活。序数级的数据提供了一个等级顺序,但是我们仍然不能使用更复杂的数学运算——比如减法或加法,以便获得真正的意义。例如,从 1 到 10 的等级是序数数据——如果我们想使用加法,我们不会从中获得任何有用的信息。再比如一个调查结果。在这个层次上,我们在数学运算上比在名义上有更多的自由。名义级别的数学运算(相等和集合成员)被继承,允许的附加运算是排序和比较。在顺序级别,中位数通常是定义数据中心的合适方法,但我们也可以使用该模式。然而,*均值是不可能的,因为这一级别的划分是不允许的。
间隔等级
现在,我们正在达到这样一个水*,数据可以用*均值来表示,我们可以使用更复杂的数学公式。间隔级别的数据支持数据点之间的相减。例如,包含温度的数据属于间隔级别。来自较低级别的操作(排序、比较等)被继承,并且允许的附加操作是加法和减法。当我们谈论中心的度量时,我们可以使用中位数、众数或*均值,通常,对中心最准确的描述是算术*均值。让我们看一个例子。我们试图使用包含储存疫苗的冰箱温度的数据来找到中心的度量。最佳温度必须低于 29 度。找到*均值和中值后,我们假设它们都接* 31,因此这对于我们的数据集来说是不可接受的。这就是我们需要另一个衡量标准的地方——方差或标准差。如果我们想知道我们的数据是如何分布的,我们可以使用这个方法。如果要求方差的度量,需要计算均值,从均值中减去每个点,求每个*方差的*均值,求*方根。公式如下:

如果我们在温度的例子中使用这个公式,我们可以计算数据集的标准偏差,根据这个度量,我们可以看到温度可能会下降(*均值减去标准偏差)。
比率水*
最后一个层次叫做比率层次。比率和区间水*之间没有太大的区别——有时我们可能会搞不清哪个才是正确的。在区间水*上,我们没有自然起点或自然零点,但在比率水*上——我们有。来自较低层的数学运算被继承,而附加的是乘法和除法。例如,银行账户中的钱被分类到这一级——一个银行账户可以有一个自然零。作为中心的度量,我们可以使用几何*均值—它是所有值的乘积的*方根。这个级别的数据应该是非负的,这就是为什么这个级别不是优选的。
结论
数据科学可以为任何业务增加价值,重要的是好好利用数据。此外,数据科学可以帮助我们基于可测量的证据做出更好的决策。当我们做决策时,数据应该总是可用的。使用数据科学方法,我们可以研究历史数据,与竞争对手进行比较,分析市场,最重要的是,就产品或服务的最佳表现提出建议。这些分析是数据科学的一部分,提供了对市场的深入了解和理解,以及他们对产品或服务的反馈。据估计,每天产生大约 25 亿千兆字节的数据。随着数据量的增加,获取对目标群体来说重要的内容可能会很困难。公司从客户那里收集的每一条数据——无论是社交媒体赞、网站访问还是电子邮件调查——都包含可以分析的数据,以便更有效地了解客户。这意味着某些群体的服务和产品是可以定制的。例如,发现年龄和收入之间的相关性可以帮助公司为以前可能没有的群体创造新的促销或优惠。
如果你对这个话题感兴趣,请随时联系我。
领英简介:https://www.linkedin.com/in/ceftimoska/
用 T5 产生数据到文本;建立一个简单而先进的 NLG 模型
通过微调 T5 实现数据到文本的 NLG 模型

作者图片
简介
自从自然语言处理领域中的序列到序列模型出现以来,我就一直在探索 NLG 模型的数据到文本生成能力。解决这个问题的早期尝试没有显示出任何有希望的结果。像简单 NLG 这样的非基于 ML 规则的方法似乎没有很好地扩展,因为它们需要格式良好的输入,并且只能执行诸如改变句子时态之类的任务。但是在语言模型的时代,每两周就会有变形金刚的新版本发布,这样的任务不再是遥不可及的梦想。
在这篇博客中,我将讨论我如何用高级深度学习模型处理数据到文本的生成问题。

模因通过图像翻转
openAI GPT-2 似乎是一个不错的选择,因为它具有引人注目的文本生成能力。但是在 NLG 2017 年数据上训练它并没有让我有所收获。模型根本没有收敛。GPT-2 的有条件和无条件文本生成能力相当不错,但是您很难找到可以处理这些任务的业务用例。
此外,根据特定领域的数据对它们进行微调有时会导致产生脱离上下文的句子

通过图像翻转进行迷因
由于 openAI(不那么开放)没有发布 GPT-3 的代码,我在该系列中只剩下第二好的,即 T5 。
型号:谷歌 T5
Google 的 T5 是一个文本到文本转换转换器,它是一个共享的 NLP 框架,所有的 NLP 任务都被重新组织成一个统一的文本到文本格式,输入和输出都是文本串。

图片来源:谷歌博客
它与只能输出一个类标签或输入范围的 BERT 型模型有很大的不同。T5 允许我们在任何 NLP 任务中使用相同的模型以及损失函数和超参数。
数据:WebNLG 2020
我使用 WebNLG Challenge 2020 的 RDF-to-text 生成任务的数据来训练 T5。
给定(a)中所示的四个 RDF 三元组,目标是生成一个像(b)这样的文本
(a)RDF 三元组

来源: WebNLG
(b)英文本
特灵于 1913 年 1 月 1 日在威斯康星州的拉克罗斯成立,总部位于爱尔兰。它有 29,000 名员工。
数据预处理
要对数据进行预处理,可以使用 Python 中的 XML WebNLG 数据读取器这里是,或者使用下面代码中给出的[xml.etree.ElementTree](https://docs.python.org/3/library/xml.etree.elementtree.html#module-xml.etree.ElementTree)模块。(我最终使用了后者,因为我太无知了,无法阅读整个挑战文档😐)
在代码中,您可以看到我们保留了正常的三元组,并用“&&”连接多个三元组。当一个表的多行被一次输入到模型中时,它可以被认为是一个分隔符。
训练模型
像往常一样,谷歌的 TensorFlow 实现很难解释,我继续使用拥抱脸的 PyTorch 实现,并选择了 T5 基础模型。整个模型训练在 google colab 中进行。

通过图像翻转进行迷因
安装转换器库
!pip install transformers
导入所需的模块
import pandas as pdimport torchfrom transformers import T5Tokenizer, T5ForConditionalGeneration,Adafactor
加载预处理后的数据,并随机重排行,使不同长度的三元组(1 个三元组到 7 个三元组)分布在数据框中,从而快速归纳损失。
修剪掉一些数据点,这样一批就不会留下任何余数,因此可以避免一些代码行(好吧,这可能是一种粗略的做法)。
train_df=pd.read_csv(‘webNLG2020_train.csv’, index_col=[0])
train_df=train_df.iloc[ :35000,:]
train_df=train_df.sample(frac = 1)batch_size=8
num_of_batches=len(train_df)/batch_size
检测 GPU。
if torch.cuda.is_available():
dev = torch.device("cuda:0")
print("Running on the GPU")
else:
dev = torch.device("cpu")
print("Running on the CPU")
加载预训练的模型、记号化器,并将模型移入 GPU。
tokenizer = T5Tokenizer.from_pretrained(‘t5-base’)
model = T5ForConditionalGeneration.from_pretrained(‘t5-base’,
return_dict=True)#moving the model to GPU
model.to(dev)
使用推荐的 T5 设置启动 Adafactor 优化器。
optimizer = Adafactor(model.parameters(),lr=1e-3,
eps=(1e-30, 1e-3),
clip_threshold=1.0,
decay_rate=-0.8,
beta1=None,
weight_decay=0.0,
relative_step=False,
scale_parameter=False,
warmup_init=False)
基于 Html 的进度条。
from IPython.display import HTML, display
def progress(loss,value, max=100):
return HTML(""" Batch loss :{loss} <progress
value='{value}'max='{max}',style='width: 100%'>{value}
</progress> """.format(loss=loss,value=value, max=max))
现在,训练模型。
我花了大约 3-4 个小时在 Colab GPU 上运行四个纪元。
序列化模型
torch.save(model.state_dict(),'pytoch_model.bin')
t5 基础模型的配置文件可以下载并放置在与保存的模型相同的目录中。确保将其重命名为 config.json
!wget https://s3.amazonaws.com/models.huggingface.co/bert/t5-base-config.json
加载训练好的模型进行推理
确保给定的路径既有保存的模型又有配置文件。此外,如果您有一个用于执行推理的 GPU,请记住将模型和输入张量移动到 GPU。
生成的结果
现在让我们看看不同输入生成的文本输出。

作者图片
结论
我们讨论了如何构建一个从结构化数据生成文本的高级 NLG 模型。T5 的文本到文本架构使得将结构化数据(可以是文本和数字数据的组合)输入模型变得容易。我在 huggingface 的 transformer 上使用了原生 PyTorch 代码,在 WebNLG 2020 数据集上对其进行了微调。
与基于 GPT-2 的文本生成不同,这里我们不仅触发语言生成,我们还控制它!!
然而,这是该方法的基本实现,并且使用相对不太复杂的数据集来测试该模型。当用具有两个以上三元组的数据点测试模型时,它似乎忽略了数据输入中存在的一些信息。为了解决这个问题,需要做进一步的研究和大量的实验。
你可以在这个回购里找到代码
有什么问题尽管问!谢谢大家!
数据转换
理解为什么数据科学家工作中“不性感”的部分可能是最重要和最酷的部分之一

阿瑟尼·托古列夫在 Unsplash 上的照片
介绍
当我们谈论数据科学时,我们偏向于从像人工智能(AI)、机器学习(ML)、预测未来等性感的方面入手。就像我们的大脑试图从过去的经验中模拟未来一样,ML 算法从过去中工作和学习,我们的工作是为它们提供尽可能最好的学习体验。
你有没有想过如何现在就闭上眼睛,体验明天你要向广大听众发表的演讲的激情?
在本文的前半部分,我们将看看简单的用例,这些用例将帮助我们理解为什么数据转换是必不可少的,以及它如何帮助我们的分类器更好地执行。在后半部分,我们将直观地理解为什么对指数特征执行对数变换将允许我们使用线性回归对其建模。
分类环境中的数据转换
我们试图根据特征 x 将汽车分为两种类型——红色和绿色,我们在下面绘制了不同汽车 id 的 x 值。

如您所见,我们的分类器必须在红色区域周围绘制一个*行四边形边界,以准确识别不同的汽车。
现在,想想如果我们使用特征绝对(x)或|x| 而不是 x 会发生什么?

如上图,分类器可以画一条直线,对数据进行准确的分类。
多酷啊!我们通过对特征 x 执行简单的数据转换,将非线性分类问题转化为线性问题。这种转换将允许我们使用线性分类器,或者如果我们仍然希望使用复杂的非线性分类器,则减少它们的工作量。类比——想象你在幼儿园的美术课上,你的老师要求你画一条直线或一个*行四边形。你会选什么?为什么?
将问题转换成线性分类的对特征 x 的另一个操作是*方(x)。

锻炼
比方说,我们对不同的汽车有两个特征 f1 和 f2,我们把它们画在下面。你能想出(f1,f2)上的一个变换来把它转换成一个线性分类问题吗?

回答
计算并绘制(f1,f2)到(0,0)的欧几里德距离。

回归环境中的数据转换
假设我们的老板希望我们预测特定 x 的 y 值,作为一名负责任的数据科学家,我们将 y 可视化为我们的特征 x 的不同值,曲线图如下所示。

看了上面的图,我们知道 x 和 y 的关系不是线性的。考虑到散点图的形状,我们可以考虑使用指数模型,这非常有意义。但是,在此之前,让我们考虑绘制 x 和 log(y)。

一旦我们把 y 转换成 log(y),我们就可以用一条直线来模拟 x 和 log(y)。这种操作称为对数变换,用于指数数据,使其成为线性。注意,x 和 y 仍然是非线性相关的。但是,由于变换,我们可以拟合一条线性回归线,从数学上讲,从线性模型回到指数模型并不困难。
此外,线性回归是可解释性的冠军,能够通过量化不同预测因素对因变量的影响来提供可操作的见解,受到许多企业利益相关者的青睐。
结论
没有通用的数据转换方法。了解您的模型喜欢什么,并以那种格式为它提供输入,将极大地提高您的 ML 管道的性能。
一般准则:
- 可视化您的数据,尝试并了解其分布
- 选择您要使用的型号
- 根据您选择的数据和模型,为您的用例定制数据转换
请注意,有时,数据转换可能会:
- 成为唯一的出路。
- 在准确性、处理时间和可解释性方面提高性能。
- 不需要。
看完这篇文章,希望你偏从数据探索入手。在你开始训练一个复杂的模型之前,试着了解是否有任何转换会让你的机器学习模型受益。
我使用 Matplotlib 创建了本文中的所有可视化效果,代码在 this GitHub Gist 中。
最后,我想感谢我的朋友萨姆校对了这篇文章。
数据转换
📈Python for finance 系列
如何将现代机器学习应用于体积扩散分析(VSA)

警告:这里没有神奇的公式或圣杯,尽管一个新的世界可能会为你打开大门。
📈Python For Finance 系列
在预览文章中,我简要介绍了体积扩散分析(VSA)。在我们完成特征工程和特征选择后,我立即注意到两件事,第一件是数据集中有异常值,第二件是分布不接*正态分布。通过使用这里描述的、这里描述的和这里描述的的方法,我去除了大部分的异常值。现在是时候面对更大的问题了,常态。
有许多方法可以传输数据。众所周知的一个例子是一键编码,更好的例子是自然语言处理(NLP)中的单词嵌入。考虑到使用深度学习的一个优势是,它完全自动化了过去机器学习工作流程中最关键的步骤:特征工程。在后面的文章进入深度学习之前,我们先来看看一些简单的转移数据的方法,看看能否让它更接*正态分布。
在这篇文章中,我想尝试几件事。第一种是将所有特征转换成简单的百分比变化。第二个是做百分位数排名。最后,我将向您展示,如果我只选择所有数据的符号,会发生什么。像 Z-score 这样的方法,是深度学习中的标准预处理,我宁愿暂时不做。
1.数据准备
为了一致性,在所有的📈Python for finance 系列,我会尽量重用相同的数据。关于数据准备的更多细节可以在这里,这里这里和这里找到,或者你可以参考我之前的文章。或者,如果你愿意,你可以忽略下面的所有代码,使用你手头上任何干净的数据,这不会影响我们将要一起做的事情。
#import all the libraries
import pandas as pd
import numpy as np
import seaborn as sns
import yfinance as yf #the stock data from Yahoo Finance
import matplotlib.pyplot as plt #set the parameters for plotting
plt.style.use('seaborn')
plt.rcParams['figure.dpi'] = 300#define a function to get data
def get_data(symbols, begin_date=None,end_date=None):
df = yf.download('AAPL', start = '2000-01-01',
auto_adjust=True,#only download adjusted data
end= '2010-12-31')
#my convention: always lowercase
df.columns = ['open','high','low',
'close','volume']
return dfprices = get_data('AAPL', '2000-01-01', '2010-12-31')#create some features
def create_HLCV(i):
#as we don't care open that much, that leaves volume,
#high,low and close
df = pd.DataFrame(index=prices.index)
df[f'high_{i}D'] = prices.high.rolling(i).max()
df[f'low_{i}D'] = prices.low.rolling(i).min()
df[f'close_{i}D'] = prices.close.rolling(i).\
apply(lambda x:x[-1])
# close_2D = close as rolling backwards means today is
# literly the last day of the rolling window.
df[f'volume_{i}D'] = prices.volume.rolling(i).sum()
return df# create features at different rolling windows
def create_features_and_outcomes(i):
df = create_HLCV(i)
high = df[f'high_{i}D']
low = df[f'low_{i}D']
close = df[f'close_{i}D']
volume = df[f'volume_{i}D']
features = pd.DataFrame(index=prices.index)
outcomes = pd.DataFrame(index=prices.index)
#as we already considered the different time span,
#here only day of simple percentage change used.
features[f'volume_{i}D'] = volume.pct_change()
features[f'price_spread_{i}D'] = (high - low).pct_change()
#aligne the close location with the stock price change
features[f'close_loc_{i}D'] = ((close - low) / \
(high - low)).pct_change() #the future outcome is what we are going to predict
outcomes[f'close_change_{i}D'] = close.pct_change(-i)
return features, outcomesdef create_bunch_of_features_and_outcomes():
'''
the timespan that i would like to explore
are 1, 2, 3 days and 1 week, 1 month, 2 month, 3 month
which roughly are [1,2,3,5,20,40,60]
'''
days = [1,2,3,5,20,40,60]
bunch_of_features = pd.DataFrame(index=prices.index)
bunch_of_outcomes = pd.DataFrame(index=prices.index)
for day in days:
f,o = create_features_and_outcomes(day)
bunch_of_features = bunch_of_features.join(f)
bunch_of_outcomes = bunch_of_outcomes .join(o)
return bunch_of_features, bunch_of_outcomesbunch_of_features, bunch_of_outcomes = create_bunch_of_features_and_outcomes()#define the method to identify outliers
def get_outliers(df, i=4):
#i is number of sigma, which define the boundary along mean
outliers = pd.DataFrame()
stats = df.describe()
for col in df.columns:
mu = stats.loc['mean', col]
sigma = stats.loc['std', col]
condition = (df[col] > mu + sigma * i) | \
(df[col] < mu - sigma * i)
outliers[f'{col}_outliers'] = df[col][condition]
return outliers#remove all the outliers
features_outcomes = bunch_of_features.join(bunch_of_outcomes)
outliers = get_outliers(features_outcomes, i=1)features_outcomes_rmv_outliers = features_outcomes.drop(index = outliers.index).dropna()features = features_outcomes_rmv_outliers[bunch_of_features.columns]
outcomes = features_outcomes_rmv_outliers[bunch_of_outcomes.columns]
features.info(), outcomes.info()

要素数据集的信息

结果数据集信息
最后,我们将具有基于不同时间尺度的量差分析(VSA)的基本四个特征,如下所列,即 1 天、2 天、3 天、一周、一个月、2 个月和 3 个月。
- 音量:非常直接
- 范围/价差:最高价和收盘价之间的差异
- 收盘价相对于区间:收盘价是接*价格柱的顶部还是底部?
- 股票价格的变化:非常直接
2.百分比回报
我知道上面有很多代码。我们通过下面的函数将所有特征转换成简单的百分比变化。
def create_features_and_outcomes(i):
df = create_HLCV(i)
high = df[f'high_{i}D']
low = df[f'low_{i}D']
close = df[f'close_{i}D']
volume = df[f'volume_{i}D']
features = pd.DataFrame(index=prices.index)
outcomes = pd.DataFrame(index=prices.index)
#as we already considered the different time span,
#here only 1 day of simple percentage change used.
features[f'volume_{i}D'] = volume.pct_change()
features[f'price_spread_{i}D'] = (high - low).pct_change()
#aligne the close location with the stock price change
features[f'close_loc_{i}D'] = ((close - low) / \
(high - low)).pct_change()#the future outcome is what we are going to predict
outcomes[f'close_change_{i}D'] = close.pct_change(-i)
return features, outcomes
现在,让我们用聚类图来看看它们的相关性。Seaborn 的 clustermap()层次聚类算法展示了一种将最密切相关的特征分组的好方法。
corr_features = features.corr().sort_index()
sns.clustermap(corr_features, cmap='coolwarm', linewidth=1);

基于此聚类图,为了最大限度地减少所选要素中的要素重叠量,我将移除那些与其他要素紧密配对且与结果目标相关性较小的要素。从上面的聚类图中,很容易发现[40D,60D]和[2D,3D]上的特征是成对出现的。为了了解这些特征与结果之间的关系,我们先来看看结果之间的关系。
corr_outcomes = outcomes.corr()
sns.clustermap(corr_outcomes, cmap='coolwarm', linewidth=2);

从上到下,20 天、40 天和 60 天的价格百分比变化被分组在一起,2 天、3 天和 5 天也是如此。然而,一天的股价百分比变化相对独立于这两组。如果我们选择第二天的价格百分比变化作为结果目标,让我们看看这些特性是如何与之相关的。
corr_features_outcomes = features.corrwith(outcomes. \
close_change_1D).sort_values()
corr_features_outcomes.dropna(inplace=True)
corr_features_outcomes.plot(kind='barh',title = 'Strength of Correlation');

相关系数太小,无法得出可靠的结论。我会期望最*的数据具有更强的相关性,但这里的情况并非如此。
双人情节怎么样?我们只选择那些基于 1 天时间尺度的特征作为演示。与此同时,我将close_change_1D转换为基于它是负数还是正数的符号,以增加绘图的额外维度。
selected_features_1D_list = ['volume_1D', 'price_spread_1D', 'close_loc_1D', 'close_change_1D']
features_outcomes_rmv_outliers['sign_of_close'] = features_outcomes_rmv_outliers['close_change_1D']. \
apply(np.sign)sns.pairplot(features_outcomes_rmv_outliers,
vars=selected_features_1D_list,
diag_kind='kde',
palette='husl', hue='sign_of_close',
markers = ['*', '<', '+'],
plot_kws={'alpha':0.3});

配对图建立在两个基本图形上,直方图和散点图。对角线上的直方图允许我们看到单个变量的分布,而上下三角形上的散点图显示了两个变量之间的关系(或缺乏关系)。从上面的图中,我们可以看到,随着交易量的增加,价差越来越大。大部分价格变动位于狭窄的价差,换句话说,更大的价差并不总是伴随着更大的价格波动。无论是低交易量还是高交易量都会导致几乎所有规模的价格变动。我们可以把所有这些结论应用到上涨和下跌的日子里。
您也可以使用接*的酒吧位置,以增加更多的维度,简单地应用
features[‘sign_of_close_loc’] = np.where( \
features[‘close_loc_1D’] > 0.5, \
1, -1)
看有多少棒线的收盘价高于 0.5 或低于 0.5。
在 pair 图中,我不喜欢的一点是所有的图都浓缩了close_loc_1D,看起来像离群值仍然存在,即使我知道我使用了一个标准偏差作为边界,这是一个非常低的阈值,338 个离群值被删除。我意识到因为 close 的位置已经是百分比变化了,在上面再加一个百分比变化没有太大意义。让我们改变它。
def create_features_and_outcomes(i):
df = create_HLCV(i)
high = df[f'high_{i}D']
low = df[f'low_{i}D']
close = df[f'close_{i}D']
volume = df[f'volume_{i}D']
features = pd.DataFrame(index=prices.index)
outcomes = pd.DataFrame(index=prices.index)
#as we already considered the different time span,
#simple percentage change of 1 day used here.
features[f'volume_{i}D'] = volume.pct_change()
features[f'price_spread_{i}D'] = (high - low).pct_change()
#remove pct_change() here
features[f'close_loc_{i}D'] = ((close - low) / (high - low))
#predict the future with -i
outcomes[f'close_change_{i}D'] = close.pct_change(-i)
return features, outcomes
去掉了pct_change(),让我们看看现在的星团图是什么样子。
corr_features = features.corr().sort_index()
sns.clustermap(corr_features, cmap='coolwarm', linewidth=1);

聚类图现在更有意义了。所有四个基本特征都有非常相似的模式。[40D,60D],[2D,3D]配对在一起。
以及与结果相关的特征。
corr_features_outcomes.plot(kind='barh',title = 'Strength of Correlation');

长期时间尺度特征与股票价格回报的相关性较弱,而*期事件对价格回报的影响更大。
通过去掉close_loc_1D的pct_change(),最大的区别在于pairplot()。

最后,close_loc_1D变量在正确的范围内绘图。这说明我们应该小心过度设计。它可能会导致一个完全意想不到的方式。
3.百分位数排名
根据维基百科,百分位排名是
分数的百分位数等级是分数在其频率分布中等于或低于它的百分比。例如,一个测试分数大于参加测试的人的分数的 75%被认为是在第75百分位,其中 75 是百分位等级。
以下示例返回与过去 60 天期间相比,每个值的交易量的百分比等级(从 0.00 到 1.00)。
roll_rank = lambda x: pd.Series(x).rank(pct=True)[-1]
# you only pick the first value [0]
# of the 60 windows rank if you rolling forward.
# if you rolling backward, we should pick last one,[-1].features_rank = features.rolling(60, min_periods=60). \
apply(roll_rank).dropna()
outcomes_rank = outcomes.rolling(60, min_periods=60). \
apply(roll_rank).dropna()
✍Tip!
熊猫rolling(),默认情况下,结果设置为窗口的右边缘。这意味着该窗口是向后看的窗口,从过去滚动到当前时间戳。这就是为什么对于那个窗口帧中的rank(),我们选择最后一个值[-1]。
更多关于rolling()的信息,请查看官方文档。
首先,我们快速浏览一下结果的聚类图。它几乎等同于顺序不同的百分比变化。
corr_outcomes_rank = outcomes_rank.corr().sort_index()
sns.clustermap(corr_outcomes_rank, cmap='coolwarm', linewidth=2);

同样的模式也适用于要素的聚类图。
corr_features_rank = features_rank.corr().sort_index()
sns.clustermap(corr_features_rank, cmap='coolwarm', linewidth=2);

即使使用不同的方法,
# using 'ward' method
corr_features_rank = features_rank.corr().sort_index()
sns.clustermap(corr_features_rank, cmap='coolwarm', linewidth=2, method='ward');

当然,特征和结果的相关性也是一样的。
corr_features_outcomes_rank = features_rank.corrwith( \
outcomes_rank. \
close_change_1D).sort_values()corr_features_outcomes_rank

corr_features_outcomes_rank.plot(kind='barh',title = 'Strength of Correlation');

最后,你可能会猜到结对图也是一样的。
selected_features_1D_list = ['volume_1D', 'price_spread_1D', 'close_loc_1D', 'close_change_1D']
features_outcomes_rank['sign_of_close'] = features_outcomes_rmv_outliers['close_change_1D']. \
apply(np.sign)sns.pairplot(features_outcomes_rank,
vars=selected_features_1D_list,
diag_kind='kde',
palette='husl', hue='sign_of_close',
markers = ['*', '<', '+'],
plot_kws={'alpha':0.3});

因为我们在集合窗口中使用了百分位等级(从 0.00 到 1.00),所以斑点均匀地分布在所有特征上。与未经变换的相同数据相比,所有特征的分布或多或少接*正态分布。
4.签署
最后同样重要的是,我想删除所有的数据颗粒,看看这些功能在这种情况下是如何关联的。
features_sign = features.apply(np.sign)
outcomes_sign = outcomes.apply(np.sign)
然后再次计算相关系数。
corr_features_outcomes_sign = features_sign.corrwith(
outcomes_sign. \
close_change_1D).sort_values(ascending=False)corr_features_outcomes_sign

corr_features_outcomes_sign.plot(kind='barh',title = 'Strength of Correlation');

现在看来有点怪,像volume_1D和price_spread_1D和现在的胜负相关性很弱。
幸运的是,聚类图基本保持不变。
corr_features_sign = features_sign.corr().sort_index()
sns.clustermap(corr_features_sign, cmap='coolwarm', linewidth=2);

结果之间的关系也是如此。
corr_outcomes_sign = outcomes_sign.corr().sort_index()
sns.clustermap(corr_outcomes_sign, cmap='coolwarm', linewidth=2);

至于 pair plot,由于所有数据都被转移到-1 或 1,它没有显示任何有意义的东西。

有时对数据进行“标准化”或“规范化”是至关重要的,这样我们才能在不同尺度的特征之间进行公*的比较。我很想用 Z-score 来标准化数据集。

Z 得分的公式需要*均值和标准差,通过计算整个数据集的这两个参数,我们有机会看到未来。当然,我们可以再次利用滚动窗口。但一般来说,人们会在将数据注入模型之前对其进行标准化。
总之,通过利用 3 种不同的数据转换方法,现在我们很有信心可以选择最相关的特性并丢弃那些大量的特性,因为所有 3 种方法几乎共享相同的模式。
5.*稳和正态性检验
最后一个问题转换后的数据能通过*稳性/正态性检验吗?这里,我将使用扩展的 Dickey-Fuller 检验,这是一种叫做单位根检验的统计检验。同时,我还想看看偏斜度和峰度。
import statsmodels.api as sm
import scipy.stats as scs
p_val = lambda s: sm.tsa.stattools.adfuller(s)[1]def build_stats(df):
stats = pd.DataFrame({'skew':scs.skew(df),
'skew_test':scs.skewtest(df)[1],
'kurtosis': scs.kurtosis(df),
'kurtosis_test' : scs.kurtosistest(df)[1],
'normal_test' : scs.normaltest(df)[1]},
index = df.columns)
return stats
检验的零假设是时间序列可以用一个单位根来表示,它不是*稳的(具有一些依赖于时间的结构)。另一个假设(拒绝零假设)是时间序列是*稳的。
- 零假设(H0) :如果没有被拒绝,说明时间序列有单位根,意味着它是非*稳的。它有一些依赖于时间的结构。
- 备选假设(H1) :拒绝零假设;这表明时间序列没有单位根,这意味着它是*稳的。它没有依赖于时间的结构。
以下是来自增强迪基-富勒测试的结果:
对于功能和结果:
features_p_val = features.apply(p_val)
outcomes_p_val = outcomes.apply(p_val)
outcomes_p_val,features_p_val


测试可以通过 p 值来解释。低于阈值的p-值(如 5%或 1%)表明我们拒绝零假设(*稳),否则,高于阈值的p-值表明我们不能拒绝零假设(非*稳)。
- p-值> 0.05 :不能拒绝零假设(H0),数据有单位根,非*稳。
- p-值< = 0.05 :拒绝零假设(H0),数据没有单位根,是*稳的。
从这个测试中,我们可以看到所有的结果都远低于 5%,这表明我们可以拒绝零假设,所有转换的数据都是*稳的。
接下来,我们来测试正态性。
build_stats(features_outcomes_rmv_outliers)

对于正态分布的数据,偏斜度应该大约为零。对于单峰连续分布,大于零的偏斜值意味着分布的右尾有更多的权重,反之亦然。
scs.skewtest()检验样本总体的偏斜度与相应正态分布的偏斜度相同的原假设。由于所有的数字都低于 5%的阈值,我们不得不拒绝零假设,并说偏斜度不符合正态分布。同样的事情去scs.kurtosistest()。
scs.normaltest()检验样本来自正态分布的原假设。它基于 D'Agostino 和 Pearson 的测试,结合了偏斜度和峰度,以产生一个正态性的综合测试。同样,所有数字都低于 5%阈值。我们必须拒绝零假设,并说由百分比变化转换的数据不是正态分布。
我们可以对通过百分比排名和签名转换的数据进行同样的测试。我不想让事情变得更复杂,把人们吓跑。在这篇文章太长之前,我最好在这里结束。
参考
- 麦金农,J.G. 1994。单位根和协整检验的*似渐*分布函数。《商业与经济统计杂志》12,167–76。
- 达戈斯蒂诺,R. B. (1971),“中等和大样本量的正态性综合检验”,《生物计量学》,58,341–348
- 达戈斯蒂诺,r .和皮尔逊,E. S. (1973),“偏离正态性的检验”,《生物计量学》,60,613–622
PySpark 中的数据转换
PySpark 中数据转换的演练

图片来自PexelsMarkus Spiske
现在,数据的增长速度超过了处理速度。这个问题的众多解决方案之一是在大型集群上并行计算。输入 PySpark。
然而,PySpark 要求您以不同的方式考虑数据。
而不是逐行查看数据集。PySpark 鼓励您从专栏的角度来看待它。起初,这对我来说是一个艰难的转变。我会告诉你我学到的主要技巧,这样你就不用浪费时间去寻找答案了。
资料组
我将使用来自 Kaggle 的有害空气污染物数据集。
这个数据集是8,097,069行。
df = spark.read.csv(‘epa_hap_daily_summary.csv’,inferSchema=True, header =True)
df.show()

作者图片
条件 If 语句
我们要做的第一个转换是条件 if 语句转换。如下所示:如果数据集中的一个单元格包含一个特定的字符串,我们希望更改另一列中的单元格。
基本上我们想从这里开始:

作者图片
对此:

作者图片
如果local site name包含单词police,那么我们将is_police列设置为1。否则我们将其设置为0。
这种条件如果在熊猫身上陈述是相当容易做到的。我们会使用[pd.np.where](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.where.html)或[df.appl](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html)y。在最坏的情况下,我们甚至可以遍历这些行。我们在 Pyspark 做不到这些。
在 Pyspark 中,我们可以使用[F.when](https://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.functions.when)语句或[UDF](https://spark.apache.org/docs/2.2.0/api/python/pyspark.sql.html#pyspark.sql.functions.udf).语句,这允许我们获得与上面相同的结果。
from pyspark.sql import functions as Fdf = df.withColumn('is_police',\
F.when(\
F.lower(\
F.col('local_site_name')).contains('police'),\
F.lit(1)).\
otherwise(F.lit(0)))df.select('is_police', 'local_site_name').show()

作者图片
现在假设我们想扩展我们上面所做的。这一次,如果一个单元格包含 3 个字符串中的任何一个,那么我们将在另一列中更改相应的单元格。
如果任何一个字符串:'Police', 'Fort' , 'Lab'在local_site_name列中,那么我们将相应的单元格标记为High Rating。
与我们之前看到的F.when函数结合的[rlike](https://spark.apache.org/docs/2.2.0/api/python/pyspark.sql.html#pyspark.sql.Column.like)函数允许我们这样做。
parameter_list = ['Police', 'Fort' , 'Lab']df = df.withColumn('rating',\
F.when(\
F.col('local_site_name').rlike('|'.join(parameter_list)),\
F.lit('High Rating')).\
otherwise(F.lit('Low Rating')))df.select('rating', 'local_site_name').show()

作者图片
F.when实际上对很多不同的事情都有用。事实上你甚至可以做一个连锁F.when:
df = df.withColumn('rating', F.when(F.lower(F.col('local_site_name')).contains('police'), F.lit('High Rating'))\
.when(F.lower(F.col('local_site_name')).contains('fort'), F.lit('High Rating'))\
.when(F.lower(F.col('local_site_name')).contains('lab'), F.lit('High Rating'))\
.otherwise(F.lit('Low Rating')))df.select('rating', 'local_site_name').show(

作者图片
这与我们在前面的例子中看到的完全一样。然而,要写的代码更多,要维护的代码也更多。
我更喜欢上面讨论的rlike方法。
删除空白
空白真的很烦人。它确实会影响字符串匹配,并会导致查询中不必要的错误。
在我看来,尽快删除空白是个好主意。
[F.trim](https://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.functions.trim)允许我们这样做。它将删除指定列中每一行的所有空白。
df = df.withColumn('address', F.trim(F.col('address')))
df.show()

作者图片
删除特定列的空行
假设我们只想删除一列中的空行。如果我们在pollutant_standard列中遇到NaN值,则删除整行。
这可以相当简单地完成。
filtered_data = df.filter((F.col('pollutant_standard').isNotNull())) # filter out nulls
filtered_data.count()
条件 OR 参数允许删除我们event_type或site_num所在的行NaN.
这就是所指的的 |。
filtered_data = df.filter((F.col('event_type').isNotNull()) | (F.col('site_num').isNotNull())) # filter out nulls
filtered_data.count()
df.na.drop 允许我们删除所有列都是NaN的行。
filtered_data = df.na.drop(how = 'all') # filter out nulls
filtered_data.show()
结论
PySpark 仍然是一门相当新的语言。可能正因为如此,互联网上没有太多的帮助。像熊猫或 R 这样的东西有丰富的信息。有了 Spark 就完全不是这么回事了。
所以我希望这些代码能帮助到一些人。他们肯定会帮助我,节省我很多时间。我经历的转变可能看起来很小或微不足道,但当它涉及到 Spark 时,没有多少人谈论这些东西。我希望这能在某种程度上帮助你。
如果我犯了一个错误,或者你想联系我,请随时通过 twitter 联系我。
原载于 2020 年 9 月 6 日https://spiyer 99 . github . io。
R 中的数据转换
带 tidyverse 包

D ata T 转换是从事商业数据分析、数据科学甚至人工智能前期工作的关键方面之一。在本练习中,我们将了解如何在 R 中转换数据。 R 是一种开源的统计计算和机器学习编程语言,由 R 统计计算基金会提供支持。使用其广泛使用的集成开发环境- RStudio 既易学又舒适。这里我们要用的 R 包是tidy verse。
tidyverse 是专为数据科学设计的 R 包集合。所有的包共享一个底层的设计哲学、语法和数据结构。
dplyr&tidyr包 tidyverse 中的函数主要完成数据转换的工作。
让我们先安装并加载这个包
**install.packages("tidyverse")
library(tidyverse)**
注意:您只需要安装软件包一次,但是每次启动环境时都需要加载软件包。
这些是我们将在本文中研究的功能—
- 排列():对观察值进行排序
- select() :选择变量或列
- filter() :根据观察值过滤观察值
- gather() :将观察从列转移到行
- spread() :将变量从行移动到列
- group _ by()&summary():将数据进行分组汇总
- mutate() :从现有变量创建新变量
排列()
按变量排列行

埃菲社在 Unsplash 上拍摄的照片
该函数按顺序排列观察值。它将一个列名或一组列名作为参数。对于单个列名,它将该列的数据与该列后面的其他列一起排序;对于多个列名,每个附加的列都会打断前面列的值。
为了展示这一点,我们将加载 mpg 数据集。它有 38 种流行车型从 1999 年到 2008 年的燃油经济性数据。
?mpg **data(mpg)
View(mpg)**

作者图片
首先,我们将根据 displ 列对观察结果进行排序。默认情况下,该列的值将按升序排列,其他列将遵循 displ 列的顺序。
**mpg_arrange1 <- mpg %>% arrange(displ)**
View(mpg_arrange1)

作者图片
然后我们将在参数中添加更多的两个列名—cty&hwy。
**mpg_arrange2 <- mpg %>% arrange(displ, cty, hwy)**
View(mpg_arrange2)

作者图片
我们可以看到第二( cty )和第三( hwy )列分别打破了第一( displ )和第二( cty )列的值之间的联系。
为了按降序排列观察值,将使用 desc() 函数
**mpg_arrange3 <- mpg %>% arrange(desc(displ))**
View(mpg_arrange3)

作者图片
注意:如果有任何丢失的值,那么这些值将总是在末尾排序
选择()
按名称选择变量

亚历山大·席默克在 Unsplash 上拍摄的照片
我们将在这里使用相同的 mpg 数据集
?mpg **data(mpg)
View(mpg)**

作者图片
现在我们将选择三列— displ , cty & hwy 到一个新的数据帧
**mpg_select1 <- mpg %>% select(displ, cty, hwy)**
View(mpg_select1)

图片由 RStudio 作者提供
如果我们想选择从 displ 到 hwy 的所有列,我们可以写如下
**mpg_select2 <- mpg %>% select(displ : hwy)**
View(mpg_select2)

图片由 RStudio 作者提供
过滤器()
按条件过滤观察值

比尔·牛津在 Unsplash 上拍摄的照片
为此,我们将使用钻石数据集,看看如何根据条件选择观察值。
?diamonds
**data(diamonds)
View(diamonds)**

图片由 RStudio 作者提供
我们可以检查列值的汇总
> **summary(diamonds$carat)**
***Min. 1st Qu. Median Mean 3rd Qu. Max.***
0.2000 0.4000 0.7000 0.7979 1.0400 5.0100> **summary(diamonds$price)**
***Min. 1st Qu. Median Mean 3rd Qu. Max.***
326 950 2401 3933 5324 18823> **table(diamonds$cut)
*Fair Good Very Good Premium Ideal***
1610 4906 12082 13791 21551
让我们只过滤掉 理想的 切工的钻石
**diamonds_filter1 <- diamonds %>% filter(cut == 'Ideal')**
View(diamonds_filter1)

作者图片
现在让我们过滤 理想高级 切割钻石
**diamonds_filter2 <- diamonds %>%
filter(cut == c('Ideal', 'Premium'))**
View(diamonds_filter2)

作者图片
这就是我们如何过滤价格大于 2500 的钻石
**diamonds_filter3 <- diamonds %>% filter(price > 2500)**
View(diamonds_filter3)

作者图片
现在我们将在三列中应用滤镜: 理想 切工0.54克拉钻石与价格 1266
**diamonds_filter4 <- diamonds %>%
filter(cut == 'Ideal', carat == 0.54, price == 1266)**
View(diamonds_filter4)

作者图片
我们来看一个更复杂的过滤标准——理想 切, 介于 0.4 和(&)1.0克拉同价格** 小于 580 或者( | 大于 10000 适当的逻辑运算符将被用来表达这些条件。
**diamonds_filter5 <- diamonds %>%
filter(cut == 'Ideal' ,
carat >= 0.4 & carat <= 1.0 ,
price < 580 | price > 10000)**
View(diamonds_filter5)

作者图片
不是(! ) 运算符需要非常小心地使用。在使用时,我们需要牢记德摩根定律。本法写明 !(x & y) 同 !x |!y ,还有 !(x | y)同 !x &!yT91。
**diamonds_filter6 <- diamonds %>%
filter(cut != 'Ideal',
!(carat >= 0.4 & carat <= 1.0) ,
!(price < 580 | price > 10000))**
View(diamonds_filter6)

作者图片
聚集()
将列收集到键值对中

菲尔·科夫曼在 Unsplash 上拍摄的照片
有时,我们可以有一个数据集,其中的观察值是在列名中找到的,需要收集到具有新列名的变量下。让我们先构建数据集。
**Country_Name** <- c('Qatar', 'United States', 'Germany',
'Canada', 'United Kingdom')
**Y2009** <- c(59094, 47099, 41732, 40773, 38454)
**Y2010** <- c(67403, 48466, 41785, 47450, 39080)
**Y2011** <- c(82409, 49883, 46810, 52101, 41652)**gdp <- data.frame(Country_Name, Y2009, Y2010, Y2011)
View(gdp)**

作者图片
该数据集可视为五个国家 2009 年、2010 年和 2011 年的 GDP 数据。可以清楚地看到,Y2009,Y2010 & Y2011 这些列名本身就是观测值,应该在一个变量或列名之下- ' Year '。我们将通过 gather() 函数来实现。
**gdp_gather <- gdp %>% gather("Year", "GDP" , 2:4)**
View(gdp_gather)

作者图片
为了让这个数据集为数值分析做好准备,我们需要从年值中删除字符“ Y ”(或任何字符),并将其从字符转换为整数。
**gdp_gather$Year <- gsub("[a-zA-Z]", "", gdp_gather$Year)
gdp_gather$Year <- as.integer(gdp_gather$Year)**
View(gdp_gather)
glimpse(gdp_gather)

作者图片

作者图片
传播()
将键值对分布在多个列中

有时,我们可以看到变量分布在数据集中的观察值中。在这种情况下,我们需要将它扩展到列名。让我们用键值构建一个数据集。
**Student** <- c('Jack', 'Jack', 'Jack', 'Jack', 'Jack', 'Jack',
'Rose', 'Rose', 'Rose', 'Rose', 'Rose', 'Rose')
**Subject** <- c('English', 'Biology', 'Chemistry', 'Maths', 'Physics',
'Social Science', 'English', 'Biology', 'Chemistry',
'Maths', 'Physics', 'Social Science')
**Marks** <- c(80, 70, 87, 75, 90, 82, 65, 70, 88, 92, 79, 93)**reportCard <- data.frame(Student, Subject, Marks)**
**View(reportCard)**

作者图片
在这个报告卡数据集中,如果我们将主题名称视为变量,那么它需要扩展到列名称。我们将通过 spread() 函数来实现。
**reportCard_spread1 <- reportCard %>% spread(Subject, Marks)**
View(reportCard_spread1)

作者图片
如果我们将学生的名字视为变量-
**reportCard_spread2 <- reportCard %>% spread(Student, Marks)**
View(reportCard_spread2)

作者图片
group _ by()& summary()
按变量分组&将多个值减少到一个值

照片由塞维多夫·热莫夫斯基在 Unsplash 拍摄
这些是非常有用的函数,它们组合在一起将值汇总成组。这里我们将使用 msleep 数据集。它包含了一些哺乳动物的睡眠数据和体重数据。
?msleep
**data(msleep)**
colnames(msleep)
**msleep <- msleep %>% select(name, order, sleep_total, bodywt)
View(msleep)**

作者图片
我们将 sleep_total 汇总到其*均值值- sleep_avg 和 bodywt 到其最大值值- bodywt_max 。该汇总将按订单分组,每个订单观察的数量将在计数栏下。这些都将由 group_by() 和summary()用数学函数- n() 、 mean() 和 max() 来完成。
**msleep_groupby_summarize <- msleep %>% group_by(order) %>%
summarise(
count = n(),
sleep_avg = mean(sleep_total),
bodywt_max = max(bodywt)
)**
View(msleep_groupby_summarize)

作者图片
变异()
创建或转换变量

克里斯·劳顿在 Unsplash 上拍摄的照片
在数据分析中,从现有变量推导出新变量是非常常见的。这里我们将使用航班数据集。它有 2013 年从纽约起飞的所有航班的准点数据。为了得到这个数据集,我们需要安装并加载包nyflights 13。
**install.packages("nycflights13")**
**library(nycflights13)**?flights
**data(flights)**
colnames(flights)
**flights <- flights %>% select(year, month, day, dep_delay,
arr_delay, distance, air_time )
View(flight)**

作者图片
现在我们将通过从 dep_delay 中减去 arr_delay 来创建两个新变量- time_gain 以及通过将距离除以 air_time 和乘以 60 来创建速度。
**flights_mutate <- flights %>%
mutate(time_gain = dep_delay - arr_delay ,
speed = distance / air_time * 60)**
View(flights_mutate)

作者图片
所以现在就这样了。我建议您使用不同的数据集以及您自己的数据来练习这种数据转换功能。这可能是你进入数据科学这一惊人领域的第一步。祝你接下来的旅程一切顺利!
你也可以看看我关于数据可视化的文章
R 语言中的“图形语法”一瞥
towardsdatascience.com](/data-visualization-with-ggplot2-db04c4956236) 
数据可信度
如果收件人值得信任,泄露一些个人隐私不一定是件坏事

本·怀特在 Unsplash 上的照片
想象一下,你有一条敏感信息,你必须告诉至少一个人。你会把它告诉那个众所周知爱说长道短、经常走漏风声的人,还是那个把你的秘密看得不仅仅是有趣的细节、而且非常负责任地保管这些信息的人?你会告诉那个你几乎不认识,但你听说过的值得信任的人,还是那个你已经认识一段时间并赢得你信任的人?你会告诉那个听到这个敏感信息后会问十个不同的后续问题的人,还是那个重视你给他们的信息而不会追问你更多信息的人?
希望这些问题已经帮助你明确了在敏感信息方面你认为什么样的人是值得信任的。
随着政府处理当前的新冠肺炎疫情,隐私已经让位于更大的利益,这种趋势在当前危机之前我们已经在医疗数据中看到了(见这篇文章讨论了医疗数据的使用,以及这篇后续文章关于我们如何开始看到这种情况在疫情发生)。最*,我看了 Vox 关于韩国相当成功地应对新冠肺炎病毒的视频,其中一段话让我特别感兴趣,下图是疾病控制和预防中心的韩国主任说的。

视频截图链接此处(同上)
事实是,为了公众健康,我们现在可能不得不放弃一些隐私,特别是如果我们想得到像韩国那样有效的回应。然而,放弃一些隐私并不等同于放弃我们在余下的数字生活中所有的隐私权。至少,不一定是这个意思。正如《纽约时报》的这篇文章所描述的,一月份,韩国当局公布了大量感染新冠肺炎病毒的人的信息。由于韩国是一个网络发达的社会,这些人很快就被抓了起来,并被公开羞辱。作为回应,卫生官员本月宣布,“他们将完善数据共享指南,以将患者风险降至最低。”通过这样做,他们证明了自己是敏感个人数据的更周到、更值得信赖的管理者。事实上,韩国疾病控制和预防中心主任郑恩景最*说:
“我们将在保护个人人权和隐私的价值与维护公共利益防止大规模感染的价值之间取得*衡”
还记得在这篇文章的开头,我让你想象你会和什么样的人分享敏感的个人信息吗?从这些问题中,你可能已经确定了一个人,他有着重视敏感信息、尊重你和信息敏感性的良好记录。简而言之,他们已经证明了自己在数据方面是值得信赖的。上述声明以及韩国卫生官员正在采取的措施证明,韩国政府正在积极努力成为公共数据的可信管理者。
当然,这种敏感数据的获取和使用远不止发生在韩国。我们看到技术正被用于跟踪像波兰、T2、以色列、T4、法国和其他许多地方的人。正如美国人从 911 袭击的后果中知道的那样,一旦这些许可被授予,就很难再取消。此外,随着我们进入一个更加数据驱动的时代,无论我们喜欢与否,我们的个人数据可能会变得越来越容易获取。这就是为什么我们开发具体的方法来确保拥有我们数据的人是值得信赖的管理者更加重要。如果像政府这样的机构想要访问我们的数据,我们需要确保它们是可信的,而确保它们保持可信的最佳方式是明确定义“可信”的含义。当然,这是一项艰巨的任务,因为这个定义可能会根据你交谈的对象而有所不同。然而,回想一下我在开始时问的那个假设的值得信任的人,我认为我们确实普遍同意让一个人值得信任的某些特质,例如以这样一种方式行事,一个人不会获取超过他们需要的信息,并确保敏感信息不会无意中传播给其他人。
在我上周的文章中,我讨论了轻视个人隐私的文化是如何导致灾难性后果的,正如最*的 Zoom 安全问题所展示的那样。上周,我指出了轻视隐私的文化的负面影响,而本周,我想指出重视个人隐私的文化的正面影响,这种文化就像是在韩国医疗机构对新冠肺炎事件的反应中培养的那种文化。是的,当他们在一月份发布敏感信息时,他们肯定犯了很大的错误,但他们利用这个机会赢得了公众的信任,并且在处理数据时更加小心。如果损失的是值得信赖、安全的一方,他们会负责任地处理数据,不会要求超出他们需要的东西,并且已经证明他们积极重视人权和隐私,那么一定程度的隐私损失不一定是坏事。
没有任何科学是非政治性的,数据科学也不例外。在我们生活的这个数据密集的现实中尤其如此。有鉴于此,数据科学家不应将他们的目标局限于获得最佳准确度或精确度分数。尤其是当我们处理越来越多的敏感信息时,我们的目标不应该总是“获取更多数据”我们的目标应该是,“充分利用我们所拥有的一切。”也许这有时会有局限性,但是一些最好的创新来自于适应局限性。
数据科学中的数据一致性
处理熊猫最常见的一致性问题

介绍
在我以前关于数据清理的文章中,我谈到了超出范围的值、不正确的数据类型、唯一性约束是如何成为常见问题的,如果不加以处理,会严重影响我们的分析。
在本文中,我们将解决一个同样危险的问题,它同样会扭曲我们的分析,这就是单元一致性。
与一致性相关的问题有多种形式:
- 华氏和摄氏温度数据
- 重量以千克和磅表示
- 多种日期格式
- 用不同货币表示的货币
这些问题的出现有很多原因。例如,跨多个位置收集数据并合并到一个位置。这会导致上述问题。您必须知道如何处理一致性问题,以便进行准确的分析。
设置

people.head()

单位一致性
考虑之前导入的这个温度数据集。它以摄氏度为单位给出了 3 个月的日*均温度信息:
temperatures.sample(10)

如果我们看指数 48,除非发生重大气候事件,我们可以猜测值是以华氏温度给出的:

图片由 作者
在这种情况下,使用散点图直观地发现它们:

散点图清楚地显示了华氏温度值。快速的谷歌搜索向我们展示了将华氏温度转换为摄氏温度的公式:

图片由 作者
现在,我们将使用该等式将 40 以上的任何值转换为摄氏度:
我们可以通过两种方式检查转换是否成功。首先,用assert声明:
再次使用散点图:

尽管这是一个简单的例子,但你的情况可能完全不同。有时,你可能甚至没有注意到数据海洋中的不一致。在寻找它们之前,你必须完全了解你的数据,并了解这些数据是如何收集的。
日期一致性
另一个非常普遍的问题是日期一致性。不同的国家有不同的标准日期时间格式,当您有来自多个来源的数据时,您将不得不处理多种日期格式。在 Python 中,有 3 种主要的日期时间格式可供使用:
- 25–12–2019-->(% d-% m-% Y)->年,月,日
- 2020 年 10 月 31 日-> (%c) - >字面日期
- 12–25–2019-->(% m-% d-% Y)->月,日,年
当您使用pandas将数据加载到您的环境中时,它总是将日期作为object数据类型导入。在设置部分,我们导入了包含人的全名和生日的示例数据:
people.sample(5)

birthday列用 YY-MM-DD 格式表示日期,但用字符串表示。将日期列转换为datetime对于执行分析有很多好处。我们将使用pd.to_datetime()功能将列转换为datetime:
我们出错了!如果我们仔细看,错误说月份必须在 1,2,…,12。这意味着,在数据的某个地方,有一个不一致的值阻止了函数的运行。pd.to_datetime对此类情况有一个很好的解决方法:
这一次,我们没有出现任何错误。如果您将infer_datetime_format设置为True,pandas将根据第一个非 NaN 元素自动识别日期格式,并将其余部分转换为该格式。如果有任何值不适合转换,errors参数决定如何处理它们。如果设置为coerce,pandas将放置NaT为缺失的日期值。
基于我们的假设,上面的代码行应该已经发现了日期不一致,并将NaT放入不一致的日期:
有几种方法可以处理这种不一致:
- 转换为 NA 并进行相应处理
- 通过查看数据源推断格式,它是如何收集的
- 通过查看其他日期来推断格式
如果你有许多不一致,将它们转换成NaN并不总是一个选项。您应该通过观察它们的模式和推断它们的格式来尝试提出定制的解决方案。
完成错误处理和转换后,最佳做法是将日期列转换为全局日期时间标准:

图片由 作者
如果你喜欢这篇文章,请分享并留下反馈。作为一名作家,你的支持对我来说意味着一切!
阅读更多与主题相关的文章:
处理常见的数据问题
towardsdatascience.com](/data-type-constraints-data-range-constraints-duplicate-data-with-pandas-44897a350b1e) [## 掌握 DS/ML 中最讨厌的任务
用 Pandas 清理分类数据
towardsdatascience.com](/master-the-most-hated-task-in-ds-ml-3b9779276d7c) [## FuzzyWuzzy:Python 中的模糊字符串匹配,初学者指南
…以及在真实数据集上的动手实践
towardsdatascience.com](/fuzzywuzzy-fuzzy-string-matching-in-python-beginners-guide-9adc0edf4b35) [## 认识熊猫最难的功能,第一部分
掌握 pivot_table()、stack()、unstack()的时机和方式
towardsdatascience.com](/meet-the-hardest-functions-of-pandas-part-i-7d1f74597e92) [## 来自 Kagglers:DS 和 ML 的最佳项目设置
来自顶级 Kagglers 的项目成功最佳实践的集合
towardsdatascience.com](/from-kagglers-best-project-setup-for-ds-and-ml-ffb253485f98) [## 我的情节糟透了。以下是我如何修复它们。
你的,在某种意义上,可能也是。
towardsdatascience.com](/deep-guide-into-styling-plots-delivering-effective-visuals-12e40107b380)
数据验证:应对大数据管理挑战的关键解决方案
由于数据验证仍然是当今数据驱动型公司面临的最大挑战之一,这里有一个适用于全球技术团队的有效改进解决方案。
数据验证预计将是 2020 年电子商务网站可能面临的最大挑战之一。在本文中,我们将回顾一些关键统计数据,强调当前影响大数据公司的主要数据验证问题。这篇文章的最终目的是为技术团队提供一个质量改进的解决方案。
全球范围内,零售电子商务公司的销售额持续快速增长。2019 年,全球销售额达到 35,350 亿美元,据 Statista 统计,这些数字将在 2023 年翻*一番,达到 65,420 亿美元之多。
随着电子商务的持续增长,存储的数据也在增长。仅电子商务的数据量就将呈指数级增长。希捷的《2025 年数据时代报告》预测,到 2025 年,全球数据空间将达到 175 兆字节。
但是,只有一小部分从竞争对手和公开来源收集的数据将用于分析。这是因为电子商店接收非标准数据,无论是来自第三方供应商还是通过他们自己构建的抓取基础设施。他们通常收集的数据是未格式化的,并且是原始格式,例如 HTML,因此很难阅读。
我们在 Oxylabs 的客户也面临这些挑战,因为我们的大多数电子商务客户都处理大数据。本文旨在指出数据管理的主要难点,并为任何处理大数据的技术团队提供解决方案和捷径。
主要数据管理问题
体积增长
数据管理将是 2020 年大数据面临的最大挑战之一。不仅进入组织的信息量将难以存储和组织,而且非结构化数据流的涌入将减慢任何分析流程,中断工作流。
不同的数据格式
数据量增长并不是唯一的问题。不同的数据格式及其变体也在增长。举个例子,有些网站提供的日期是 CSV 格式,如 YYYY-MM-DD,而其他网站的标准是 JSON ,格式为 MM/DD/YYYY。在读取非标准化数据时,这种看似很小的差异可能会导致很大的错误。
数据有效性
当范围的增长速度超过人力资源的增长速度时,必须考虑使用自动化来处理这些任务。* 90%的公司表示他们已经实现了部分数据管理流程的自动化。这包括分析和报告形式的后端以及前端和数据过滤。这就是我们的数据管理解决方案数据验证发挥作用的地方。
什么是数据验证?
数据验证是一种检查和调整数据(通常在导入和处理之前)的准确性和质量的方法或功能。根据您使用的验证选项(我们将在本文后面介绍不同的 Cerberus 验证选项),它可以成为一个自定义验证,确保您的数据是完整的,包含不同的值,并确保它们不会重复,并确保值的范围是一致的。
简而言之,数据验证允许您执行分析,知道您的结果将是准确的。那么,什么方法或库可以用于顺利的数据验证过程呢?
Cerberus:强大的数据验证功能
Cerberus 提供强大而简单的轻量级数据验证功能。它被设计成易于扩展,允许自定义验证。简单来说,它是 Python 的一个验证库。
请注意,我们选择 Cerberus 作为例子,因为验证模式是语言不可知论者(JSON ),可以很好地与其他语言一起工作,使它更灵活地适应各种工作流。
Cerberus 基本工作流程
要使用 Cerberus 验证您的数据,您需要做的就是定义规则。这是通过一个叫做模式的 python 字典对象来完成的。
假设您有 JSON 人员数据集:
```json**[**{**"name": "john snow",**"age": 23,**"fictional": True,**},**...**}```*
你希望确保它的有效性。您可以定义的最基本的模式如下所示:
```python**schema = {**"name": {"type": "string", "required": True},**"age": {"type": "int"},**"fictional": {"type": "bool"},**}```*
这里我们为个人数据字段定义了严格的类型:姓名必须是字符串,年龄必须是整数,虚构的必须是布尔值。此外,我们总是希望名字出现,因为没有名字的人的数据很少有用。一旦我们获得了数据集和模式,我们就可以在 python 中执行我们的验证:
```python**import json**from cerberus import Validator****dataset: dict**schema: dict****validator = Validator()**success = validator.validate(dataset, schema)**if not success:**print(validator.errors)**# error example:**# {'name': ["field 'name' is required"]}```
这里我们创建了一个 Cerberus 验证器对象。现在,您可以简单地为它提供一个数据集和模式,并运行 validate。如果验证失败,验证器将向您显示错误消息。很简单。现在让我们看看 Cerberus 为我们准备了什么样的验证选项!
Cerberus 验证选项
类型验证
第一种也是最重要的一种验证是 __ 类型验证 _ _。
确保数据集字段是正确的类型是一种很好的做法,因为无效的类型可能会破坏整个数据工作流,甚至更糟的是,以静默方式执行无效的操作。例如,字段“年龄”最终是浮点数,而不是整数。这会在你不知不觉中打乱你所有的计算。
值验证
接下来,我们将验证价值覆盖和价值本身。例如,可以设置“必需”规则以确保该字段总是存在。“禁止”、“允许”和“包含”规则的混合可以确保严格的值选项。
为了举例,让我们验证一个食谱数据集:
```python**schema = {**# forbid some ingredients**"ingredients": {"forbidden": "pork"},**# restrict recipe type**"type": {"allowed": ["breakfast", "lunch", "dinner"]},**# all recipes posts should have recipes category**"categories": {"contains": "recipes"},**}```*
考虑到这一点,我们也可以将关系添加到一些关系期望中。例如,如果我们的食谱有素食版本,我们希望确保它包含素食成分:
```python**schema = {**"vegan_alternative": {"dependencies": "vegan_ingredients"}**}```*
最后,最灵活和最常见的值验证规则是正则表达式模式,Cerberus 也支持这种模式。以我们的食谱为例,我们可以进一步确保食谱的标题以大写字母开头:
```python**schema = {**"title": {"regex": "[A-Z].+"}**}```*
Cerberus 提供了广泛的内置值、覆盖范围和类型验证,并且可以通过自定义规则轻松扩展。让我们添加我们自己的 python 函数作为规则:
```python**def is_odd(field, value, error):**if not value & 1:**error(field, "Must be an odd number")**schema = {**"preparation_time": {"check_with": is_odd}**}```*
在这里,我们确保准备时间总是一个奇数(营销告诉我们奇数往往卖得更好)。
密钥验证
只剩下一件需要验证的事情了——密钥本身。这是一个重要的步骤,特别是如果您自己不做数据解释,而将数据提供给其他服务的话。例如,如果图形可视化工具不支持大写字母,您应该确保数据没有大写字母:
```python**schema = {**"keysrule": {**"type": "string",**"regex": "[a-z]+"**}**}```*
在这里,模式验证确保所有键都应该只包含小写字符。
正如我们所看到的,Cerberus 支持广泛的验证规则,通过使用它们的整体组合,我们确保我们的数据遵循严格的可预测格式,以进行无错误的数据处理。此外,地狱犬也可以帮助处理。
Cerberus 附加处理
有时我们知道数据集已经有无效值。正是因为这个原因,Cerberus 提供了在验证之前处理数据的能力。
首先,我们可以规范化密钥格式:
```python**v = Validator({}, allow_unknown={'rename_handler': [str, str.lower]})**v.normalized({'Cat': 'meow'})**# {'cat': 'meow'}```*
这里,我们确保所有的键都是小写字符串。
今后,我们还可以通过清除未知键来精简数据集,因为数据集通常带有元键和不重要的数据:
```python**v = Validator({'cat': {'type': 'string'}}, purge_unknown=True)**v.normalized({'cat': 'meow', 'dog': 'woof'})**# {'cat': 'meow'}**# cat people > dog people```
在这个例子中,我们去掉了不想要的动物类型。
我们也可以反其道而行之,通过为不存在的值设置默认值来扩展数据集:
```python**schema = {"dogs_or_cats": {**"type": "string",**"default": "cats"**}}```*
因此,如果“dogs_or_cats”字段没有值,我们可以直接假设该值是“cat”。
最后,我们可以通过强制将字符串转换为整数,以任何方式改变数据:
```python**schema = {'amount': {'type': 'integer', 'coerce': int}}**validator.validate({'amount': '1.0'})**validator.document**# {'amount': 1}```*
通过结合这两个 Cerberus 的特性,验证和处理,我们可以始终确保以一种非常实用的方式拥有一个可靠的数据流。您将拥有一个数据源模式文件,团队中的任何人都可以轻松地访问、编辑、维护和理解该文件。
包扎
随着不可靠结构化数据量的增加,管理和处理数据以使其可读的需求对大数据公司来说变得越来越重要。分析非结构化数据会变得非常令人头疼,并会降低您的工作流程。通过应用数据验证解决方案,如 Cerberus,您可以创建一个节省资源、资金和时间的重要公司生活帮。
数据验证—数据湖和数据库迁移项目
使用 Spark 进行高速低成本数据验证的指南

在过去的 25 年里,我参与了大量的数据库迁移和数据湖项目。数据迁移/数据湖接收后,客户的一个非常常见的验收标准是执行数据验证。根据经验,我可以很容易地说,任何给定项目的大部分时间都花在了数据验证上。在处理异构数据库时尤其如此。花费在数据验证上的时间经常超过实际执行迁移或接收所花费的时间。如果您需要执行多次迁移和摄取迭代,问题会成倍增长。
在过去的几年里,我的主要目标是开发一种不仅速度快而且成本低的解决方案。以下是我多年来开发的框架的发展阶段。
采样后进行人工验证
在我早期,一种非常常见的数据验证方法是抽样。在此方法中,从源和目标中选择了一组样本行。质量保证工程师对样本集进行了目视扫描/比较。该过程大部分是手动的,因此效率低下且容易出错。此外,它只验证了一小部分行样本。
采样后自动验证
在这个方法中,从源和目标中选择一组样本行,然后是执行数据验证的 SQL/PERL 脚本。该过程是自动化的,非常高效,但有时仍然很慢,这取决于样本大小。该方法还验证了一个小样本行。
整个数据集的自动验证
客户开始要求逐行逐列地进行数据验证。这意味着数据采样不再是一个选项。需要一种能够执行完整数据验证的解决方案。我们制定了如下计划:
- 从源和目标中根据主键选择相同行的串联列
- 创建行的校验和并进行比较。校验和匹配确保行完全相同。
- 如果发现不一致,则将违规行写入失败表

(图片作者)
在我们开始处理大型数据集之前,上述解决方案对我们来说工作得相当好。与此同时,大数据开始变得强大。尽管上述解决方案具有内置的并行处理能力,但我们经常开始缺少时间,错过最后期限。
当我们计算出当前项目的数据验证每一次迭代需要超过 30 天时,问题变得极其严重和可怕。一个失败的开始,因为我们最终会错过所有的最后期限。
我们需要一个更好的解决方案…快速
分布式计算拯救世界
幸运的是,我们已经进入了大数据时代。作为早期采用者,我们已经在几个项目中采用了 Hadoop。Spark 和云计算的应用即将出现。除了数据迁移,我们还遇到了几个数据湖项目。因此,我们希望创建一个框架,既能适用于这两种使用情形,又能兼容内部部署或云基础架构。我们是这样做的:
- 数据接收:除了从源到目的地迁移/接收数据,我们还选择在 HDFS(本地 Hadoop)或 S3 (AWS cloud)上以 Parquet 格式转储源和目的地数据的额外副本。如果您使用 AWS DMS 并使用—S3-settings“data format”:“parquet”创建一个 S3 端点,这一步非常简单
- 基础架构:针对内部部署的——Spark 集群(Hadoop ),针对 AWS 云的——EMR 的——HDFS 上的 PySpark,HDFS 上的 PySpark。由于数据验证计划不是真正的关键任务,我们选择使用 4-5 个 Spot 实例来降低成本。对我们来说效果很好。我已经发布了 EMR 实例的详细信息,如下所示:
--instance-groups '[{"InstanceCount":5,"BidPrice":"OnDemandPrice",
"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},
"InstanceGroupType":"CORE","InstanceType":"c4.8xlarge","Name":"Core - 2"},{"InstanceCount":1,
"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},
"InstanceGroupType":"MASTER","InstanceType":"m5.xlarge","Name":"Master - 1"}]'

(作者图片)
- 火花码:漂亮简单却非常有效。为每个表创建两个 pyspark 数据帧,并执行两次减法,如下所示:
dfsourcesubdfdest = dfsource.subtract(dfdest)
dfdestsubdfsource = dfdest.subtract(dfsource)
- 以前的方法与新方法的比较:假设比较 5 亿行,以前的方法需要 36 个小时才能完成。如果表有数十亿行(在我们的例子中经常如此),那么您就完了。使用新方法,将数据转储到存储器只需一个多小时,进行火花比较大约需要 20 分钟。相当整洁…😄
我希望这篇文章能帮助你进行快速而低成本的数据验证。尽管我还没有发布完整的代码集和命令,但是如果您需要更多的细节,请随时联系我。
我希望这篇文章是有帮助的。三角洲湖作为大数据 Hadoop、Spark & Kafka 课程的一部分,由 Datafence 云学院提供。课程是周末自己在网上教的。
使用 Azure 机器学习服务进行数据版本控制
读完这些,你就会明白 Azure ML 是如何处理数据的,MLOps 是如何关联的,学会自己怎么做

在这个数据科学时代,最重要的问题之一是实现人工智能的整个生命周期。你可能知道,机器学习的基础是数据。如果你想确保你的项目有完全的可追溯性,你不能忘记不那么性感的部分。
这篇文章旨在探讨为什么数据版本化是必不可少的,以及如何在 Azure 机器学习上做到这一点。
只是对 MLOps 的一瞥
但首先,让我们深入了解一下 MLOps 到底是什么。理解这一点的一个很好的方法是看看微软制作的信息图。在这里,您可以看到良好的实践是:
- 能够创建或重新训练模型。
- 模型和数据版本控制。
- 审计能力。
- 部署和监控性能。
- 观察数据漂移。

微软的图片
这是一个表面的表示,但具有构成机器学习项目的所有关键组件。
那么…为什么是数据版本化?
你可能已经注意到了,我们需要为审计做好准备,如果我们不能证明我们使用了哪些数据,这个难题就不完整。这只是在我们考虑监管问题的情况下,但我们还需要考虑良好的质量流程。
了解所有使用过的零件在哪里是至关重要的。如果失败或表现不佳,我们可能不知道为什么我们没有得到预期的结果。数据应该永远是我们的第一怀疑对象,所以无法检查数据是一个大问题。

由 Borna Bevanda 在 Unsplash 上拍摄的照片
但是可能还有其他原因来修改我们的数据。正如我们也看到的,数据漂移也是一个非常令人头疼的问题。数据漂移是模型精度随时间下降的主要原因之一。因此,如果我们不断检查我们的数据是否在漂移,我们就可以及时做出反应,并在为时已晚之前重新训练我们的模型。
那就开始吧!
在数据版本化方面有不同的选择。标准玩家是 DVC ,但是如果你正在寻找一些考虑到所有 Azure 服务的东西,Azure 机器学习服务是最适合你的。
创建 Azure 机器学习工作区!
先决条件:完成以下步骤后,你应该创建一个 Azure 账户并开始免费试用。如果你已经知道如何创建你的机器学习工作空间,直接跳到下一节。
首先,您应该创建一个资源组,它是您创建的其他资源所在的容器,所以请转到搜索栏并单击“Resource groups”选项。

作者从门户网站 Azure 、图片截屏。
之后,你应该点击“添加”按钮。

来自门户 Azure 的屏幕截图
然后,为您的资源组选择一个名称,并选择“查看+创建”选项。

作者从门户网站 Azure 、获取的屏幕截图。
一旦你准备好资源,下一步就是找到机器学习服务。

来自作者的门户网站 Azure 、图片的截屏。
然后,你应该点击“添加”按钮。

作者从 Portal Azure 、图片中截取的屏幕截图。
之后,您将被重定向到下面的页面,您应该在这个页面上创建您的资源。

作者从 Portal Azure 、图片中截取的屏幕截图。
之后,你应该准备好了!点击这个链接,选择你的资源。
太棒了,你已经创建了你的第一个 Azure 机器学习工作区!
Azure 机器学习数据存储
数据存储是 Azure ML 的第一个组件,它与我们今天要看的数据相关。数据存储是到 Azure 存储服务的安全连接。这很好,因为您可以引用不同资源上的任何其他存储服务。您的数据应该可以在您的工作区内访问。
当您创建 Azure 机器学习资源时,会自动创建一个 Blob 存储和一个文件共享,并将其作为数据存储引用。如您所见,如果您选择侧栏上的 Datastore 选项,您将看到它们被创建(Blob 存储是工作区的默认选项)。

截屏来自 Azure ML ,图片作者。
因此,创建数据存储是为了更好地访问您的数据,而不必担心代码中的硬编码凭证。但是,具体的文件呢?如何跟踪我的图像、CSV、拼花地板或其他文件?
数据集!
数据集是拯救数据版本化的元素。它们是引用数据源位置及其元数据副本的抽象。
数据集的伟大之处在于你可以注册它们,并且会自动以给定的名称创建。当您使用相同名称注册新数据集时,数据集将作为新版本上传,并保留其他版本的注册表。
每次创建新模型时,您都可以存储所使用的数据,并且有权访问工作空间的每个人都应该能够检查您的数据集。
让我们把手弄脏吧!
你知道没有代码的教程是不完整的。因此,让我们创建一个新的计算实例来最终破解一些代码。去计算,点击“新建”按钮。

作者截图自 Azure ML ,图片。
之后,选择您的虚拟机,并点击“下一步”。

作者提供的来自 Azure ML 、图片的截屏。
在最后一部分,您可以创建您的资源。

作者提供的来自 Azure ML 、图片的截屏。
一旦你的实例准备好了,点击“Jupyter”选项。

截屏来自 Azure ML ,图片作者。
要显示我们心爱的具有 AzureML 可能性的“Jupyter”笔记本,请单击选项“新建”,选择“Python 3.6 — AzureML”或您应该看到显示的版本。

屏幕截图来自 Azure ML Jupyter 笔记本,图片作者。
现在我们已经准备好在我们的机器学习工作空间中编码了!
在下一节中,我将使用屏幕截图,但是您可以在我的 GitHub repo 中找到代码。
了解我们的工作空间
首先,我们需要定义我们将要使用的工作空间。如果您在我们创建的计算实例的“Jupyter”笔记本中,您可以只使用方法。from_config(),这通常应该是一个 JSON 文件,但是这里所有的配置设置都已经完成了。

截屏来自 Azure ML Jupyter 笔记本,图片作者。
将文件上传到您的数据存储
之后,我们可以上传一些数据到我们的数据存储。在我们的工作空间上使用 get_default_datastore() ,我们获得了对 Blob 存储的引用。我们需要选择一些数据来保存它,所以我们将使用 Azure open datasets 中的糖尿病数据集。
说到数据集,Azure 有两种风格:TabularDataset 和 FileDataset。当我们有结构化数据时,第一种方法是有用的(就像在这种情况下)。我们可以将这些数据集转换成熊猫或 spark 数据帧。FileDataset 是非结构化数据的正确选择。正如您将看到的,我们将把文件上传到 Blob 中。

屏幕截图来自 Azure ML Jupyter notebook,图片由作者提供。
数据集
在我们将数据加载到 Blob 中之后,我们需要为注册过程检索它。当我们注册数据集时,您只是引用存储中的一个位置,因此不会产生额外的成本。如果你的数据在你自己的存储器里,你只需要连接到你的工作空间。

屏幕截图来自Azure MLJupyter notebook,图片作者。
使用最后一个块,您成功注册了您的第一个数据集!。很好,但是如果在处理这些数据一段时间后,您意识到年龄字段被错误地赋值了呢?您应该将数据上传到数据存储,并用相同的名称注册新数据。

屏幕截图来自Azure MLJupyter notebook,图片作者。
因此,我们即将到达数据版本化发挥其魔力的时刻。如果我们收集数据集,我们应该会看到我们在年龄字段中所做的更改。但是如果我们想检查第一个数据集呢?嗯,我们只需指定版本,瞧!现在你有了一个可靠的方法来调用你的数据集!

截屏来自Azure MLJupyter notebook,图片作者。
回头见!
我认为 Azure 根据数据构建的解决方案非常酷。我们刚刚看到了为该服务创建的所有功能的一小部分,如果你想将工作负载迁移到 Azure,不要忘记数据是非常重要的。
我真的希望你喜欢或发现这篇文章有用!如果你喜欢这个内容让我知道!我们可以更详细地回顾 Azure 机器学习服务的其他组件。
关于作者:我对数据科学、云基础设施、商业问题和写作充满热情。我最*获得了 DP-100 Azure 数据科学家助理认证,我喜欢一拿到就分享所有的知识。
如果你喜欢,就在 Medium 和 Linkedin 上关注我。如果你想给我写信,我最*在推特上。我很乐意与你交谈!
如果你想多读一点,看看我最*的一些帖子:
[## 想成为 Azure 数据科学家助理(DP-100)吗?让我们
读完本文后,您将对云认证和 DP-100 有更深刻的理解
towardsdatascience.com](/thinking-about-becoming-an-azure-data-scientist-associate-dp-100-lets-32f8766df21e) [## 具有两个以上特征的聚类?尝试用这个来解释你的发现
使用 Plotly 的 line_polar 将向我们展示一种令人兴奋的聚类解释方法。此外,我们将看到…
towardsdatascience.com](/clustering-with-more-than-two-features-try-this-to-explain-your-findings-b053007d680a)
数据可视化:用 Python 制作交互式图表并给老板留下深刻印象的 3 个秘密技巧。
在这篇文章中,我将给出我使用 Python 和 PlotLy(作为一名数据科学家)的 top3 数据可视化技巧,这会让你的听众欣喜若狂。经过测试和批准。

在这篇文章中,我将尝试增强 Python 的可能性,使你的图形具有交互性、美观,并让你的老板印象深刻。这些技巧背后的目标是给人更好的印象,并增强用户/客户体验。管用!
概括来说,这三个目标是:
- 1.交互性(提示 1、2 和 3)
- 2.好看的图表(提示 3)
- 3.给你的老板留下深刻印象(建议 1、2 和 3)
Gif 来自 Giphy.com
这三个技巧来自我作为数据科学家工作 3 年后在客户面前的经验。如果你有其他想法,欢迎在评论中分享。
在本文中,我们将介绍第一个技巧。
让我们开始吧。
0.先决条件
在开始之前,请确保您安装了 Python3 版本和以下软件包:
- 熊猫
- Plotly
- 熊猫数据阅读器
下面的代码不能在 Python 2 上运行
一旦你确保安装了上面的包,我们将使用 Pandas DataReader 导入市场数据。在本例中,我们将为 Tesla 导入数据。
如果这些软件包中的任何一个尚未安装,您可以使用 pip 命令,如下所示。
pip install pandas-datareader
pip install DateTime
如果你想阅读更多关于算法交易和如何获得市场数据的内容,我强烈推荐这篇精彩的文章:
[## 如何从纽交所获取不到 3 行的市场数据(Python)。
在本文中,您将学习使用 Python 获取股票市场数据,如价格、交易量和基本面数据…
towardsdatascience.com](/how-to-get-market-data-from-the-nyse-in-less-than-3-lines-python-41791212709c)
如果你懒得看,可以找下面几行代码:
用于导入市场数据的代码行
一旦您从 Tesla 上传了数据,将使用的输出和数据集如下:

运行上述代码和 Yahoo Finance API 后的预期输出。
既然先决条件已经解决,我们可以从第一个提示开始。
提示 1 :添加范围滑块
我将与您分享的第一个技巧是范围滑动选择器。信不信由你,在一行代码中,你已经可以给你的图形带来实质性的交互性。
用户可以选择和缩放特定的时间段,而不是静态的图表。
在下面的例子中,它将面向财务图表,但是一旦有了时间序列,您就可以使用它。
例如,它可以用于营销来规划一段时间内的销售,或者医疗工程来规划恢复进展。我不能涵盖所有不同的领域,但你知道我的应用的可能性。
让我们在下面输入代码:
输出:

上图显示了使用范围滑动选择器的影响。
印象深刻不是吗?
如果你看上面的图表,你会发现一个范围滑动选择器被添加到图表中。用户/客户端将能够容易地缩放图形的特定部分。
您甚至可以用下面的代码行将其导出为 HTML,并发送给客户或朋友。
fig.write_html("/Users/Desktop/MyGraph.html")
如果你想从头到尾建造它,跟随这个一步一步的视频,它甚至是实时的更惊人的:
关于如何构建交互式 Python 图表的教程。
另一个例子是,您也可以导入多个份额,并将这些份额索引到相同的比例(Source 1)。结果如下:

后续提示:
在下一篇文章中,我们将介绍如何添加一个交互式按钮来帮助客户/用户本能地过滤数据,如下图所示。

如果你有任何问题,或者你想让我介绍数据可视化的某一点,欢迎在问答中发表评论。
来源:
一天学会算法交易(模块 3):
交易 707 是数据科学家和交易员的结合。我们都在伦敦工作和生活。我们觉得累了…
www.udemy.com](https://www.udemy.com/course/learn-algorithmic-trading-in-one-day/?couponCode=TOWARDSCIENCE)
宝莱坞的数据可视化。一
角。1~网页抓取

布莱恩·麦高恩在 Unsplash 上的照片
如果你曾经有机会和印度人谈论电影,你一定已经意识到宝莱坞在他们的生活中扮演了多么重要的角色。代表我所有的同胞,我们就是离不开他们~无论是对着 3 个白痴、笑,还是过着 Zindagi Na Milengi Dobara (我个人一直最喜欢的)的常青时光,还是跟着沙鲁克·汗到chamk Challo 一起跳舞!
这个小项目的灵感来自于我对宝莱坞的热爱。由于这是一个巨大的产业,我想比较一下有史以来票房最高的电影。
我会把这个项目分成几个部分,这样更容易理解。这篇文章将围绕如何使用 Python 中的 BeautifulSoup 收集数据展开。
1.网络抓取简介,美丽的群组和请求
网页抓取
手动收集数据是一个乏味且耗时的过程,这时网络搜集就派上了用场。这是一种用于从网站自动检索信息的技术,几乎不费吹灰之力。
这是一种复制形式,从网络上收集并复制特定数据,通常复制到中央本地数据库或电子表格中,供以后检索或分析。——维基百科
美丽的声音
BeautifulSoup 是一个 Python 库,有助于网络抓取。它位于 HTML 或 XML 解析器之上,为迭代、搜索和修改解析树提供 Pythonic 式的习惯用法。

为了成功地使用 BeautifulSoup,必须了解 HTML 代码的基础知识,以便从页面中收集正确的信息。
当打开一个页面时,例如这个维基百科页面,可以通过右击页面,然后转到“inspect”来访问 HTML 代码。对于初学者来说,那里的代码量肯定是巨大的,所以要快速找到具体的数据,必须突出显示表中的一个文本,右键单击它,然后转到“inspect”。

每个元素都有一个特定的标签和类。
- 表示整个表格,如下面的截图所示。它给出了一个“类”,从这个类中可以识别表。该表的各个组件都在此标签下。

- 接下来是标签,用来表示表格的表头。

- 标识表格的所有行。

- 标识单个行。

- 代表一行中的每个单独的单元格。

开始刮吧!
2.入门指南
为了下载页面以执行 web 抓取,必须安装 R equests 包。它不仅允许用户下载页面内容,还允许用户发送 HTTP 请求。
这可以使用终端中的 pip 命令来安装。
pip install requests
pip install beautifulsoup4
3.导入库
对于这一部分,这是收集数据所需的 4 个库。
import pandas as pd
import numpy as np
import requests
from bs4 import BeautifulSoup
- Pandas: 用于将数据转换成结构化的形式(表格)。
- Numpy: 一个流行的库,允许用户简单快速地执行数组操作。
- BeautifulSoup: 检索页面的 HTML 结构。
4.启动代码
website='[https://en.wikipedia.org/wiki/List_of_highest-grossing_Indian_films'](https://en.wikipedia.org/wiki/List_of_highest-grossing_Indian_films')
website_url=requests.get(website).text
soup=BeautifulSoup(website_url,'html.parser')
上面的代码定义了从中检索数据的网站,并调用 soup 函数来下载数据。
s = requests.Session()
response = s.get(website, timeout=10)
response
这段代码确保页面的下载已经完成。您应该得到输出为
5.阅读表格
my_table = soup.find('table', {"class":'wikitable sortable'})
Soup.find 函数用于通过定义标签和类来查找页面中的特定元素。正如我上面所说的,页面中的表有“table”标记,所以如果整个页面中只有一个表,就没有必要指定它的类。在这种情况下,有多个表,我只想要其中的一个。当鼠标悬停在表上方时,可以看到我想要的表具有类‘wiki table sortable ’,所以我指定了它。
当您运行 print(my_table)函数时,您会看到它打印出标签内的所有内容(在 HTML 代码中从到
),这非常难以阅读。

如果你想知道,这就是结果的样子。这幅图只是整个结果的一小部分。
如果您担心是否检索到了正确的表,此代码可用于确认。它打印出列标题和列数。
header = [th.text.rstrip() for th in rows[0].find_all('th')]
print(header)
print('------------')
print(len(header))

为了收集每行中的信息,下面的代码是
my_table_data = []
for row in rows[1:]:
data = [d.text.rstrip() for d in row.select('td')]
my_table_data.append(data)
既然数据已经收集完毕,就可以使用 pandas 将它们组成一个数据框。
df = pd.DataFrame(my_table_data)
打印出来后,应该是这样的:

耶!
不过任务还没有结束…在我们保存它之前,最好根据我们的喜好重命名和清理数据。
6.清洁和保存
我使用这段代码重命名了列名并删除了不需要的信息。
df.rename(columns = {0:"Rank"}, inplace = True)
df.rename(columns = {1:"Peak"}, inplace = True)
df.rename(columns = {2:"Film"}, inplace = True)
df.rename(columns = {3:"Year"}, inplace = True)
df.rename(columns = {4:"Director"}, inplace = True)
df.rename(columns = {5:"Producer"}, inplace = True)
df.rename(columns = {6:"Language"}, inplace = True)
df.rename(columns = {7:"Worldwide_Gross_INR"}, inplace = True)
df = df.drop(columns=[8])df.head()

一旦我对我的数据满意了,我就把它保存到一个 excel 文件中。
df.to_excel('Bollywood_movies1.xlsx', index=True)
瞧啊。我们刚刚使用网络抓取创建了我们的第一个数据表!
请继续关注我对这个数据集的可视化。😃
使用 Seaborn 的数据可视化教程
快速数据可视化教程/ Seaborn 参考笔记

照片来自 Unsplash
“Seaborn 让您的数据科学项目的探索性数据分析阶段变得美丽而轻松”
介绍
这个教程是针对那些曾经和 Seaborn 合作过,但是已经失去接触的观众。我希望,通过阅读本文,您可以回忆起 Seaborn 可视化风格和命令,以便开始您的数据探索。本教程的布局是这样的,它展示了在给定 x 个数字特征和 y 个分类特征的情况下,如何使用 Seaborn 进行可视化。
让我们导入 Seaborn:
import seaborn as sns
数据集:
我们将使用 seaborn 库中可用的 tips 数据集。
使用以下方式加载数据集:
tips = sns.load_dataset('tips')
total_bill(数字变量) :该桌的总账单
tip(数字) :给为该桌服务的服务员的小费
性别(分类):账单支付者的性别(男/女)
吸烟者(分类):账单支付者是否吸烟(是/否)
day(分类):星期几(星期日、星期一等)
table_size(数字):桌子的容量
date:账单支付的日期和时间
海风风格:
让我们从 Seaborn 中可用的不同风格开始。每种样式都通过背景颜色、网格布局和图的轴刻度来区分。Seaborn 有五种基本样式:深色、深色网格、白色、白色网格和刻度。
sns.set_style('dark')sns.set_style('darkgrid')sns.set_style('ticks')sns.set_style('white')sns.set_style('whitegrid')





形象化
让我们看看使用 Seaborn 可以实现的各种可视化。下面的每一部分都展示了在给定你可用的分类变量和数字变量的情况下,如何进行可视化。
一个数字变量:
如果我们有一个数字变量,我们可以分析这个变量的分布。
g = sns.distplot(tips.tip)
g.set_title('Tip Amount Distribution');g = sns.distplot(tips.tip,kde=False)
g.set_title('Tip Amount Histogram');g = sns.distplot(tips.tip,rug=True)
g.set_title('Tip Amount Distribution with rug');



我们可以观察到小费金额数据大致正常。
一个分类变量
如果我们有一个分类变量,我们可以做一个计数图,显示分类变量的每个值出现的频率。
g = sns.catplot(x="day",kind='count',order=['Thur','Fri','Sun','Sat'],data=tips);g.fig.suptitle("Frequency of days in the tips dataset [Count Plot]",y=1.05);

两个数值变量
为了分析两个数值变量之间的关系,我们可以在 seaborn 做散点图。
g = sns.relplot(x="total_bill",y="tip",data=tips,kind='scatter');g.fig.suptitle('Relationship between continuous variables [Scatter Plot]',y=1.05);

Seaborn 还使两个数值变量之间关系的密度分布可视化变得容易。
g = sns.jointplot(x="total_bill",y='tip',data=tips,kind='kde');g.fig.suptitle('Density distribution among tips and total_bill [Joint Plot]',y=1.05);

kde 图是另一种显示两个连续变量之间关系分布的图。
g = sns.jointplot(x="total_bill",y='tip',data=tips,kind='kde');g.fig.suptitle('Density distribution among tips and total_bill [Joint Plot]',y=1.05);

我们也可以用置信区间画一条回归线,其中一个数字变量作为因变量,另一个作为自变量。
g = sns.lmplot(x="total_bill",y="tip",data=tips);g.fig.suptitle('Relationship b/w tip and total_bill [Scatter Plot + Regression Line]',y=1.05);

带回归线的散点图
如果自变量是 datetime,我们可以做一个线图,也是时间序列图。
g = sns.lineplot(x="date",y="total_bill",data=tips);g.set_title('Total bill amount over time [Line plot]');

两个数字变量和一个分类变量
有了两个数值变量和一个分类变量,我们可以绘制两个数值变量部分提到的所有图。分类变量的附加维度可用作颜色/标记,以区分图中的分类变量值。
g = sns.relplot(x="total_bill",y="tip",hue='sex',kind='scatter',data=tips);
g.fig.suptitle('Relationship b/w totalbill and tip distinguished by gender [Scatter Plot]',y=1.05);g = sns.relplot(x="total_bill",y="tip",style='sex',kind='scatter',data=tips)
g.fig.suptitle('Relationship b/w totalbill distinguished by gender as marker [Scatter Plot]',y=1.05);


或者,我们可以将每个分类变量值作为一个组来绘制每个分类变量值的两个数值变量之间的关系。
g = sns.relplot(x="total_bill",y="tip",col='sex',kind='scatter',data=tips);g.fig.suptitle('Relationship between totalbill and tip by gender [Scatter Plot]',y=1.05);

三个数字变量
如果我们有三个数值变量,我们可以做一个两个变量的散点图,第三个变量可以用作散点图中各点的大小。
g = sns.relplot(x="total_bill",y="tip",size='table_size',kind='scatter',data=tips);g.fig.suptitle('total bill vs tip distinguished by table size [Scatter Plot]',y=1.05);

三个数值变量和一个分类变量:
如果我们有三个数字变量和一个分类变量,可以为分类变量的每个值绘制上一节中提到的相同的图。
g = sns.relplot(x="total_bill",y="tip",col='sex',size='table_size',kind='scatter',data=tips);g.fig.suptitle('Total bill vs tip by gender distinguished by table size [Scatter Plot]',y=1.03);

一个数字变量和一个分类变量:
这可能是数据可视化中最基本、最常见、最有用的情节。如果我们有一个数字变量和一个分类变量,我们可以做各种各样的图,如条形图和条形图。
g = sns.catplot(x="day",y="tip",kind='bar',order=['Thur','Fri','Sun','Sat'],ci=False,data=tips);g.fig.suptitle('Tip amount by day of week [Bar Plot]',y=1.05);

g = sns.catplot(x="day",y="tip",kind='strip',order=['Thur','Fri','Sun','Sat'],ci=False,data=tips);g.fig.suptitle('Tip amount by day along with tips as scatter [Strip Plot]',y=1.03);

如下图所示的蜂群图和小提琴图使我们能够可视化每个分类变量中数值变量的分布。
g = sns.catplot(x="day",y="tip",kind='swarm',order=['Thur','Fri','Sun','Sat'],ci=False,data=tips);g.fig.suptitle('Tip amount by day along with tip distribution [Swarm Plot]',y=1.05);

g = sns.catplot(x="day",y="tip",kind='violin',order=['Thur','Fri','Sun','Sat'],data=tips);g.fig.suptitle('Tips distributions by day [Violin Plot]');

我们可以使用一个点图来显示连续变量在分类变量的每个值内的四分位数范围(第 25 个百分点到第 75 个百分点)。
g = sns.catplot(x="day",y="tip",kind='point',order=['Thur','Fri','Sun','Sat'],data=tips,capsize=0.5);g.fig.suptitle('IQR Range of tip by day [Point Plot]',y=1.05);

一个数字变量和两个分类变量:
有了一个数字变量和两个分类变量,我们可以使用上一节中提到的所有图,并在每个子图中将额外的第三个分类变量作为列变量或子组,如下所示。
g = sns.catplot(x="day",y="tip",kind='bar',col='smoker',order=['Thur','Fri','Sun','Sat'],ci=False,data=tips);g.fig.suptitle('Tip amount by day of week by smoker/non-smoker [Bar Plot]',y=1.05);

g = sns.catplot(x="day",y="tip",kind='bar',hue='smoker',order=['Thur','Fri','Sun','Sat'],ci=False,data=tips);g.fig.suptitle('Tips by day with smoker/non-smoker subgroup [Grouped Bar Plot]',y=1.05);

一个数字变量和三个分类变量:
有了一个数字变量和三个分类变量,我们可以实现“一个分类变量和一个数字变量”一节中提到的所有可视化,并容纳另外两个分类变量,其中一个变量作为图中的列变量/行变量,另一个变量作为每个子图中的子组。
g = sns.catplot(x="day",y="tip",kind='bar',hue='smoker',col='sex',order=['Thur','Fri','Sun','Sat'],ci=False,data=tips);g.fig.suptitle('Tips by day with smoker/non-smoker subgroup by gender [Grouped Bar Plot]',y=1.05);

三个以上的连续变量:
最后,如果我们有三个以上的数字变量,我们可以使用热图或 pariplot。有了这些图,我们可以直观地看到单个图中每个数值变量之间的关系。
g = sns.heatmap(tips.corr());g.set_title('correlation between continuous variables [Heat Map]');

g = sns.pairplot(tips);g.fig.suptitle('Relationship between continuous variables [Patiplot]',y=1.03);

设置标题、标签和图例
一些 Seaborn plots 返回 matplotlib AxesSubplot,而另一些返回 FacetGrid(如果您忘记了什么是 matplotlib AxesSubplots,请查看我在 matplotlib 上的注释以供参考)。


FacetGrid 是 matplotlib AxesSubPlots 的网格(2D 数组)。您可以使用数组索引访问每个子情节,并为每个情节设置标签和标题。
g = sns.relplot(x="total_bill",y="tip",data=tips,kind='scatter');
g.axes[0,0].set_title('Relationship between continuous variables [Scatter Plot]');
g.axes[0,0].set_xlabel('Total Bill Amount');
g.axes[0,0].set_ylabel('Tip Amount');

如果绘图返回 AxesSubplot,可以使用 AxesSubplot 方法设置标题和图例。
g = sns.distplot(tips.tip)
g.set_title('Tip Amount Probablity Distribution');
g.set_xlabel('Tip Amount')
g.set_ylabel('probability')

对于 FacetGrid,可以从 FacetGrid 对象中获取 figure 对象,并为 figure 对象设置标题。
g = sns.relplot(x="total_bill",y="tip",col='sex',kind='scatter',data=tips);g.fig.suptitle('Relationship between totalbill and tip by gender [Scatter Plot]',y=1.05);

结论
希望本教程有助于你开始使用 seaborn 轻松制作漂亮的可视化效果。虽然 Seaborn 易于使用,但它也提供了许多定制功能,这是一个高级主题。一旦你熟悉了基本的绘图,你就可以在使用 Seaborn 进行可视化时进一步探索它。
参考
用于显示样地的数据集:
https://github . com/mwaskom/seaborn-data/blob/master/tips . CSV
Seaborn 官方网站:
【https://seaborn.pydata.org/
本文中使用的图的源代码可以在我的 github repo 中找到:
https://github . com/pavankumarboinapalli/articles/blob/master/seabornify . ipynb
我乐于接受建设性的批评。请随意评论改进这篇文章的方法。例如,如果你觉得有一些信息可以包括在内,或者如果你想对一个子主题有更多的解释。
用 Matplotlib 实现数据可视化
如何在 5 分钟内掌握 Matplotlib 的基本关键特性

照片由 Isaac Smith 在 Unsplash 上拍摄
Matplotlib 是 Python 中著名的可视化数据库之一。在本文中,我将介绍这些我认为有用且重要的关键函数,以便那些 Matplotlib 新手能够快速掌握。
- 基本制图
- 在标题和标签中生成数学表达式
- 用文本和箭头给图表添加注释
- 突出显示您的图表
入门指南
像往常一样,如果我们没有 matplotlib 包,我们需要安装它。
pip install matplotlib
让我们导入我们在本教程中需要的包。
基本制图

figure1.png
让我们从 Matplotlib 中的基本图表功能开始。
plt.title将为您的图表创建一个标题。它接受普通的字符串和 Tex 标记。如果您希望使用 Tex 标记来生成数学表达式,您必须使用$来包含您的文本字符串。我更喜欢用这个,因为它看起来比sin(x/2)好多了!下面是一些我们可以在 Matplotlib 中使用的其他数学表达式的例子。更多例子你可以参考文档。

plt.plot将用给定的数据点生成一个图,x和np.sin(x)是我们在这种情况下输入的数据点。默认情况下,plt.plot会返回一个实线样式(-)。您可以选择其他线型,如虚线或点线。

线条样式
我们可以用color参数定制绘图的颜色。你可以传递颜色字符串或颜色代码。和标题一样,你也可以把数学表达式传递给剧情的label。plt.legend将根据您在plot中传递的属性为图表创建图例。
plt.grid将在图表上创建一个网格。与plot类似,可以定义不同的线条样式。alpha是网格的不透明度。
plt.xlabel和plt.ylabel用于标注 x 轴和 y 轴。
如果您想将此图表保存为图像,请使用plt.savefig。如果您从未指定完整路径,默认情况下,图像将保存在脚本的同一文件夹中。
plt.show用于在使用终端或脚本时显示图表。这在一些 IDE 和 Jupyter 笔记本中是不必要的。
注释您的图表

figure2.png
我已经用plt.figure(figsize=(10,10))放大了图表的尺寸,这样我们可以更清楚地看到注释。您可以将宽度和高度传递给figsize以获得您想要的图表大小。
plt.annotate用于标注两条直线的交点。xy是注释点的位置,而xytext是注释文本的位置。我已经展示了 3 种不同颜色和尺寸的箭头,你可以参考文档以获得更多选项。
突出显示您的图表

figure3.png
plt.axvspan用于沿 x 轴高亮显示,而plt.axhspan用于沿 y 轴高亮显示。我们可以用facecolor参数定义不同的颜色,用alpha定义不同的不透明度。
自定义条形图中的 xtick
条形图也是另一个在可视化中常用的图表,让我们也来看看。

figure4.png
plt.bar取一个数组为你的横条坐标。如果你想创建一个多条形图,你必须传递两个条形图的坐标。x — width/2和x + width/2被传入其中以创建一个多条形图。
plt.xtick用于将标签更新为天数(['Mon','Tue','Wed','Thu','Fri']),因为默认为[0,1,2,3,4]。如果文本太长,我们也可以给这个标签添加旋转。在这种情况下,刻度会旋转 30 度。
现在你已经学会了如何用 Matplotlib 定制你的图表,我希望这篇文章能帮助你掌握 Matplotlib 的基础知识,并轻松熟悉 Matplotlib 的其他功能。如果我犯了任何错误或错别字,请给我留言。
您可以在我的 Github 中查看完整的 Jupyter 笔记本。干杯!
如果你喜欢读这篇文章,你可能也会喜欢这些:
在 Python 中再现相同的 SQL 查询结果
towardsdatascience.com](/how-to-rewrite-your-sql-queries-in-python-with-pandas-8d5b01ab8e31) [## 如何掌握 Python 命令行参数
使用命令行参数创建自己的 Python 脚本的简单指南
towardsdatascience.com](/how-to-master-python-command-line-arguments-5d5ad4bcf985)
你可以在 Medium 上找到我其他作品的链接,关注我 这里 。感谢阅读!
数据可视化 101:有效可视化的 7 个步骤
用引人注目的视觉效果讲述您的数据故事。

图片由作者提供(使用 Canva 制作)
成为数据科学家的一个重要方面是能够使用各种可视化工具有效地交流数据分析结果。
数据是一个用数字讲述的故事,可视化是你讲述这个故事的方式。
不幸的是,我们更多地关注学习新的分析方法、库和方法,熟悉新的数据集或趋势机器学习和人工智能算法,而忽视了提高我们的可视化技能。
不要误解我的意思,掌握最新的技术对于在 DS 领域取得成功是非常重要的。但是我们需要花一些时间来提高可视化和讲故事的能力。
想象一下这个 T3;你 花费数小时清理数据,探索数据,并对其建模。很有意思;你的结果是有效的,而且意义重大。但是,你的数据可视化是枯燥和无效的。这导致你的观众忽略了你的努力。
学习如何有效地可视化您的数据就像学习如何讲述一个引人入胜的故事。
您对图表类型、颜色和风格的选择将对他人如何看待您的数据产生巨大的影响。
幸运的是,有一些简单的指导方针,如果你遵循的话,可以让你的数据可视化在视觉上吸引人,引人注目和迷人。
这篇文章将介绍基于科学实验和研究的简单技巧来提升你的视觉化。
事不宜迟,让我们开始用我们的数据有效地讲述一个故事。
提示№1:简单总是更好
使用可视化的目的是让信息更容易被他人阅读和理解。因此,要避免复杂、拥挤的可视化。
每当你创建一个可视化,你需要注意数据和墨水的比例。数据-油墨比率是一个术语,用于表示图表中数据与冗余油墨的数量,如背景效果/颜色和数据的 3D 表示。
除了使用多维图形,您还可以使用可视化属性(如形状、颜色和厚度)来区分不同的数据集。
为了使您的可视化简单有效,您的数据-墨水比率需要很高。

图片由作者提供(使用 Canva 制作)
提示 2:选择正确的图表类型
如何选择最能描述数据的图表类型
towardsdatascience.com](/data-visualization-101-how-to-choose-a-chart-type-9b8830e558d6)
每当您试图创建一个图表时,您都需要注意您的数据类型,以选择正确的图表来准确地表示它。
根据您使用的数据,您将使用的图表类型会有所不同。一个好的经验法则是:
- 如果您有分类数据,如果您有 5 个以上的类别,请使用条形图,否则请使用饼图。
- 如果您有名义数据,如果您的数据是离散的,请使用条形图或直方图,如果是连续的,请使用折线图/面积图。
- 如果要显示数据集中值之间的关系,请使用散点图、气泡图或折线图。
- 如果要比较数值,请使用饼图(相对比较)或条形图(精确比较)。
提示 3:想象每个图表的一个方面
在创建图表之前,您需要决定您到底想要显示什么。你想显示图案还是细节?为了让你的视觉效果更有效,试着一次只展示一个方面。
如果您需要显示数据的两个方面,一个模式和一些细节,请使用两个不同的图。例如,您可以使用折线图显示详细信息,使用热图或水*图显示数据中的模式。
水*图*行显示多个时间序列。地*线图类似于时间序列图。然而,在横向图中,使用颜色来突出不同时间序列之间的差异和极端情况。

图片由作者提供(使用 Canva 制作)
提示 4:让你的坐标轴范围有趣
您的垂直轴和水*轴的范围取决于图表的类型和您试图用它讲述的故事。
例如,如果您使用条形图,并且只显示不同数据集的最大值,那么您的坐标轴需要从 0 开始。
然而,如果你想用精确的数字显示数据的波动,你需要放大你的坐标轴来清楚地显示这种波动。当图限接*波动范围时,更容易看到数据集中的变化。

图片由作者提供(使用 Canva 制作)
技巧№5:用数据转换强调变化率
在可视化中使用变换的决定取决于数据集和绘图目的。在图表上应用变换可以改变图表传达的印象和信息。
一般来说,您可以转换图形的两个方面。你的坐标轴或者数据本身。
变换您的坐标轴
绘制一组数据时,可以使用线性或对数刻度。对数刻度通常用于显示一段时间内的变化百分比,因此刻度上的点不是等距分布的。
另一方面,线性比例用于显示数据集各唯一点之间的绝对差异。

图片由作者提供(使用 Canva 制作)
转变您的数据
人们有时很难理解对数标度,因此避免这种情况的方法是转换数据。例如,您可以将值标准化为*均值或特定值,而不是显示绝对值。
提示 6:小心散点图中的重叠点
使用散点图时,有时两个或多个圆可能会相互重叠,这可能会使读取数据更加复杂。它还可以隐藏图形中特定集群的实际大小。
要避免这个问题并使你的散点图更有意义,你可以做的一件事是对你的圆使用不同的不透明度,以清晰地显示你的所有数据点。
实现类似效果的另一个策略是绘制未填充的圆。这种方法在大型数据集的情况下可能没有好处,那么,使用不透明度选项可能是一个更好的选择。您还可以更改圆圈的大小,以获得更清晰的整体视觉效果。

图片由作者提供(使用 Canva 制作)
提示 7:小心你的配色方案
颜色可以成就或破坏你的图表。当你创造新的视觉效果时,你需要小心选择配色方案。要选择最佳的配色方案,你需要问自己两个问题。
颜色在不同*台上可见吗?
有时,当我们在设备上构建图表以用于演示或会议时,我们会忘记测试该图表在不同*台上的显示效果。
它们在电脑或手机上显示时会清晰吗?灯光怎么样?我必须使用高屏幕亮度才能看清图表,还是不管用?

图片由作者提供(使用 Canva 制作)
我将使用什么媒体来显示我的图表?
如果您正在创建要打印的图表,纸张类型可能会影响您对颜色的选择。有时,在特定种类的纸张上打印时,屏幕上清晰的颜色可能不明显。
此外,尽量使用较少的颜色或相关的颜色来传达你的信息。如果你正在创建一个热图,你需要使用一种颜色的渐变,而不是不同的颜色。使用不同的颜色可能会混淆,使你的地图难以理解。
结论
可视化数据通常是将数据传达给广大受众的最佳和最直接的方法。每当我们试图创建图表和数字时,我们需要使它们简单、直接、易读。
请记住,您的数据讲述了一个故事,您对可视化的选择可以让这个故事变得激动人心,也可以让它变得完全乏味。
因此,遵循 7 个简单的步骤,你可以快速提高可视化的质量和可读性:
- 简单的总是更好。
- 您的轴范围产生了巨大的差异。
- 每张图关注的一个方面。
- 为您的数据选择正确的图表类型。
- 使用变换来强调变化。
- 小心散点图中的重叠圆。
- 不要过度使用颜色方案。
参考
[1]希利,C. G. (1996 年 10 月)。为数据可视化选择有效的颜色。第七届 IEEE 可视化年会论文集' 96 (第 263-270 页)。IEEE。
[2]常青树,S. D. (2019)。有效的数据可视化:正确的数据对应正确的图表。Sage 出版公司。
[3]c .凯莱赫和 t .瓦格纳(2011 年)。科学出版物中有效数据可视化的十大准则。环境建模&软件、 26 (6)、822–827。
数据可视化 101:如何选择图表类型
如何选择最能描述数据的图表类型

图片由作者提供(使用 Canva 制作)
在处理任何数据科学项目时,探索和解释结果的一个重要步骤是可视化数据。在项目开始时,可视化数据有助于您更好地理解数据,找到模式和趋势。
在项目结束时,在您完成分析并应用不同的机器学习模型后,数据可视化将帮助您更有效地交流您的结果。
人类天生是视觉动物;当事物以一种易于理解的可视化方式呈现时,它对我们来说是有意义的。解读条形图比查看电子表格中的大量数字要容易得多。
高效的数据可视化可以决定项目的成败。如果你花了大量的精力来分析和模拟你的数据,但是你最终使用了错误的图表类型来展示你的结果,你的观众将不会理解你所付出的努力或者如何使用这些结果。
有许多图表类型,如此之多,选择正确的图表的过程可能会令人不知所措。这篇文章将——希望——给你一个简单直接的方法来选择最好的图表类型,完美地代表你的数据,并最有效地传达它。
如何开始?
在开始研究图表类型之前,你需要问自己 5 个关于数据的关键问题。这些问题将帮助您更好地理解您的数据,从而选择最佳的图表类型来表示它。
№1.你的数据试图传达什么样的故事?
数据只是用数字讲述的故事。
所以,关于你的数据,你需要知道的第一件事是,它试图传递什么样的故事?为什么收集这些数据,如何收集?
你收集数据是为了发现趋势吗?比较不同的选择?它显示出一些分布吗?还是用来观察不同值集之间的关系?
了解数据的起源并知道它试图传递什么将使选择图表类型变得更加容易。
№2.你将向谁展示你的成果?
一旦你弄清楚了数据背后的故事,接下来,你需要知道你将向谁展示你的结果。如果你正在分析股票市场的趋势,并且你将把你的发现展示给一些商人,你可能会使用不同的图表类型,而不是把你的发现展示给刚开始接触股票市场的人。
使用数据可视化的全部目的是使数据通信更有效。
因此,您需要了解您的受众,以便在向他们展示数据时可以选择最佳的图表类型。
№3.你的数据有多大?
数据的大小将显著影响您将使用的图表类型。有些类型的图表不适合用于大规模数据集,而有些则非常适合大数据。
例如,饼图最适用于少量数据集;但是,如果您使用大量数据集,使用散点图会更有意义。
您需要选择一种最适合您的数据大小的图表类型,并清楚地表示它而不混乱。
№4.你的数据类型是什么?
有几种类型的数据,描述的,连续的,定性的,或分类的。您可以使用这种数据来消除某些图表类型。例如,如果你有连续的数据,条形图可能不是最好的选择;你可能需要用折线图来代替。
同样,如果您有分类数据,那么使用条形图或饼图可能是一个好主意。您可能不想使用带有分类数据的折线图,因为根据定义,您不能有连续的类别。必须是离散的有限数量的类别。
№5.您的数据的不同元素是如何相互关联的?
最后,您需要问自己数据的不同元素是如何关联的。您的数据顺序是否基于某些因素—时间、大小、类型?并不代表基于某个变量的排名。还是不同变量之间的相关性?
您的数据是随时间变化的时间序列吗?或者更多的是一种分配?
数据集中的值之间的关系可能会更直接地决定使用哪种图表类型。
最常用的 7 种图表类型
有 40 多种图表可供选择;有些比其他的更常用,因为它们更容易构建和解释。让我们谈谈最常用的 7 种图表类型以及何时使用它们。
条形图

图片由作者提供(使用 Canva 制作)
何时使用:
- 比较更大数据集的各部分,突出显示不同的类别,或显示随时间的变化。
- 使用长类别标签——它提供了更多的空间。
- 如果您希望在数据集中同时显示正值和负值。
何时回避:
- 如果您使用多个数据点。
- 如果你有很多类别,避免你的图表超载。你的图表不应该超过 10 条。
圆形分格统计图表

图片由作者提供(使用 Canva 制作)
何时使用:
- 当您显示整个数据集的相对比例和百分比时。
- 最适用于小型数据集-也适用于圆环图。
- 当比较一个因素对不同类别的影响时。
- 如果你有多达 6 个类别。
- 当你的数据是名词性的而不是有序的。
何时回避:
- 如果你有一个大的数据集。
- 如果你想在数值之间进行精确或绝对的比较。
折线图

图片由作者提供(使用 Canva 制作)
何时使用:
- 如果你有一个不断变化的数据集。
- 如果您的数据集对于条形图来说太大。
- 如果要显示同一时间线的多个系列。
- 如果您想要可视化趋势而不是精确值。
何时回避:
- 折线图适用于较大的数据集,所以,如果你有一个小的数据集,使用条形图代替。
散点图

图片由作者提供(使用 Canva 制作)
何时使用:
- 展示大数据集中的相关性和聚类。
- 如果数据集包含具有一对值的点。
- 如果数据集中的点的顺序不重要。
何时回避:
- 如果你有一个小的数据集。
- 如果数据集中的值不相关。
对比图

图片由作者提供(使用 Canva 制作)
何时使用:
- 如果你想展示部分到整体的关系。
- 如果您想描绘数据量,而不仅仅是与时间的关系。
何时回避:
- 它不能用于离散数据。
泡泡图

图片由作者提供(使用 Canva 制作)
何时使用:
- 如果要比较独立值。
- 如果你想显示分布或关系。
何时回避:
- 如果你有一个小的数据集。
组合图表

图片由作者提供(使用 Canva 制作)
何时使用:
- 如果您想比较不同测量值的值。
- 如果值的范围不同。
何时回避:
- 如果要显示 2~3 种以上的图形。在这种情况下,最好有单独的图表,以便于阅读和理解。
图表选择提示
每当您决定创建一些数据可视化时,请使用这些最佳实践来使其更加直观和有效。
- 如果您有分类数据,如果您有 5 个以上的类别,请使用条形图,否则请使用饼图。
- 如果您有名义数据,如果您的数据是离散的,请使用条形图或直方图,如果是连续的,请使用折线图/面积图。
- 如果要显示数据集中值之间的关系,请使用散点图、气泡图或折线图。
- 如果要比较数值,请使用饼图(相对比较)或条形图(精确比较)。
- 如果要比较体积,请使用面积图或气泡图。
- 如果要显示数据的趋势和模式,请使用折线图、条形图或散点图。
结论
在选择使用哪种图表类型之前,您需要更好地了解您的数据、数据背后的故事以及您的目标受众/媒体。每当你试图创建一个可视化,选择简单的颜色和字体。
永远以简单的视觉化为目标,而不是复杂的。可视化数据的目标是使其更容易理解和阅读。因此,避免超载和混乱你的图表。拥有多个简单的图表总是比一个复杂的图表要好。
本文是可视化 101 系列文章的第一部分。接下来的文章将介绍有效数据可视化的技巧和 Python 中不同的可视化库,以及如何根据数据和图形类型选择最佳库。
数据可视化 101:如何选择 Python 绘图库
如何选择不同用途的绘图库

图片由作者提供(使用 Canva 制作)
“可视化信息可以给我们提供快速解决问题的方法。我们可以很快获得一个简单问题的清晰或答案。”—大卫·麦坎德斯
可视化数据是任何数据科学项目中必不可少的步骤之一。它可以更容易地找到模式,检测异常,并有效地交流您的结果。
然而,可视化数据的过程可能有点棘手。今天,有如此多的绘图工具和库,我们可以使用它们通过图表和颜色将数据变得生动。有些工具相当奢侈和昂贵。
那么,一个人怎么能决定用什么呢?
那么,这篇文章将——希望——帮助你回答这个问题。
在本文中,我们将介绍 Python 中 10 大绘图库;我们将浏览一些使用示例,以及如何为您的下一次可视化冒险选择其中一个。
但是,
在我们进入那个之前,让我们首先谈论我们能产生的两种类型的情节。
静态与动态绘图
在绘制任何信息时,我们都有可供选择的选项;我们既可以生成静态图,也可以生成动态图。
静态绘图
静态图包含显示两个或多个变量之间恒定关系的图形。也就是剧情一旦创建,用户就无法更改。在静态图中,用户不能改变图的任何方面。
动态绘图
当开发人员/设计人员希望用户与图进行交互,改变图的某些方面并更加熟悉用于创建图的数据时,可以使用动态图,也称为交互式图。
如何选择?
好的,你有一些想要可视化的数据,但是你不知道从哪里开始。让我来帮你。每当我开始一个项目,需要创建一些可视化,我经常问自己 4 个问题,引导我做出正确的选择。
Q1:我的目标*台/媒体是什么?
你需要决定的第一件事是你需要哪种绘图类型,静态的还是动态的?通常,静态图用于打印输出、技术论文或报告。在这种情况下,你需要告诉你的观众一些事情,而不是与情节本身互动。
但是,如果您在在线教程、课堂或任何 web 应用程序中使用该图,用户可以通过摆弄数据来更好地理解它或在其他地方使用它,那么您应该创建一个动态图。
Q2:我的数据公开了吗?
这是一件需要考虑的重要事情。如果您的数据是私有的,不能公开获取,那么您需要使用静态图。但是,如果数据存储在不需要特殊权限就可以访问的公共服务上,那么动态绘图可能是更好的选择。
问题 3:我的优先事项是什么?
一旦我决定使用静态还是动态绘图。我问自己,我的视觉化的优先顺序是什么?我需要它复杂很多层吗?回答这个问题有助于选择要使用的正确库。
如何选择最能描述数据的图表类型
towardsdatascience.com](/data-visualization-101-how-to-choose-a-chart-type-9b8830e558d6)
问题 4:我需要一种特殊的视觉化吗?
最后,我问自己,我需要什么样的策划?是简单的图表吗?条形图、柱形图、饼图或甜甜圈图?或者我需要绘制一些更专业的东西,比如网络或地图?
假设我需要可视化一般信息,然后使用任何提供我想要的图表类型的库。然而,如果我需要创建地图或网络,这将限制我的选择,并帮助我更快地做出决定。
用引人注目的视觉效果讲述您的数据故事。
towardsdatascience.com](/data-visualization-101-7-steps-for-effective-visualizations-491a17d974de)
十大 Python 绘图库
Python 是数据科学和许多其他应用中最常用的编程语言之一。然而,由于它的流行,Python 有如此多的数据可视化库可供选择。选择的多样性既是一件好事也是一件坏事。
有许多选项意味着你可以选择与你的目标完全匹配的库,但是对于新加入这个领域的人和决定选择什么的专家来说,这可能太混乱了。
在这里,我将介绍 10 大 Python 库,以及如何和何时使用它们。我将这些库分为两类,用于绘制静态图表的库和用于动态图形的库。
让我们开始视觉化…
静态绘图库
Matplotlib
谈到 Python 中的数据可视化,我们不能不提到第一个也是最古老的 Python 可视化库, Matplotlib 。Matplotlib 是一个开源库,创建于 2003 年,语法接* MATLAB。从那时起,图书馆得到了很多的爱和支持,直到今天。
许多 Python 包都是基于 Matplotlib 核心构建的。例如,Seaborn 和 Pandas 充当 Matplotlib 的包装器,允许用户用更少的代码行创建图形。
什么时候使用 Matplotlib?
- 如果你熟悉 MATLAB,使用 Matplotlib 会看起来很熟悉,并且会使你的转换更容易。
- 如果你的大部分数据是时间序列,那么使用 Matplotlib 会让使用和绘图变得有点复杂。
- Matplotlib 在处理静态 2D 图方面非常强大。然而,如果您想要绘制 3D 或交互式可视化,这将变得非常复杂。
- Matplotlib 是一个非常低级的库,这意味着需要编写更多的代码来实现可视化。
- Matplotlib 不是为数据探索目的而设计的,所以如果你的主要目标是这样做,你最好使用另一个库。
用法举例

海生的
Seaborn 是基于 Matplotlib 构建的库之一。它充当包装器,为用户提供 Matplotlib 的高级替代方案。您可以创建与 Matplotlib 相同的可视化,但代码行要少得多。
由于 Seaborn 是基于 Matplotlib 构建的,所以它包含了与 Matplotlib 相同的图表类型,此外还有一些很酷的图表,如热图和 Violin 图表。Seaborn 还可以用于使 Matplotlib 图表在视觉上更具吸引力。
什么时候使用 Seaborn?
- 我一直建议,如果你正在使用 Matplolib,你应该使用它来使你的可视化效果更好。
- 如果您开始使用 Python 和 DS,Seaborn 是一个简单明了的库,您可以用它来轻松创建令人惊叹的图表。
- Seaborn 提供了简单的定制方法来为您的图形添加您的触觉。它让您可以完全控制所创建图形的调色板。
- Seaborn 有许多你可以轻松使用的统计内置图,例如小*面图和回归图。
用法举例

普洛特宁
早在 1993 年,一本精彩的书出版了。图形语法为设计者和数据科学家提供了一个分层的规则指南,以创建漂亮、有意义和有用的数据可视化。
如果你以前使用过 R,那么 Plotnine 是用类似的语法构建的,是《图形语法》书中不同方面的实现,它基于流行的 R 库 ggplot 。
什么时候用 Plotnine?
- 使用 Plotnine 最直接的原因是,如果您正从 R 过渡到 Python,并且希望创建可视化而没有太多麻烦。
- Plotnine 允许用户通过明确地将数据映射到形成图的可视对象来容易地构成图。
- Plotnine API 允许您使用少量代码轻松创建不同类型的图表,而无需经常查阅文档。
- 使用 Plotnine 进行绘图是非常强大的,因为它使自定义绘图易于思考和创建。
用法举例

网络 x
NetworkX 是一个不仅仅用于可视化的 Python 库。相反,它是一个用来分析、操作和研究复杂网络结构的软件包。
NetworkX 是那些特定领域或特定区域的库之一;也就是说,您不能使用这个库生成任何图表。例如,您不能使用 NetworkX 创建条形图或饼图。
什么时候使用 NetworkX?
- 如果您正在处理图形或图论算法,使用 NetworkX 将允许您快速实现和分析这些应用程序。
- 如果你想研究不同数据点之间的关系。
- 如果你试图模拟和分析整个网络的性能。
用法举例

缺少编号
每当您开始一个新的数据科学项目时,您将需要执行一些数据探索以更好地理解您的数据。经常发生的一件非常恼人的事情是遇到丢失的数据条目。作为数据科学家,丢失数据条目是整个项目中最具挑战性的任务之一。
好了,失踪的人来了。它允许用户通过提供数据集的可视化摘要来测试数据集的缺失条目。因此,您可以根据变量之间的完整性和相关性对数据进行筛选和排序,而不是遍历一行又一行的数字。
什么时候用 Missingno?
- 如果您想加快和简化任何项目的数据探索阶段。
- 显示每个列、矩阵、热图和树状图中存在的值的计数。
用法举例
这里使用的数据集是。

动态绘图库
Plotly
Plotly 是一个基于 Javascript 的模块,用于生成和操作交互式可视化。使用 Plotly,您可以创建独特的图表,如树状图、3D 图表和等高线图。这些图表类型中的大多数不能通过大多数其他库生成。
此外,Plotly 有许多用于机器学习和数据科学的内置应用程序,这使得 ML 回归和 kNN 分类等标准算法的实现和可视化更加容易。
何时使用 Plotly?
- 如果您想从用 Python 创建交互式数据可视化开始,那么 Plotly 是一个不错的选择。它允许你创建自定义图表,没有任何麻烦。
- 您可以在 Plotly 中创建令人惊叹的动画,帮助您更好地交流数据。
- 如果您想要创建漂亮的地图、科学图表、3D 图表或金融图表。
- Plotly 允许您创建自定义控件到您的图表,以提供更多的交互式功能。
用法举例

散景
与 Plotly 类似,Bokeh 是一个基于 Javascript 的包,允许您创建令人惊叹的交互式可视化。此外,与 Plotnine 类似,散景是图形语法中规则的一种实现。
散景提供三种级别的控制,以适应不同的用户类型。最高级别允许您创建标准图表,如条形图、饼图、散点图等。中间层像 Matplotlib 一样提供一定程度的特异性,并允许您控制每个图表的基本构建块。最后,最低级别让您可以完全控制图表的每个元素。
什么时候使用散景?
- 创建漂亮的交互式可视化。
- 如果您想要执行数据转换,例如向拥挤的绘图添加抖动。
- 如果你想创造美丽的 2D 图形。但是,如果你想要 3D 图形,请使用 Plotly。
用法举例

闪光
Gleam 是一个 Python 库,灵感来源于 R Shiny 库。它允许 Python 开发人员为 web 创建交互式数据可视化。
Gleam 将所有这些放在一起,创建了一个 web 界面,让任何人都可以实时处理您的数据,从而比以往任何时候都更容易帮助他人理解和解释您的数据。
什么时候用 Gleam?
- 如果您想为 web 创建可视化,但不想处理 JS、HTML 或 CSS。
- 如果你想让你的用户实时控制你的数据。
阿尔泰尔
Altair 是一个基于 Vega-Lite 的简单、用户友好且一致的统计可视化 python 库。Altair 允许您仅用几行代码快速创建有意义、优雅且有用的可视化效果。
什么时候使用牛郎星?
- 如果您想要轻松的交互式数据可视化。
- 快速有效地对数据应用转换。
- 如果您想创建声明性统计可视化。
- 创建堆叠的、分层的、多面的和重复的图表。
用法举例

薄层
是一个漂亮的 Python 地理可视化库,用于绘制地图。follow 使用 fleet . js 的制图功能实现交互式地图可视化。
follow 使您能够放大和缩小地图,单击和拖动它们,甚至在它们上面添加标记。
什么时候用叶?
- 如果你想创建交互式地图,best 是你最好的选择。
用法举例

结论
数据可视化是开发人员或数据科学家将其数据传达给广大受众的方式。构建更好、更有效的数据可视化是每个数据科学家都必须努力发展的一项宝贵技能。
每当你想要创建一些可视化,这里有一个经验法则可以遵循,如果你是数据科学和 Python 的新手,并且只想创建静态图表,那么使用 Seaborn 。对于网络分析,使用 NetworkX 。如果你想创建交互式可视化来呈现,使用 Plotly ,但是如果你想在网络上使用这个可视化,那么使用 Gleam 。最后,如果你想创建交互式地图,叶子是你的朋友。
最后,无论您选择什么库,您都可以创建引人注目的可视化效果。记住,复杂并不总是答案。始终使用提供可视化所需特性的库。
数据可视化 102:制作数据表最重要的规则
如何有效地使用表格来传达关于数据的信息?

图片来自米卡·鲍梅斯特
在之前的关于数据科学和统计中的数据可视化的帖子中,我讨论了我认为绘制数据最重要的一条规则。在这篇文章中,我将继续讨论制作数据表的最重要的规则。我将把重点放在向其他人报告/交流发现的数据表上,而不是数据科学中表的许多其他用途,比如存储、组织和挖掘数据。
总而言之,图表就像句子一样,向浏览者/读者传达一个清晰的思想。另一方面,表格的功能更像段落,传达多个句子或想法来获得一个整体的想法。与通常提供一种思路的图表不同,表格可以更具探索性,为查看者/读者提供分析信息并从中得出自己的结论。
餐桌规则#1:不要害怕提供你需要的或多或少的信息。
段落可以用多个句子来传达一系列的思想/陈述,表格也不例外。一个人可以传达多条信息,观众/读者可以在他或她自己的闲暇时间浏览和分析,使用这些数据来回答他们自己的问题,因此可以根据需要随意占用空间。几页长的表格是公*的游戏,并且在许多情况下是绝对必要的(尽管经常被放在附录中,以供需要更深入了解的读者/观众使用)。
在我之前的数据可视化帖子中,我给出了这个条形图作为一个例子,试图为一个图形说出太多的语句:

图片来自 Linux 截图
这是相当于一个段落的信息,用表格来表示会更好。在表格中,读者/查看者可以自己按国家和年份浏览表格值,并回答他或她可能提出的任何问题。例如,如果有人想分析一个特定的国家是如何随着时间的推移而变化的,他或她可以很容易地用一个表格来完成,和/或如果他或她想分析比较某个特定十年的国家之间的移民比率,这也是可能的。在上图中,每个国家的子段在每个十年列的不同垂直位置开始,这使得很难直观地比较大小,并且由于每个十年有几十个值,后面的分析也很难直观地解读。
但是,与此同时,不要害怕将一句话或一张图表价值的数据传递到表格中,特别是当这些数据是你要说的核心内容时。有时,当一个想法至关重要时,作者会包含一个句子段落,同样,一个单独的陈述表也会有类似的效果。例如,为单个变量编写一个表确实有助于传达该变量很重要:
现在,有时在这些单语句实例中,你可能想要使用一个图表而不是一个表格(或者两者都用),我将在规则 3 中详细讨论这一点。
表格规则#2:保持列的一致性,以便于浏览。
我发现,当查看者/读者扫描表格时,他们通常下意识地假设一列中的所有变量都是相同的:相同的单位和值的类型。在行与行之间改变一列的值可能会让你的读者在看的时候感到困惑。例如,考虑这个虚构的研究数据:
在该表中,每行表示不同的值和/或单位。例如,沿着控制栏往下,第一栏是以年为单位的*均年龄。第二列切换到中值年龄,这是一个不同于*均值的值类型(尽管使用相同的年数单位)。最后两行表示男性和女性的数量和百分比:两者都是不同类型的值和不同的单位(数量和百分比不同于年份)。这可能会让查看者/读者感到不舒服,因为他们经常希望列具有相同的值和单位,并且很自然地将它们进行比较,就好像它们是相似类型的值一样。
我建议像这样转置它,这样列代表相似的变量,行代表两组变量:
表格规则#3:不要害怕使用图表来表达数量、比例或尺度
像规则#1 中的性别表这样的表用数字传达相关信息,但是数字本身并不能直观地显示值之间的差异。
图表擅长直观地描述数据的大小、比例和/或规模,因此,如果在这个例子中,重要的是传达女性比男性的“一些关键结果”大多少,那么基本的条形图可以让读者/观众看到女性的百分比是男性的两倍以上。

作者制作的图表
现在,为了传达这种视觉上的清晰,图表失去了精确关联精确数字的能力。例如,只看这个图表,读者/观众可能不确定男性是 36%、37%还是 38%。人们已经开发了许多绘图策略来处理这种情况(从使网格线更清晰,在线段的顶部、旁边或周围写下准确的数字,等等),但是在既需要传达准确的数字又需要传达它们的大小、比例或规模的情况下,结合图表也可以很好地工作:

作者制作的图表
最后,鉴于表格可以传达多种陈述,请随意使用几个图表来描述一个表格的大小、比例或规模。不要试图将一个多语句的表过载到一个单一的、难以理解的图表中。将您试图与该表联系起来的每一项陈述分解,并在一个图表中分别描述。
结论
如果图表是句子,那么表格的功能就更像段落,传达大量信息,表达不止一种思想或陈述。这给你的读者/观众提供了探索数据的空间,并让他们自己解释数据来回答他们的任何问题。
不幸的是,我自己没有这张图表使用的数据,否则我会为它制作一个表格。
【https://ethno-data.com/rules-for-tables/】原文发表于此:。有关该网站和其他文章的更多信息,请访问https://ethno-data.com/。
也感谢《数据科学》杂志发表这篇文章。关于他们工作的更多细节,见 本 。
数据可视化和可访问性:三个推荐读物和顶级技巧
你可以制作一个你认为是有史以来最漂亮的数据可视化——但对许多观众来说,它可能几乎毫无用处。了解一些使数据可视化对每个人都更好的关键方法。

本文的许多读者可能每天都在做的事情是创建不同类型的数据可视化。然而,我们可能不会总是停下来想一想,患有不同残疾的人是否会发现这些可视化是可访问的和有用的。
为了更多地了解这个重要的问题,我从专家那里找到了一些关于这个主题的资源,在这里与你分享。它们非常值得你花时间去完整阅读。我还会强调一些你可以在自己的工作中使用这些作者的顶级技巧的方法。
推荐阅读#1
“可访问数据可视化设计简介”,开发者兼设计师莎拉·l·福斯海姆
提示:“可视化任何数据时,使用标签和图例很重要。如果可能,尝试在上下文中添加标签。…看到写出来的值也意味着:用户不必猜测、悬停或进行计算来获得准确的数字,[并且]不必完全掌握视觉效果来理解正在发生的事情。”
使用它:在 Alteryx Designer 交互式图表工具中,您可以向图表的各个部分添加标签,以显示条形图或饼图各个部分的实际值和/或标签。
例如,在下面的图表中,我在饼图的各个部分添加了区域标签,并隐藏了图例,因为它变得多余了。现在,区域信息立即可用,而不是要求查看者来回查看颜色的含义。即使有人不能感知图表,他们仍然可以获得数字信息。

推荐阅读#2
“可访问的数据即更好的数据即”, 作者 Amy Cesal(在 Cole Nussbaumer Knaflic 的博客上的客座博文,用数据讲故事的创始人兼首席执行官)
置顶提示:“空白是你的朋友。当信息过于密集时,图形会让人感觉难以理解。在图表的各部分之间留出间隙会有所帮助。明智地使用留白有助于区分不同部分,而不仅仅是依靠颜色,从而提高可读性。这也可以通过帮助用户区分不同颜色之间的差异来补充可访问的颜色选择。”
使用它:如果空白能帮助你的浏览者从你的视觉化中获得价值,那么它就不是浪费的空间!在 Alteryx Designer 中可以做到这一点的一种方法是向条形图中添加更多的空白,如果其中有更多的空白区域,可能会变得更加易读。
默认情况下,每个条形将为其潜在宽度的 80%;将该数值增加到 100%会使条形相互紧靠,它们之间的间隙为零。减小条形宽度可以使一些图表更具可读性。下图中的条形设置为 65%宽度。

交互式图表工具中的条形图格式选项

这张图表还使用了一个副标题,总结了其创建者的主要信息,这有助于人们从可视化中快速获得关键信息。
在你的可视化或报告中加入更多的细节总是很诱人的,但是留白和简单让你的信息更容易被访问。
推荐阅读#3
红绿色盲的五种设计方法 ,“安迪·基尔克
****提示:“颜色的含义由来已久,并被广泛使用,尤其是在金融或企业环境中,但尽管它们为许多观众提供了某种直接的含义,但大约 4.5%的人口是色盲(8%的男性),其中红绿色盲是最常见的形式。这意味着很大一部分观众可能无法感知这种重要的视觉编码。”
使用它: Kirk 的文章对某些颜色组合的文化意义提供了有趣的见解。例如,交通信号灯的红-黄-绿颜色对一些文化背景的人来说意味着“停-小心-前进”。
但是,即使这些含义看起来适用于我们的数据可视化,我们可能会无意中阻止一些人体验可视化。我们必须谨慎选择颜色,以确保患有各种色盲的人能够清楚地看到它们。更重要的是,确保颜色不是你在数据可视化中传达意义的唯一方式。
如果你选择了自己定制的调色板或公司的颜色,而不是提供的调色板,你可以使用在线模拟器如科布利斯来检查你完成的图形的易理解性。

上图所示的同一张图表的三个视图,由科布利斯针对不同类型的色盲进行模拟。
关于这个主题还有很多需要了解的,我强烈建议全文阅读所有这些文章。
用上面的播放器听播客片段。
另一个了解更多的方法是:我们刚刚在 Alteryx 发布了一集关于可访问性的 Alter Everything 播客。Alteryx 工程经理 Steve Tomasak 与可访问性和本地化团队负责人 Jeremy Likes 和可访问性产品经理 Kyle Waterworth 进行了交谈。杰里米和凯尔都使用辅助技术,并分享他们的个人经历。他们还讨论了通用设计背后的关键思想,并讨论了一些创新的辅助技术。
听一听这一集,了解关于这个主题的更多信息,这对每个塑造和使用技术的人都很重要!
最初发表在 Alteryx 社区数据科学博客上。在 Alteryx 数据科学门户上找到更多资源。
如何快速让你的图表看起来美得惊人
Excel 中的数据可视化和动画以及后期效果
那么,您刚刚完成了对数据的检索、处理和分析。你拿起你的数据,决定把它制成图表,这样你就可以向别人展示你的发现。你点击“图表”,然后……

布鲁斯·艾隆哈特拍摄的照片
丫看起来有点无聊。我们想要的是更有趣、更有活力的东西。大概是…这样:

布鲁斯·艾隆哈特拍摄的照片
是啊!现在看起来真棒!让我们看看如何快速制作这个动画。
先决条件
好吧,这是你需要开始做的:
- 条形图的数据(咄!)
- Adobe Illustrator (不要担心我们不需要它来做任何复杂的事情)
- 土坯后特效
第一步:让你的 Excel 图表看起来更好
所以,让我们做一些事情来使我们的图表看起来更好。我们可以先把文本放大一点,然后改变一下图表的样式。
现在对于样式,我不需要 y 轴,相反,我只需要图形中每个条形顶部的总数值。我们可以很容易地在 excel 中完成,
- 选择图表
- 点击'画笔图标'
- 在'样式下,我们可以找到我们正在寻找的图形样式。对我来说,这是第二次,但对你来说可能不一样。

布鲁斯·艾隆哈特拍摄的照片
下一步只是让字体变大,然后把字体改成你喜欢的样子。移除任何背景线(您可以选择并删除它们)。或许可以把酒吧变得更宽。在我完成编辑后,我的图表看起来像这样。

布鲁斯·艾隆哈特拍摄的照片
现在不要担心文本太浅,稍后,我会添加一个更深的背景色,让它看起来更流行。
尝试你想要的设计,尽情发挥你的创造力。
步骤 2:在 Adobe Illustrator 中将 Excel 图表分解成组件
在 Adobe Illustrator 中创建新项目,并将大小设置为 1920 x 1080。然后,只需将您刚刚从 Excel 制作的图表复制粘贴到 Illustrator 中。
该图像将复制为矢量图像,这意味着您可以调整其大小,而不必担心质量损失。调整图像大小,直到它适合您想要它在画布上呈现的方式。请参见下文,了解如何调整它的大小。

布鲁斯·艾隆哈特拍摄的照片
将每个条形拆分到它们自己的层中
如果你打开'图层'面板(你可以点击 f7 或窗口- >图层打开它),你应该看到'图层 1 。如果我们打开它,我们应该看到一个名为“ <剪辑组> ”的图层,其中包含了我们需要的所有条。

布鲁斯·艾隆哈特拍摄的照片
现在他们都粘在一起了。
1.选择-<剪辑组>-->右键点击>选择释放剪辑蒙版。这将创建一个'复合路径'层。
2.选择该层,再次右击该栏,选择'释放复合路径'。现在我们把所有的小节都分开了。

布鲁斯·艾隆哈特拍摄的照片
创建五个新层(每个条形一个),并将每个条形层拖到新层中。给新的条形层重新命名,以便以后在 After Effects 中更容易使用。

布鲁斯·艾隆哈特拍摄的照片
将条形值拆分到一个新层中
再创建一个名为“值”的图层,将所有的数值条移入该图层。确保不要移动任何年份值,我们只希望条形值在那里。
移除不必要的层
现在我们基本上完成了。我们需要做的最后一件事是移除第 1 层中我们不需要的任何子层。
一个简单的方法是点击图层旁边的小图标。如果某样东西从 Illustrator 中消失了,那么我们希望保留它。如果看起来什么都没有消失,那么我们可以移除它。这样做的目的是删除白色背景,这样我们就可以在后期添加我们自己的特效了。如果你想保留白色背景,请随意进入下一步。
完成后,将第一层的重命名为轴,这样在后期效果中更容易识别。
第 3 步:动画效果
创建一个新的 After Effects 项目,并将大小设置为 1920 乘 1080。我的持续时间被设置为 5 秒,但如果你愿意,你可以设置为 3 秒。接下来,我们需要导入刚刚创建的 Illustrator 文件。我们可以通过双击项目面板并选择我们的 AI 文件来做到这一点。
确保导入种类设置为构图并且进尺尺寸设置为图层尺寸。然后,我们只需点击 after-effects 自动为我们创建的新构图,就可以开始工作了。你也应该在合成面板中看到我们所有的图层。

布鲁斯·艾隆哈特拍摄的照片
每层都有一个锚点。这些锚点是我们应用的效果发生的点。我们需要将这些锚点移动到每个条的底部,以便动画从该点开始。
为此
- 选择特定的条形对象(例如:条形 1)
- 在工具栏中选择锚定工具。
- 然后,只需将锚点移动到工具栏的中间底部。对每个条形重复此操作。你可以在下面看到一个我是如何做的例子。

布鲁斯·艾隆哈特拍摄的照片
将条形图从 0%缩放到 100%
一旦我们把锚定在正确的位置,我们就可以开始制作动画了。这部分真的很简单。
在“合成”面板中:条形层(例如:条形 1)>变换>缩放。
- 点击秤选项上的链图标取消秤的链接。这就解除了宽度和高度之间的联系。
- 点击秤选项旁边的秒表图标。这为我们的动画创建了一个关键帧。
- 将高度设置为 0%。在比例选项中,高度是第二个值。
- 将时间轴上的擦洗器移动到 7 帧(或者您希望动画持续多长时间),并将高度调整回 100%。这将自动为我们创建一个新的关键帧,并在 7 帧内使我们的生长条从原始高度的 0%变为 100%。

布鲁斯·艾隆哈特拍摄的照片
添加反弹动画
反弹动画使我们的酒吧到达顶部时,它会超过,然后再下降。这使得动画看起来更加流畅生动。
为此,在按住 ALT 键的同时,点击秤台旁边的秒表图标。时间线上将打开一个文本区。将以下内容复制粘贴到那里。
// Inertial Bounce - Created by Animoplex: [www.animoplex.com](http://www.animoplex.com)
// Original Version: [http://www.graymachine.com/top-5-effects-expressions/](http://www.graymachine.com/top-5-effects-expressions/)
// Modified expression for a smoother bounce effect and easier editing. Use this on any property with two keyframes to get a nice bounce effect that is based on velocity of the value change. Perfect for a scale from 0 to 100 or a speedy rotation that needs some extra life. Adjust amp, freq and decay values to tweak the effect. Amp is intensity, freq is bounces per second, and decay is the speed of decay, slow to fast.// Variation Aamp = 5.0; freq = 2.0; decay = 4.0;n = 0;
if (numKeys > 0) {
n = nearestKey(time).index;
if (key(n).time > time) { n--; }
}
if (n == 0) { t = 0; }
else { t = time - key(n).time; }
if (n > 0 && t < 1) {
v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
value + v*(amp/100)*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
}
else { value; }

布鲁斯·艾隆哈特拍摄的照片
恭喜你!困难的部分已经过去了,现在我们只需要做一些复制粘贴和修复一些东西。您现在应该会看到类似这样的内容:

布鲁斯·艾隆哈特拍摄的照片
将粘贴运动效果拷贝到其他条
如果您关闭我们刚刚处理的组件的下拉菜单并再次选择它,您可以在键盘上键入字母“U”来查看您已更改的属性。
- 这样做,并选择我们刚刚制作的两个关键帧。
- Ctrl+C 或 Cmd+C 来复制它们。
- 选择其他每个条形构件,并将其粘贴到每个构件上。

布鲁斯·艾隆哈特拍摄的照片
酒吧的移动时间
打开我们刚刚制作动画的所有酒吧的所有属性。我们看到每个条形的动画同时出现。要解决这个问题,我们只需要移动每个条形的关键帧动画,使其在最后一个动画结束时开始。
对我来说,第 5 根棒线是我在图上的第一根棒线,第 1 根棒线是我最后一根棒线。所以对我来说,我只需要像下面这样移动它们,但你可能需要以不同的方式移动它们。

布鲁斯·艾隆哈特拍摄的照片
动画显示条形值
动画开始时的值很奇怪。相反,让它们出现在动画的结尾会更好。
- 点击“值”组件>变换>不透明度
- 点按秒表并将关键帧设定为 0%
- 我们希望不要在动画接*结束时才开始动画制作,所以把你的时间擦洗器放在最后一个条形动画开始和结束的中间。您可以通过选择“不透明度”属性最右侧的菱形图标来手动创建关键帧。
- 将搓擦器移动到最后一个条形动画的末尾,并将不透明度设置回 100%。现在,这些值将出现在动画的末尾。

布鲁斯·艾隆哈特拍摄的照片
添加背景颜色
- 图层>新建>实体…
- 挑选你最喜欢的颜色。
- 在构图面板中,将背景拖到底部,再次查看你的图形。

布鲁斯·艾隆哈特拍摄的照片
你完了!
漫威看着你美丽的作品。

布鲁斯·艾隆哈特拍摄的照片
如果你喜欢这个,可以考虑读一些更酷的东西,比如如何在 Python 中处理丢失的数据
开始使用数据前如何清理数据的指南。
towardsdatascience.com](/machine-learning-handling-missing-data-27b09ab146ba)
或者说三文鱼怎么可以用一个神奇的力量回到家!
原来他们不用谷歌地图!
medium.com](https://medium.com/illumination/how-do-salmon-get-back-home-48f2ab445568)
数据可视化受众和场景
数据科学/数据分析/教育
在数据可视化中,您可能会面临三种情况

无论你是在做多元分析还是构建深度学习神经网络,数据可视化可以说是任何数据职业中最重要的部分。我个人更喜欢数据的分析而不是可视化,但是,如果最终用户不理解我正在分析的数据,那还有什么意义呢?
数据可视化是数据职业的一个有趣的部分,因为它是职业中唯一可以留给解释而不是纯粹事实的部分。当然,你比较销售额的条形图是正确的,但是如果它是一个圆形图,也许对最终用户更有意义?数据可视化是这个职业的一部分,我继续在这方面进行一些额外的实践,但是,鉴于我所经历的所有错误和实践,我想向我的读者和其他数据专业人士/学生提供一些数据可视化。让我们开始吧!
免责声明:我不是全职的数据专家,我只是简单地转述我在暑期实习和个人实践中的经验。这并不是要告诉你你到底需要知道什么,而是从我的经历中给你一些实用的建议。高级技术信息请查看 走向数据科学 。如果您对一些有助于数据可视化的建议感兴趣,请继续阅读!
以最终用户为中心进行创作
我收到的关于数据可视化的最好的建议是“以终端用户为中心进行创建”。正如任何创意人员在创作一件艺术品时都了解他们的受众一样,数据专业人员在创作可视化作品时也是如此。从某种意义上说,可视化是数据的艺术品。我们花费大量时间构建模型、进行统计分析和清理数据。没多少人懂那部分专业,但每个人看到一个好图就懂了。考虑到这一点,让我们来看看一些观众:
首席执行官/高级管理层
首席执行官、首席运营官、首席财务官等。
除非你是中级数据管理人员或是高级分析师,否则你可能最少与这一组人打交道。这个群体往往年纪较大,经验丰富,技术不如分析师娴熟,因为这不是他们的工作。执行管理层是管理公司的人,他们需要快速清晰的概述。他们可能希望时不时地钻研数字,但大多数时候,他们只是需要高层次的观点来快速做出决策。Power BI 将是这些报告的一个好工具,因为它允许快速创建报告,而不是复杂的仪表板。
二。上层管理
营销副总裁、销售副总裁、IT 总监等。
你可能会比管理层更多地与这个团队合作。这个群体往往是中老年人,经验丰富,拥有高于*均水*的技术技能。他们更喜欢钻研数字,但在大多数情况下,仍然喜欢保持高层次的观点。Tableau 对这个群体来说是一个很好的工具,因为这些经理喜欢按照自己的意愿挖掘数字。
三。中层管理人员
营销自动化经理、销售开发经理等。
这是你最常与之共事的群体之一。这群人更年轻,经验更少,但技术更娴熟。成长在信息时代初期的他们,比其他群体更有兴趣挖掘数字。Tableau 非常适合技术含量较高的职位,而 Power BI 则适合技术含量较低的职位。
四。专业职位/个人
BI 开发人员、网络分析师、客户开发代表等。
这是另一个你会花大量时间与之共事的群体。许多集中的职位会要求你为他们拉指标。这个团队非常年轻,没有什么经验,但是技术能力很强。任何报告或可视化工具的工作,因为他们可能会理解它!
数据可视化场景
现在,我不想只告诉您不同的最终用户组,而是想展示一些示例,说明我如何使用相同的数据为这些不同的用户组创建报告。通常,你会收到一封电子邮件,有人会问:“嘿 _____,我们能从这些数据中学到什么,我们的表现如何?”。这就是你将得到的所有指导,所以这里有三个例子,是我在创建它们时的思考过程。为了实现这些可视化,我使用了格雷戈利·史密斯在 Kaggle 网站上发布的视频游戏销售数据集。在这些情景中,您是一家视频游戏公司的首席数据分析师,工作时间接*财年结束。许多利益相关者都很好奇他们做得如何,以及他们可以做些什么来改进。让我们看完这些报告吧!
假设,我们公司拥有这个数据集中的所有游戏,这是一个很好的商业模式
I .全球销售报告:高级管理层

对于这份报告,我们视频游戏公司的首席执行官给我们发邮件说,“你好 ____,我想知道我们的表现如何,谢谢”。在为高管创建报告时,我们需要考虑的第一件事是,“我们如何尽可能简洁、高水*地呈现重要信息?他们需要知道什么?”。我们的首席执行官想知道我们的表现,所以让我们先解决这个问题。由于这是一家全球性公司,他们可能想知道总销售额,以及三个地区之间的销售额。可视化时间序列的最佳方式之一是折线图,所以让我们用过去 20 年的全球销售额以及所有三个地区的销售额制作一个折线图。首席执行官可能也想要一些能帮助他们做出重大战略决策的见解。由于流派是一个重要的跟踪指标,让我们跟踪它的表现,并把它放在报告中。最后,他们可能需要了解每个地区的独立表现,这样他们就可以根据需要推出基于绩效的激励措施。让我们在饼图中包括每个地区的总销售额。搞定了。那么这份报告提供了什么呢?你可能会注意到这都是长期的、大量的信息。根据这份报告,我们建议首席执行官们应该专注于开发一些动作游戏,并在北美进行市场推广。营销也应该遵循他们在 2008 年所做的,因为那是销售的最高点。在真实的数据集中,将会有更多的信息来做出决策,而不仅仅是少量的变量,但是对于我们的目的来说,这是可行的!进入下一个报告!
二。全球销售报告:营销副总裁

接下来,北美全球营销副总裁给我们发邮件。“嘿 ____,我正在为我们的 R&D 团队提出一个请求,以决定我们希望我们的下一个游戏是什么。介意拉一些数据发给我吗?”。我们开始工作吧!我们知道,因为这是全球营销副总裁,他们可能想知道指标在全球的表现,以及仅与产品或产品销售相关的指标。让我们先来总结一下北美相对于全球的销售情况,因为他们的第一要务是北美。在类型的话题上,让我们也想象一下不同的类型在每个地区是如何表现的,来感受一下全球营销战略的前景。*台是另一个重要的变量,因为合作关系很昂贵,所以让我们看看每个*台在美国的销售情况。最后,让我们也来看看前 10 名最畅销的游戏,看看哪些是热门的,哪些一直是热门的。搞定了。这些都是很好的指标,因为它们代表了北美和全球的表现。我们的建议应该是考虑用我们最新的技术为 Xbox 和 PlayStation 制作一些动作游戏。此外,我们在角色扮演游戏方面表现不佳,但日本在这方面表现出色。我们应该建议我们的副总裁打电话给日本的营销副总裁,从他那里获得一些关于他们如何营销和开发角色扮演游戏的想法。那应该很好,让我们开始最后的报告吧!
三。全球销售报告:欧洲使命召唤项目经理

快到中午的时候,《使命召唤》在欧洲的首席项目经理给我们发了一封电子邮件。“您好 ______,我想知道我们是否可以获取一些销售指标,谢谢”。显然,这封邮件有点模糊,所以我们需要使用我们的数据和直觉来做出一份好的报告。首先,我们来看看《使命召唤》在欧洲的表现与全球其他地区相比如何。接下来,我们来看一下各个地区的使命召唤销售总额。最后,我们来看看每款《使命召唤》游戏的表现如何。请注意,我们只包括了关于使命召唤的指标,因为使命召唤项目经理不需要在其他指标上浪费时间和内存。我们就给他使命召唤指标吧,因为这是他的专长。我们应该建议欧洲项目经理联系各自地区的其他两位项目经理,弄清楚 2015 年发生了什么导致销售额如此急剧下降。我们还应该建议他们联系“使命召唤:黑色行动”的开发者,并创建另一个系列,因为该系列表现非常好,五个顶级使命召唤游戏中的三个都是“黑色行动”系列的一部分。
结论
咻!这是一个很大的可视化!希望这能让你对创建报告的计划和思考过程有所了解。这不仅仅是把图表放在纸上那么简单,而是为每个最终用户创造独特的东西。在创建可视化效果的时候,一定要考虑到最终用户,他们会注意到的,你也一样。随时可以继续回来这个故事做参考!保持安全,快乐观想!
"注:这些报告是使用 微软 Power BI创建的
查看我的其他一些故事!
要联系我或接收更多内容,请在 Twitter 上关注我@BMNAnalytics!**
获得有意义见解的数据可视化要素
要做的事情,按这个顺序
如果你是商业智能分析师、审计师、数据工程师或任何关心决策“数据”方面的人,你已经处理了大量的图表和绘图。Tableau、Qlik、Power-BI、Python、R、Plotly 等工具。主宰这个世界,让从原始数据中获得洞察力变得容易(非常感谢!).正如我在上一篇文章中提到的,像专家一样进行预处理,工作的附加值来自于图表提供的洞察力,而不是图表本身。本文主要关注各个步骤中的检查点,以确保您的仪表板有效且有洞察力。
要求证明准确性和完整性

仪表板的第 0 步总是检查源数据的准确性和完整性。如果你没有自己提取数据,而是从其他地方获得的,打电话/发邮件/发短信/WhatsApp,获得令人信服的证据。
要求摘录用于提取这些数据的逻辑。以下是一些有帮助的问题:
- 所有的滤镜都是按照你的问题设置的吗?
- 时间段是否正确?
- 参数的含义与您认为的一样吗?
- 这些参数是您想要观察的指标的正确代表吗?
这是你准确性的证明。
通常,数据查询结果会在屏幕上显示一条消息,说明发现 X 行结果- 这应该是您的数据提取中的数字。您可以将其与之前类似提取中生成的数据总量/数据进行比较,以检查这是否是一个可信的数字。
这是你的完整性证明。
对于每张图片,获取一个上下文

让我们假设您手头有经过准确性和完整性验证的数据。现在,您已经构建了一个漂亮的数据图表。要从任何一个图表中得出洞见(姑且称这个图像),总要有第二个图表让场景完整有意义(姑且称这个上下文)。永远不要相信独立的数字,不管它们看起来有多可怕。
看到一个图像的那一刻,寻找一个语境 。
大背景

总是看到更大的画面说什么。下面是一些如何在大图中寻找上下文的例子,用 高亮显示 介词 你的上下文应该包含。考虑以下例子:
- 如果您发现一台机器生产了您所有缺陷零件的 90%(图片),那么在您继续修理这台机器之前,您还需要第二张图表来显示这台机器生产了多少个(上下文)。如果它也生产 90%的零件,当然,它有更多的零件是有缺陷的,这意味着你所有的机器都需要修理。
- 如果你看到你的公司一个月赚了 10 万美元(图片),看看你的市场份额与市场上其他拥有类似目标客户群(上下文)的公司的 。
- 如果你生产的 100 万个零件有缺陷(图片),看看机器上每 100 万个中有多少个有缺陷,你生产了多少个(上下文)。
记住上下文看起来像一个百分比或比率。一个数字看起来像是在煽动情绪。以数据大师、Gapminder.org、汉斯·罗斯林、的创始人 Factfulness 为例
没有上下文:2016 年有 420 万婴儿死亡。
很可怕,不是吗?
有语境:2015 年 450 万,2014 年 440 万,1950 年 1400 万。我们突然比以前少了 1000 万死亡婴儿。我们这样做是好是坏?
4.如果有人试图向你出售没有背景的图片信息,快跑!
时间背景

- 时间背景显示了你观察的季节性和趋势。例如:每周三的数据点与一周的其他时间相比 高吗?它们是否每周都比前一周(趋势)高/低?
- 自昨天/上个月/去年同季的以来,你的指标有什么变化?你是不是因为六月的太阳高,销量就高?你做了一些可以重复的伟大的事情吗?
- 时间提供的另一个细节是变化率。 您的指标有多动态?
在对您的原始数据进行进一步研究时(例如使用机器学习),记住对 和进行标准化,从图片中移除 季节性和趋势。
寻找模式

- 一旦你有了图像和它们的背景,开始寻找模式。最好的开始方式是用你的眼睛在不同的变焦水*下观察它们,每次至少取两个不同的参数。
例如,假设您有以下参数:
10 个产品的利润,产品的投资额,部门主管的身高,这些产品的研发收入。
将这些参数中的每一个与其他参数进行对比,看看它们能告诉你什么。视觉信息再多也不为过。问问你自己— “什么是因”**“什么是巧合”。(是啊,这家伙的身高可能是个巧合……)
2.寻找相似大小、相似范围的参数,看看它们在不止一个上下文中是否有共同的行为。这可能(不是必须)有助于确定什么是巧合,什么是因果关系。
确保你的图表代表了所有重要的信息

把事物分为黑与白,好与坏,1 与 0,这是人类的倾向。在将这种趋势应用于数据表示之前,请查看您的黑白桶是否代表了所有信息。例如,看下面的问题:
- 班上的学生是好的、坏的、一般的还是你需要技能水*和学科信息?
- 添加主题信息不会改变你的洞察力,但会减慢你的图形速度吗?
- 月表示是足够的粒度,还是需要周时段?
创建*均存储桶时要非常小心。如果你用它们来比较,注意比较极端与极端,手段与手段。将异常情况排除在*均水*之外。
一些信息比另一些更重要

为了检查您选择的参数是否是正确的代表,检查移除对 KPI 或指标产生最大影响的参数。这一组或这几组参数是最重要的参数,您应该希望在这些参数的基础上构建您的谈话要点。
说了这么多,注意,现实世界中,因果比我们想象的要复杂得多。不要被眼前最简单的解释所迷惑。在有效解决问题的道路上,这是最难也是最诱人的障碍。
人类的数据可视化:我如何把我的数据变成水彩艺术
你有没有听过一个陌生人的谈话,感觉他们在表达你自己都不知道的想法?或者有过,但无法用语言表达?
虽然这听起来很有戏剧性,但这就是我在观看 Giorgia Lupi 的关于数据人文主义的 TED 演讲时的感受。Giorgia Lupi 是一位来自意大利的建筑师兼创始人,她的公司的整个交易是帮助公司以直观美观的方式可视化数据。我所说的漂亮,不仅仅是指饼图上的所有切片都来自同一个颜色家族。
总结一下我对数据人文主义的理解(Giorgia,如果你正在阅读这篇文章,请随意在评论中烤我),这是一个处理数据的框架,旨在让过程和结果变得有趣,让一个完全没有数据背景的人可以理解。

数据人本主义还寻求捕捉典型报告指标领域之外的数据点。例如:当可视化一名年轻患者的自身免疫性疾病医疗保健经历时,除了捕捉血小板计数、皮肤瘀伤的强度以及患者服药的时间,Giorgia 还找到了一种方法来整合家庭拥有积极时刻的天数、家庭成员必须出差工作的天数以及每天的恐惧强度。

完成的作品!查看更多关于瘀伤的信息:我们在这里看不到的数据:http://giorgialupi.com/bruises-the-data-we-dont-see
Giorgia 的工作激发了我为自己的数据创建可视化的尝试,我已经记录了几个星期了(这是一件完全正常的事情)。这是我在每周开始时做的一份非常简单的每日清单,包括锻炼、学习法语、散步、和家人一起出去玩等等。大多数时候,我有 7-9 件想做的事情,如果我们诚实的话,我可能在一个好的日子里完成 5-6 件(在我从未去过网飞的周末,我会完成 0 件)。如果你还没看,那就别看这个了,马上去看。)
这是我过去 3 周生活的一个形象化的描述,还有一些关于每周亮点和不足的注释。

手绘水彩,然后在 Photoshop 中扫描和数字增强,供您欣赏👩🏻💻
每周用一束花代表,每次活动用一朵花代表(健身、家庭、美食等。).某项活动我做得越多,它的花瓣就越多,当我达到一周的目标时,最多能有 5 片花瓣。

我在过去 3 周内跟踪的目标和活动
我有一个愿景,我的花束会随着我的成长而“成长”,花的组成会随着我建立更强的习惯和发现新的兴趣而改变。例如,在我实验的第二周,我有了第一次数字家庭聚会,并决定每周至少有一次家庭聚会。因此,我添加了一朵新的花(紫色鼠尾草),并开始跟踪它前进。

疯狂背后的数学。
我发现的最初趋势之一——尽管现在下定论还为时过早——是我越来越擅长从清单上划掉一些事情。我想追踪的东西也越来越多样化。随着我越来越坚持锻炼、约会之夜、和家人在一起、寻找新的爱好(比如 Photoshop!我可能学过也可能没学过这篇文章怎么用 PS)。
通过艺术可视化我的数据激励我采取比我以前的列表和复选框方法更好的行动。这是因为如果我错过了一天,我就无法找回那片花瓣——即使我一周的其余时间都很完美。相反,当我完成了所有的清单时,我会很兴奋地看到我的花束在周末会是什么样子,会不会比前一周更满。我没有纳入但在未来的迭代中探索会很有趣的事情是跟踪我试图打破的坏习惯(即玩我的头发、睡懒觉、叫外卖)并拿走一片花瓣或添加一个符号来代表我做这些事情中的一件。
这种数据人文主义的实践激励我每天都尝试着带着它,希望有一天我的生活会变成普西塔里的花束(我甚至满足于 Loblaws)。
说真的,你见过他们吗?它们太漂亮了。

在 Pusitari 的 150 美元,这个可爱的安排可能是你的。你可以以后再谢我
不要脸的 plug:如果你对自己的数据可视化感兴趣,或者想了解更多关于这个过程的信息,可以访问我在🥳的新公司
机器学习的数据可视化
理解数据是机器学习中非常重要的课题之一。在现实世界的问题中,我们会得到大量的原始数据,我们需要从这些数据中获取有意义的信息来解决问题。
机器学习有两种问题。回归和分类。考虑一个要求我们预测房子价格的问题。这里我们需要预测一个数值。这个问题就变成了回归问题。有时我们需要做出“是”或“否”的决定。这是一个二元分类问题。有时候我们需要预测一个类。考虑这样一个问题,我们需要预测像猫、狗、马等动物。这是一个多类分类问题。
每当我们为监督学习的问题获得数据时,我们就会获得属性和标签。属性是自变量,我们必须用它来预测标签或因变量。属性被称为输入、预测、特征、独立变量。标签被称为输出、目标、结果、因变量。如果标签是分类的,问题就变成了分类问题,如果是数值的,问题就变成了回归问题。
当你得到任何问题的数据时,都会有很多属性。我们需要从这些属性中选择特征。问题是当我们得到数据时,有许多相关和不相关的属性。我们需要检查这些属性与输出的相关性。我们需要根据与输出数据的相关性来选择特征。我们需要区分可以选择的好的和坏的属性。
机器学习或建立预测模型中最耗时的步骤之一是特征选择或特征工程。

斯科特·布莱克在 Unsplash 上拍摄的照片
研究数据
数据包含属性和标签。在许多理解数据的方法中,下面是两种主要的方法。用描述性统计数据理解数据,用数据可视化理解数据
用描述性统计理解数据
以下是我们分析数据的方法
1.查看原始数据以理解问题
2.了解数据的大小
3.检查是否有任何丢失的数据
4.了解数据的类型
5.总结数据的描述性统计,以便更好地理解。
6.理解具有相关性的属性之间的关系。
了解数据集中属性的数据类型
一般来说,数据有两种类型,定量的和定性的。定量数据仅由数字组成,定性数据由数字以外的数据组成。根据数据的收集、组织、存储和格式化方式,定性数据进一步分为结构化数据和非结构化数据。
结构化数据由数字或单词组成,可以分为名义数据或顺序数据。名义数据也称为分类数据,可以是标签、数字或文本,代表一个类别。例如,男性和女性可表示为 0 或 1 或 M 和 f。序数数据类似于名义数据,但此外,数据元素可基于偏好进行排序或分级。例如,人们的收入可以根据收入分为高、中、低三类。
文本、视频、图像、音频都属于非结构化数据。
定量数据又分为连续数据和离散数据。连续数据可以取某个范围内的任何值,通常用 decimal 或 float 表示。比如 1.23,2.45 等。离散数据取值一般不能再进一步有意义地细分,它代表离散值,并用整数表示。例如,数苹果,10,20,22,34 等等。
定性数据又分为区间数据和比率数据。区间数据没有原点或基数(绝对零度),具有名义数据和序数数据的特征。因此,区间数据允许负值,并且只支持加法和减法运算(因为没有原点或基数)。例如,温度值以摄氏度和华氏度表示,而不是以开尔文表示(开尔文具有绝对零度)。比率数据具有名义数据、序数数据和区间数据的特征,此外,还具有起源或基础。因此,它支持所有四种运算——加、减、乘、除。例如,以开尔文为单位的温度值。
在数据科学领域,还发现数据分为四种基本类型——数值数据、分类数据、时间序列数据和文本。
数字数据代表任何数值,它进一步分为连续数据和离散数据,它们具有与上述相同的含义。
分类数据表示上述名义和顺序数据的特征。
时间序列数据表示在特定或规则的时间间隔内,在某个时间间隔或时间段内收集的数字序列。例如,某几年售出房屋的*均数量。时间序列数据不仅仅是数字(数值数据)的集合,而且是按时间顺序排列的。
文本数据通常只是单词。对于机器学习和深度学习,通常使用不同的方法将单词转换为数字。
数据的描述性度量
描述性测量给出了对数据的统计理解。它们让我们了解数据是如何定位的,以及数据的分布情况。描述性统计分析是从数据中得出结论的非常重要的一步。这是理解数据的第一步。
有两种数据的描述性度量,集中趋势的度量和扩散的度量。
集中趋势的度量
均值、中值和众数是集中趋势的度量。数据围绕某个值聚集的趋势称为集中趋势。
数据样本的*均值是所有数值的总和除以数值的个数。这是最常用和最可靠的集中趋势法。

*均值的计算是基于每个值的,因此它会受到异常值的很大影响。所以,当有极端值时,*均值就不是一个好的集中趋势的量度。
中位数是有序样本的中间点。它也被称为第 50 百分位。中位数比*均值受异常值或偏差数据的影响小得多。
众数是在样本中出现次数最多的值。模式是唯一可以应用于分类变量的中心趋势。
方差或价差的度量
方差是描述数据的第二个重要属性。方差是数据的扩散或分散程度。最流行的传播度量是范围、四分位范围、方差和标准差。
范围就是最大值和最小值之差。最小值是样本的最小值,最大值是样本的最大值。它只依赖于 2 个观察值,因此它有助于表示小数据集的离差。
四分位间距是第三个四分位值和第一个四分位值之间的差值。四分位数将排序数据集分为 4 个部分。分隔各部分的值称为 Q1、Q2、Q3
IQR 是 Q3——Q1
方差是值和*均值之差的*方和除以样本数— 1。

标准差是方差的*方根。这两个是最常用的变异度量。这些统计数据告诉我们这些值是如何围绕*均值波动的。如果*均值周围的数据浓度较高,则标准偏差将较低,反之亦然。
理解属性之间的关系
理解属性之间的关系对于选择在创建模型时要使用的特征是很重要的。可能有许多属性是冗余的或虚假的属性。在训练模型时,需要移除这些属性。使用冗余属性增加了训练时间和计算负荷。此外,属性的数据可能会有偏差。数据可能不符合完美的正态分布。当数据倾斜时,模型的性能将不会提高,即使对超参数进行调整。使用皮尔逊相关系数和检查偏斜数据可以了解数据之间的关系。
皮尔逊相关系数
皮尔逊相关系数是一个统计值,有助于理解一对属性或一个属性与标注或输出之间的关系。

其中 x 和 y 是两个属性,x 条和 y 条是属性的*均值
该系数的值可以在-1 和 1 之间变化。
- 值为 0 表示这两个属性之间没有关系
- 值 1 表示这两个属性之间完全相关
- 值-1 表示这两个属性之间存在负相关
如果皮尔逊系数的值更接* 1,则属性之间的相关性非常密切,在模型中包含这两个属性将会增加训练和计算量。您可以从模型中忽略一个属性或特征,或者应用 PCA(主成分分析)来降低特征的维数。
皮尔逊系数可应用于属性和目标变量之间。如果系数的值接* 0,则特征或属性与输出之间没有关系,我们可以忽略该特征。如果系数值是负值并且接*于 0,那么最好忽略该特征。有熊猫函数来求皮尔逊相关系数。
偏斜数据
通常,属性数据是正态分布的。数据通常位于钟形曲线中。有时会出现数据失真的情况。

注:此图摘自维基百科。
当数据呈正态分布时,*均值、中位数和众数相同,数据均匀分布在*均值的两侧。有时会出现正偏差或数据偏向*均值的左侧,或者出现负偏差,即数据偏向*均值的右侧。
当我们有倾斜的数据时,即使调整超参数,模型的性能也不会提高。这是因为我们偏离了数据正态分布的回归假设。在使用这些数据进行训练之前,需要对这些数据进行处理。处理倾斜数据的一种流行方法是应用对数变换。处理偏斜数据的另一种方法是应用 box cox 变换。
用可视化理解数据
数据可视化是理解数据的最快方式之一。属性的数据可视化可以独立完成,也可以与另一个属性相结合。数据的独立可视化是通过单变量图完成的,而用于检查与其他属性的关系的可视化是多变量图。
单变量图
单变量图用于独立理解每个属性的数据。直方图、密度图、箱线图和须线图是一些单变量图。
直方图
直方图用于获得数据的分布。数据被放入不同的箱或区间,观察的频率被记录在图中。下图给出了一个房价直方图的例子。

直方图给出了关于数据的以下信息。
- 它给出了观察的计数
- 它给出了数据的分布。
- 它表明数据是否正态分布。
- 它指示数据是否有偏差。
- 如果数据中有任何异常值,它也会给出信息。
- 它给出了数据的分布。
密度图
密度图显示了连续时间间隔内的数据分布。与直方图不同的是,没有为间隔分配条柱,因此我们可以看到数据的连续分布。直方图的视觉外观取决于条块宽度的选择。

盒须图
箱线图可以用来显示分布的形状、中心值和可变性。绿色中间线显示数据的中位数,方框的边缘显示数据的第三和第一个四分位数。附在盒子上的线称为触须,末端显示数据的最大值和最小值。箱形图给出了数据的范围和四分位间距。箱线图也显示了异常值。位于胡须上方或下方的点表示异常值

多元曲线图
当一个图中包含多个参数或属性时,它们被称为多元图。多元图用于理解两个或多个属性的相互依赖性。相关矩阵图和散点图是用于理解机器学习中属性相关性的一些图。
相关矩阵图
相关矩阵是显示变量之间相关性的表格。矩阵中的每个单元格显示了两个变量之间的相关性。变量之间的相关性表明变量是如何相互关联的。它显示了一个变量如何随着另一个变量的变化而变化。相关性可以是正的,也可以是负的。如果一个变量和其他变量的变化方向相同,那么这些变量就是正相关的。当一个变量的变化方向与另一个变量的变化方向相反时,这两个变量是负相关的。

这张图给出了变量之间的相关性。这里出售的房子和 borough_flag 负相关。区旗和犯罪数量没有关联。
从相关矩阵图中可以了解到以下情况
理解变量或属性之间的相关性。
如果变量之间有很多相关性,线性回归可能会有不可靠的结果,所以有时我们可以从模型中删除一个变量。
散点图
散点图使用点来表示变量组 x 和 y 的值。它基本上是确定两个变量 x 和 y 之间是否有任何统计关系。

上图显示了变量 A、B、C、D、e 的散点图。变量之间可能存在以下关系。变量之间可能存在正相关、负相关、非线性关系或不相关。在上图中,变量 A 和 b 之间存在正相关。变量 A 和 c 之间存在负相关。变量 A 和 e 之间存在非线性相关。变量 A 和 d 之间不存在相关。
散点图还可以识别数据中是否有异常值。
多类数据的可视化
有时我们需要可视化分类问题的数据,其中有多个类别的数据。很多时候,属性数据的维数非常大,上述技术都无助于降低维数。在这些场景中,PCA、LDA 和 t-SNE 技术用于特征提取和降维。这些技术降低了数据的维度,帮助我们直观地了解不同类别的数据是如何分离的。
主成分分析
这是一种基于数据相关性的无监督线性变换技术,将识别数据中的模式。它是一种基于投影的方法,在高维数据中寻找最大方差的方向,并通过将数据投影到具有相等或更少维的新子空间中的一组正交轴上来变换数据。具有新轴的 PCA 的可视化将显示投影,该投影扩展数据并以某种方式形成聚类。以下是应用 PCA 后的数据聚类。

这种可视化帮助我们识别不同类的数据之间的分离。如果数据没有分离,主成分的数量需要增加,以检查我们是否得到了分离。这些主要成分现在可以用于构建我们的模型。
线性判别分析
它类似于 PCA,其中它找到使数据的方差最大化的分量轴,但是此外它尽可能多地保留类别区分信息。因此,LDA 的目标是再次将原始数据投影到具有相等或更少维度的新子空间中的一组轴上,但是此外,新的轴将使得它们最大化多个类别之间的分离。以下是在将 LDA 应用于上面应用了 PCA 的相同数据集之后的数据聚类。可以看出,当使用 LDA 时,类别分离更加明显。
双组分 LDA

t-分布随机邻居嵌入(t-SNE)
这是一种用于数据可视化的无监督非线性技术。t-SNE 的主要优点是它保留了数据中的局部和全局结构。这意味着原始数据中距离较*的点在低维中会保持距离较*。t-SNE 方法确定高维空间和低维空间中的两对点之间的相似性度量,然后使用成本函数试图优化这两个相似性度量。以下是对数据应用 t-SNE 后形成的聚类。

数据可视化有助于理解机器学习模型的数据和特征选择。
作者
斯里尼瓦斯·查克拉瓦蒂·:srinivas.yeeda@gmail.com
钱德拉塞卡银行:chandru4ni@gmail.com
数据可视化:北美自由贸易区国家在疫情的表现
在家的时间和疫情期间的总病例数

介绍
北美自由贸易协定是由美国、加拿大和墨西哥组成的经济集团。该组织成立于 1994 年 1 月 1 日,旨在加强这些国家之间的贸易关系。其目标之一是与欧洲和中国市场展开正面竞争,这两个市场*年来发展迅猛。
北美自由贸易区本质上是经济区,与其他经济区相比,没有机构或政府来管理该区。由于欧盟以其社会和经济差异而闻名,分析其社会孤立图和疫情期间 Covid19 的总病例以更好地了解每个国家及其在这种新情况下的差异是很有趣的。
数据库ˌ资料库
所有的数据都来自谷歌移动报告网站,在那里你可以看到社区移动报告,这些报告是关于面对新冠肺炎的政策所带来的变化。这些图表显示了不同地区和不同类别的流离失所趋势。最后,病例总数的数据被从网站我们的世界的数据中删除。
预处理和清洗
程序的重要库
import pandas as pd
import matplotlib.pyplot as plt
读取数据
link='https://www.gstatic.com/covid19/mobility/Global_Mobility_Report.csv'data = pd.read_csv(link)
data.head()

列太多了
分隔主列
data_country = data.iloc[:,[1,7,8,9,10,11,12,13]].copy()data_country.columns = ['country','date', 'retail', 'grocery', 'parks', 'transit', 'workplaces', 'residential']data_country.date = pd.to_datetime(data_country.date)data_country.index = data_country.datedata_country.drop(labels = 'date', axis=1, inplace=True)data_country.head()

所有国家
使用“groupby”方法,对“住宅”列的经济集团国家进行分组。
data_country.groupby(by[data_country.index,"country"])
.mean().unstack()["residential"][['United States','Canada','Mexico']]

仅限北美自由贸易区国家
数据可视化
fig, ax = plt.subplots(nrows=1,ncols=3,figsize=(20,4))item = "residential" #grocery, parks, transit, workplaces, retailcountrys = ['United States','Canada','Mexico']for i,country in enumerate(countrys):data_country.groupby(by=[data_country.index,"country"]).mean().unstack()[item].rolling(window=7).mean().plot(legend=False,color="grey",linewidth=1, alpha=0.4, ax=ax[i])data_country.groupby(by=[data_country.index,"country"]).mean().unstack()[item][country].rolling(window=7).mean().plot(legend=False,color="blue",linewidth=7, alpha=0.6, ax=ax[i])ax[i].set_title(country,fontsize=12,ha='right')ax[i].xaxis.grid(False)ax[i].set_xlabel("")ax[i].set_xticklabels(["","Mar","Apr","May","Jun","Jul","Aug","Sep"])ax[i].xaxis.set_tick_params(labelsize=12)ax[i].yaxis.set_tick_params(labelsize=12)if (i==0) or (i==2):ax[i].yaxis.tick_right()else:ax[i].set_yticklabels([])#plt.savefig("nafta.png",dpi=300)plt.show()

整个疫情的社会隔离图
在这个图表中,我们用蓝色和灰色突出显示了国家的值,我们有世界上其他国家的值。

每个国家相对于世界的病例总数图表
在第二张图中,我们可以看到,尽管美国有一个指数,并且倾向于拥有与加拿大相似的病例数,但 Covid 的病例数比加拿大和墨西哥多许多倍,这向我们揭示了与加拿大相比,该病毒尚未得到控制,加拿大有类似的隔离图。
结论
值得注意的是,这两个图表是不同的,例如,加拿大像墨西哥一样有很高的社会隔离水*,今天它已经有一个低得多的数字,这可能意味着政府和疾病人口有更大的控制。所以,即使美国和加拿大有相似的社会隔离图表,案例数量的图表显示了美国非常大的差异,在集团的所有国家都有非常高价值的参与。
为了更好地理解这里观察到的代码和数据,可以链接到 GitHub 上的知识库,以及更深入的北美自由贸易协定内容。
数据可视化:如何选择正确的图表[第 1 部分]
为您希望受众完成的任务选择正确的图形或图表样式

摩根·豪斯尔在 Unsplash 上的照片
根据世界经济论坛的数据,世界每天产生 2.5 万亿字节的数据。面对如此多的数据,管理和理解它们变得越来越困难。任何人都不可能一行一行地查阅数据,看到不同的模式并进行观察。
数据可视化是数据科学过程之一;也就是说,一个处理数据科学任务的框架。在数据被收集、处理和建模之后,需要为结论可视化关系。
我们使用数据可视化作为一种技术,通过可视化表示来传达数据的洞察力。我们的主要目标是将大型数据集提取到可视化图形中,以便直观地理解数据中的复杂关系。
所以现在,我们知道数据可视化可以提供传统描述性统计无法提供的洞察力。我们的大问题是如何为数据选择正确的图表?
本说明将为我们提供不同图表类型的概述。对于每种类型的图表,我们将介绍一个简短的描述。然后我们讨论什么时候使用它,什么时候应该避免使用它。接下来,我们将查看一些用于实现的 Python 代码。我只提出首要原则;完整版本将在本文末尾提供。
我希望这篇笔记足够有趣,可以弥补这个不足。让我们开始吧。
你想让你讲什么故事?
在制作图表之前,理解我们为什么需要图表是很重要的。图表、绘图、地图和图解帮助人们理解复杂的数据、发现模式、识别趋势和讲述故事。思考我们想与观众分享的信息。在这里,我根据图表的数据可视化功能对其进行分组,也就是说,我们希望我们的图表与我们的受众进行交流。虽然每个图表在特定功能中的分配并不是一个完美的系统,但它仍然可以作为一个有用的指南,用于根据我们的分析或交流需求选择图表。
本说明的第一部分将向我们介绍不同的图表,以显示变量之间的联系、随时间变化的趋势以及变量在类别中的相对顺序
关系
1.使用 Matplotlib
2 的散点图。边缘直方图
3。使用 Seaborn
4 的散点图。在 Seaborn
5 的结对情节。热图
数据随时间变化
6.线图
7。面积图
8。叠加面积图
9。未堆叠的面积图
等级
10.垂直条形图
11。横道图
12。多组条形图
13。堆栈条形图
14。棒棒糖图表
本笔记第二部分将向我们介绍用于比较变量及其分布的不同图表类型。
分配
15.直方图
16。带直方图的密度曲线
17。密度图
18。箱线图
19。带状图
20。小提琴剧情
21。人口金字塔
比较
22.气泡图
23。项目符号图
24。饼状图
25。网饼状图
26。圆环图
27。树形图
28。分叉杆
29。Choropleth 地图
30。气泡图
关系
我们使用关系方法来显示两个或多个变量之间的联系或相关性。
当评估数据集之间的关系时,我们试图理解两个或多个数据集是如何组合和相互作用的。
这种关系被称为相关性,它可以是正的,也可以是负的,这意味着所考虑的变量可能相互支持,也可能相互矛盾。
1.使用 Matplotlib 绘制散点图

图片由作者
散点图是一种常用于统计和数据科学的图表。它由跨两个轴绘制的多个数据点组成。散点图中描绘的每个变量都有不同的观察值。每当我们看到两个数据集之间的任何关系时,它都是一种有利的图表类型。
我们使用散点图来确定数据与每个变量的关系(即相关性或趋势模式。)它还有助于检测图中的异常值。
在机器学习中,散点图常用于回归,其中 x 和 y 是连续变量。它们也用于聚类分散点或离群点检测。
如果我们对观察时间模式感兴趣,散点图是不合适的。
散点图用于数字数据或数字。因此,如果我们有三个部门、五种产品等类别。散点图不会揭示太多。
Python 实现
我们使用虹膜数据集进行可视化。
plt.scatter(iris_df['sepal length (cm)'], iris_df['sepal width (cm)'])
plt.title('Scatterplot of Distribution of Sepal Length and Sepal Width', fontsize=15)
plt.xlabel('sepal length (cm)')
plt.ylabel('sepal width (cm)')

图片由作者
2.边缘直方图
边缘直方图是添加到散点图的每个轴的边缘的直方图,用于分析每个测量的分布。
我们使用边际直方图来评估两个变量之间的关系,并检查它们的分布。将边缘直方图放在散点图中,或者在突出显示的表格上添加边缘条,可以使可视化具有交互性、信息量大且令人印象深刻。
Python 实现
# A seaborn jointplot shows bivariate scatterplots and univariate histograms in the same figure
p = sns.jointplot(iris_df['sepal length (cm)'], iris_df['sepal width (cm)'], height=10)

图片由作者
3.使用 Seaborn 的散点图
我们的目标是创造一个传奇来理解不同群体之间的差异。我们将使用 seaborn 的 FacetGrid 按物种给散点图着色。
sns.FacetGrid(iris_df, hue=’species’, size=10) \
.map(plt.scatter, ‘sepal length (cm)’, ‘sepal width (cm)’) \
.add_legend()
plt.title(‘Scatterplot with Seaborn’, fontsize=15)

图片由作者
4.Seaborn 的配对图
另一个有用的 seaborn 图是pairplot,它显示了每对特征之间的二元关系。从配对图中,我们将看到鸢尾物种在所有特征组合中都与其他两个物种分开。
sns.pairplot(iris_df.drop(“target”, axis=1), hue=”species”, height=3)

图片由作者
5.热图
热图是数据的图形表示,使用颜色编码系统来表示不同的值。热图通过在行和列中放置变量并对表中的单元格进行着色,对于交叉检查多变量数据非常有用。

图片作者作者
所有的行是一个类别(标签显示在左侧),所有的列是另一个类别(标签显示在底部)。单独的行和列被分成子类别,这些子类别在矩阵中相互匹配。表格中的单元格包含颜色编码的分类数据或基于色标的数值数据。单元格中的数据展示了连接行和列中两个变量之间的关系。
热图对于显示多个变量之间的差异、揭示任何模式、显示任何变量是否相似以及检测它们之间的任何相关性非常有用。
当我们想要查看分类值的哪些交叉点比其他交叉点具有更高的数据集中度时,热图会非常有用。
热图更适合显示数字数据的更一般化视图。很难准确区分颜色深浅的差异,也很难提取特定的数据点(除非我们包括细胞的原始数据)。
如果其中一行或一列设置为时间间隔,热图还可以显示数据随时间的变化。例如,使用热图来比较城市全年的温度变化,以查看最热或最冷的地方。因此,行包含每个月,列表示小时,单元格包含温度值。

Python 实现
我们使用来自 Kaggle 的世界幸福报告数据集。我清理了数据,将所有文件合并到happiness_rank.csv文件中。你可以下载并清理数据或者在这里下载最终结果。我推荐你在 Github 上查看我的数据清理代码。
sns.heatmap(happy[usecols].corr(),linewidths=0.25,
vmax=0.7,square=True,cmap="Blues",
linecolor='w',annot=True,annot_kws={"size":8},
mask=mask, cbar_kws={"shrink": .9})

图片作者作者
数据随时间变化
有时,仅仅知道变量之间存在关系是不够的;在某些情况下,如果我们也能想象这段关系发生的时间,更好的分析是可能的。因为关系是用变量之间的链接来表示的,所以日期/时间显示为链接属性。这种可视化方法显示一段时间内的数据,以发现一段时间内的趋势或变化。
6.折线图
折线图用于显示连续时间间隔或期间的量化值。
绘制折线图时,首先在笛卡尔坐标网格上绘制数据点,然后将它们连接起来。通常,y 轴有一个数量值,而 x 轴是一个时间刻度或一系列间隔。图表上线条的方向是对数据的一个很好的比喻:向上的斜率表示值在增加,向下的斜率表示值在减少。线条在图表中的移动可以创建揭示数据集中趋势的模式。
折线图最常用于显示趋势和分析数据随时间的变化。
折线图最适合连续数据,因为它连接了许多属于同一类别的变量。

来源:Python 图表库
当与其他线条或其他数据系列组合在一起时,可以对单独的线条进行比较。然而,我们应该避免在每张图中使用超过四行的线条,因为这会使图表更加混乱和难以阅读。解决这个问题的方法是将我们的图表分成多个支线剧情。
Python 实现
假设我们有一个包含中等成员信息的数据集。我们想看看 2019 年读过的文章的趋势。
plt.plot(data['Month'], data['All Views'], color='#4870a0', marker='o')

图片作者作者
7.对比图
面积图的概念基于折线图。彩色区域向我们展示了一个变量随时间的发展。

来源: Matplotlib 备忘单
面积图非常适合清楚地说明两个或更多数据点之间的变化幅度。例如,幸福分数有六个生成分区;我们希望看到每个分部的贡献。

来源: Matplotlib 备忘单
此外,如果我们感兴趣的是每个分部产生的部分,而不是分部本身的总量,我们可以使用 100%堆积面积图。这将显示一段时间内每个部门的百分比贡献。
如果我们想要呈现波动的值,如股票市场或价格变化,面积图不是最佳选择。
Python 实现
在这里,我们希望展示一段时间内外部视图的累计数量。
plt.stackplot(data['Month'], data['External Views'], colors='#7289da', alpha=0.8)

图片由作者
7.堆叠面积图
堆叠面积图的概念是基于简单的面积图。它在同一个图形上显示几个组的值。每组的值显示在彼此的顶部。整个图表代表所有数据随时间变化的总和。
堆积面积图类型是一种功能强大的图表,因为它允许对数据进行分组并查看选定日期范围内的趋势。
堆积面积图使用面积来表示整数,因此它们不适用于负值。
堆积面积图丰富多彩且有趣,但我们应该谨慎使用,因为它们很快就会变得一团糟。我们不应将超过五个类别放在一起。
Python 实现
plt.stackplot(data['Month'], data['Internal Views'], data['External Views'],
alpha=0.75,
colors=['#7289da','#f29fa9'],
labels=['Internal Views', 'External Views'])

图片作者作者
9.未堆叠的面积图
与堆叠面积图不同,未堆叠面积图在同一图形上显示几个组的重叠。
x = data['Internal Views']
y = data['External Views']# plot the data
ax.plot(x, color='#49a7c3', alpha=0.3, label='Internal Views')
ax.plot(y, color='#f04747', alpha=0.3, label='External Views')# fill the areas between the plots and the x axis
# this can create overlapping areas between lines
ax.fill_between(x.index, 0, x, color='blue', alpha=0.2)
ax.fill_between(x.index, 0, y, color='red', alpha=0.2)

图片作者作者
等级
可视化方法显示数据值的相对顺序。
条形图
条形图是最常用的图表类型之一。顾名思义,条形图是由一系列显示变量发展的条形组成的。
条形图有四种类型:水*条形图、垂直条形图、组条形图和堆积条形图。
当我们想要跟踪一个或两个变量随时间的发展时,条形图非常有用。图表的一个轴显示正在比较的特定类别,另一个轴代表测量值。
当我们有一个变量的单周期分解时,简单的条形图是不合适的。例如,如果我想描绘对公司收入有贡献的主要业务线,我不会使用条形图。相反,我会创建一个饼图或其变体。
10.垂直条形图
垂直条形图(柱形图)不同于直方图,因为它们不显示一段时间内的连续发展。垂直条形图的离散数据是分类的,因此回答了“有多少?”在每个类别中。
垂直条形图通常用于比较特定数值范围内的几个项目。因此,它非常适合于比较单个子项目之间的单个数据类别,例如,地区之间的相应收入。

图片由作者
Python 实现
我们使用 mpg_ggplot2 数据帧。它是变量(在列中)和观察值(在行中)的矩形集合。mpg包含美国环境保护署对 38 种受欢迎车型的观察结果。
Python 实现
在这里,我们要对比一下车模。
plt.bar(value_count.index, value_count.values, color='#49a7c3')

图片作者作者
11.水*条形图
水*条形图水*表示数据。数据类别显示在 y 轴上,数据值显示在 x 轴上。每个条形的长度等于对应于数据类别的值,所有条形都从左到右穿过。
Python Implementation
plt.barh(value_count.index, value_count.values, color='#b28eb2')

图片作者作者
13.多组条形图
也称为分组条形图或簇状条形图。
当两个或多个数据系列并排绘制并按类别分组时,使用这种变化的条形图,所有数据系列都在同一坐标轴上。
我们使用多组条形图将分组变量或类别与具有相同变量或类别类型的其他组进行比较。
组条形图的缺点是,一个组中的条形图越多,阅读起来就越困难。
Python 实现
ax = views.plot.bar(rot=0,color='#E6E9ED',width=1, figsize=(14,8))
ax = df.plot.bar(rot=0, ax=ax, color=['#7289da', '#dd546e', '#99aab5', '#f3c366'],
width=0.8, figsize=(14,8))

图片由作者
13.堆叠条形图
与并排显示条形的多集条形图不同,堆积条形图将条形分段。堆积条形图用于显示如何将一个较大的类别划分为较小的类别,以及每个部分与总额之间的关系。
堆积条形图将该段的每个值放在前一个值之后。条形的总值是所有段值的总和。这是比较每组/分段条形图总额的理想方法。
堆积条形图的一个主要缺陷是,每个条形图的分段越多,阅读起来就越困难。此外,将每个组件相互比较也很困难,因为它们不在一个共同的基线上。
Python 实现
rect1 = plt.bar(data['Month'] ,data['Internal Views'],
width=0.5, color='lightblue')
rect2 = plt.bar(data['Month'], data['External Views'],
width=0.5, color='#1f77b4')

图片作者作者
14.棒棒糖图表
棒棒糖图以一种视觉愉悦的方式提供了与有序条形图相似的用途。我们使用棒棒糖图来显示一个数值变量和另一个数值变量或分类变量之间的关系。
如果我们处理大量的值,并且当值都很高时,例如在 80–90%范围内(100%之外),棒棒糖图通常被认为比标准条形图有用。那么一系列高大的柱子会在视觉上具有侵略性。
如果我们的数据中有长度非常相似的未分类棒棒糖,那么比较两个非常相似的棒棒糖的大小就比比较标准棒棒糖更困难。
Python 实现
(markerline, stemlines, baseline) = plt.stem(value_count.index, value_count.values)

图片由作者
第一部分到此为止。该代码可在 Github 上获得。我们将在第二部分继续讨论分布和比较。
到目前为止,我们知道数据可视化是一种快速、简单的普遍表达概念的方式——我们可以通过稍作调整来试验不同的场景。
有几十种用于数据可视化和数据分析的工具——从简单的需要零编码( Tableau )到复杂的需要编码( JaveScript )。不是每个工具都适合每个想学习可视化技术的人,也不是每个工具都可以扩展到行业或企业目的。
我最喜欢的教授告诉我,“好的数据可视化理论和技能会超越具体的工具和产品。”当我们学习这项技能时,关注最佳实践,并探索我们在可视化和仪表板方面的风格。数据可视化不会很快消失,所以无论您最终使用什么工具或软件,都必须建立一个可以随身携带的分析、讲故事和探索的基础。
如果你想更深入地研究这个特定的主题,这里有一些很好的起点。
bubble.io 中的数据可视化
如何在不编码的情况下生成用户友好的数据可视化?

卢克·切瑟在 Unsplash 上的照片
Bubble.io 对于初创公司和中型公司来说,这是一个非常好的*台,可以以非常低的成本,有时甚至是零成本来开发他们的网站。
它使非技术人员(是的,像我一样)和那些时间紧迫的团队能够从一开始就不用自学 Python Flask 来构建网站。相反,它允许用户将元素拖放到画布上,并定义工作流来控制逻辑。【1】
据说,Bubble 的愿景是让手工编码在很大程度上过时。【2】
在我最*的实习期间,我有机会用 bubble.io 从零开始开发一个公司网站,只花了 120 美元购买了 2 个插件。很神奇,对吧?
今天,我想带你浏览网站的一个重要部分:数据可视化,以及如何做。
首先,bubble 的 marketplace 中有相当多的数据可视化插件。但经过仔细选择,我选择了 ApexCharts.js,因为它的不同图表和图形范围相对较广,如面积图(堆栈图)、条形图、圆环图、饼图、散点图、热图等。您可以点击此页面查看更多详情:https://pluginpreview.bubbleapps.io/chart
要将这个插件与页面集成,有几个步骤:
- 通过 SQL 数据库连接器(bubble 内置免费插件,万岁!)
- 添加新的查询以生成相应的系列类别(列)和数据(行)
- 选择可视化类型,在页面上添加新的视觉元素,并填充“外观”部分的空白
- 享受你美丽的想象🎉
接下来,我将一步一步地向您介绍,并使用一些简单的示例。
步骤 1:连接您的数据库
单击工具栏部分的“插件”并选择“SQL 数据库连接器”

插件页面
如果你在“已安装插件”列表中看不到它,你需要从插件市场下载,不需要额外付费。
接下来,选择数据库类型,并按照指示输入连接字符串:

与您的数据库连接
建议使用 AWS RDS 服务,根据您的存储情况,免费层在相当长一段时间内可能就足够了。(另一种节省一些的方法💲!)
步骤 2:添加新的查询以相应地生成系列类别(列)和数据(行)
在此之前,我需要演示我的三个演示表。

关系模式
如您所见,这只是为了演示,您实际的关系表应该比这复杂得多。
我的第一个查询是根据年/月为不同的部门选择 Sales_Amount。我在这里将“年/月”格式化为文本(varchar ),这是为了演示,也是因为 bubble.io 只启用“日期”格式,如“2020–01–01 ”,而不是我在这里想要的格式。

简单的 SQL 查询
⚠️There're 在这里要注意几件事:
- 问号“?”对应于您稍后要在界面上输入的参数值,请确保正确设置类型;
- 总是以‘LIMIT 200’结束你的查询,这是 bubble.io 内置的设置,以防查询返回太多值;
通过单击“更新查询类型”按钮,您将看到此界面,并确保将数据类型设置为您想要的⬇️

接下来,我将展示一个简单的折线图:
当“出发编号”等于 1 时,部门名称=“家庭”
步骤 3:选择可视化类型,在页面上添加新的可视化元素,并填充外观部分的空白
为了获得定制的输出,在填充“外观”部分的空白时,您需要选择“从外部 API 获取数据”,然后从 SQL 连接查询列表中进行选择。

现在这是魔术棒部分,通过设置你的返回值(列和行):

请记住,通常系列类别需要是“文本”条目,而系列数据是“数字”。您也可以通过输入数字来选择小数金额。
瞧啊。现在你得到了这个漂亮的交互折线图。

当'部门编号' = 1 时,销售金额的简单折线图
在这篇文章变得太长之前,我只想演示一些其他的可视化的可能性,比如多条形图和堆栈图。

条形图与堆栈图
至于第二个查询,我选择显示所有订单中部门的比例。

我建议用圆环图或饼图来展示这些数据。

甜甜圈 vs 馅饼
在这个插件中你仍然可以做很多事情,比如改变颜色、大小、字体等等。我认为这个插件是一个不错的选择,可以在 bubble.io 基础设施下实现数据可视化,而不是花一大笔钱从 Tableau 或 PowerBI 购买许可证。(但是如果你预算充足💰,那就另当别论了……)
无论如何,我会回来分享更多关于如何最大限度地利用 bubble.io 的内容。😝
谢谢大家!
数据科学中的数据可视化
解决分析问题时如何有效地使用图表

数据可视化简介
数据可视化是创建交互式视觉效果以了解趋势、变化并从数据中获得有意义的见解的过程。数据可视化主要用于数据检查和清理、探索和发现,以及向业务涉众传达结果。大多数数据科学家很少关注图表,只关注数字计算,这有时会产生误导。为了理解可视化的重要性,让我们看看下面图 1 和图 2 中 Anscombe 的数据四重奏。

图一。Anscombe 的数据四重奏显示了一对 X 和 Y 可以具有不同的值,但却具有不同的中心趋势和相关值。数据来源——弗朗西斯·j·安斯科姆(1973 年)
当使用下图 2 中的可视化表示时,相同的数据点描绘了完全不同的趋势。

图二。展示了使用简单汇总统计数据检查时,四个相同的数据集看起来相似,但绘制成图表时差异很大。图像鸣谢——弗朗西斯·j·安斯科姆(1973)
在进行任何计算之前,将数据可视化是很重要的。与描述性统计相比,可视化表示可以传达更多的信息。
数据可视化的作用
多种商业智能工具(BI)目前统治着市场,各有利弊。自助式仪表盘的概念旨在让对数据科学知之甚少或一无所知的利益相关者独立处理数据,并得出一些可能有助于其日常业务决策的发现。在下面的例子中,我们将看看使用 Tableau 或 Python 的数据可视化的一些应用。
数据检查和清理
数据可视化可用于查找数据集中的明显错误,包括空值、随机值、不同记录、日期格式、空间数据的敏感性以及字符串和字符编码。

图 3。展示了位于中央商务区及其周围的不同传感器捕捉到的墨尔本行人流量的分布。其思想是分析纬度和经度信息对于给定的数据集是否有效。该图像是作者使用 Tableau 开发的。
数据分布
数据可视化可用于了解数据的分布,寻找集中趋势(*均值、中值和众数),使用箱线图了解异常值的存在,检查偏斜度,以及了解 winsorization 对数据分布的影响。下面的图 4 说明了如何开发箱线图来了解异常值的存在。

图 4。显示安装在墨尔本不同地区的不同传感器的异常值(行人流量中的异常值)。用于此分析的数据集可在此处找到。该图像是作者使用 Jupyter 笔记本开发的。
模型假设
线性回归和其他分类模型遵循某些基本假设,如数据必须呈正态分布、不同自变量之间不应存在相关性、误差项的同方差性等等。因此,可视化也是验证这些假设的关键。

图 5。使用热图说明数字变量的相关图。关联图用于删除高度相关的变量,同时构建分类模型,以使用航班和设施数据预测客户满意度。该图像是作者使用 Jupyter 笔记本开发的。
人在回路分析
数据科学家通常使用人在循环分析来获得数据的外观和感觉,做出假设,运行适当的分析来验证假设,并重复该过程,直到确定确凿的证据。例如,在 Python 中,一个非常流行的包 Seaborn 有一个叫做 pair plot 的函数。配对图在确定因变量和自变量之间的关系时非常有用。可视化的想法是更好地理解一些独立变量是否影响模型结果的方向感。

图 6。说明了因变量(比如航空公司乘客的客户满意度)与独立变量(如飞行距离、到达延迟和出发延迟)的配对图表示。该图像是作者使用 Jupyter 笔记本开发的。
降维
在处理多个变量时,很难在 n 维空间中可视化数据。例如,在具有不同客户属性(比如数字)的数据集中,很难考虑所有属性来绘制客户。在这种情况下,主成分分析(PCA)或因子分析等降维技术有助于将属性降维。主成分分析找出能最好地解释观察结果的变量的线性组合,而因子分析找出能最好地解释变量之间关系的变量的线性组合。然后,可以绘制降低的维度,以便在 2D 空间中分析客户。
关于如何用 Python 重新创建这些图表的更多信息可以在这里找到。
使用 matplotlib、pyplot 和…的 python 可视化最佳实践和概念的完整实践指南
towardsdatascience.com](/data-visualization-say-it-with-charts-in-python-138c77973a56)
分析问题中的数据集类型
了解数据集的类型对于确定可以应用的可视化类型非常重要。例如,当处理表格数据时,与空间数据相比,条形图和折线图的组合可能会很有用,在空间数据中,带有密度图的地图可能会有效地传达结果。在我们深入了解可视化的类型之前,让我们先了解一些常用的关键数据类型。
表列数据
以表格形式组织的数据,每个数据项占一行,每个属性占一列。例如,Excel 格式的数据集、CSV 文件、Pandas 数据框等。
网络数据
网络中的节点是数据项,节点之间的链接是关系。例如社交网络。
空间数据:
根据其空间位置或范围自然组织和理解的数据。例如位置的纬度和经度、地理信息、郊区、街道等。
文本数据:
这种数据集由单词和标点符号序列组成。例如 twitter feed 或客户投诉。
视觉词汇
下图展示了如何使用不同的可视化来描述数据中的不同场景。

图 7。展示了一些有助于可视化趋势与参考点偏差的图表。图片致谢— Github.io

图 8。展示了一些有助于可视化多个数据点之间相关性的图表。图片致谢— Github.io

图 9。说明如何使用可视化来理解与时间相关的属性变化。图片致谢— Github.io

图 10。说明如何使用不同的可视化来理解不同组件的等级或顺序。图片致谢— Github.io
你可以在这里找到其他可视化的例子。
跨数据类型的可视化效果
下表显示了不同数据类型的不同视觉效果。为了更好地理解这个表,我们需要更好地理解变量(来自数据的属性)是如何被分类到不同的数据类型中的。分类变量是没有任何顺序的变量,如性别、等级、婚姻状况、工作职位等。数值变量被分割成序数变量和数量变量。序数变量是可以排序的类别。例如满意度(好、差和一般)、潜力(高、中和低)等。数量变量是可以取-无穷大到+无穷大之间任何数值范围的变量。例如年龄、工资、收入、销售额等。

图 11。说明了在考虑变量的数据类型的情况下,如何使用不同的图形来可视化数据中的模式。图片致谢——由作者使用 PowerPoint 制作。

图 12。阐释了可用于不同数据类型的可视化类型。图片来源——由作者使用 Excel 开发。
结论
数据可视化是所有分析项目的基础。它不仅有助于深入了解数据,还可以用作数据预处理的工具。对于不同的数据类型和业务场景,拥有正确的可视化集合是有效交流结果的关键。
参考
- Github(未标明)。视觉词汇。[在线] ft-interactive.github.io .可在:https://ft-interactive.github.io/visual-vocabulary/【2020 年 8 月 23 日访问】。
- Anscombe,弗朗西斯 J. (1973)统计分析中的图表。美国统计学家,27 岁,17-21 岁。
关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;可以和我在 上联系 和 上推特;
熊猫中的数据可视化
仅使用熊猫进行快速数据可视化

介绍
在本文中,我将演示如何只用熊猫来可视化数据。它不像 Matplotlib 或 Seaborn 那样灵活,但对于快速数据探索来说非常方便。
首先,让我们以导入 pandas 和加载 Iris 数据集为例。
import pandas as pdimport seaborn
df=seaborn.load_dataset('iris')
检查数据帧

它包含 4 个数字列和一个分类列。
线形图
让我们从简单的线条图开始。

它用不同的颜色绘制数字列。这里的 x 轴是索引。您也可以自定义绘图,例如,如果您只想查看 sepal_length 和 sepal_width,您可以这样做:

您也可以更改轴。例如,绘制 sepal_length 与 petal_length 的关系(这里使用线图没有意义)

散点图
显示萼片长度和花瓣长度之间关系的合适的图应该是散点图。

您可以通过替换 x 和 y 来绘制不同的列。
检查所有数字列相关性的一个技巧是绘制散点图矩阵。您可以通过以下方式做到这一点:

它显示了不同列相对于其他列的散点图矩阵和列的直方图。
直方图
直方图是查看数据分布的有用图表,在 Pandas 中,您可以使用hist()快速绘制它

它显示了数值变量的直方图。您也可以绘制所需的列。

箱形图
观察数据分布的另一个有用的图是箱线图。你可以使用df.plot.box()简单地绘制它

条形图
你可能还想比较不同的物种,你可以通过组合熊猫groupby()和plot.bar()来做到这一点

它显示了各列相对于物种的mean值。
圆形分格统计图表
也可以绘制条形图。简单的叫plot.pie()。

请注意,熊猫中的plot()函数是建立在 matplotlib 之上的,所以你可以随时使用 Matplotlib 来修改剧情。
例如,您可以更改图例的位置并隐藏 ylabel。

就是这样。Pandas 中的这些绘图技术可能不像 matplotlib 或 seaborn 那样灵活和易于生成报告,但它们在早期数据探索中仍然非常方便。
感谢阅读。
你可以看看我其他关于熊猫,Numpy,Python 的文章。
[## 让我的数据分析过程更高效的 10 个熊猫窍门:第二部分
我希望我早点知道的技巧
towardsdatascience.com](/10-pandas-tricks-to-make-my-data-analyzing-process-more-efficient-part-2-b72ea43a0bb5) [## 让我的数据分析过程更高效的 10 个熊猫窍门:第 1 部分
我希望我早点知道的技巧
towardsdatascience.com](/10-pandas-tricks-to-make-my-data-analyzing-process-more-efficient-part-1-78a0cc1636f3) [## 让我的代码更好更聪明的 7 个小技巧
我希望我早点知道的技巧
towardsdatascience.com](/7-numpy-tricks-to-make-my-code-better-and-smarter-9e8a4ccf43d1) [## 让我的代码更好更聪明的 7 个 Python 技巧。
我希望我能早点知道的技巧。
towardsdatascience.com](/7-python-tricks-to-make-my-code-better-and-smarter-60dfde0b6c49)
数据可视化,让他们惊叹
设计强大可视化的两个概念

格雷格·拉科齐的照片
W 是什么让你对数据可视化如此着迷?我喜欢从数据中创造视觉效果的主要原因是,它能让我们看到研究主题的不同视角。在这篇文章中,我将分享两个概念,通过我们设计的可视化来提高我们的洞察力。
- DataViz 是“第二只”眼睛
- 知识之岛
1 — DataViz,一只“第二”眼睛
我们的大脑有能力用我们的眼睛来看 3D。这叫立体视觉。基本上,每只眼睛给我们一个 2D 视觉,因为它们在我们脸上是分开的,所以每只视网膜产生的图像略有不同。这种差异是深度的结果,深度提供了第三维度。换句话说,有第二只眼睛会带来不同的视角,当两个视角放在一起时,我们可以看到 3D。
数据可视化就像第二只眼睛,它可以给我们不同的视角,从而产生新的理解和知识。艺术家迈克尔·墨菲称之为感知转变,“当一个人对特定刺激的解释突然改变时发生的瞬间”。下面的视频展示了迈克尔·墨菲艺术的感知转变的一个例子。
佛罗伦萨·南丁格尔(1820–1910)是数据可视化设计师改变视角的完美例子,她改变了我们处理医疗保健和拯救生命的方式。她是一名护士和统计学家。她收集数据并创造可视化效果,以更好地理解战争和医院中的死亡率等主题。她用下面的图表证明了卫生条件的改善是如何降低医院死亡率和预防疾病的。点击了解更多关于佛罗伦萨·南丁格尔和她的遗产。

显示医院死亡率的图表。信用:惠康收款
2 —知识之岛
“知识之岛”的概念很简单,拉尔夫·w·索克曼称之为“知识之岛越大,奇迹的海岸线就越长”。我们对一个主题的理解就像一个岛屿的大小,它的海岸线代表了我们可以思考、思考和质疑它的程度。
马塞洛·格莱塞写了一本名为《知识之岛》的书。科学的局限和对意义的探索”,他给出了这样的定义:
“我们拥有的知识决定了我们能够拥有的知识。随着知识的转移,我们会提出我们无法预料的新问题”。
数据可视化是增加我们知识孤岛的一种强有力的方式。它可以给我们不同的视角,增加我们岛屿的面积,从而扩大奇妙的海岸线。它将使我们能够思考以前无法思考的问题。Alberto Cairo 在他的书《真实的艺术》中以一种非常有见地的方式使用知识岛来教授数据可视化。推荐阅读。
2019 年初,我致力于一个代表这个概念的可视化。我正在研究巴西石油公司(PBR,一家巴西公司)的股票,以决定现在是否是买入的好时机。我盯着下面的图表:

巴西石油公司股票
我的目光直奔 2013–2016 年期间。我想知道那里发生了什么使那些股票如此急剧地下跌。然后我意识到,在那些年里,巴西正在进行一项大规模行动,调查政府和巴西国家石油公司之间的腐败。我对此做了更多的研究,将政府和反腐行动中的一些重要事件放在一起,寻找与 PBR 股市的任何关联。下图是我研究的结果(点击此处查看完整页面):

自从迪尔玛·罗塞夫(Dilma Rousseff)在 2012 年当选巴西总统并改变了巴西国家石油公司(Petrobras)的领导层以来,股价开始下跌,并创下了过去 13 年来的最低价格。红色区域显示了* 30 人因被指控腐败而被捕的时期,紧随其后的是最低价格水*。第一个情节让我提出了新的问题,放大了我的知识孤岛,找到了新的视角。现在我的奇妙海岸线更长了,这个岛也可以变得更大了。政府腐败如何影响其他公司或经济的其他部分?我可以用政府的腐败来预测股价吗?
数据可视化是强大的,它可以改变、改善和拯救世界。这是带来新观点和创新的关键。下一次,当你着手进行数据收集或可视化设计时,记住知识之岛,让你的读者对他们从未遇到过的新问题感到好奇。
数据可视化是强大的,它可以改变、改善和拯救世界。这是带来创新的关键。当您创建和设计下一个可视化时,请牢记这些概念进行数据探索。它将引导你为你的读者提供新的数据和知识。你将使他们能够问更深层次的问题。让他们去想吧!
参考文献: 【1】n . l .安徒生《信仰之眼》四月总会(2019)T5【2】m .格莱塞《知识之岛》(2014)
【3】a .开罗《真实的艺术》(2016)
美国新冠肺炎的数据可视化
我们已经渡过难关了吗?

Yassine Khalfalli 在 Unsplash 上拍摄的照片
2020 年 1 月 19 日,第一例新型冠状病毒(新冠肺炎)抵达美国,当时华盛顿州的一名 35 岁男子带着我们现在所知的病毒常见症状走进了一家诊所:呼吸道炎症和发烧。截至 2020 年 4 月 30 日,美国有超过 100 万例新冠肺炎病例。大多数美国人都对病毒的传播感到震惊。
新冠肺炎成长动力
和流行病的情况一样,新冠肺炎的增长起初是指数增长。想象一下,一个人带着新冠肺炎病毒去参加一个聚会,并把疾病传染给了三个人。第二天,这三个人分别把病毒传染给了另外三个人。两天之内,一例冠状病毒变成了十四例。
源自一个案例的额外案例的数量可以用一个增长度量或通常称为 R0 的变量来表示。R0 由病毒传播能力和病毒携带者接触的*均人数决定。R0 在流行病的整个生命周期中是可变的。
像新冠肺炎这样的流行病不会永远以指数速度增长。随着时间的推移,流行病的增长变得类似于 S 形逻辑曲线。在流行病开始时,R0 大于 1,表明呈指数增长。随着病毒要么在整个人群中传播,要么被疫苗、病例隔离技术和/或社交距离策略阻断,增长率达到拐点。

指数增长与逻辑增长
当 RO 下降到 1 以下时,指数增长最终变为衰退。从指数增长到衰退的转变通常被媒体描述为“弯曲曲线”。随着衰变积累动量,R0 接*零,增长率实际上可以呈指数下降。
新冠肺炎疫苗不太可能在短期内准备好。病例隔离技术(包括广泛、快速检测和接触者追踪)在美国仅处于起步阶段。因此,我们一直严重依赖社交距离来减缓增长速度。显然,社会距离带来了巨大的经济和社会成本。我们不想继续保持不必要的社交距离。
但新冠肺炎最可怕的一面是指数增长的不确定性和抽象性。没有规则告诉我们指数增长可以持续多久。在疫情持续的时候,很难判断我们是否已经超越了拐点。简单地比较一段时间内新病例的数量是不够的。短时间内的增长放缓可能并不能证明增长率已经真正开始下降。R0 可以下降几周,然后再次飙升。另一方面,即使在衰退阶段,新病例也会继续增加。如果我们只关注原始数据,忽略感染点,低估衰退阶段的速度,我们可能会不必要地延长社会距离,给经济上最脆弱的美国人带来不必要的痛苦。
我们需要一种更好的方法来分析和可视化新冠肺炎增长率数据。理想情况下,我们应该提供数据,以便外行人一眼就能明白我们在任何时刻所处的位置。具体来说,我们应该能够展示数据,以便外行能够快速回答这些关键问题:
我们是否已经过了拐点?我们“弯曲曲线”了吗?
每个州都在寻求减缓病毒传播的途径?各州和各地区的差异大吗?
成长转为衰败后会发生什么?衰变阶段持续多久?
方法
使用 Python 中的数据准备、探索和可视化过程,我将尝试以更有用的方式呈现新冠肺炎增长率数据。
在逻辑曲线上,指数增长转为衰退的时刻通常被称为拐点。这是生长度量或 R0 下降到 1 以下的时刻(*均而言,一个感染病例将导致少于一个其他感染病例)。显然,这个转折点是根除病毒的一个重要里程碑。如何知道自己是否已经到了拐点?当使用对数标度以不同的方式查看逻辑曲线时,我们可以实时回答这个问题。
为了获得 S 曲线的另一个视角,重新考虑指数增长意味着什么是有帮助的:相对于时间的新案例与现有案例成比例。让我们看看现有病例和新病例在对数标度上的关系,其中轴上的单位以 10 为因子递增。这样做可以让我们清楚地看到指数增长是现有病例和新病例之间的正线性关系。在拐点处,现有病例和新病例之间的关系不再是线性的。相反,随着新病例的减少,这种关系变得越来越消极。
左侧(物流),右侧(现有与新)
Logistic 曲线的新视角
每个图表都是相同数据的不同表达。左边是一条逻辑曲线,显示了现有值如何随时间变化。在右侧,x 轴是现有案例的日志,y 轴是新案例的日志。每个点都是一个时间点。随着时间的推移,点从左向右迁移。
并非所有的逻辑曲线都是相同的,尤其是在流行病的背景下。这是两条逻辑曲线讲述不同故事的一个例子。在顶部,我们看到一条曲线,它上升迅速,但也迅速衰减。本质上,增长从“悬崖”上跌落。悬崖后是一个陡峭的下降,总病例数在 6000。在底部,我们看到一条曲线,它从未像右边的曲线那样急剧增长,但在拐点之后,它的衰减要*缓得多。所有案件最终以 10000 英镑了结。就像这些不同的逻辑曲线一样,新冠肺炎发现一些国家的增长比其他国家衰退得更快。
急剧衰减逻辑曲线
渐进贴花逻辑曲线
在流行病中,逻辑斯谛曲线增长动态如何发挥作用?将这些概念应用到新冠肺炎,这里有南韩(被广泛认为是控制疫情最成功的案例)、义大利(一个已经度过拐点但尚未脱离险境的国家)和美国的案例。在左边,我们看到每个国家一段时间内的病例总数。在右边,我们从一个不同的角度来看情况,现有案例与新案例。
对于韩国来说,自 3 月 4 日出现拐点以来,新增病例的变化率一直在相对急剧下降。对比现有病例和新病例,我们可以观察到拐点之后的下降相当陡峭。它真的“掉下悬崖”这些数据向我们描述了韩国在处理新冠肺炎问题上的有效政策。韩国现在正在重新开放经济和社会,包括学校和非必要的企业。
在意大利,自达到拐点以来,情况已经大不相同。在意大利,增长衰退的速度要慢得多。总的来说,拐点的另一边更像一个“山坡”而不是“悬崖”意大利仍比韩国更容易受到第二波指数级增长冲击。意大利还没有开始重新开放其大部分经济,预计在五月初开始一个的渐进过程。
看看美国的曲线,就到达拐点而言,我们似乎已经度过了一个转折点。但问题依然存在,美国的新冠肺炎增长会像南韩一样“跌落悬崖”,还是像义大利一样衰退得更慢?迄今为止,数据显示,意大利的情况更有可能出现,增长可能会更加缓慢。虽然美国已经度过了拐点,但我们可能还会有更多个月出现大量新病例。我们可能很难重新开放我们的经济和学校系统。
看看各个州,我们会对美国的现状有一个更详细的了解。
在美国,每个州都讲述着不同的故事
5 月 9 日更新
在《T2》这部视觉作品中有很多东西需要消化。让我们从右边的散点图开始。这里我们绘制了日志(现有病例)与日志(新病例)的对比图,就像我们对比美国和韩国时的情况一样。沿着同一性线的恒定增长(Log(现有病例)= Log(新病例))表示指数增长。离开这条线意味着到达拐点。一个状态下降的速率表明了状态案例衰减的速度。
在左手边,我们用 10 天的病例增长滚动*均值来标记美国各州。由于 50 个不同州的报告不一致,因此采用了*滑*均值。
- 红色表示指数增长期。
- 浅红色表示接*拐点。
- 白色州表示该州正处于拐点
- 浅蓝色表明该州的病例率正在缓慢下降。
- 蓝色表示该州的病例率正在快速下降。
外卖
- 从三月中旬到四月中旬,新冠肺炎在所有州都呈指数增长
- 自 4 月中旬以来,我们已经看到各州的增长率都有所下降
- 虽然美国作为一个整体似乎已经到达拐点,但在每个增长阶段都有一些州。
- 区域内有相似之处,也有差异。
- 少数几个州已经像韩国一样跌落悬崖,正在经历快速的指数式衰退。这些州在遥远的西北部和东北部(怀俄明州、阿拉斯加州、爱达荷州、蒙大拿州、缅因州和佛蒙特州)人口较少,是农村地区
- 有些州仍接*指数增长。这些州位于中西部偏上的地区(明尼苏达州、爱荷华州、内布拉斯加州和堪萨斯州)
- 对于病例最多的州(纽约、新泽西和马萨诸塞州),拐点的另一边似乎非常*缓。本质上,这些状态停留在悬崖顶上;增长指标低于 1,但非常缓慢地向零移动。
- 逻辑增长动态方面的区域内差异始终存在。例如弗吉尼亚/西弗吉尼亚。路易斯安那州/密西西比州、俄勒冈州/加利福尼亚州、蒙大拿州/北达科他州和佛蒙特州/新罕布什尔州。这一点尤其重要,因为加州、俄勒冈州和华盛顿州的州长都宣布了类似的完全基于地区的重新开放计划。
- 也许最可怕的发现是:我们已经看到一些州经历了增长下降,然后是第二波增长(马萨诸塞州、科罗拉多州、田纳西州和南卡罗来纳州)
第二波?
- 值得注意的是,在整个新冠肺炎疫情期间,检测和报告一直是的问题。增长的突然增加可能是由于一直存在的检测和报告捕获案例的快速增加。与此同时,科罗拉多州、田纳西州和南卡罗来纳州最*都因重新开放部分经济而出现在新闻中。
最终想法
虽然达到拐点是美国根除新冠肺炎的一个里程碑,但数据显示,我们面前还有几个月的病毒。我们可以从数据中清楚地看到,许多州并没有像韩国那样坠入快速案件衰减的悬崖。在一些州,我们甚至见证了拐点之后增长指标的增加。数据清楚地表明了两点:
- 由于物流增长的差异(甚至是区域内的差异),新冠肺炎政策应该以州为基础来确定。在病毒的不同阶段,状态变化的速度不同。
- 尽管在每一个州都“转危为安”并度过了拐点,但现在不是鼓励回归常态的时候。大多数州不会从悬崖上跌落到指数衰减状态,未来几个月会有数千例新冠肺炎病例。回归常态只会让我们回到指数增长。
我会继续更新每期《视觉周刊》的数据,直到一切恢复正常。
来源
- 国家层面新冠肺炎案例数据
- 国家级新冠肺炎病例数据
- 国家政策数据
- 指数增长和流行病
- 如何判断我们是否击败了新冠肺炎
- 美国首例 COVID
- 逻辑曲线
- 如果您对我的数据或方法有任何想法或希望为这项研究做出贡献,请联系我
- 如果你对聊天感兴趣,请联系 https://www.linkedin.com/in/daniel-reiff2/或 daniel.reiff2@gmail.com
- 代码在这里找到:https://github.com/reiffd7/Coronavirus
使用 R 实现巴西联邦保护区动物物种的数据可视化
使用 R 语言工具进行环境支持数据分析的实例。

由 douglasgois 通过 pixabay 拍摄的照片
欢迎阅读我的第一篇数据科学文章!我将试着以简单明了的方式解释这项工作。
联邦保护单位(缩写“UC”)是巴西国家领土的保护区,由政府划定,以其自然特征的相关性为特征,在这里保护和保存生物多样性。
生物多样性代表了存在于生物圈、我们的环境中的一整套物种,以及它们的基因和涉及物种之间关系的整个生态系统。人类作为土地不可分割的一部分,属于这个生态系统,并对其可能影响环境*衡的行为负责。
当今时代,造假者、大业主、非法伐木和偷猎的行为和活动越来越不受控制,这告诉我们应该更加注意和警惕。

Parna do Jamanxim 的非法采矿活动。照片:Ascom/Ibama
因此,我偶然发现了一个由 ICMBio (Chico Mendes 生物多样性保护研究所)提供的 UCs 中受威胁和几乎受威胁动物的数据库,该数据库更新至 2018 年。data . gov . br/dataset/especes-da-fauna-em-unidades-de-conservacao。它是一个. csv 文件,有 13 个实例,包括:物种名称、纲、目、科、脊椎动物与否、UC(保护单位)、UF(联盟单位)等。
因此,我决定使用 R 语言的一些工具来执行更精确的分析,并探索这个数据集中其他一些隐含的相关数据。
我的目标是从数不清的仍有可能但未在该数据集中直接指定的信息中提取 3 条信息,它们是:
·受威胁和接*受威胁动物多样性更大的 UCs
·联邦区内受威胁和接*受威胁动物多样性更高的 UCs(缩写“DF”);
受威胁和接*受威胁的物种,出现在 DF 地区的 UCs 中。
不要再说了,开始工作!
起初,我导入了。csv 与
fa <- read_csv("arquivo.csv")
转换到tible以便以更合适的方式进行数据处理
fauna <- as_tibble(fa)
str(fauna) #tipos de dados

作者图片
现在我们有了一个来自。csv 文件。
经过几个步骤的数据争论后,data.frame 现在可以发现信息了。
为了统计每个 UC 在数据集中出现的次数,我重新分组为 UC 和 UF,并将其重新排列为另一个名为 uc_ordem 的 df 。
uc_qtd <- fauna_uc %>%
group_by(UC, UF) %>%
count()
uc_ordem <- arrange(uc_qtd, desc(n))
现在,为了更好地可视化数据并获得我想要的第一个信息,我生成了一个具有 50 个更高频率的词云,以及一个包含 10 个濒危物种多样性最大的词云的条形图。
wordcloud(uc_ordem$UC, uc_ordem$n, random.order=FALSE, rot.per=0.35, scale=c(1.9, 0.1), min.freq = 1, max.words=50,
colors=brewer.pal(8, "Dark2"))p <- head(uc_ordem,10)
ggplot(p, aes(x=reorder(UC, n),y=n)) +
geom_bar(stat="identity", fill="steelblue") + coord_flip() +
labs(title = "Diversidade de Fauna Ameaçada das UCs", x = "Unidades de Conservação", y = "Número de espécies diferentes")


作者图片
根据数据集中包含的数据,Marinha do Arvoredo 和 Sooterama 的生物保护区以及 Abrolhos 国家公园是受威胁和几乎受威胁物种多样性最大的保护区(各有 48 个物种)。
有了这些信息,收集本文开头提出的最后两个信息就变得容易了。所以,我们走吧!
为了只过滤按不同种类数排序的 DF UCs,我使用了 filter() 函数,然后生成了一个新的 data.frame 的条形图。
fauna_qtd_df <- fauna_uc %>% filter(UF == "DF") %>%
group_by(UC) %>%
count() %>%
arrange(desc(n))ggplot(fauna_qtd_df, aes(x=reorder(UC, n),y=n)) +
geom_bar(stat="identity", fill="steelblue") + theme(axis.text.x = element_text(angle = 50, hjust = 1)) +
labs(title = "Diversidade de Fauna Ameaçada em UCs do DF", x = "Unidades de Conservação do DF", y = "Número de espécies diferentes")

作者图片
Á的 ESEC 是联邦区内濒危物种最多的加州大学。
作为对 R 中数据的探索性分析的最后一步,为了提取我想要的最后一个信息,我从 unique() 函数中创建了 data.frame animals_df ,这允许我提取重复的单个元素。
fauna_df <- fauna_uc %>% filter(UF == "DF") %>%
group_by(ID_taxon)
fn_df <- unique(fauna_df$taxon)
fn_df

作者图片

Lobo-Guará(短尾金龟)。照片由ge linger通过 pixabay 拍摄

Tapaculo-de-brasília。照片:赫克托·博泰
最后,我有 22 个物种的名字,它们的栖息地之一是塞拉多生物群落。
现在,我已经向您介绍了 R 语言中包含的许多数据分析工具中的一些,我鼓励您从这个数据集甚至其他环境数据集包含的许多工具中获取更多信息,获取新数据并使用数据科学做出贡献,以保护和拯救生物多样性。
感谢阅读!
数据可视化:原理、工具和有用的技巧

来源:沉积照片
当 Excel 电子表格不足以将这些点联系起来,并且不可能让分析师参与构建报告时,数据可视化服务和工具就来了。
为什么要数据可视化?
如果你希望你的《脸书邮报》被尽可能多的人阅读,你会怎么做?你会增加一个有趣的视觉效果。这个技巧对报告也非常有效。数据驱动的视觉效果吸引更多的注意力,更容易理解,并有助于将您的信息快速传达给受众。在描述性图形和仪表板的帮助下,即使是困难的数据也可以清晰易懂。这是为什么呢?大多数人都是视觉学习者。因此,如果你希望你的大多数合作伙伴、同事和客户能够与你的数据进行交互,你应该把枯燥的图表变成漂亮的图形。基于研究,以下是一些值得注意的数字,它们证实了可视化的重要性:
- 人们从眼睛中获得 90%的关于他们周围环境的信息。
- 50%的大脑神经元参与视觉数据处理。
- 图片增加了 80%阅读文本的愿望。
- 人们记住他们听到的 10%,他们读到的 20%,他们看到的 80%。
- 如果包装插页不包含任何插图,人们会记住 70%的信息。添加图片后,他们的记忆率高达 95%。
相关数据可视化为您的企业带来诸多优势:
- 快速决策。使用图形可以轻松快速地汇总数据,让您快速看到一个列或接触点比其他列或接触点高,而无需查看 Google Sheets 或 Excel 中的几页统计数据。
- 更多的人参与进来。大多数人更擅长感知和记忆视觉呈现的信息。
- 参与程度更高。漂亮明亮的图形和清晰的信息会吸引读者的注意力。
- 更好地理解数据。完美的报告不仅对技术专家、分析师和数据科学家来说是透明的,对首席营销官和首席执行官来说也是透明的,有助于每一位员工在其职责范围内做出决策。
成功数据可视化的原则
创建任何图形之前要做的第一件事是检查所有数据的准确性和一致性。例如,如果比例因子是 800%,而*均值是 120–130 %,您应该检查这个数字的来源。也许你需要从图表中删除某种异常值,这样就不会扭曲整体画面:800%淡化了 120%和 130%之间的差异。报告中这种无关紧要的数据会导致错误的决策。在现实生活中,我们习惯于这样一个事实:正确的信息应该在正确的时间传递给正确的人。数据可视化有三个相似的原则:
- 根据你的目标选择正确的图形。
- 确认你的图片的信息适合观众。
- 为图形使用合适的设计。
如果你的信息是及时的,但图形不是动态的,或者有不正确的见解或困难的设计,那么你不会得到你希望的结果。
图表的类型及如何选择
如果你选择了错误的图表,你的读者将会感到困惑或者错误地解释数据。这就是为什么在创建图表之前,确定要可视化的数据及其目的非常重要:
- 比较不同的数据点
- 显示数据分布:例如,哪些数据点是频繁的,哪些不是
- 借助数据显示事物的结构
- 追踪数据点之间的联系
让我们来看看最受欢迎的图表类型以及它们可以帮助你实现的目标。
1。折线图

图片由作者提供
折线图显示一个或多个变量如何在数据点之间变化。这种类型的图表对于比较数据集随时间的变化非常有用,例如,一年内三个登录页面每月的流量统计。
2。条形图

图片由作者提供
条形图是另一个非常适合比较数据集的图表。当您需要比较大量数据集或直观地强调其中一个数据集的独特优势时,通常会使用水*条形图。垂直条形图展示了数据点如何随时间变化,例如,公司的年度利润在过去几年中是如何变化的。
3。直方图

图片由作者提供
由于直方图和条形图在视觉上的相似性,它们经常被误认为是条形图,但是这些图表的目标是不同的。直方图显示了一个数据集在一个连续的时间间隔或一个确定的时间段内的分布。在这个图表的纵轴上,你可以看到频率,而在横轴上,你可以看到时间间隔。
与柱状图不同,条形图不显示任何连续的区间;每列都显示自己的类别。借助条形图可以更容易地展示不同年份的购买数量。如果您想知道订单价值(10–100 美元、101–200 美元、201–300 美元等)。)的购买量,最好选择直方图。
4。饼状图

图片由作者提供
饼图显示数据集中每个值的份额。它用于显示任何数据集的组成部分。例如,每个产品类别占总销售额的百分比是多少?
5。散点图

图片由作者提供
散点图显示了数据点之间的联系。例如,在散点图的帮助下,你可以发现转化率如何根据产品折扣的大小而变化。
6。气泡图
这是一个有趣的图表,它允许你通过第三个参数来比较两个参数。让我们把上一个例子中的转换率和折扣大小,加上收入(用圆圈大小表示),我们会得到类似下图的结果。

图片由作者提供
看这个图表,很容易注意到打 7 折的产品转化率最高,而不打折或打 9.5 折的产品带来的收益最多。
7。地理图

图片由作者提供
地理图很简单。当您需要展示跨地区、国家和大陆的特定分布时,可以使用它。
我们提到了一些最受欢迎的图表,但不是全部。您可以在数据可视化目录中找到其他类型的图表。此外,我们推荐这张方便的信息图表,它可以帮助你为你的目标选择正确的图表类型。
视觉效果的正确使用
使用数据可视化时,您必须考虑的第二件重要事情是为受众选择正确的信息。你在报告中谈论的数据应该是你的读者所熟悉和清楚的。
这是一张获得了著名的数据新闻奖的图表。对于不熟悉这个故事背景的人来说,这个图表看起来像是一个三岁小孩画的画。然而,当你对它了解得更多一点的时候,你会看到它的作者做了大量的工作。

来源: BuzzFeedNews
Buzzfeed 新闻编辑 Charles Seife 和 Peter Aldhous 使用 R 语言将联邦调查局和 DHS 特工作为空中监视的一部分获得的飞行数据可视化。具体来说,这张图表显示了 2015 年 12 月加州圣贝纳迪诺大规模枪击事件负责人的房屋和清真寺上方的航班。
当选择您想要在一个图表上可视化的参数时,您必须确认它们可以组合。有些数据组合就是不符合逻辑,尽管乍一看数据完全相关。这是一个有错误相关性的图表的例子。它表明掉进游泳池淹死的人数与尼古拉斯·凯奇电影的数量相关。

来源:泰勒维金
创建图表时,接下来要考虑的是比例和范围。人们习惯于这样一个事实,即轴上的测量是从底部和左侧开始的。如果你改变了测量的方向,会让一个不专心的观众感到困惑。尽管我们应该提到,当用作战术机动时,反转测量是可能的,如下例所示:

来源: Omundy
乍看之下,使用枪支的谋杀数量似乎在逐年下降。事实上,它是相反的,因为规模从顶部开始。也许图表的作者故意这样做是为了减少对数据的负面反应。
合适的比例也能让你的图表更清晰。如果报告显示的数据点太*,您看不到任何移动,请尝试更改比例。不要从零开始测量,或者将标尺分成更小的部分,图像会变得清晰。

图片由作者提供
在向最终用户提供报告之前,请确保图表加载速度很快。缓慢的加载会扼杀你所有的努力。例如,如果您在 Google Sheets 中可视化数据,您的数据很可能存储在同一页面或下一页面,而不是来自第三方来源。但是当您在 Data Studio 中创建报告时,数据将从其他地方导入。在这种情况下,您必须注意数据源的可访问性和数据流速率。否则,当有一个图表模板但数据尚未加载时,您将会看到一幅令人沮丧的画面。
正确的设计
你的图形设计应该总是遵循简单的原则。如果你必须准备一份标准的报告,就没有必要修饰它。避免任何只会使图表混乱的额外元素:不同的颜色和结构、3D 体积、阴影、渐变等。

图片由作者提供
图表越简单,你的读者就越容易理解你想要分享的信息。
不要将可视化效果做得太小,也不要将所有图表放在同一个仪表板页面上。在一张幻灯片或同一个仪表板页面上使用三种以上的图表被认为是不良风格。如果你真的需要这么多图表类型,把它们放在不同的页面上,这样就容易理解了。
不要害怕尝试。如果你有一个非标准的任务,也许你的解决方案也应该是非标准的。在下面的信息图中,我们可以看到不同动物的翅膀运动模式。动态可视化是完全相关的。

来源: KickstartUtopia
让我们看看数据可视化工具,并讨论如何根据您的目标选择合适的工具。
比较报告软件
现在,市场上有很多数据可视化工具。有些是付费的,有些是免费的。其中一些可以完全在网络上工作,另一些可以安装在桌面上但可以在线工作,还有一些只能离线工作。我们列出了 10 个流行的数据可视化工具:
前五种工具和服务是由专门从事数据可视化的公司开发的。数字 6 到 10 是非常有趣的工具,大部分是免费的在线工具。它们提供非标准类型的可视化,并可能提供处理数据的新方法。
选择报告工具时要注意什么:
- 从你想完成的任务开始。例如,现在市场上的一个主要趋势是动态报告。如果一个工具不能处理动态报告,那就是对它的攻击。
- 考虑你准备支付的金额。如果你的团队足够大,每个员工都必须使用可视化工具,那么每个用户的成本可能是一个停止信号。
- 决定谁将使用该工具以及如何使用。有没有组编辑的可能?开始使用该工具有多简单?界面友好吗?有没有可能在没有任何编程知识的情况下创建一个报表?例如,R Studio 是一个很好的服务,特别是在搜索趋势和建立归因和相关性模型方面。但是如果你不知道任何编程语言,不会连接任何特定的库,也不是技术专家,那么你开始使用 R Studio 将会很困难。
我们选择了五种服务,并准备了一个表格,比较它们的优点、缺点和主要特征。在我们开始之前,让我们解释一下动态数据可视化和动态报告有何不同。
动态报告指实时从不同来源导入数据的可能性。谷歌数据工作室没有动态报告。假设我们已经连接了一个来自 Google BigQuery 的 Data Studio 请求,然后更改了这个请求中的一些内容。为了在报告中记录这些变化,我们至少需要刷新 Data Studio 页面。然而,如果在 Google BigQuery 中我们添加或删除了一些字段(不仅仅是改变计算的逻辑,而是改变表的结构),那么 Data Studio 将会关闭报告并显示一个错误。你必须重做它。
动态数据可视化是指在一个会话中查看不同日期的汇总统计数据的可能性。例如,在 Google Analytics 中,您可以更改时间间隔,并获得所需日期的统计数据。
五大可视化工具的关键特征

我们想详细讨论与 OWOX BI 一起使用的三个工具:Google Data Studio、Google Sheets 和 OWOX BI Smart Data。
谷歌数据工作室
Google Data Studio 允许你连接数据源,可视化数据,并以类似于其他 Google 产品的方式轻松地与同事分享报告。
优势:
- 免费
- 150 多个易于集成的连接器
- 可以通过一个仪表板使用来自多个来源的数据
- 方便共享报告
Google Data Studio 是一个免费工具,有 Google 提供的 17 个原生连接器。它们已经过检查,工作正常,足以完成大多数任务。还有由合作伙伴提供的连接器,尽管您必须理解连接器可以由具有不同技能水*的开发人员提供,并且不能保证它们会正确执行。

图片由作者提供
顺便说一下,如果你想在 Data Studio 报告中看到任何脸书或雅虎 Gemini 的统计数据,你可以在 OWOX BI 的帮助下将数据导入 Google BigQuery 。虽然其他连接器可能会忽略一些分析,但使用 BigQuery,您可以从您的脸书帐户接收完整的数据分析。
有一个方便的谷歌数据工作室图库,里面有现成的模板。

图片由作者提供
OWOX BI 也有现成的仪表板模板。
第一个是营销属性仪表板。在这个仪表板中,您可以找到营销专家和分析师使用的所有基本参数和指标。

图片由作者提供
第二个控制面板是数字营销付费渠道 KPI 控制面板,它根据数据源进行划分(详细显示)。换句话说,它显示脸书营销活动的过滤数据等。
这些是演示仪表板。您可以复制它们,更改自己的数据源,并在工作中使用它们。
Data Studio 最*的一次更新增加了按视图过滤数据的可能性。例如,您可以比较当前期间和上一年的数据点。
Data Studio 的另一个有趣的更新是允许您在界面中更改已经创建的图形的类型。以前,更改图表时,您必须删除它并创建一个新的图表。现在可以直接在界面中改变图形样式了。
谷歌工作表
这是最受欢迎的报告工具,任何营销专家都至少使用过一次。Google Sheets 界面非常简单明了,尤其是对于那些开始使用 Excel 进行分析的人来说。
优势:
- 自由灵活—支持动态参数、数据透视表等
- 易于与数据源集成
- 通过链接方便地共享报告
有用的链接:
Google Sheets 中的图表和报表集与 Google Data Studio 中的相同。

图片由作者提供
此外,还可以管理颜色和选择单元格格式:

图片由作者提供
也许 Google Sheets 的主要优势是数据透视表。最*,Google Data Studio 进行了更新,允许计算三个以上的字段和十列。它让分析师的生活变得更加轻松,尽管 Data Studio 中的可能性仍然有限,而且在 Google Sheets 中使用数据透视表仍然更加舒适。

图片由作者提供
谷歌工作表有一个免费的插件,可以让你直接从谷歌分析上传数据,并根据导入的数据生成报告。此外,您可以直接从工作表中请求谷歌分析数据。在这个 GIF 中,您可以看到如何导入数据以及应该设置哪些参数和指标。

图片由作者提供
我们想在 Google Sheets 中分享我们最喜欢的报告——群组分析报告。

图片由作者提供
这个报告模板可以在这里找到。你可以看到使用的说明和公式。必须填写彩色字段,其他彩色字段在公式的帮助下更新。有大量计算出来的指标,但是这个报告很难,而且需要大量的人力。我们希望这个模板对你有用。此外,您可以在 Google Analytics 和 Google Sheets 中阅读详细的群组分析指南,我们在其中提供了非常详细的说明。
OWOX BI 智能数据
有了 OWOX BI 智能数据,你不需要知道 SQL 语法。用自然语言用简单的英语问一个问题就够了。该服务处理请求,将其翻译成技术语言,并返回一个漂亮的图形和表格,其中包含您的问题的答案。
优势:
- 不需要特殊的技术培训
- 快速回答问题
- 友好的界面
- 有俄语和英语版本
有一个详细的参考指南,您可以从中了解到您可以在智能数据中创建的每种类型的报告。
智能数据报告使用什么数据
您网站上的用户操作:
- 你可以在 OWOX BI 的帮助下调整Google Analytics→Google big query流媒体。
- 或者使用标准的Google Analytics 360→Google big query导出。
交易:
广告活动成本:
- 推特、脸书、雅虎双子座,我的。目标→谷歌分析
- 其他来源→谷歌分析
收集完所有这些数据后,你就可以开始提问了。我们在 OWOX BI 智能数据中添加了客户需要的所有报告。然后,我们按主题将它们分组,以便于搜索报告。我们有 ROPO 报告,归因报告,注册会计师合作伙伴报告,客户关系管理数据报告,等等。
根据您的数据提出的问题:
- 在[时间段]内,[指标]如何随[维度]而变化?
- 尺寸的度量是多少?
- 【公制】如何分配给【维度】?
- 网站上有多少[公制]?

图片由作者提供
归因问题:
- 广告渠道、活动和关键词的真正价值是什么?
- 根据基于漏斗的模型,roa、ROI 和 CRR 是什么?
- 转化价值(如注册)是如何在渠道和活动中分配的?
- 根据最后的非直接点击模型,哪些来源具有最大和最小的价值?
- 哪些活动和关键词在吸引新用户方面表现最佳?
- 在漏斗的每一步,哪些渠道和活动表现最好?
- 来源和渠道的哪些行动链导致交易?

图片由作者提供
关于 CRM +线上数据的问题:
- 不同活动的订单执行情况如何不同?
- 不同渠道组每天的毛利有何不同?
- 不同城市的 CRM 订单数和 CRM 用户数有什么不同?
- 按来源和渠道,ROAS 毛利是多少?
- CRM 订单数量与支付和交付类型之间有什么关系?
- 换算和*均配送时间、城市有什么关系?
- CRM 订单、CRM 用户数、店铺之间有什么关系?

图片由作者提供
在本参考文献中,您可以找到 CRM 导出的完整数据结构。
注册会计师活动问题:
- 流量诈骗的来源有哪些?
- 根据品牌需求购买了多少广告?
- 哪一个合作伙伴应该为重叠交易的行为支付报酬?
- CPA 合作伙伴生成的会话质量如何?

图片由作者提供
ROPO(线上调研,线下购买)问题:
- 线上广告对线下购买有什么影响?
- 什么是真正的 ROPO 购买转换窗口,交易价值和用户做出购买决定的天数之间有什么关系?
- 在完成线下购买之前,买家、交易和收入是如何按天分配的。
- 用户需要多少天来决定购买最贵的商品?

图片由作者提供
这里是 OWOX BI Smart Data 的一个小 FAQ 块,它解决了如何构建请求、结构应该是什么样子、如何显示您想要查看的维度和指标等问题。
对于给定的维度,一次可以选择多少个指标?
智能数据报告不限制您可以使用的指标数量。然而,有了大量的指标,在 Google Data Studio 中可视化数据更加容易。
- 在参考指南中可以找到所有可能的指标和尺寸列表。
如何构建请求,结构应该是什么样子
示例和问题结构可在我们的参考指南中找到:
最好的选择是只输入您想要查看的维度和指标。
这些图表显示的数值是否正确?
智能数据报告基于您的完整数据和现成的 SQL 请求,您可以在 Google BigQuery 项目中复制和检查这些数据和请求。
数据可视化:用 Python 中的图表说出来
使用 matplotlib、pyplot 和 seaborn 的 python 可视化最佳实践和概念的完整实践指南

威廉·艾文在 Unsplash 上的照片
商业智能(BI)是一个概念,通常涉及组织中适当且有价值的商业信息的交付和集成。公司使用 BI 来检测重大事件,如深入了解客户行为、监控关键绩效指标以及获取市场和销售情报,以快速适应不断变化的动态业务。可视化是任何 BI 的支柱,因此分析师或数据科学家需要了解可视化的细微差别,以及它如何在有效交流见解和发现方面发挥重要作用。
我们将使用真实世界的数据提出一些商业问题,并了解如何用 Python 创建强大的、有效的和有洞察力的、可视化的 PEI 框架的演示。
以下是我们将在本文中涉及的五件事:
- 可视化在分析行业中的重要性
- 如何决定使用哪个图表
- python 中 matplotlib 和 seaborn 的介绍和背景
- 使用 python 的一系列图表和可视化来回答来自真实世界数据的相关问题
- 使用可视化讲述故事的最佳实践
为什么数据可视化很重要?
数据和分析正在改变竞争的基础。领先的公司不仅利用他们的能力来改善他们的核心业务,还推出全新的商业模式。随着 cxo 不断跟踪不断变化的市场,Topline KPIs(关键绩效指标)正在成为当前的需求,从而使他们能够做出明智的大规模决策。仪表板在利益相关者中变得越来越流行,随着从众多数据源收集的大量数据涌入,可视化成为分析这些数据的关键。简而言之,构建视觉效果的四个主要原因包括:
- 对于探索性数据分析,通常称为数据 EDA
- 向不同的利益相关方清楚地传达顶层调查结果
- 分享数据的无偏表示
- 使用可视化来支持发现、见解和建议
在我们开始之前,让我们看一看可视化图表的基础。图表通常分为两大类:
- ****数据图表,也叫定量图表,用图形描绘数字来说明一个点。它们包括饼图、条形图、堆积条形图、散点图、折线图等。
- ****概念图,也叫非量化图表,使用文字和图像。概念图描述了一种情况,如相互作用、相互关系、杠杆作用或工作中的力量。一些常见的例子有流程图、甘特图、矩阵等。
数据图表是分析行业中使用最广泛的图表类型。从仪表板、定期报告到演示文稿,它们在以利益相关方能够理解的方式传达我们的分析方面发挥着重要作用。概念图在咨询和战略概述中起着重要作用,尤其是在逐步概述战略很重要的情况下,或者在需要 SWOT 分析(优势、劣势、机会、威胁)的情况下。
想了解更多关于当前市场上商务智能趋势的信息吗?
** [## 现代分析的黎明——了解商业智能的一些最新趋势…
基于调查的方法来确定每个数据科学家都应该知道的 BI 工具
towardsdatascience.com](/the-dawn-of-modern-analytics-a-look-into-some-of-the-recent-trends-of-business-intelligence-fc12cdf41cae)
图表选择框架
在使用 Excel、Python、R、Tableau、R Shiny、Power BI 或 Qliksense 等*台时,用户会接触到多种引人注目的图表布局。然而,在分析的世界里,创造一个有吸引力的可视化比创造一个有效的可视化更重要。下面是选择框架,它是任何图表选择的基础。

图表选择框架
Python 中的数据可视化简介
Matplotlib 历史和建筑
Matplotlib 是 Python 中使用最广泛的数据可视化库之一。它是由约翰·亨特发明的,他是一名神经生物学家,当时正致力于分析皮层脑电图信号。他的团队可以使用专利软件的授权版本进行分析,并且只能轮流使用。为了避免这种限制,John 开发了一个基于 MATLAB 的版本,在后期阶段配备了一个脚本接口,用于快速轻松地生成图形,目前称为 matplotlib。
Matplotlib 运行在一个三层架构系统上,后端层、艺术家层和脚本层。

Matplotlib 架构
让我们看看下面的代码:
# — — — — — — — — — — — — - Backend Layer, Figure Canvas Layer: Encompases area in which figures are drawn — — — — — — — — — — — — -from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas#— — — — — — — — — — — — -From Artist layer, importing Artist Figure: Artist layer knows how to use a renderer to draw an object----------------------
from matplotlib.figure import Figure
fig=Figure()
canvas=FigureCanvas(fig) #-----passing object of artist layer to backend layer (Figure Canvas)#— — — — — — — — — — — — -Using numpy to create random variables----------------------
import numpy as np
x=np.random.rand(100)#— — — — — — — — — — — — -Plotting a histogram---------------------
ax=fig.add_subplot(111)
ax.hist(x,100)
ax.set_title('Normal Distribution')
fig.savefig('matplotlib_histogram.png')
我们可以看到,要使用后端和艺术家层的组合绘制随机数直方图,我们需要处理多行代码片段。为了减少这种工作,Matplotlib 引入了名为 Pyplot 的脚本层。
"matplotlib.pyplot" 是命令风格函数的集合,使 matplotlib 像 MATLAB 一样工作。每个 pyplot 函数对图形进行一些改变,例如,创建图形,在图形中创建绘图区域,在绘图区域中绘制一些线,用标签装饰绘图,等等。在 matplotlib.pyplot 中,各种状态在函数调用中被保存,这样它可以跟踪诸如当前图形和绘图区域之类的东西,并且绘图函数指向当前轴。
import matplotlib.pyplot as plt#— — — — — — — — — — — — -Using numpy to create random variables----------------------
import numpy as np
x=np.random.rand(100)plt.hist(x,100) #-----100 refers to the number of binsplt.title(‘Normal distribution Graph’)
plt.xlabel(‘Random numbers generated’)
plt.ylabel(‘Density’)
plt.show()
同样的输出可以通过 pyplot 使用更少的代码行直接生成。
让我们看看下面的例子,以了解我们如何使用 python 中的 matplotlib 和 pyplot 创建不同的绘图。我们将使用来自 Kaggle 的自杀率概览数据来绘制上面讨论的一些图表。
#— — — — — — — — — — — — -Reading dataset — — — — — — — — — — — -
import pandas as pdsuicide_data=pd.read_csv(‘C:/Users/91905/Desktop/master.csv’)suicide_data.head()#We can summarize data by multiple columns like country, year, age, #generation etc. For the sake of simplicity we will try and the #answer the following questions#1\. How total suicide number in the globe changed with time#2\. Total suicides by gender and age bucket separately#3\. Total suicides by gender across age buckets#4\. Proportion of suicides by generation#5\. Distribution of suicides till date using box plot and histogram#— — — — — — — — — — — — -Since data is at different levels, we will try and summarize the data by year, --------------
#— — — — — — — — — — — — -sex, age, sex+age and generation--------------year_summary=suicide_data.groupby('year').agg(tot_suicide=('suicides_no','sum')).sort_values(by='year',ascending=True)gender_summary=suicide_data.groupby('sex').agg(tot_suicide=('suicides_no','sum')).sort_values(by='sex',ascending=True)age_summary=suicide_data.groupby('age').agg(tot_suicide=('suicides_no','sum')).sort_values(by='tot_suicide',ascending=True)#— — — — — — — — — — — — -Line Graph to see the trend over years-----------------import matplotlib.pyplot as plt
import numpy as np%matplotlib inlineyear_summary.plot(kind='line', figsize=(10,6));
plt.title('Summary of Suicides by Year');
plt.xlabel('Year');
plt.ylabel('#Suicides');#— — — — — — — — — — — — -Bar graph to compare suicides by gender and age-------------
gender_summary.plot(kind='bar', figsize=(10,6));
plt.title('Summary of Suicides by Gender');
plt.xlabel('Sex');
plt.ylabel('#Suicides');age_summary.plot(kind='bar', figsize=(10,6));
plt.title('Summary of Suicides by Age');
plt.xlabel('Age');
plt.ylabel('#Suicides');#— — — — — — — — — — — — -Total suicides by age and gender together----
gender_age_summary=suicide_data.groupby(['sex','age']).agg(tot_suicide=('suicides_no','sum')).unstack()
gender_age_summary.head()gender_age_summary.plot(kind='bar', figsize=(10,6), stacked=True);
plt.title('Summary of Suicides by Genger & Age');
plt.xlabel('Age');
plt.ylabel('#Suicides');#— — — — — — — — — — — — -Proportion of Suicide by Generation— — — — — — — — — — — — -
generation_summary=suicide_data.groupby('generation').agg(tot_suicide=('suicides_no','sum')).sort_values(by='tot_suicide',ascending=False).reset_index()
generation_summary.head(10)#— — — — — — — — — — — — -Plotting pie chart— — — — — — — — — — — — -
fig1, ax1 = plt.subplots();
fig1.set_size_inches(8,6)ax1.pie(generation_summary['tot_suicide'],labels=generation_summary['generation'],autopct='%1.0f%%',shadow=True);
ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
plt.title('% Suicides across Generation')
plt.show();#— — — — — — — — — — — — -Histogram Plot— — — — — — — — — — — — -
year_summary.plot(kind='box', figsize=(10,6)); #----------To plot histogram change kind='box' to kind='hist'
plt.title('Distribution of suicide figures');






基于 Matplotlib 和 Pyplot 的自杀数据可视化
海生的
Seaborn 是一个基于 matplotlib 的 Python 数据可视化库。它提供了一个高层次的界面来绘制有吸引力的和信息丰富的统计图形。Seaborn 通常以统计数据可视化为目标,但提供更智能和增强的布局。
有用提示—在使用 seaborn 功能之前,使用 sns.set(color_codes=True)。这为你的可视化添加了一个很好的背景。
让我们尝试使用 Seaborn 重新创建上面的图表
import seaborn as snssns.set(color_codes=True)#— — — — — — — — — — — — -Suicides by year--------------------------
year_summary=suicide_data.groupby('year').agg(tot_suicide=('suicides_no','sum')).sort_values \
(by='year',ascending=True).reset_index()
year_summary.head()#— — — — — — — — — — — — -Using Seaborn to plot trend of suicide with time-------------------------------
fig, ax = plt.subplots(figsize=(10,6));
plt.title('#Suicides across Years')
sns.lineplot(year_summary['year'],year_summary['tot_suicide']);#— — — — — — — — — — — — -Summary by Gender------------------------------------------
gender_summary=suicide_data.groupby('sex').agg(tot_suicide=('suicides_no','sum')).sort_values(by='sex',ascending=True).reset_index()fig, ax = plt.subplots(figsize=(10,6));
plt.title('#Suicides across Years')ax=sns.barplot(gender_summary['sex'],gender_summary['tot_suicide']);
ax.set(xlabel='Gender', ylabel='#Suicides');
plt.show()#— — — — — — — — — — — — -Summary by Gender/age------------------------------------------
gender_age_summary=suicide_data.groupby(['sex','age']).agg(tot_suicide=('suicides_no','sum')).reset_index()
gender_age_summary.head()fig, ax = plt.subplots(figsize=(10,6));
plt.title('#Suicides across Years')ax=sns.barplot(x=gender_age_summary['sex'],y=gender_age_summary['tot_suicide'],hue=gender_age_summary['age']);
ax.set(xlabel='Gender', ylabel='#Suicides');
plt.show()gender_age_summary1=suicide_data.groupby(['sex','age']).agg(tot_suicide=('suicides_no','sum')).unstack()
gender_age_summary1.head()#— — — — — — — — — — — — -Stack bar--------------------------------
sns.set()
gender_age_summary1.plot(kind='bar', stacked=True)#— — — — — — — — — — — — -Checking correlation between suicide, population and gdp per capita
sns.pairplot(suicide_data[['suicides_no', 'population', 'gdp_per_capita ($)']], size=4, aspect=1);#— — — — — — — — — — — — -Boxplot— — — — — — — — — — — — -
sns.boxplot(gender_age_summary['sex'],gender_age_summary['tot_suicide']);






使用 Seaborn 的自杀数据可视化
使用可视化讲述故事的最佳实践
以下是创建演示文稿或可视化效果时应该遵循的一些最佳实践:
- 明确定义问题陈述,并使用自上而下的方法将其分解为多个假设。在上述案例研究中,问题陈述包括了解不同国家的自杀率以及影响自杀率的因素。因此,在进入可视化之前,列出所有可能影响自杀率的因素,例如,年龄、性别、GDP、人口、增长、世代等等。
- 确定可能给你的故事增加价值的关键因素。想一想这些因素是如何相互联系的,以便对正在发生的事情有一个更全面的了解。不要按年龄和性别分别看自杀率,试着比较两组的自杀率。你可以得到高质量的见解,比如,年龄在 18 到 25 岁之间的男性自杀率更高
- 一旦你决定了因素,确保你使用图表选择框架来决定哪个图表最适合
- 确保所有图表格式的一致性,包括颜色、文本大小、标题大小、轴间距、图例位置和图表对象的对齐
- 在每一个图像下面都有一些发现;这将帮助你为你的利益相关者拼凑一个故事
数据科学行业的新手?这里有一些提示和窍门供你开始!
5 编码嗅探如果你在数据科学行业工作,你必须知道
towardsdatascience.com](/are-your-coding-skills-good-enough-for-a-data-science-job-49af101457aa) [## 我不能在 10 天内教你数据科学
理解数据科学空间中的实体和需求的案例研究方法
towardsdatascience.com](/i-cant-teach-you-data-science-in-10-days-f3beeb099b60)
关于作者:高级分析专家和管理顾问,帮助公司通过对组织数据的商业、技术和数学的组合找到各种问题的解决方案。一个数据科学爱好者,在这里分享、学习、贡献;你可以和我在 上联系 和 上推特;**
使用熊猫散景的数据可视化
为熊猫数据帧创建令人惊叹的可视化效果
探索性数据分析是理解和建立有效的 ML 模型的基础。数据可视化是 EDA 的一个关键部分,有许多工具可用于此。Bokeh 是一个交互式可视化库。它提供了直观和通用的图形。散景有助于快速轻松地制作交互式绘图和仪表盘。熊猫散景为熊猫提供了一个散景绘图后端。
将熊猫散景与您的 Python 代码集成非常简单。你只需要安装并导入 pandas-bokeh 库,然后你就可以像使用其他可视化工具一样使用它了。你应该在导入熊猫后导入熊猫-散景库。使用以下命令下载并导入 pandas-bokeh 库:
*#Load the pandas_bokeh library*
!pip install pandas_bokehimport pandas as pd
import pandas_bokeh
您可以将打印输出设置为 HTML 或笔记本。使用命令pandas _ bokeh . output _ notebook()将输出设置为 notebook。这将在笔记本单元格中嵌入情节。使用命令pandas _ bokeh . output _ file(filename)将输出显示为 HTML 文件。
您可以使用命令 df.plot_bokeh() 轻松绘制 Pandas 数据帧。熊猫散景提供了各种各样的绘图选项,如线,分散,酒吧,直方图,面积,地图绘图,步骤,点,饼图。所有的情节都是互动的,可*移的,可缩放的。下面是一些流行的可视化代码的例子,使用数据分析中常用的 pandas_bokeh 绘制。
柱状图
*#Vertical barchart*
carhpbot.plot_bokeh(
kind="bar",
figsize =(1000,800),
x="name",
xlabel="Car Models",
title="Bottom 10 Car Features",
alpha=0.6,
legend = "top_right",
show_figure=True)
*#Stacked vertical bar*
carhpbot.plot_bokeh.bar(
figsize =(1000,800),
x="name",
stacked=True,
xlabel="Car Models",
title="Bottom 10 Car Features",
alpha=0.6,
legend = "top_right",
show_figure=True)

条形图
线条图
iris.plot_bokeh(
kind='line',
x='species',
y=['sepal_length', 'sepal_width','petal_length','petal_width'],
xlabel='Species',
ylabel='Length and Width',
title='Flowers',
)

直方图
iris.plot_bokeh(kind="hist",title ="Iris feature distribution",
figsize =(1000,800),
xlabel = "Features",
ylabel="Measure"
)

柱状图
散点图
car.plot_bokeh.scatter(
x='horsepower',
y=['weight'],
figsize=(1000, 700),
zooming=False,
panning=False
)

地图地块
mapplot["size"] = mapplot["pop_max"] / 1000000
mapplot.plot_bokeh.map(
x="longitude",
y="latitude",
hovertool_string="""<h2> @**{name}** </h2>
<h3> Population: @**{pop_max}** </h3>""",
tile_provider="STAMEN_TERRAIN_RETINA",
size="size",
figsize=(1200, 600),
title="Cities with more than 1000K population")

地图绘图
面积图
carhp.plot_bokeh.area(
x="name",
stacked=True,
figsize=(1300, 700),
title="Compare Car Models",
xlabel="Top 10 Car models",
)

这些是使用 pandas_bokeh 绘制的一些基本图。这些图中的每一个都可以使用各种可选参数进一步增强。熊猫博客提供了一个精彩的 GitHub 库用一些很棒的例子解释了所有的情节。我上面展示的例子都可以在我的 Kaggle 笔记本的数据集中找到。
使用 Plotly 的统计图进行数据可视化
统计图表类型和使用 Plotly 绘图

斯蒂芬·道森在 Unsplash 上拍摄的照片
数据可视化在数据分析中起着重要的作用,因为只要人眼看到一些图表或图形,他们就会试图在该图形中找到模式。
数据可视化是使用不同的图/图形/图表直观地表示数据,以找出模式、异常值以及数据集不同属性之间的关系。它是数据的图形表示。
统计数据分析是执行各种统计操作的过程。它是一种定量研究,即对数据进行研究,以找出数据的统计特性。
Python 为可视化提供了不同的库/包,如 Matplotlib、Seaborn、ggplot 等。但我个人最喜欢的是 Plotly ,因为它不仅帮助我们可视化数据,还创建了高度互动和视觉上吸引人的图表/条形图/曲线图等。
在本文中,我们将讨论最重要的统计图表,并将创建和可视化它们。
箱线图
箱线图帮助我们可视化数据及其四分位数,箱线图的主要好处之一是我们可以清楚地识别异常值。让我们绘制一个箱线图,这里使用的数据集是一个汽车设计数据集,它包含汽车制造公司的不同属性。
import pandas as pd
import plotly.express as pxdf = pd.read_csv('car_design.csv')fig = px.box(df, x="body-style", y="price")
fig.show()

箱线图(异常值清晰可见)
直方图
直方图用于确定数据的*似分布。在直方图中,创建不同的箱,并表示每个箱的计数。直方图基于面积,而不是条形的高度。在直方图中,它是指示每个条柱出现频率的条形区域。
fig = px.histogram(df, x="city-mpg")
fig.show()

代表不同数据仓的直方图。
热图
热图是数据的二维图形表示,表示不同数据属性之间的相关性,并根据颜色进行区分。
fig = px.density_heatmap(df.corr())
fig.show()

热图
散点图
散点图是一种可视化形式,其中点用于显示数据集中两个变量的不同值。它用于找出两个变量之间的关系。
fig = px.scatter(df, x="city-mpg", y="highway-mpg", trendline="ols")
fig.show()

散点图显示了强相关性
小提琴情节
小提琴图是数字数据的统计表示。它类似于一个箱形图,在每一侧增加了一个旋转的核密度图。
fig = px.violin(df, y="price")
fig.show()

使用小提琴图的价格分布
2D 密度等高线
2D 密度图或 2D 直方图是众所周知的直方图的扩展。它显示了数据集中的值在两个定量变量范围内的分布。避免在散点图中过度绘制非常有用。
fig = px.density_contour(df, x="city-mpg", y="highway-mpg", marginal_x="histogram", marginal_y="histogram")
fig.show()

2D 密度等值线图
在本文中,我们看到了不同的统计图,以及如何使用 Plotly 绘制它们,Plotly 是一个用于可视化的 python 库。
这些图将为您提供统计数据可视化背后的基本概念,您可以相应地更改参数,并根据您的要求可视化数据。
[## 在 Python 中使用 Pandas Profiling、Sweetviz 和 Autoviz 实现 EDA 自动化的技巧
探索性数据分析(EDA)用于探索我们正在处理的数据的不同方面。应该执行…
analyticsindiamag.com](https://analyticsindiamag.com/tips-for-automating-eda-using-pandas-profiling-sweetviz-and-autoviz-in-python/) [## 下载股票数据并直观地展示出来
使用 YFinance 和 Plotly 库进行股票数据分析
towardsdatascience.com](/downloading-stock-data-and-representing-it-visually-6433f7938f98) [## sweet viz:Python 中的自动化 EDA
使用 Sweetviz python 库进行探索性数据分析
towardsdatascience.com](/sweetviz-automated-eda-in-python-a97e4cabacde)
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。 您也可以在我的**Github中查看我在这里使用的代码和数据。
使用 Streamlit 实现数据可视化
Streamlit 简介

卢克·切瑟在 Unsplash 上的照片
喜欢、分享、订阅频道- HackerShrine
最*,我遇到了一个开源框架— Streamlit ,它是用来创建数据应用的。所以我花了一些时间在文档上,并在一个粮食需求预测数据集上做了一些数据可视化。
Streamlit 的开源应用框架是数据科学家和机器学习工程师在几个小时内创建漂亮、高性能应用的最简单方式!全是纯 Python。全部免费。
要开始,只需键入以下命令:
pip install streamlit
要检查它是否安装正确,请运行以下命令:
streamlit hello
如果这出现在您的浏览器上,则 streamlit 已安装并正常工作!

现在我们将使用上面链接中提供的数据集绘制一些简单的图表。
首先导入必要的库并给出一个标题。
import streamlit as st
import pandas as pd
import numpy as np
import plotly.figure_factory as ff
import matplotlib.pyplot as pltst.title(‘Food Demand Forecasting — Analytics Vidhya’)
在数据集中,您将看到 3 个 csv 文件,我们现在将使用 pandas 导入这些文件。@st.cache 在这里对于流畅快速的运行是相当重要的。在这里详细阅读。
[@st](http://twitter.com/st).cache
def load_data(nrows):
data = pd.read_csv('train.csv', nrows=nrows)
return data[@st](http://twitter.com/st).cache
def load_center_data(nrows):
data = pd.read_csv('fulfilment_center_info.csv',nrows=nrows)
return data[@st](http://twitter.com/st).cache
def load_meal_data(nrows):
data = pd.read_csv('meal_info.csv',nrows=nrows)
return data
现在让我们调用这些函数。我现在只取 1000 行,你可以取整个数据集。
data_load_state = st.text('Loading data...')
weekly_data = load_data(1000)
center_info_data = load_center_data(1000)
meal_data = load_meal_data(1000)
首先我们来看一下 周需求数据 。我们将绘制条形图,直方图,折线图和面积图。
条形图
st.subheader(‘Weekly Demand Data’)
st.write(weekly_data)#Bar Chart
st.bar_chart(weekly_data[‘num_orders’])

直方图
#histogram
df = pd.DataFrame(weekly_data[:200], columns = [‘num_orders’,’checkout_price’,’base_price’])
df.hist()
plt.show()
st.pyplot()

折线图
#Line Chart
st.line_chart(df)

面积图
chart_data = pd.DataFrame(weekly_data[:40], columns=[‘num_orders’, ‘base_price’])
st.area_chart(chart_data)

我们拥有的下一个 csv 文件属于 履行信息中心。
为了显示 csv 文件中的原始数据,我添加了一个复选框,当它被选中时,就会显示原始数据。Streamlit 提供了简单而优雅的语法,如下所示。
st.subheader(‘Fulfillment Center Information’)
if st.checkbox(‘Show Center Information data’):
st.subheader(‘Center Information data’)
st.write(center_info_data)
#st.write(center_info_data)

以类似于每周需求数据的方式绘制区域代码和中心类型的条形图。
st.bar_chart(center_info_data[‘region_code’])
st.bar_chart(center_info_data[‘center_type’])


接下来,我们将使用 plotly 查看配送区域代码和中心 id。
hist_data = [center_info_data[‘center_id’],center_info_data[‘region_code’]]
group_labels = [‘Center Id’, ‘Region Code’]
fig = ff.create_distplot(hist_data, group_labels, bin_size=[10, 25])
st.plotly_chart(fig, use_container_width=True)

我们拥有的最后一个 csv 文件是膳食数据,让我们也显示它的原始数据。
st.subheader('Meal Information')
st.write(meal_data)
这里绘制了一个简单的 cusine 柱条形图。
st.bar_chart(meal_data[‘cuisine’])

然后创建按钮,点击该按钮将显示餐饮类别数量的条形图。这可以通过编写以下代码来实现:
agree = st.button(‘Click to see Categories of Meal’)
if agree:
st.bar_chart(meal_data[‘category’])

要运行您的 streamlit 应用程序,只需键入以下命令:
streamlit run appname.py
这将打开一个浏览器,你可以看到所有的可视化。
这是我电脑上的一个屏幕录像。
[## Aniket Wattamwar 在 LinkedIn 上发帖
最*,我偶然发现了一个开源框架 Streamlit。所以,我花了一些时间在文档上,做了一些…
www.linkedin.com](https://www.linkedin.com/posts/aniket-wattamwar-0a6658139_machinelearning-python-streamlit-activity-6699267657994162176-psWO)
你可以在我的 G itHub 上找到完整的代码。你也可以在其他*台上和我联系——Linktree
谢谢你。
和*。
使用 ggplot2 实现数据可视化
实践教程
R 语言中的“图形语法”一瞥

r 编程
编程已经成为最好的数据分析工具之一,尤其是在可视化分析方面。一个伟大的社区贡献使得学习、使用和分享有效的可视化变得更加容易。必须指出,适当的可视化对于数据科学家&人工智能专家来说是一个非常重要的因素。即使您只对具有影响力的可视化的业务通信感兴趣,R 也可以为您提供一种全面的工作方式,在这种方式下,您可以充分自由地处理数据并为您的受众创建有用的图表。顺便说一下,它是一个开源工具。RStudio 是最适合 r 的 IDE(集成开发环境)。
ggplot2
gg plot 2是 R 社区最流行的数据可视化包。它是由哈德利·威克姆在 2005 年创立的。它是基于 Leland Wilkinson 的 图形语法 实现的——这是一种数据可视化的通用方案,它将图形分解为比例和层等语义组件。在使用 ggplot2 的时候,你提供数据,调用特定的函数,将你想要的变量映射到美学,定义图形参数,剩下的就交给它了!具体可以去翻翻它的文档。

tidyverse
tidy verse是同一位 Hadley Wickham 推出的数据科学软件包集合。【tidy verse】封装了“gg plot 2”**以及其他用于数据争论和数据发现的包。更多细节可在其文档中找到。
安装软件包
让我们先安装所需的软件包。您不需要在我们的系统中多次安装任何软件包,除非您愿意升级它。注意:如果安装,那么就不需要单独安装 ggplot2 !
***# install.packages('ggplot2')
install.packages('tidyverse')
install.packages("ggalt")
install.packages('GGally')
install.packages('ggridges')***
- 反转 为所有地块**
- ggalt 为哑铃剧情**
- GGallyfor散点图**
- 垄垄垄为*垄*
加载包
现在我们需要加载我们的包。与安装不同,每次启动系统时都需要加载软件包。
***library(tidyverse)
library(ggalt)
library(GGally)
library(ggridges)***
探索数据集
在本练习中,我们将使用四个数据集。其中两个是标准数据集,在世界范围内用于实践数据可视化。这些是 虹膜 和 钻石 数据集。另外两个是为此工作目的专门策划的数据集。 names.csv 有 1880 年到 2017 年这几年三个女性名字的使用数据,life _ expect ency . CSV包含了 15 个国家 1967 年和 2007 年的预期寿命。请从我的 github 库或者从 google drive 下载这两个数据集,看哪个方便。注意:所有这些数据集都是开源的。
现在,让我们导入数据集
***data_iris <- iris
data_diamonds <- diamonds**setwd("E:**/**---**/**your_working-directory")
**data_names <- read.csv("names.csv", header = TRUE)
data_life_exp <- read.csv("life_expectency.csv", header = TRUE)***
这里有三个检查导入数据的选项,
***View(data_iris)***

作者图片
***head(data_iris)***

作者图片
***glimpse(data_iris)***

作者图片
关于功能
我们将使用 ggplot2 包中的几个函数。这些函数一起工作,产生所需的图形。每个 ggplot2 图形都以函数**ggplot()** 开始。它基本上创建了坐标系。在此之上添加图形层。该函数的第一个参数是目标图的输入数据集。然后是 geom 功能,根据其 geom 即**geom_point**、**geom_line**、**geom_bar**等,在坐标系上添加标绘图层。每个几何函数都需要一个 T4 参数。这定义了数据集中的变量如何映射到可视化属性。美学函数**aes()**被分配给**mapping**自变量。aes()函数的主要参数是轴增量- **x**、**y**和微分参数,如**color**、**size**、**fill**、**alpha**。当区别参数被放在aes()函数之外时,它们就变成了共同特征参数。**ggtitle()**、**xlab()**、**ylab()**、**theme()**这些功能用于标签和专题属性。注 : 通过执行 命令,可以在帮助选项卡中找到这些功能的详细信息?function _ name,像**?geom_point**。

作者图片
这些功能可以组织在下面的模板中
***ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))****ggplot(<DATA>) +
<GEOM_FUNCTION>(aes(<MAPPINGS>))****ggplot(data = <DATA> , mapping = aes(<MAPPINGS>)) +
<GEOM_FUNCTION>()****ggplot(<DATA> , aes(<MAPPINGS>)) +
<GEOM_FUNCTION>()***
散点图

照片由 Gábor Juhász 在 Unsplash 上拍摄
数据集- 虹膜

作者图片
基本散点图
***ggplot(data_iris) +
geom_point(aes(x = Sepal.Length , y = Sepal.Width),
color = 'blue', size = 4, pch = 19) +**
ggtitle("Basic Scatter Plot", subtitle = "iris") +
xlab("SEPAL LENGTH") +
ylab("SEPAL WIDTH") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold.italic',
color = 'darkgreen',
size = 10, angle = 0),
axis.text.y = element_text(face = 'bold',
color = 'blue',
size = 10, angle = 45))*

作者图片
散点图,通过颜色区分特征&形状
***ggplot(data_iris) +
geom_point(aes(x = Sepal.Length , y = Sepal.Width,
*color = Species, shape = Species*), size = 4) +**
ggtitle("Scatter Plot with feature differentiation - 1") +
xlab("SEPAL LENGTH") +
ylab("SEPAL WIDTH") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold.italic',
color = 'darkgreen',
size = 10, angle = 0),
axis.text.y = element_text(face = 'bold',
color = 'blue',
size = 10, angle = 45))*

作者图片
散点图,按尺寸区分特征&透明度
***ggplot(data_iris) +
geom_point(aes(x = Sepal.Length , y = Sepal.Width,
*size = Petal.Width, alpha = Petal.Length*)) +**
ggtitle("Scatter Plot with feature differentiation - 2") +
xlab("SEPAL LENGTH") +
ylab("SEPAL WIDTH") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold.italic',
color = 'darkgreen',
size = 10, angle = 0),
axis.text.y = element_text(face = 'bold',
color = 'blue',
size = 10, angle = 45))*

作者图片
线形图

艾玛·露易丝·科默福德在 Unsplash 上拍摄的照片
数据集- 名称

作者图片
基本线条图
***ggplot(data_names %>% filter(name == 'Helen')) +
geom_line(aes(x = year, y = n),
lwd = 1.25, color = 'darkgreen') +**
ggtitle("Basic Line Plot", subtitle = "name - Helen") +
xlab("YEAR") +
ylab("NUMBER") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
根据颜色和线型区分特征的线图
***ggplot(data_names) +
geom_line(aes(x = year, y = n,
*color = name, lty = nam*e), lwd = 1.25) +**
ggtitle("Line Plot with feature differentiation") +
xlab("YEAR") +
ylab("NUMBER") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
条形图

数据集- 钻石

作者图片
基本条形图
**as.data.frame(table(data_diamonds$cut))* **ggplot(as.data.frame(table(data_diamonds$cut))) +
geom_bar(aes(*x = Var1, y = Freq*),
*stat = 'identity'*, fill = 'darkgreen') +**
ggtitle("Basic Bar Plot") +
xlab("CUT") +
ylab("COUNT") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
极坐标变换的基本条形图
**as.data.frame(table(data_diamonds$cut))* **ggplot(as.data.frame(table(data_diamonds$cut))) +
geom_bar(aes(*x = Var1, y = Freq, fill = Var1*),
*stat = 'identity'*) +**
ggtitle("Bar Plot with polar transformation") +
xlab("CUT") +
ylab("COUNT") + **coord_polar("y") +** theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
基本条形图- 2
***ggplot(*data_diamonds*) +
geom_bar(aes(x = cut, fill = cut),
color = 'lightblue') +**
ggtitle("Basic Bar Plot - 2") +
xlab("CUT") +
ylab("COUNT") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
堆积条形图
***ggplot(data_diamonds) +
geom_bar(aes(x = cut, *fill = clarity*),
color = 'lightblue') +**
ggtitle("Stacked Bar Plot") +
xlab("CUT") +
ylab("COUNT") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
相同高度的堆积条形图
***ggplot(data_diamonds) +
geom_bar(aes(x = cut, fill = clarity), *position = 'fill*') +**
ggtitle("Stacked Bar Plot (same height)") +
xlab("CUT") +
ylab("COUNT") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
分组条形图
***ggplot(data_diamonds) +
geom_bar(aes(x = cut, fill = clarity), *position = 'dodge'*) +**
ggtitle("Grouped Bar Plot") +
xlab("CUT") +
ylab("COUNT") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
带极坐标变换的堆积条形图
***ggplot(data_diamonds) +
geom_bar(aes(x = cut, fill = clarity)) +**
ggtitle("Stacked Polar (1)") +
xlab("CUT") +
ylab("COUNT") +
**coord_polar("y") +**
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
带极坐标变换的堆积条形图- 2
***ggplot(data_diamonds) +
geom_bar(aes(x = cut, fill = clarity)) +**
ggtitle("Stacked Polar (2)") +
xlab("CUT") +
ylab("COUNT") +
**coord_polar() +**
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
瓷砖图

数据集- 钻石

作者图片
**as.data.frame(table(data_diamonds$cut, data_diamonds$color))*
**ggplot(as.data.frame(table(data_diamonds$cut,
data_diamonds$color))) +
geom_tile(aes(x = Var1, y = Var2, fill = Freq)) +
*geom_text(aes(x = Var1, y = Var2, label = Freq),
color = "yellow") +***
ggtitle("Tiles Plot") +
xlab("CUT") +
ylab("COLOR") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
哑铃图

照片由 Anastase Maragos 在 Unsplash 上拍摄
数据集-life _ exp**

作者图片
***ggplot(data_life_exp) +
geom_dumbbell(aes(x = Y1967, *xend = Y2007*,
y = country, *group = country*),
*colour* = 'grey', size = 4,
*colour*_x = 'green', *colour*_xend = 'blue') +**
ggtitle("Dumbbell Plot (Life Expenctancy 1967 ~ 2007)") +
xlab('YEAR') +
ylab('COUNTRY') +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
散布矩阵图

数据集- 虹膜

作者图片
基本散点图矩阵图
***ggpairs(data_iris[ , 1:4]) +**
theme_bw()*

作者图片
具有特征差异的散点图
***ggpairs(data_iris, aes(color = Species)) +**
theme_bw()*

作者图片
柱状图

由 Clarisse Meyer 在 Unsplash 上拍摄的照片
数据集-钻石**

作者图片
基本直方图
***ggplot(data_diamonds) +
geom_histogram(aes(x = price), fill = 'blue',
color = "lightblue", binwidth = 500)+**
ggtitle("Basic Histogram") +
xlab("PRICE") +
ylab("Frequency") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
堆积直方图
***ggplot(data_diamonds) +
geom_histogram(aes(x = price, *fill = cut*),
color = "lightblue", binwidth = 500)+**
ggtitle("Stacked Histogram") +
xlab("PRICE") +
ylab("Frequency") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
密度图

数据集- 钻石

作者图片
***ggplot(data_diamonds) +
geom_density(aes(x = carat,
fill = cut), alpha = 0.7)+**
ggtitle("Density Plot") +
xlab("PRICE") +
ylab("Density") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
箱形图

由 CHUTTERSNAP 在 Unsplash 上拍照
数据集-钻石**

作者图片
基本方框图
***ggplot(data_diamonds) +
geom_boxplot(aes(x = cut, y = carat, fill = cut)) +**
ggtitle("Basic Box Plot") +
xlab("CUT") +
ylab("CARAT") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
分组方框图
***ggplot(data_diamonds) +
geom_boxplot(aes(x = cut, y = carat, *fill = clarity*)) +**
ggtitle("Grouped Box Plot") +
xlab("CUT") +
ylab("CARAT) +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
带极坐标变换的箱形图
***ggplot(data_diamonds) +
geom_boxplot(aes(x = color, y = price, fill = color)) +**
ggtitle("Box Plot with polar transform") + **coord_polar("y") +**
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
小提琴情节

图片由 Elijah M. Henderson 在 Unsplash 上拍摄
数据集- 钻石

作者图片
***ggplot(data_diamonds) +
geom_violin(aes(x = cut , y = carat, fill = cut)) +**
ggtitle("Violin Plot") +
xlab("CUT") +
ylab("CARAT") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者的意象
山脊图

保罗·厄尔在 Unsplash 上的照片
数据集- 钻石

作者图片
***ggplot(data_diamonds) +
geom_density_ridges(aes(x = carat , y = cut,
fill = clarity), alpha = 0.7) +**
ggtitle("Ridge Plot") +
xlab("PRICE") +
ylab("CUT") +
theme_bw() +
theme(axis.text.x = element_text(face = 'bold', size = 10),
axis.text.y = element_text(face = 'bold', size = 10))*

作者图片
我相信你会发现这篇文章非常有帮助,我建议你用自己的数据集进一步练习这些图表。这可能是视觉分析和您迈向数据科学之旅的良好开端!!**

Chirag Saini 在 Unsplash 上拍摄的照片
** [## 艾哈迈德叶海亚哈立德-经理,企业计划管理- EPMO,企业战略-机器人…
打破数据、战略、规划和执行之间的孤岛!这个简介是一个技术和人工智能专业人士目前…
www.linkedin.com](https://www.linkedin.com/in/aykhaled/)**
用 Julia 和 VSCode 实现数据可视化
使用 Julia 和免费的 VSCode IDE,您可以用很少的编程知识制作令人印象深刻的数据可视化。

除了茱莉亚语言标志外,所有图片均由 julialang.org 阿兰·琼斯创作
不久前,我写了一篇关于使用 Julia 和一个叫做 JuliaBox 的在线环境进行数据可视化的文章。当时 JuliaBox 是一项免费服务;不幸的是,它已被撤回。这是一个耻辱,因为它是一个伟大的服务。
因此,这篇文章的新版本使用了微软的 VSCode IDE(它不仅是免费的,而且也不太可能很快消失)。你需要安装 VSCode,Julia 语言,然后是针对 Julia 的 VSCode 扩展。如果这听起来很复杂,别担心,一点也不复杂。
朱莉娅
Julia 是一种相对较新的数据分析语言。它有一个高级语法,旨在易于使用和理解。有人称之为新 Python。
然而,与 Python 不同的是,它是一种编译语言,这意味着尽管它像 Python 一样容易编写,但它运行得更快,因为它被转换为更容易被计算机理解的低级代码。如果您必须处理需要大量处理的大型数据集,这非常有用。

与 Python 相比,Julia 对程序的布局也没有那么挑剔。
Julia 拥有现代编程语言的所有特性,但是在这里,我们将看看 Julia 的数据可视化能力。这些既令人印象深刻又易于使用。
一旦你安装了 Julia 和 VSCode,你就可以运行 Julia 代码并将你的可视化保存为标准的 png 文件。
安装 Julia 和 VSCode
要安装 Julia,你需要去 https://julialang.org/的下载适合你操作系统的版本。安装很简单,只需按照说明操作。
对于 VSCode,建议是一样的,除了你去 https://code.visualstudio.com 的下载。
准备好之后,启动 VSCode 并加载 Julia 扩展。
要做到这一点,你可以点击最左边面板中的扩展符号(四个矩形中的一个与另一个略有偏移)并在搜索栏中键入 julia 。

现在点击安装。
如果您已经正常安装了 Julia,这应该就是您需要做的全部工作。如果你做了一些不同的事情,你需要点击设置图标(齿轮)并手动输入julia.exe 的位置。您也可以在文件|首选项|扩展菜单中找到设置。
在继续之前,我必须告诉您,本文中的说明和代码是在 Windows 10 笔记本电脑上开发的。我不知道为什么它在 Linux 或 Mac 上应该有任何不同,但我没有在这些环境中测试过。
图书馆
在我们编写任何程序之前,我们需要加载我们想要使用的库。你只需要这样做一次,一旦你加载了库,它们就永远存在了。
通过打开一个 Julia 终端(也称为 REPL,用于读取、评估和打印循环)来实现这一点。
您可以通过多种方式启动 REPL。从视图菜单中找到命令面板,然后单击它或按 Ctrl+Shift+P。这会给你一个命令列表,其中一个是“朱莉娅:启动 REPL”(如果你看不到它向下滚动或开始在搜索栏中键入“朱莉娅”,命令就会出现),所以单击它,你会得到一个终端窗口。
在 REPL 窗口的 Julia 提示符下,键入以下内容
julia> using Pkg
这告诉 Julia 您将使用包管理器。然后键入以下内容并点击
julia> Pkg.add("Plots")
现在你需要添加几个我们将在教程中用到的包。键入以下几行:
julia> Pkg.add("CSV")
和
julia> Pkg.add("DataFrames")
稍后您将会用到这些软件包。
现在你可以开始了!因此,打开一个新文件,将其命名为“myPlots.jl”或类似的名称,但要确保它具有扩展名。所以 VSCode 知道它是什么类型的文件。你现在应该有两个面板打开,文件和 REPL。您仍然希望打开 REPL,因为这是打印程序输出的地方。
您的屏幕应该是这样的:

朱莉娅·图斯
和大多数其他语言一样,Julia 依赖于特定专业用途的代码库,我们只是下载了我们需要的代码。我们最初感兴趣的一个叫做图。这为我们提供了创建数据可视化的能力。
所以我们需要执行的第一段代码是这样的:
using Plots
这告诉 Julia 加载我们将用来创建可视化的库。
你的第一次想象
这里有一个简单的程序来确保一切正常。
using Plots
x = 1:10; y = rand(10); # These are the plotting data
plot(x,y, label="my label")
运行它将在 VSCode 的一个新选项卡中生成类似下图的内容(要运行代码,请在命令面板中找到该命令(Ctrl+Alt+P)将有许多选项,但您希望执行整个文件):

第一次朱莉娅可视化
这可能需要一点时间,因为当你第一次执行代码时,Julia 代码是动态编译的,这使得你第一次运行时速度变慢,但下一次会变得很快。因此后续的代码运行会更快。
让我解释一下代码是怎么回事。
x = 1:10;y =兰特(10);#这些是绘图数据
这位代码创建两位数据,一位称为
x ,另一位称为 y 。
x 被赋予从 1 到 10 的数字范围的值,而 y 被赋予 10 个伪随机数的范围(每个伪随机数将具有 0 到 1 之间的值)。因此,我们在这里有一个图形的基础:一个范围从 1 到 10 的 x 轴和 x 轴上每个点的 y 值。
下一步很简单。
plot(x,y,label= "我的标签")
这段代码调用一个函数来绘制图表,我们所做的就是给它 x 和 y 值——另外,我们还给它一个标签。
这很简单,但是,当然,我们真的想可视化一些真实的数据。
真实数据——天气
我有几个表,我在其他文章中用过。这是一组关于过去几十年英国伦敦天气的数据。我是从英国气象局提供的公共表格中推导出来的。
数据记录了每个月记录的最高温度、最低温度、降雨量和日照时数。我有两个文件,一个是完整的数据集,一个是 2018 年的,只有。它们是 CSV 格式的,就像您可以导入到电子表格中一样。
为了处理这些文件,我们需要另一个允许我们读取 CSV 文件的库。
我们可以看到在下一段代码中引用的库,即“使用 CSV ”,下面一行实际上是将数据读入变量 d 。
using CSV
d = CSV.read("D:notebooks/juliaplot/london2018.csv")
print(d)
运行代码的结果是,我们现在有了一个如下所示的数据表:

当然,您需要将文件名的路径更改为下载到的位置。
来自有意义数据的图表
我们下载的数据是一个表格,有 6 栏:年、月、 Tmax (最高温度)、 Tmin (最低温度)、 Rain (降雨量单位为毫米)和 Sun (日照时数)。
这是数据的子集(仅针对 2018 年),因此所有行中的年列具有相同的值。
条形图
所以,我们有的是 2018 年每个月的数据。如果我们想在柱状图中绘制每个月的最高温度,我们可以这样做:
using Plots
using CSV
d = CSV.read("D:notebooks/juliaplot/london2018.csv")
bar(d.Month,d.Tmax)
bar 是一个绘制条形图的函数(还有什么?)并且我们提供了 x 和 y 轴的列。我们通过使用数据表的名称,后跟列的名称来实现这一点。这两个名字用一个点隔开。
这里,我们将列月作为 x 轴,将 Tmax 作为 y 轴,因此我们在表格中绘制了 12 个月中每个月的最高记录温度。
将它放入一个新的代码单元并运行它,您会惊喜地(我希望)看到这个图表:

条形图
折线图
如果你想制作一个折线图,你可以做同样的事情,但是使用函数 plot
plot(d.Month, d.Tmax)

折线图
如果您想在同一张图表上绘制最高和最低温度,您可以这样做:
plot(d.Month, [d.Tmax, d.Tmin], label=["Tmax","Tmin"])
请注意,d.Tmax 和 d.Tmin,这两个值在方括号中组合在一起,并用逗号分隔。这是向量或一维数组的符号。此外,我们还为线条添加了标签,这些标签以相同的方式分组。我们得到了这样一个图表:

散点图
或者散点图怎么样?散点图通常用于查看是否可以在数据中检测到模式。这里我们绘制了最高温度与日照时数的关系图。正如你所料,这是一种模式:一种明显的相关性——日照时间越长,气温越高。
scatter(d.Tmax, d.Sun)

圆形分格统计图表
我们拥有的数据并不适合被描绘成饼图,所以我们将再次生成一些随机数据— 5 个随机数。
x = 1:5; y = rand(5); # These are the plotting data
pie(x,y)

柱状图
现在,我们将加载更多的数据:
d2 = CSV.read("londonweather.csv")
这类似于我们一直使用的数据表,但更大,因为它涵盖了几十年的数据,而不仅仅是一年。这给了我们大量的降雨量数据,这样我们就可以看到伦敦在一段较长的时间内的降雨量分布。要创建直方图,我们运行以下代码:
直方图(d2。Rain,label= "降雨")
所以整个程序看起来像这样:
using Plots
using CSV
d2 = CSV.read("d:notebooks/juliaplot/londonweather.csv")
histogram(d2.Rain, label="Rainfall")
这是结果。

保存图表
在 VSCode 环境中看到这些图表当然很好,但是为了有用,我们需要能够保存它们以便在我们的文档中使用它们。
您可以像这样保存图表:
histogram(d2.Rain, label="Rainfall")
savefig("d:notebooks/juliaplot/myhistogram.png")
运行此代码时,不会显示图表,但会以给定的文件名保存。
结论
我希望这是有用的——我们已经查看了 Julia Plots 中可用的基本图表。朱莉娅的故事远比我们在这篇短文中看到的要多,你也可以用情节做更多的事情,但我希望你已经发现这篇介绍已经激起了你探索更多的欲望。
下载
右键单击下面的链接下载文件,然后将它们复制到 Julia 将使用的目录中。数据文件在这里: london2018.csv 和 londonweather.csv
一如既往,感谢阅读。如果你想知道我什么时候发表新文章,请考虑在这里注册一个电子邮件提醒。
如果你不是一个媒体订阅者,那就注册吧,这样你就可以每月花 5 美元阅读尽可能多的文章。在这里注册,我会赚一点佣金。
使用 R 的数据可视化手册:初学者教程

动手教程
以更互动的方式创建我们的数据可视化
目录(仅适用于 web)
1 [What’s leaflet?](/data-visualization-with-leaflet-using-r-eea044c0c328#f65e)
2 [Interaction Features](#b0ea)
3 [Prerequisites](#69bd)
4 [Let’s Create the Data Viz](#7752)
5 [Recap](#7432)
6 [Conclusion](#5cd8)
7 [References](#150f)
传单是什么?
he leaflet 是一个开源库,可以轻松地实现空间数据可视化。因为它是一个开源库,并集成到任何*台和编程语言中,所以它目前成为世界上最流行的地图库。从历史上看,这份传单是由 Vladimir Agafonkin 于 2011 年首次开发的。
先决条件
在我们开始构建可视化之前,确保我们满足以下要求。
- 有几个库的 R 编程语言,如
**leaflet**、**leaflet.extras**、**dplyr** - 数据由位置点(纬度和经度)和附加信息组成。您可以在这里 轻松下载样本数据
- 良好的互联网连接
让我们创建数据,即
用 R 构建一个脚本来创建传单地图非常简单。但是,如果我们想建立一个交互式的美丽的地图,当然,一些脚本必须添加。下面的脚本将创建我们的简单地图(实际上这很酷)。为什么?因为我们已经给我们的标记添加了一些信息,如地点的名称、地址、经度、纬度、主管、和学生的姓名,而不是只有标记。单击标记后,该信息将通过弹出窗口显示。
leaflet(data.location) %>%
addProviderTiles(providers$OpenStreetMap) %>%
addMarkers(lng = ~long,
lat = ~lat,
popup = paste(paste('<b>Office:</b>',
data.location$place),
paste('<b>Address:</b>',
data.location$address),
paste('<b>Lat:</b>',
data.location$lat),
paste('<b>Long:</b>',
data.location$long),
paste('<b>Supervisor:</b>',
data.location$supervisor),
data.location$student1,
data.location$student2,
data.location$student3,
sep = '<br/>'),
label = ~place,
group = 'data.location')
好的,让我们在地图上添加一些特征。在放大和缩小每个位置后,最好将我们的视图重置为默认值。所以,我们可以添加一个重置地图按钮。此外,我们有一个搜索功能来简化我们的搜索,只需输入我们的位置名称,算法就会根据我们的关键字显示相关的结果。所以,只需在前一个脚本的底部添加以下脚本即可。
addResetMapButton() %>%
addSearchFeatures(
targetGroups = 'data.location',
options = searchFeaturesOptions(zoom = 15,
openPopup = TRUE,
firstTipSubmit = TRUE,
autoCollapse = TRUE,
hideMarkerOnCollapse = TRUE))
好,然后,我们添加测量按钮,并突出显示它的一般信息或标题。对于 measure 按钮,正如它的名字一样,它将向我们显示两点或更多点之间的距离。我们可以利用这个特性来估计两个城市之间的距离。如果遇到之字形路线,可以逐点画一条直线。测量单位必须根据我们的需要来设置,例如以米为单位。最后,为了显示我们的一般信息,最好添加一个信息框。
addMeasure(
position = 'bottomleft',
primaryLengthUnit = 'meters',
primaryAreaUnit = 'sqmeters',
activeColor = '#3D535D',
completedColor = '#7D4479') %>%
addControl("<P><b>Masterpiece Statistics 53</b>
<br/>Search for offices/ industries<br/>in Java by name.</P>",
position = 'topright')
概述
概括一下我们的脚本,我们可以正确地运行下面的脚本,瞧,我们的地图已经准备好解释并开始生产了。
完整版本的数据脚本,即使用传单
我们可以看看我们的地图,如下图所示。

使用传单的数据可视化(图片由作者提供)
我们可以试试搜索的功能。例如,根据我们以前的代码,它将从数据中读取任何输入。

从传单中搜索的特征(图片由作者提供)
结论
因此,我们可以很容易地使用传单作为我们的工具来可视化的空间数据。它提供了许多功能,如搜索功能、缩放等。传单也很容易部署到 HTML 中。
参考
[1]伍德拉夫,穆林斯,琼斯 宣传单:制作网络地图!(2014)。
[2]诉阿加丰金。 宣传单:一个面向移动友好的交互式地图的开源 JavaScript 库(2019)https://leafletjs.com/index.html。
Python 中 Matplotlib 的数据可视化
破解数据科学就业市场的最佳实践

在分析数据之前,首先要做的事情之一就是数据可视化。在 Python 中,有许多高质量的可视化库。最流行的通用可视化库是 Matplotlib,它主要致力于生成静态出版物质量的 2D 和 3D 图形。我们可以将它用于许多不同的图,如直方图、条形图、热图、线图、散点图等。
Matplotlib 基础
在 Matplotlib 中,您将会遇到和使用一些重要的概念,以及它们的含义或作用。

Matplotlib 中的绘图元素
- 轴—这代表一条数字线,用于确定图形界限。
- 轴——这些代表我们所理解的情节。一个图形可以包含尽可能多的轴。
- 艺术家——指的是你能在你的图形上看到的一切,例如
collection对象、Line2D对象和Text对象。请记住,大多数艺术家都在轴上。 - 图形—指您正在处理的整个图形。
一个图形可以包含多个轴实例,例如,在一个图形中显示多个面板,或者在另一个轴实例中显示插图。
基本 Matplotlib 函数
Matplotlib库一开始看起来可能相当复杂,但是有了基本的编码知识,对你来说应该会更容易。以下是您将在 Matplotlib 中使用的绘图列表。
- 箭筒-用于创建 2D 箭场
- 步长(step )-用于创建步长图
- Stem-用于构建 stem 图
- 散点图(scatter )-创建 x 相对于 y 的散点图
- 堆叠图-用于为堆叠区域创建图
- 绘图(plot )-为轴创建标记或绘图线
- 极坐标(polar )-创建极坐标图
- 饼图—创建饼图
- 条形图-创建水*条形图
- 条形图-创建条形图
- 箱形图-创建须状和箱形图
- 直方图—用于创建直方图
- Hist2d 用于在 2d 创建直方图
此外,如果您经常使用图像,您应该使用以下图像功能。
- Imshow —用于显示坐标轴上的图像
- Imsave —用于以图像文件的形式保存数组
- Imread —用于将文件从图像读入数组
做中学
这本书里的所有脚本都是通过 Jupyter 笔记本执行的。因此,您应该安装 Jupyter 笔记本或在 Saturn Cloud 上创建一个帐户。
完整的源代码
导入 Matplotlib
让我们看看如何使用它。我们必须首先从我们的Matplotlib包中导入pyplot模块,然后才能创建一个图。

设置样式
我们将使用plt.style指令为我们的人物选择合适的美学风格。这里我们将设置默认样式,这确保我们创建的绘图使用默认的 Matplotlib 样式。

图片由 Matplotlib 提供
简化,执行以下命令。

你也可以使用不同的风格。点击此处进一步阅读。请注意,从 Matplotlib 版本 1.5 开始支持这里使用的样式表,因此如果您使用的是 Matplotlib 的早期版本,则只有默认样式可用。
绘制函数
我们将学习如何用 Python w/ Matplotlib 绘制正弦波。我们将绘制sin(x)及其在区间0和2π之间的倍数和次倍数角度。
NumPy库有sin()函数,它接受一组值并为它们提供正弦值。

使用以下命令,将您的绘图的静态图像嵌入笔记本中。

math库将帮助定义pi来生成 x 轴的随机值。

计算每个样本在处的正弦波值,然后指定 x 轴和 y 轴标签以及图标题,如图所示。

线条图
我们要绘制的第二个图是线形图。线形图是所有 Matplotlib 图中最简单的一种。线形图主要用于绘制两组数值之间的关系。
现在,我们创建两个不同风格的独特系列。使用linspace ()功能确定 x 坐标。x坐标从0开始,到20结束,因此您应该有以下函数。

按以下顺序在你的坐标轴上画线。

在上面的例子中,作为默认线条的第一条是实线,而第二条是虚线。
调整线条的颜色和样式
要调整颜色,可以使用 color 关键字,该关键字接受一个字符串参数,表示几乎任何可以想象的颜色。颜色可以通过多种方式指定。

如果没有指定颜色,Matplotlib 将自动循环显示多行的一组默认颜色。
同样,我们可以使用linestyle关键字调整线条样式,如下所示。

调整绘图的轴限制
调整轴极限的最基本方法是使用plt.xlim()和plt.ylim()方法。

如果您想让任一轴反向显示,只需执行此命令。

此外,我们还可以通过传递一个指定[x-min, x-max, y-min, y-max]的列表来设置 x 和 y 限制。

标记图
我们可以创建图的标签,如标题、轴标签和简单的图例。
标题和轴标签是最简单的标签,如下所示。

可以通过plt.legend()方法创建图例。

对数图
对数图本质上是一个基本图,但它是在对数标度上设置的。这与普通线性标度的区别在于,间隔是按照大小顺序设置的。我们有两种不同类型的对数图。
- 双对数图。
- 半对数图。
例如,执行下面的代码片段来显示对数图。

散点图
散点图用于以散点的形式绘制两个数字列之间的关系。通常,对于 x 轴上的每个值,如果 y 轴上有多个值,则使用散点图。
使用plt.scatter()功能创建散点图,如下所示。例如,我们使用来自sklearn库的虹膜数据,其中每个样本都是三种类型的花中的一种,其花瓣和萼片的大小已经过仔细测量。

我们可以同时探索数据的四个不同维度:每个点的(x, y)位置对应于萼片长度和宽度,该点的size与花瓣宽度相关,而color与特定种类的花相关。
如何绘制带误差线的条形图?
误差线对问题解决者很有用,因为误差线显示了一组测量值或计算值的置信度或精度。可以用plt.errorbar()方法创建一个基本的误差栏。

我们使误差线比点本身更亮,如下所示。

使用具有双界面的多个轴和图形
为了创建多个支线剧情,我们也可以使用subplot()函数在主图中创建多个绘图区域。

此外,我们可以使用下面的代码从上面的图中创建垂直分割。

如何创建条形图?
条形图用于显示与分类数据相关的值。然而,plt.bar()函数接受一个位置和值的列表,x 的标签由plt.xticks()提供。
例如,我们显示了越南电信公司 2019 年的服务收入如下。

我们也可以在同一个图表中包含多个 X 值。Viettel 是 2019 年越南最大的纳税人,具体如下。

对于堆叠条形图,我们需要提供参数bottom,这通知 matplotlib 条形图应该从哪里开始,因此我们将添加下面的值。

绘制直方图
直方图是概率分布的图形表示。事实上,直方图只是一种特定的条形图。
以下脚本从正态分布中提取 1000 个值,然后生成 20 个柱的直方图。

绘制箱线图
通过方便地显示一组值的中值、四分位数、最大值和最小值,箱线图允许您比较值的分布。以下脚本显示了从正态分布中抽取的 100 个随机值的箱线图。

饼图
要比较数量的相对重要性,没有什么比饼图更好的了。

将数字保存到文件中
要将图形保存到文件中,我们可以使用savefig方法。这个方法接受一个字符串,输出文件名作为第一个参数,还有几个可选的关键字参数。例如,要将前面的图形保存为 PNG 文件,您可以运行以下命令。

使用savefig的transparent=True 参数也可以使图形画布透明。

输出。

my_figure.png 文件
都是关于用 Python 中的 Matplotlib 进行数据可视化。
参考
[2]https://www.saturncloud.io/s/
[3]https://matplotlib . org/3 . 2 . 1/gallery/style _ sheets/style _ sheets _ reference . html
用 Python 实现数据可视化

(图片由作者提供)
终极指南
掌握 python 的数据可视化库(matplotlib,seaborn,pandas,和 plotly。)
《一图胜千言》
——弗雷德·r·巴纳德
数据可视化是数据的视觉(或图形)表示,以便在数据中找到有用的见解(即趋势和模式),并使数据分析过程变得更加容易和简单。
数据可视化的目的是在第一眼就能快速清晰地理解数据,并使其在视觉上可以呈现以理解信息。
在 Python 中,有几个全面的库可用于创建高质量、有吸引力、交互式和信息丰富的统计图形(2D 和 3D)。
Python 中一些流行的数据可视化库
- Matplotlib 就是这样一个流行的可视化库,它允许我们创建高质量的图形,包括散点图、折线图、条形图、直方图和饼图。
- Seaborn 是 Python 的另一个数据可视化库,它构建在 Matplotlib、之上,拥有一个具有吸引力设计的高级接口。此外,它减少了产生与 Matplotlib 相同结果所需的代码行数。
- Pandas 是 Python 中另一个很棒的数据分析库(数据操作、时序分析、集成数据索引等)。). Pandas Visualization (构建于 Matplotlib 之上)是 Pandas library 的一个工具,它允许我们更快更容易地创建数据帧(以列和行的表格形式排列的数据)和系列(能够保存任何类型数据的一维标签数组)的可视化表示。
- Plotly 库用于创建交互式和多维绘图,通过提供更好的数据可视化,使数据分析过程更容易。
通过这篇文章,我们将能够通过学习如何在不同的 Python 库中绘制数据来可视化不同形式的数据,并理解在哪里适当地使用哪一个。
注意:我们可以使用Google co laboratory来避免安装库的过程。只需将所有库导入笔记本即可使用。
了解 Maplotlib 的基础知识

(图片由作者 ) 图中的元素
- 图:一切都被绘制的整个区域。它可以包含多个带轴的图、图例、轴范围、网格、图标题等。
- 轴:图形下方正在构建图形的区域(或图形出现的区域)被称为轴。一个图形中可以有多个轴。
- 轴:这是图表中的数字线,代表绘图的数值范围(上图中提到的 X 轴和 Y 轴)。在多维图形的情况下,图形中可以有两个以上的轴。
- 图标题:标题位于轴上方的中央,给出了图的概况。
导入数据集
在本文中,我们将在不同的地方使用 虹膜数据集 ( 作为一个例子),它是免费的,并且是常用的(因为它是模式识别文献中最著名的数据库之一)。
我们可以通过两种方式导入该数据集:
1.使用 Scikit-learn 库:
使用 Scikt-learn 库导入虹膜数据集
无需下载.csv文件,我们可以使用 python 中的 sci-kit 学习库直接导入工作空间中的数据集。

(图片由作者 ) 数据集中的前五个头
2.使用熊猫图书馆:
使用 Pandas 库导入数据集
使用上面的(通过导入 Pandas 库)代码,并下载数据集的.csv格式,我们可以在我们的工作空间中导入数据。这些是iris数据集中的前五个元素:

(图片由作者 ) 数据集中的前五个头
上述两种方法都可以用于导入数据集和创建图表,但我们将使用后者,因为数据的可读性更好(正如您可以看到的两种方法的输出结果的差异)。
Matplotlib 入门
我们首先使用以下代码在笔记本中导入库:
导入 matplotlib
该库中有多种样式可用于绘制地块。
线条图
折线图或折线图表示一个系列(连续)中的数据,沿数字线显示数据的频率。它可以用来比较数值组。这是我们可以用 python 制作的最简单的图表之一。
基本线图的代码
这里,使用numpy linspace()函数,我们将生成数据点并将其存储在变量x中,计算x值的*方并将其存储在另一个变量y中。
我们将使用plt.plot()功能绘制图形,使用plt.show()显示图形。

(图片由作者)y = x 的折线图
我们可以给我们的图添加更多的函数,使它更容易解释。
- 添加标签:
x-axis label和y-axis label我们将分别使用plt.xlabel()和plt.ylabel()函数。 - 我们也可以使用
plt.title()函数给我们的图一个标题。 - 图中的网格可通过调用
plt.grid(True)函数简单应用(使数据更容易解释)。
随着这些功能的增加,图表变得更加易读和易于分析。

(图片由作者)y = x 的折线图
我们可以在绘图中添加多条线,并通过使用不同的颜色和一些其他功能来区分它们:
在上面的代码中,我们添加了另一个变量z=x**3 (z=x)并更改了线条的样式和颜色。
要改变线图中线条的颜色,我们必须在plt.plot()函数中添加color=''参数。
要改变线图中线条的样式,我们必须在plt.plot()函数中添加linestyle=’’参数(或者我们可以简单地添加' * '或'-',等等)。

(图片由作者)y = x 和 z=x 的折线图
这使得信息的提取和数据变量的比较更加容易。
同样,我们也可以为数学函数创建图:
在这里,我们为sin(x)和cos(x)创建了一个情节。
我们可以通过使用 x 轴的功能plt.xlim(lower_limit,upper_limit)和 y 轴的功能plt.lim(lower_limit,upper_limit)来调整轴的限制。
为了进一步标记该图,我们可以添加具有plt.legend()功能的legend,这将有助于识别哪条线代表哪种功能。

(图片由作者)sin(x)和 cos(x)的折线图
支线剧情
为了在同一个图形中创建单独的(多个)图,我们可以使用plt.subplots(num_rows,num_cols)功能。这里每个支线剧情的细节可以不同。
创建支线剧情
plt.sublots()函数创建子情节的图形和网格,其中我们可以通过传递一个int值作为参数来定义列和行的数量。此外,我们还可以通过使用gridspec_kw={'hspace': , 'wspace': }参数来改变子选项之间的间距。之后,通过简单地使用子情节的索引号,我们可以很容易地绘制图形。

(图片由作者 ) 一张图中的四个支线剧情
散点图
这种图使用“点”来表示不同变量的数字数据。
散点图可用于分析一个变量如何影响其他变量。(我们可以使用任何数量的变量来绘制图表。)
我们将使用dataset_name.plot()函数来创建图形,在参数中,我们将应用带有标签x-axis和y-axis的kind = 'scatter’。看看下面提到的例子(虹膜数据集)。
这里,我们比较了数据集中不同种类的花的petal length和petal width。

(图片由作者 ) 虹膜数据集散点图
但是,在这里,我们很难从这个图中分析和提取信息,因为我们无法区分存在的类别。
所以现在,我们将尝试另一种方法来解决我们的问题。在此方法中,我们将使用plt.scatter()创建一个散点图。
为了根据花卉的种类改变点 的颜色,我们可以创建一个字典,存储与种类名称相对应的颜色。通过使用for循环,我们创建了三种不同物种的单个散点图(每种用不同的颜色表示)。
这个情节比上一个好得多。物种的数据变得更容易区分,并为更容易的信息分析提供了总体清晰性。

(图片由作者 ) 虹膜数据集彩色散点图
条形图
条形图可用于比较分类数据。我们必须提供频率和类别,我们希望在图上表现出来。
使用 matplotlib 绘制条形图
这里我们使用 iris 数据集来比较不同种类的花的数量(然而,它们等于 50)。为了找到数据集中每个唯一类别的计数,我们使用了value_counts()函数。下面代码中的变量species和count存储每个唯一类别的名称(.index函数)和每个类别的频率(.values函数)

(图片由作者 ) 虹膜数据集中不同种类花朵的数量
这是最基本的条形图,您可以尝试该图的一些变化,如同一图中的多个条形图,改变条形的宽度(使用width=参数)或创建堆积条形图(使用bottom参数)。
箱线图
箱线图通过绘制基于样本最小值、下四分位数、中值、上四分位数和样本最大值的数据分布来帮助绘制和比较值(称为五位数汇总)。这可以帮助我们分析数据,找出数据中的异常值和变化。
箱形图
我们在这里排除了物种列,因为我们只比较 iris 数据集中所有花的petal length, petal width, sepal length, sepal width。我们使用.boxplot()功能创建盒状图。

(图片由作者 ) 方框图
直方图
直方图用于表示数据的频率分布(或者我们可以说是概率分布)。我们必须使用plt.hist()函数来创建直方图,我们还可以为该图定义bins(即,将整个数值范围分解为一系列区间,并计算落入每个区间的数值计数)。
直方图是一种特殊的条形图。
使用 matplotlib 创建直方图的代码

(图片由作者 ) 直方图
误差线
误差线是一个很好的工具,通过直观地显示数据的变化来找出一组数据之间的统计差异。它有助于指出数据分析过程中的误差和精度(并决定模型的质量)。
用于创建误差线 matplotlib 的代码
为了绘制误差线,我们必须使用errorbar()函数,其中x和y是数据点位置,yerr和xerr定义误差线的大小(在这段代码中,我们只使用了yerr)。
我们还可以通过使用fmt参数来改变误差线的样式和颜色(就像在这个特定的例子中我们将样式设置为点’o’),使用ecolor来改变点的颜色,使用color参数来改变垂直线的颜色。
通过在plt.legend()函数中添加loc = ''参数,我们可以确定图例在图中的位置。

(图片由作者 ) cos(x)误差棒图
热图
热图用于以‘颜色编码图像图’(数据中的值以颜色表示)的形式表示分类数据,以找到数据中特征的相关性(聚类分析)。在热图的帮助下,我们可以直观地对数据进行快速而深入的分析。
使用 matplotlib 创建热图
在本例中,我们使用 iris 数据集来创建热图。.corr() 是熊猫的数据框函数,用来寻找数据集中的相关性。热图是通过使用.imshow()函数创建的,其中我们将数据集的correlation、cmap(用于设置绘图的样式和颜色)作为参数传递。为了添加工具栏,我们使用了.figure.colorbar()函数。最后,为了添加注释(你可以在色块上看到提到的值),我们使用了两个 for 循环。

(图片由作者 ) 虹膜数据集热图
饼图
饼图用于查找数据类别组成之间的相关性(可以是数据的百分比或比例),其中每个切片代表一个不同的类别,提供整个数据的摘要。
饼图 matplotlib
为了绘制饼图,我们必须使用plt.pie()函数。为了给绘图带来 3D 效果,我们使用了shadow = True参数、explode参数来显示与绘图其余部分分开的类别,为了显示每个类别的百分比,我们必须使用autopct参数。为了使圆成比例,我们可以使用plt.axis('equal')功能。

(图片由作者 ) 饼状图 matplotlib
海生的
凭借 seaborn 的高级界面和吸引人的设计,我们可以用更好的可视化效果创造出惊人的情节。此外,所需的代码行数在很大程度上减少了(与 matplotlib 相比)。
在工作区中导入库的代码:
导入 seaborn 库
线形图
我们可以通过使用sns.lineplot()函数在 seaborn 库中简单地创建线图。
在这里,我们可以使用库中可用的.set_style()功能改变网格/背景的颜色。并且使用sns.lineplot()功能我们可以绘制折线图。

(图片由作者 ) 折线图使用 seaborn 库
散点图
有了 seaborn 库,我们只用一行代码就可以创建散点图!
使用 seaborn 库的散点图
这里,我们使用了**FacetGrid()** 函数(通过它我们可以快速浏览我们的数据集)来创建绘图,我们可以在其中定义hue(即散点的颜色)和.map函数来定义图形类型。(创建散点图的另一种方法是使用sns.scatterplot()

(图片由作者 ) 散点图使用 seaborn 库
条形图
我们可以使用sns.barplot()函数在 seaborn 库中创建一个柱状图。

(图片由作者 ) 棒图使用 seaborn 库
直方图
我们可以使用sns.distplot()函数在 seaborn 库中创建一个直方图。我们还可以使用这个库进行数据分析,计算概率分布频率(PDF)、累积分布频率(CDF)、核密度估计 (KDE) 。
Seaborn 提供了比 matplotlib 更多的数据可视化特性。

(图片由作者 ) 直方图使用 seaborn 库
热图
Seaborn 在创建热图方面非常高效,它显著减少了创建图表的代码行。
matplotlib 中的多行代码减少到只有两行!

(图片由作者 ) 使用 seaborn 库的热图
配对图
这是 seaborn 图书馆提供的一种独特的情节。这绘制了数据集中的成对关系(在单个图中)。对于数据分析来说,这是一个非常棒的工具。
通过使用sns.pairplot()功能,我们可以创建配对图(height用于调整图的高度)。

(图片由作者 ) Pairplot 使用 seaborn 库
熊猫可视化
这个库提供了一种使用 pandas 数据框和数据结构绘制图表的简单方法。这个库也是建立在 matplotlib 之上的,因此需要更少的代码行。
直方图
用这个库创建直方图非常简单,我们只需使用.plot.hist()函数。我们也可以通过使用subplots=True参数在同一个图中创建支线剧情。

(图片由作者 ) 直方图使用熊猫库
线形图
通过使用.plot.line()函数,我们可以使用该库创建线图。图例也会自动添加到该库中。

(图片由作者 ) 线条图使用熊猫库
Plotly
有了这个库,我们就可以创建多维互动剧情了!这是一个易于使用的高级接口库。我们可以使用下面的代码导入这个库:
4D 图(虹膜数据集)
您可以试着自己运行这段代码来检查和处理这个图。

(图片由作者 ) 互动多维剧情
结论
我希望通过这篇文章,您能够使用 python 中的不同库来可视化数据,并开始分析它。
为了更好地理解这些概念,我建议您尝试编写这些代码。继续探索,我相信你会发现新的特性。我在文档末尾分享了我的笔记本储存库,供您参考。
如果你有任何问题或意见,请发表在评论区。
permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/kk189/Hello/blob/master/data_visualization.ipynb)
如果您想改进编写代码的方式,请查看我们的另一篇文章:
如何编写高效、更快的代码来提高程序的性能?
medium.com](https://medium.com/swlh/how-to-write-efficient-and-faster-code-67567e74ef87)
最初发表于:www.patataeater.blogspot.com
Resources:
[https://plotly.com/](https://plotly.com/)
[https://matplotlib.org/](https://matplotlib.org/)
[https://pandas.pydata.org/](https://pandas.pydata.org/)
[https://seaborn.pydata.org/](https://seaborn.pydata.org/#)
使用 seaborn 库实现数据可视化
7 个 seaborn 图表,用于快速有效的数据分析

图片由 Pixabay 的 Mudassar Iqbal 提供
简介
如果您还没有使用 Seaborn 进行数据探索,这是学习一些基本情节的绝佳时机。在本文中,我们将介绍几种可以在 Seaborn 中使用的不同类型的图表:
计数图
条形图
柱状图
接合图
配对图
箱线图
小提琴剧情
我们将在著名的 Iris 数据集上演示如何使用它们。
为什么要用 seaborn?
从库站点中摘录的这句话很好地描述了使用 Seaborn 的原因:
“Seaborn 是一个基于 matplotlib 的 Python 数据可视化库。它提供了一个高级界面,用于绘制有吸引力且信息丰富的统计图形。”
我想强调一下【高层接口】和一个形容词【吸引人】。这两者的结合使得 Seaborn 对我们这些用户来说非常有吸引力。它基本上允许你用最少的努力创建漂亮的图形。
安装 seaborn
安装 Seaborn 非常简单。只要从命令行运行这个命令,您就应该准备好了。
pip install seaborn
加载数据集
由于我们将展示如何使用真实数据集的图表,我们应该首先加载它。下面的代码使用 seaborn load_dataset 函数将著名的 Iris 数据集加载到数据框中。
import seaborn as sns;
df = sns.load_dataset("iris")
df.head()
让我们调用 info()函数来获取一些附加信息。
df.info()

该数据有 5 列 150 个条目。每个条目是一朵花,前四列是描述花的尺寸的浮点数,最后一列是表示花的分类的字符串。我们应该有三个不同的鸢尾种类。
计数图
我们可以使用 countplot 来可视化这个数据集上的物种分布。
计数图是可视化分类变量数值计数的理想选择。
sns.countplot(x ='species', data=df);

正如我们提到的有三类:刚毛,云芝,,和海滨锦鸡儿。我们还可以看到,这是一个*衡的数据集,每个花卉类别有 50 个例子。
柱状图
柱状图是一种广泛用于比较连续变量*均值的图表。让我们看看如何将它应用于虹膜数据集。
import matplotlib.pyplot as plt
sns.barplot(data=df)
plt.xticks(rotation=45)

请注意,该图自动排除了分类变量。对于数字列,现在很容易读取每个测量的*均值。此外,每个测量都有黑色的误差线(黑线在上面)。可以通过更改 x、y 和色调参数来操纵这种类型的图形。所以玩吧!
我还必须在代码末尾添加一个 matplotlib 函数,否则 x 轴上的标签会重叠。
直方图
如果您想在 Seaborn 中绘制直方图,我只想指出,它不像您在本文中遇到的以前的图表那样需要数据框。相反,您只需要向它传递一个数据序列,例如数据帧中的一列。
让我们在萼片长度栏上试试。
sns.distplot(df['sepal_length'])

如你所见,结果是一个直方图。伴随它的蓝线是核密度估计(kde ),它比直方图本身提供了更多的分布信息。
但是我如何绘制整个数据帧的直方图呢?我需要一个 for 循环吗?您可以使用 for 循环来实现这一点,或者更好地使用 pairplot。
配对图
Pairplot 将为所有连续变量创建直方图,并可视化所有对之间的相关性。让我们来看看如何使用它。
sns.pairplot(data=df.drop(columns='species'), kind='reg');

那看起来非常有用。请注意,配对图将数据框作为其输入。
我还添加了种类参数,并将其设置为‘reg’(kind =‘reg’)。这是为了得到适合相关图的线性回归,因为我认为它有助于可视化。
Pairplot 还有一个色调参数,对于数据探索非常有用。色调应该是一个分类变量,允许你将一个数据集划分成更小的组。在我们的例子中,我们只有一个分类变量,即‘物种’。让我们看看如何在 pairplot 中使用它。
sns.pairplot(df, hue='species');

太好了!现在你可以看到变量之间的相关性与它的物种划分。
接头图
如果您处理包含大量变量的数据集,或者只想更深入地研究一对变量,您可以使用 jointplot。让我们看看萼片长度和萼片宽度的相关性。
sns.jointplot(data=df, x='sepal_length', y='sepal_width', kind='reg')

如你所见,这又是一个非常有用的信息。对于每个变量,我们在图的两侧有直方图和核密度估计,主要部分显示为带有线性回归线的单个点。
箱线图
允许我们检查连续变量分布的另一个有用的可视化是箱线图。它为我们提供了四分位范围信息,并允许我们看到异常值。
让我们看看如何使用来可视化我们的连续变量。
sns.boxplot(data=df)

如你所见,我们可以看到连续变量分布的快速概览。只有萼片宽度有异常值,它们在须的两侧(上下)。
您可以使用 x、y 和色调参数来进一步自定义箱线图。例如,你可以通过在前面的代码中添加 x 和 y 参数来查看不同花卉种类的萼片长度的分布。
sns.boxplot(data=df, x='species', y='sepal_length')

小提琴剧情
Violin 图类似于箱线图,它们允许我们通过显示核密度估计来查看分布。
让我们看看数据集的小提琴图。
sns.violinplot(data=df)

我们可以看到花瓣宽度的 kde 有两个峰值。我的猜测是,每一种花都可能导致不同的穗状花序。你可以进一步定制小提琴的情节来展示这一点。
sns.violinplot(data=df, x='petal_width', y='species')

看起来我的停职是正确的。每个花种都有不同的分布花瓣宽度变量。
总结
正如你所看到的,使用 Seaborn 制作有效且漂亮的可视化效果非常简单。我们在这里使用的大部分代码不超过一行!这个库非常直观和用户友好,即使对于还没有完全掌握 python 的人来说也是如此。
我建议你现在选择一个数据集,自己尝试一些情节!
最初发布于 aboutdatablog.com: 用 seaborn 库进行数据可视化,2020 年 7 月 23 日。
PS:我正在 Medium 和上撰写深入浅出地解释基本数据科学概念的文章。你可以订阅我的* 邮件列表 每次我写新文章都会收到通知。如果你还不是中等会员,你可以在这里加入。***
下面还有一些你可能喜欢的帖子:
学习如何使用折线图、散点图、直方图、箱线图和其他一些可视化技术
towardsdatascience.com](/9-pandas-visualizations-techniques-for-effective-data-analysis-fc17feb651db) [## 熊猫概况和探索性数据分析的第一行代码!
了解如何为自动 EDA 安装和使用 pandas profiling
towardsdatascience.com](/pandas-profiling-and-exploratory-data-analysis-with-line-one-of-code-423111991e58) [## Jupyter 笔记本自动完成
数据科学家的最佳生产力工具,如果您还没有使用它,您应该使用它…
towardsdatascience.com](/jupyter-notebook-autocompletion-f291008c66c) [## 9 大 Jupyter 笔记本扩展
改进笔记本电脑功能,提高您的工作效率
towardsdatascience.com](/top-9-jupyter-notebook-extensions-7a5d30269bc8)**
数据即诊所:改进排名图
无论是公司排名还是日常商品价格排名,媒体都有很多排名图表。一些渠道做到了这一点,而其他渠道往往会失败。

约书亚·戈尔德在 Unsplash 上拍摄的照片
人类是视觉动物。我们喜欢观察自然、动物和我们周围的一切生物。新闻帖子中的图片也是如此。我们喜欢让我们更接*故事的视觉层,而不仅仅是阅读纯文本。因此,我们的眼睛很可能会停留在文章中的一两张图片上。这就引出了今天的话题,排行榜。媒体喜欢排名,可以是根据年收入或员工数量对财富 500 强公司进行排名。
爱沙尼亚初创企业景观
我们爱沙尼亚人引以为豪的一件事就是我们的初创企业。对于爱沙尼亚以外的人来说,这里有一些你可能听说过的名字:
- 网络电话
- 转移方式
- 管道驱动
- 博尔特(原名 Taxify)
- Veriff
- 莫内塞
- 星际飞船技术公司
所有这些初创企业都来自波罗的海小国——爱沙尼亚,该死的,我们为他们感到骄傲。所以自然地,我们的媒体喜欢比较他们和他们的统计数据。今天的例子(再一次)来自 Delfi,并根据员工数量对这些初创企业进行排名。

资料来源:Delfi arileht。数据来源:初创爱沙尼亚
该图有 3 个不同的系列:
- 2018 年员工数量
- 2019 年的员工数量
- 员工增加/减少(Kasv)
对于 10 家公司来说,这使得 30 个不同的数据点被绘制在一个图表上,并且这些系列的配色方案非常相似。此外,由于它非常简洁,几乎没有任何空间来添加额外的上下文数字。这使得人们很难了解整个故事。因此,我们如何改善这一点,以更好地向公众说明?
你的使命,你是否应该选择接受它
我们今天的挑战是让这张图表更简单,同时显示额外的信息。这对于那些进一步研究图表和分析数据的人来说至关重要,但与此同时,这也将迎合对高水*数字感兴趣的更广泛的受众。我根据相同的数据创建了两个不同的选项,但是使用了两个不同的图表。
方案一:更进一步
有一种方法可以快速提升原有观想,而不需要做太多改变。我们可以将它保留为柱形图,但我们可以将它堆叠起来,而不是将 3 个不同的系列一个接一个地显示出来。这将把 3 个系列减少为 1 个,仅显示雇员,堆叠区域将显示逐年增加/减少。结果如下:

这样做的结果是一个更清晰的图表,您可以很容易地看到同比增长是正还是负,并显示所有 3 个高水*的数字:
- 2018 年员工数量
- 2019 年员工增减数
- 2019 年底员工总数
这是唯一的选择吗?不,肯定不是,但这是我们可以利用的。如果我们考虑排名(例如体育),他们倾向于从上到下,而不是从左到右,反之亦然。这也是我们的眼睛喜欢解释这些结果的方式。所以——回到制图板。
方案二:我们来排列一下
我准备用一个普通的条形图,而不是堆积柱形图。这一次我不想使用堆叠版本,因为我想使用额外的空间来引入更多的数字细节。

在选项 1 中,我使用了 3 种颜色来代表 2018 年和 2019 年期间员工的增加/减少。方案 2 使用 2 种颜色,一种代表 2018 年(灰色),一种代表 2019 年(蓝色)。我选择显示 2019 年底的员工人数,因为这是我们追求的关键数字。额外的数字细节已添加到条形内,并反映了 2019 年的增加/减少以及同比百分比变化。不同于关注总人数,年度同比数据清楚地表明,增长最高的是 Veriff,他从 65 名员工增加到 305 名员工,增加了 240 ,反映出 369% 的同比变化。
结论
生成不同的图形很容易,但让它们变得容易理解却是另一回事。我在本文中提出的两个选项以更有意义的方式引出了故事,而不是本文中提出的原始图表。
再一次,让我们不要考虑我们使用的图表和图形的视觉方面,而是更多地考虑如何让看到这些视觉化的人们容易地使用它们。
来源:
*** 数据&图形 ***—Delfi arileht—https://arileht . Delfi . ee/news/uudised/eesti-idufirmad-kasva sid-mullu-taas-Lendu-tousis-uus-staar?id=88948031
数据即使用 Python 和 Tableau:从 API 调用到托管仪表板
互动图表是视觉叙事的关键。

Tableau 仪表板,我们将在本文中创建。
构建信息图通常在您第一次浏览数据时就开始了。 Matplotlib、Seaborn 和 ggplot2 是经典的编程图表,而 Plotly 也大受欢迎。但对我来说,没有什么比得上画面的干净专业美感。在本文中,我们将抛开内联 Jupyter 笔记本图表,学习如何使用 Tableau Public 创建托管的交互式图表。
本文由三部分组成:
- 研究 — 你的主题是什么,你将如何提取数据?在本文中,我们将了解BLS 劳工统计局的 API。我们能够使用带有参数的 HTTP POST 请求来检索数据,这些参数包括每个 BLS 查询的查询 id。我们需要的数据是各州的失业数据。
- 数据清理 —使用 python,我们将调用 BLS API,并使用 Pandas 将数据清理成整齐的垂直格式。这可以用 Jupyter 笔记本或 Python 脚本来完成。数据将保存到 CSV 文件和 SQLite 数据库中。
- Tableau —创建一个 choropleth(地理)地图和一个树形地图,并将图表发布给 Tableau Public。我们将能够共享带有嵌入链接的图表。
您可以遵循我的 GitHub repo 中的查询和清理数据部分!这是一篇来自新冠肺炎疫情的失业分析的姊妹篇。
这个笔记本描述了几个查询美国劳工统计局 API 的例子,并把数据整理成一个…
github.com](https://github.com/rchardptrsn/COVID-Employment-Analysis)
第 1 部分:研究和查询数据
Bureau of Labor Statistics API 是一个 REST API ,它基于惟一的查询 id 提供数据。BLS 查询 id 基于许多因素,如州和行业。要找到查询 ID,您需要浏览到 BLS 数据库、表格&计算器并找到与您的数据相关的类别。各州的失业情况可以在“本地失业统计——一屏搜索”中找到。您会注意到每个查询都有一个惟一的 ID。如果您可以确定模式,您可以通过编程方式生成这些 id,而不是复制和粘贴。
第 2 部分:查询 API 和清理数据
在 GitHub repo 中,有一个名为 blspandas.py 的模块,它具有包装器函数,用于清理和执行检索数据的 HTTP POST 请求(Credit:BD Economics)。下面的脚本调用这些函数来创建一个查询 id 列表,执行 HTTP 请求,并将结果保存为 pandas 数据帧。
blspandas.py 模块的一个关键部分是clean_bls_data(combined_queries)函数。在我们运行df = blspandas.clean_bls_data(combined_queries)之前,我们的数据是这样的:

我们需要像《T2》一样的整齐垂直格式的数据。熊猫融化对于这种转变来说再合适不过了。
运行df = blspandas.clean_bls_data(combined_queries)后,数据如下所示:

清理数据的目标
为此,让我们思考一下我们最终需要什么。我们的目标是创建一个 choropleth 图和一个树形图,显示从 2020 年 1 月到 2020 年 6 月的失业率变化。这将描述新冠肺炎疫情对劳动力市场的影响,并显示哪些州没有反弹。
我们需要做的是找出每个州两个日期之间的失业率差异。我们将通过定位包含这两个日期的所有日期行,并从六月份的失业人数中减去一月份的失业人数。
产生的chg_emp数据帧如下所示:

这就是我们创造画面视觉效果所需要的一切!只需通过运行以下命令将chg_emp数据帧写入 CSV 文件:
chg_emp.to_csv('Change in unemployment by state.csv', index=False)
第三部分:画面
此时,要么注册 Tableau Public,要么购买该软件。作为一名学生,我可以免费注册并获得完整的桌面版本。
Choropleth 图
通过将 CSV 文件导入工作簿来加载数据。单击新工作表,并按如下方式进行配置:

你会注意到在“标记”下面还有其他选项来显示每个州的名称和失业情况。
树形地图
对于树形图,我们将显示相同的数据,但是以一种允许更多细节的方式,包括州名和失业率的变化。在标记下,您需要:
- 状态标签
- 失业百分比的颜色
- 失业百分比标签

创建仪表板
您可以通过单击“仪表板 1”并拖动两个工作表来创建仪表板。在这里,我将 Choropleth 排列在树状图的顶部。

推送到 Tableau Public
最后,我们将把 Tableau 工作簿推送到 Tableau Public。
为此,我们需要提取我们的 CSV 数据源。这将允许工作簿作为单个捆绑文件上传到 Tableau Public。

一旦摘录完成,我们可以将我们的工作簿发布到 Tableau Public。

上传到 Tableau 后,它将在您的浏览器窗口中打开。此时,您只需点击右下角的“共享”按钮,将链接发送给您的朋友,即可共享您的仪表盘!点击这里查看我的托管仪表板版本!
嵌入式仪表盘
您有几个选择:
- 嵌入脚本—这可以嵌入到 html 中,以提供 Tableau Public 的实时仪表板版本。这篇文章演示了如何将动态仪表盘嵌入到 WordPress 博客文章中。
- 不幸的是,您不能在中型文章中嵌入 live dashboard。
- 另一个不错的选择是在一个简单的 python web 服务器上嵌入仪表板。
感谢您的阅读,我希望您和我一样发现 python+Tableau 堆栈很有吸引力!
数据即 Python:应用和仪表板

Markus Spiske 摄于 Pexels
探索 Python 中最流行的开源数据可视化工具
作为一名顾问数据科学家,我非常清楚将我的工作总结到仪表板和应用程序中的重要性。
这让我能够推广我的算法和工作,并将它们放入直觉图形中,以便更好、更快地理解。在本文中,我们将介绍设计dashboards和applications时使用的最著名的工具和python库。
目录
摘要如下:
- 阴谋地破折号
- 流线
- 散景
- 基巴纳
- Heroku 部署
神秘地闪过
Dash 是 Plotly 开发的开源工具。它允许插入多种类型的小部件,可以选择布局和样式,因为 dash 的布局是基于 HTML 的,并允许 CSS 样式。
通过运行以下命令行完成设置:
pip install dash
pip install dash_core_components
pip install dash_html_components
dash 应用程序的布局是组件的层次树,是 HTML 元素和图形的混合,使用:
- dash_html_components 库提供了所有 html 标签的类,关键字参数描述了 HTML 属性,如样式、类名和 id。使用这个库,我们可以添加 HTML 元素,比如
Div, H1, P,... etc。更多细节,我建议你查看它的文档。 - dash_core_components 库生成更高级别的组件,如控件和图形,并使用 Plotly 的语法。例如,我们可以插入一个
Button, Dropdown, Slider,DatePickerRange, ... etc.。更多详情请访问官方网站。
可以使用以下 python 代码开发一个简单的 Dash 应用程序:
import dash
import dash_core_components as dcc
import dash_html_components as html
app = dash.Dash(__name__)
app.title='Hello World'
app.layout = html.Div(children=[
html.H1(children='Hello Dash!', style={'textAlign':
'center', 'color': '#7FDBFF'}),
html.Div(children='''
Dash: A web application framework for Python.
'''),
dcc.Graph(
id='example-graph',
figure={
'data': [
{'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar',
'name': 'SF'},
{'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar',
'name': u'Montréal'},
],
'layout': {
'title': 'Dash Data Visualization'
}
}
),
])if __name__ == '__main__':
app.run_server(debug=True)
选项debug=True允许考虑最*的修改,而无需重新运行应用程序。
要运行应用程序,我们使用以下命令行:
python app_file.py
你可以在 http://127.0.0.1:8050/ 上运行以下应用程序:

作者图片
式样
可以添加一个覆盖应用程序基本样式的 CSS 文件,允许您自定义图形和 HTML 元素。为此,文件夹的结构应该如下所示:
app.py
assets/
|-- style.css
|-- custom-script.js
|-- img.png
|-- background.jpg
|-- favicon.ico
必须将 CSS 文件和所有其他插入的图像放在一个名为assets的文件夹中,以便 Dash 读取。一旦完成,我们所要做的就是使用以下 python 行指定样式表:
external_stylesheets=["assets/style.css"]
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
引导程序
当构建 dash-app 时,我个人更喜欢使用 Bootstrap。这是一个用于 Plotly Dash 的 python 库,包含样式化和高级元素。
使用以下命令行完成设置:
pip install dash-bootstrap-components
将 bootstrap 主题作为样式表之一包括进来是很重要的:
external_stylesheets=["assets/style.css", dbc.themes.BOOTSTRAP]
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
Boostrap 包含了DropDownMenu, Navbar, Progress, Button, ... etc等很多元素。最有用的元素之一是Layout,它允许使用行和列来构建仪表板,这对应用程序的结构非常有用。
欲了解更多详情,请随时访问官方文档。
复试
像任何其他应用程序一样,支持图形之间的交互性是很重要的,这可以通过回调函数来实现。
每个插入元素都有两个重要特征
- id :元素的唯一称谓
- 属性:元素与元素不同
链接应用程序中的两个元素的方式如下:

作者图片
在这种特殊情况下,第一个元素影响第二个元素:通过其 id_1 选择的第一个元素的 property_1 影响通过其 id_2 访问的第二个元素的 property_2 。
from dash.dependencies import Input, Output
@app.callback(
Output(component_id='id_2', component_property='property_2'),
[Input(component_id='id_1', component_property='property_1')]
)
def callback_function(input_value):
"""
What to do
"""
NB :在回调函数中可以接受多个输入。
隐藏物
当开发一个应用程序时,在缓存中保存元素是非常重要的,这样可以减轻加载的负担,提高交互性,缓存允许这样做。
Dash 不支持特定的缓存特性,但是克服这个问题的一个方法是在 python 中使用global variables。
制表符
Dash 中的选项卡可以使用dcc.Tab组件插入,其中其子项是组成选项卡的元素。
import dash
import dash_html_components as html
import dash_core_components as dcc
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div([
dcc.Tabs([
dcc.Tab(label='1st Tab', children=[
dcc.Graph(),
###
]),
dcc.Tab(label='2nd Tab', children=[
dcc.Graph(),
###
]),
dcc.Tab(label='3rd Tab', children=[
dcc.Graph(),
###
]),
])
])
走廊
Dash 有一个图库,你可以在那里浏览和发现其他仪表盘,这是一个很好的基线和灵感来源。
细流
Streamlit 是一个开源应用程序框架,主要用于使用 python 以快速高效的方式创建 ML 仪表盘。设置非常简单,可以使用以下命令行来执行:
pip install streamlit
与 Dash 相比,Streamlit 具有更好的缓存处理能力,这将在接下来的章节中进行介绍,因此可以使用以下流程实现更快的开发迭代:

streamlit.io
一旦创建了您的文件,您可以键入这个命令行,它将在 http://localhost:8501 上运行您的应用程序
streamlit run file.py
和 Dash 一样,可以选择模式Always re-run来实时修改。
Streamlit 的 widgets gallery 包含多个条目,它们都可以使用一行代码插入:Markdown、SelectBox、Slider、Plot等...注意,小部件可以插入到one-page area或sidebar中,插入是在vertical stacking之后完成的:
import streamlit as st
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.decomposition import PCA
import pandas as pd
img=mpimg.imread('imgs/streamlite_funct.png')
iris = datasets.load_iris()
feature_names=['sepal length (cm)',
'sepal width (cm)',
'petal length (cm)',
'petal width (cm)']
database=pd.DataFrame(iris.data, columns=feature_names)
database["class"]=iris.target
# plot the first three PCA dimensions
fig = plt.figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)
X_reduced = PCA(n_components=3).fit_transform(iris.data)
ax.scatter(X_reduced[:, 0], X_reduced[:, 1], X_reduced[:, 2], c=iris.target,
cmap=plt.cm.Set1, edgecolor='k', s=40)
ax.set_title("First three PCA directions")
ax.set_xlabel("1st eigenvector")
ax.w_xaxis.set_ticklabels([])
ax.set_ylabel("2nd eigenvector")
ax.w_yaxis.set_ticklabels([])
ax.set_zlabel("3rd eigenvector")
ax.w_zaxis.set_ticklabels([])
def main():
########### Sidebar ##############################
st.sidebar.markdown("# Hello World")
st.sidebar.selectbox('Select a tool', ["Dash", "Kibana", "Streamlit", "Bokeh"])
st.markdown("## Multiselection")
st.multiselect('Select a tool', ["Dash", "Kibana", "Streamlit", "Bokeh"])
st.markdown("## Radio buttons")
st.radio('Select a tool', ["Dash", "Kibana", "Streamlit", "Bokeh"])
st.markdown("## Slider")
st.slider('Select a Number', min_value=1, max_value=4, value=1)
st.markdown("## Image")
st.image(img, width=500)
st.markdown("## DataBase")
st.dataframe(database)
st.markdown("## Plot")
st.write(fig)
if __name__ == "__main__":
main()
我们得到以下应用程序:

作者图片
函数st.write非常重要,可以用来插入很多 python 元素。要了解更多细节,我建议您阅读 streamlit 的文档。
交互性:每个元素都可以被赋予一个代表其当前值的变量,接下来,它可以被用来更新另一个元素,从而更新交互性。
隐藏物
缓存通常用于存储恒定的数据,无论在应用程序上做出何种选择,这些数据都不会改变。我们可能经常在应用程序中定义函数,但每次刷新应用程序时都不需要重新运行这些函数,我们可以使用以下 python 代码缓存这些函数:
@st.cache
def function_1():
####
制表符
在许多应用程序中,选项卡可能非常重要:在 Streamlit 中实现这一点的一种方法是在侧边栏中添加一个selectbox,它的选择将影响仪表板的结构,并在框的值上使用 if 语句。
st.sidebar.markdown("Tabs")
tab=st.sidebar.selectbox('Select a Tab', ["Home", "Documentation", "Partners", "Contact"])
if tab=="Home":
#Develop the one_pager
##
elif tab=="Documentation":
###
elif tab=="Partners":
###
elif tab=="Contact":
###
健康应用——Streamlit
当我开始发现 Streamlit 时,我决定通过开发一个简单的健康应用程序来投入使用。

作者图片
您可以使用这个 url 访问应用程序,脚本托管在这个 git 存储库中。更多 app 可以访问官方图库。
散景
Bokeh 是一个 python 库,允许创建一个交互式仪表板。可以使用以下命令行安装它:
pip install bokeh
例如,可以使用以下 python 脚本创建以下应用程序:

作者图片
from bokeh.io import show, curdoc
from bokeh.plotting import figure, ColumnDataSource
from bokeh.layouts import row, column
from bokeh.models.widgets import Tabs, Panel
from bokeh.models import Slider, CheckboxGroup, RadioGroup, Button, CustomJS
#data source
x = [x*0.005 for x in range(0, 200)]
y = x
source = ColumnDataSource(data=dict(x=x, y=y))
#Plots
plot_1 = figure(plot_width=400, plot_height=400)
plot_1.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
plot_2=figure(tools='box_zoom, lasso_select')
plot_2.circle(x=[1,2,3,4,5], y=[2,3,1,1,2])
plot_2.background_fill_color = 'black'
plot_3=figure(tools='box_zoom, lasso_select')
plot_3.circle(x=[1,2,3,4,5], y=[2,3,1,1,2])
#widgets
slider = Slider(start=0.1, end=4, value=1, step=.1, title="power")
button = Button(label='Click')
checkbox = CheckboxGroup(labels=['Kibana', 'Bokeh', 'Streamlit', 'Dash'])
radio = RadioGroup(labels=['Kibana', 'Bokeh', 'Streamlit', 'Dash'])
#Interactivity
callback = CustomJS(args=dict(source=source), code="""
var data = source.data;
var f = cb_obj.value
var x = data['x']
var y = data['y']
for (var i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], f)
}
source.change.emit();
""")
slider.js_on_change('value', callback)
#Plots zoom-linking
plot_2.x_range=plot_3.x_range
plot_2.y_range=plot_3.y_range
#Tabs
first=Panel(child=row(column(slider, button, checkbox, radio), plot_1), title='first')
second=Panel(child=row(plot_2,plot_3), title='second')
tabs=Tabs(tabs=[first, second])
#App
curdoc().add_root(tabs)
show(tabs)
注意,一旦我们定义了图形plot,我们就使用语法plot.graph来为它分配想要的图形。使用ColumnDataSource处理数据,使用row, column布局。我们定制添加的小部件Slider, CheckboxGroup, RadioGroup, Button,并使用 JS 回调CustomJS将它们链接到图形。要在http://localhost:5006/myapp上运行您的应用程序,您可以使用以下命令行:
bokeh serve --show myapp.py
走廊
和所有其他工具一样,散景一开始就有非常丰富的图库。
弹性堆叠
弹性搜索
Elasticsearch 是一种特殊类型的表格索引,它提供了一个更快的搜索引擎。我们可以将 pandas 数据库转换成一个Elasticbase,然后使用 Kibana 可视化它,Kibana 是 stack Elastic 的可视化工具。首先,你需要根据你的操作系统下载Kibana&elastic search。安装后,我们将使用 elasticsearch 正确地索引我们的熊猫数据框架。为此,我们首先需要使用命令行启动服务 elasticsearch 和 kibana:
./elasticsearch-7.6.1/bin/elasticsearch
./kibana-7.6.1/bin/kibana
一旦 Kibana 启动,我们就可以使用这个 python 脚本向 Elasticsearch 服务发送数据
import pandas as pd
from elasticsearch import Elasticsearch
# Database loading and service openning
database=pd.read_excel("data/test_db.xlsx")
es_client = Elasticsearch(http_compress=True)
#Elasticsearch does not accept NAN values
print(database.isna().sum().sum())
df=database.copy()
INDEX="laposte" #Its name in Elasticsearch (laposte for example)
TYPE= "record"
def rec_to_actions(df):
import json
for record in df.to_dict(orient="records"):
yield ('{ "index" : { "_index" : "%s", "_type" : "%s" }}'% (INDEX, TYPE))
yield (json.dumps(record, default=int))
e = Elasticsearch()
r = e.bulk(rec_to_actions(df))
#Verify if everything went fine
print(not r["errors"])
基巴纳
servie kibana 在本地主机的端口5601上启动,我们可以使用地址localhost:5601在浏览器中访问它。一旦进入主页面,我们可以点击Dashboard和Create dashboard,如下所示:

作者图片
我们现在可以通过以下步骤添加小部件:

作者图片
可以使用光标定位插入的图形,这使得布局易于定制。请注意搜索栏的存在,其中的数据是使用 Elasticsearch 索引的,这使得查询耗时更少,并增加了仪表板的交互性,尤其是在处理大型数据库时。交互在 kibana 中自动处理。

作者图片
制表符
Kibana 中的选项卡可以使用 markdowns 小部件中的嵌入式链接来创建。您首先在不同的仪表板中创建所有选项卡,然后在每个选项卡中添加到其他选项卡的嵌入链接。
走廊
不要犹豫去参观基巴纳的官方画廊。
Heroku 部署
应用程序开发完成后,您可以在线托管它,这样任何人都可以使用 Url 访问它。一种方法是使用 Heroku,它提供这种有一些限制的免费服务。你首先需要注册,然后在线创建一个 heroku 应用程序,它将链接到你的 git 库。回购应具有以下结构:
.
├── app.py
├── requirements.txt
├── setup.sh
└── Procfile
您可以查看我的 git 存储库了解更多信息。在本地 git 文件夹上运行以下命令行:
heroku create
git push heroku master
heroku ps:scale web=1
heroku open
你的应用程序会一直等待你在 git 中的每一次推送,以便考虑最新的变化。
结论
应用程序和仪表板是每个项目非常重要和决定性的阶段,它们允许总结我们的工作,并通过一个本能的界面让用户更容易访问。每种技术的使用主要取决于您的交付和截止日期:一些工具允许更大的灵活性,另一些工具开发起来更快:

作者图片
在我个人看来,如果所有条件都满足,Dash可以是最佳的搭配选项。
原载于 2020 年 5 月 20 日 https://www.ismailmebsout.com。
数据仓库综合指南
在数据清理过程完成之前,数据科学无法启动。了解数据仓库作为可用于分析的数据集的存储库的角色。

在企业环境中寻找干净的数据。陈虎在 Unsplash 上拍照。
作为一名数据科学家,了解一些基本的数据仓库概念是很有价值的。我们所做的大部分工作都涉及到在需要清晰易懂的数据集上增加企业价值。对于达到其生命周期的那个阶段的数据集,它已经通过了数据架构的许多组件,并且希望通过许多数据质量过滤器。这就是我们如何避免数据科学家最终将 80%的时间花在数据争论上的不幸情况。
让我们花点时间通过了解与建立数据仓库相关的各种考虑来加深对数据架构过程的理解。
数据仓库是一个特定的基础设施元素,它为包括数据分析师和数据科学家在内的线下用户提供对数据的访问,这些数据已经过整形以符合业务规则并以易于查询的格式存储。
数据仓库通常连接来自多个“真实来源”事务数据库的信息,这些数据库可能存在于单个业务单元中。与存储在事务数据库中的信息不同,数据仓库的内容被重新格式化,以提高查询速度和方便性。
数据必须符合验证质量的特定业务规则。然后,它被存储在一个非规范化的结构中——这意味着将可能被一起查询的信息存储在一起。这有助于通过降低从仓库中获取数据所需的查询的复杂性(即,通过减少数据连接的数量)来提高性能。
在本指南中:
构建数据仓库
在为数据仓库开发 维度模型 的过程中,设计通常会经过三个阶段:(1)业务模型,它根据业务需求概括数据,(2)逻辑模型,它设置列类型,(3)物理模型,它代表关系数据仓库的实际设计蓝图。
因为数据仓库将包含来自业务各个方面的信息,利益相关者必须事先同意将要存储的数据的(即粒度级别)。

一个假设的 safari tours 业务的示例星形模式。
数据仓库中的底层结构通常被称为 星型模式 —它将信息分类为维度或事实(即度量)。 事实表 存储观察或事件(即销售、订单、库存余额等。)维度表包含关于这些事实的描述性信息(即日期、位置等。)**
有三种不同类型的事实表:(1)标准化粒度的事务记录,(2)给定时间范围内的定期记录,(3)给定业务流程内的累积记录。
除了星型模式,还有将数据排列到雪花模式的选项。这里的区别是每个维度都是归一化的。
规范化是一种数据库设计技术,用于创建包含原子级信息的记录。
然而,雪花模式给维度模型增加了不必要的复杂性,通常星型模式就足够了。
增强性能并根据大小进行调整
除了了解如何构建数据之外,设计数据仓库的人还应该熟悉如何提高性能。
一种增强性能的技术是按照通常的查询顺序对数据创建一个聚集索引。例如,我们可以选择按旅游日期降序来组织事实表,这样接下来的旅游将首先显示在表中。建立聚集索引会对记录的物理存储方式进行重新排序,从而提高检索速度。除了可选的单个聚集索引之外,一个表还可以有多个非聚集索引,这些索引不会影响表的物理存储方式,而是会在内存中创建额外的副本。**
另一个性能增强包括将非常大的表分成多个较小的部分。这叫做分区。通过将一个大表分割成更小的单个表,只需要访问一小部分数据的查询可以运行得更快。分区可以是垂直的(拆分列)或水*的(拆分行)。这里有一个链接,你可以在这里下载。rtf 文件包含用于 SQL 的分区脚本以及其他数据库架构资源,如项目启动和管理清单。

是的,我会偷你的免费资源和有用的工具。由Slawek在 Unsplash 上拍照
考虑总数据库大小是调优性能的另一个关键因素。根据服务级别协议(SLA) ,在设计数据仓库时估计结果数据库的大小将有助于使性能与应用程序需求保持一致。此外,它将提供对物理磁盘空间的预算需求或云存储成本的洞察。
要进行这种计算,只需合计每个表的大小,这很大程度上取决于索引。如果数据库的大小明显大于预期,您可能需要规范化数据库的某些方面。相反,如果您的数据库变小了,您可以进行更多的非规范化,这将提高查询性能。
相关数据存储选项
数据仓库中的数据可以重新组织成较小的数据库,以满足组织的需要。例如,一个业务部门可能会创建一个数据集市,提供特定于他们部门的信息。这个只读信息源为那些可能不太了解数据架构技术细节的业务用户提供了清晰度和可访问性。这里有一个创建数据集市时要部署的规划策略。
类似地,可以为操作报告建立一个操作数据存储(ODS) 。 主数据管理(MDM)系统 存储有关独特业务资产的信息(即客户、供应商、员工、产品等。)
使用大数据
为了处理大数据,数据架构师可能会选择实施一种工具,如 Apache Hadoop 。Hadoop 基于谷歌开发的用于索引万维网的 MapReduce 技术,并于 2006 年向公众发布。在高度结构化的数据仓库环境中,信息已经过上游验证以符合业务规则,与此相反,Hadoop 是一个软件库,它接受各种数据类型,并允许跨计算机集群进行分布式处理。Hadoop 通常用于处理流数据。
Hadoop 加快了多台计算机集群的数据处理速度。通过 GIPHY 。
虽然 Hadoop 能够快速处理流数据,但它在查询速度、查询复杂性、安全性和编排方面存在问题。*年来,随着基于云的解决方案(例如 Amazon Kinesis )的崛起,Hadoop 已经不再受欢迎——在处理非结构化数据的速度方面提供了相同的收益,同时与云生态系统中解决这些潜在弱点的其他工具相集成。
提取、转换、加载(ETL)
提取 、 转换 、 加载 定义将数据移出其原始位置(E),进行某种形式的转换(T),然后将其加载(L)到数据仓库中的过程。数据库架构师应该着眼于实现一种系统化的方法,考虑到围绕设计考虑、操作问题、故障点和恢复方法的最佳实践,而不是以一种特别的、零碎的方式来处理 ETL 管道。另请参见这个关于设置 ETL 管道的有用资源。
ETL 的文档包括创建源到目标的映射:关于如何将源系统中的数据结构和内容转换为目标系统的结构和内容的一组转换指令。这里有一个用于此步骤的样本模板。
您的组织也可以考虑 ELT——加载没有任何转换的数据,然后使用目标系统的能力(通常是基于云的工具)来执行转换步骤。
从仓库中获取数据
一旦建立了数据仓库,用户应该能够方便地从系统中查询数据。优化查询可能需要一些培训,重点是:
数据存档

最后说一下优化你组织的 数据归档 策略。存档的数据对组织来说仍然很重要,对于希望使用历史趋势进行回归的数据科学家来说尤其重要。
数据架构师应该针对这一需求进行规划,将不再频繁使用的历史数据重新定位到一个具有更高延迟和强大搜索功能的独立存储系统中。将数据移动到成本较低的存储层是这一过程的一个明显优势。组织还可以从取消对归档数据的写访问中获益,保护数据不被修改。
摘要
本文涵盖了建立数据仓库的可靠实践。通过发表评论,让我知道你是如何在工作中使用这些信息的。

遵循这些步骤,你将成为数据丛林之王。由 Pixabay 在像素上拍摄的照片。
****如果你觉得这篇文章对有帮助,请关注我的 Medium 、 LinkedIn 和 Twitter ,了解更多提升你的数据科学技能的想法。
如何提高数据仓库的数据质量
Google 的 BigQuery 的演练示例

照片由安德里亚斯·古尔霍恩在 Unsplash 拍摄
您可以在数据仓库流程中构建一些简单的数据质量检查,以检测由于 ETL/ELT 管道中的错误或连接失败而导致的数据不一致。衡量数据质量和快速检测错误总是一个好主意,否则会导致消费者缺乏信任。下面的文章将向您展示一些易于在源系统和目标系统之间进行数据一致性检查的方法——例如数据仓库或数据湖。

数据质量测量流程—作者提供的图片
通过计数行检查表格
检测源系统和目标系统之间偏差的一个非常简单的检查是计算两个系统中表的行数。当然,这种检查只有在源系统和目标系统中有相同的表结构时才有意义,这是通过 ELT 过程实现的。
大查询中的行数示例:
SELECT count(1) FROM `double-silo-282323.Test_Data.table_1` ;
SELECT count(1) FROM `double-silo-282323.Test_Data.table_2`
您可以在两个系统中手动完成这项工作,但是自动方法会更好——例如,通过 ETL 工具将计数结果从源系统带到您的数据仓库/Lake,并创建如下图所示的报告:

示例报告—按作者分类的图像
您还可以通过触发警报(例如使用云功能)并通过电子邮件发送给数据工程师来改善这种情况。
通过业务关键数字检查表格内容
要检查表的内容是否相同,除了计算行数之外,还需要其他技术。一个例子是关键数字的使用。您可以对某些行(如价格或金额)求和,并检查源系统表和目标系统表的总和是否相同。这里的挑战是找到好的关键人物。建议与业务部门合作。然而,您不需要太多的计算能力就可以实现这种检查,只需要 SQL 中一个简单的SUM()函数。
单一数据记录检查
要检查每一列和每一个值,可以使用下面的语句— UNION ALL of two EXCEPT DISTINCT:
(
SELECT * FROM `double-silo-282323.Test_Data.table_1`
EXCEPT DISTINCT
SELECT * from `double-silo-282323.Test_Data.table_2`
)UNION ALL(
SELECT * FROM `double-silo-282323.Test_Data.table_2`
EXCEPT DISTINCT
SELECT * from `double-silo-282323.Test_Data.table_1`
)
结果将是,所有在源或目标系统中不同或不存在的行都被显示出来。

查询结果示例-按作者排序的图像
这是上述方法中最有效的检测数据问题的方法,但也会耗费大量的计算能力和金钱。这是因为像 Big Query 这样的数据仓库技术会对每次查询和查询的数据量进行收费。这里的解决方案可以是每月从源系统的一个完整的表中获取数据,将其写入目标系统,并与数据仓库中的表进行比较。它将向您提供数据是否一致以及 ETL/ELT 过程是否 100%事务安全的信息。
确保数据一致性的其他可能性
您可以实现的其他可能性有:
- 监控您的 ETL/ELT 作业—例如,如果由于连接错误导致数据未能传输,您会收到警报。
- 构建如上所示的报告,并添加信息,如上次刷新数据时的信息。
- 如果您的数据复制过程失败,则实施归档/恢复系统。
- 使用 ELT 而不是 ETL——在紧急情况下或当您必须重新加载大量数据时(ELT 通常比 ETL 过程快得多)。
- 拥有一个处理用户数据质量投诉的流程或票证系统。
- 监控源系统,以便您知道何时出现技术困难。
- 构建您的 ETL/ELT 作业,以便它们能够处理停机时间并重试。
结论
为了快速检测错误和故障,持续监控数据质量和数据传输非常重要。本文中提到了一些方法,但是由于技术设置和成本的原因,您必须找到适合您的过程的方法。但是请记住,数据质量是一个非常重要的话题。否则,您可能会缺乏用户和业务部门的信任。
进一步阅读
[## 标准 SQL | BigQuery | Google Cloud 中的 Abfragesyntax
建议使用一种或多种药片或药片,并在技术上加以改进。在…
cloud.google.com](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax?hl=de) [## 基于 MaxCompute 的数据仓库数据质量管理
作者:海清
alibaba-cloud.medium.com](https://alibaba-cloud.medium.com/data-quality-management-of-data-warehouses-based-on-maxcompute-2ca15c698bee)
面向娱乐和非营利组织的数据堆栈—第一部分
为您的副业项目选择数据仓库

萨拉·库菲在 Unsplash 上拍摄的照片
驱动几乎所有数据科学团队的引擎是某种形式的数据仓库,它充当组织中各种不同数据源的中央收集点和存储库。这些来源可能包括组织的主要事务性数据库、日志、电子邮件、SaaS API、CRM、ERP 以及各种形式的随机*面文件。数据仓库的目的是将所有这些数据收集到一个真实的数据源中,并通过一个访问点方便用户访问。此工作流中的终端可能是手动 SQL 查询、某个 BI *台或数据科学家的自动化模型培训工作流。

图片来自 dbt,这是一个令人惊叹的开源数据仓库管理框架。
当数据仓库得到组织的财政支持时,它们是一种有用的资源,但是个人数据从业者如何为了个人项目的目的或作为培训资源来模仿这种经验呢?一个人如何用个人预算创建自己的个人数据仓库?这是一个我长期以来一直在寻找满意解决方案的问题,因此这是我将探索现代分析*台产品生态系统中一些可用选项的系列博客帖子中的第一篇。这第一部分将主要集中在想象标准和一些可能的解决方案堆栈可能看起来像什么,然后稍后我将调查和评估不同的选项。
显而易见的初步答案是建立一个本地 PostgreSQL 数据库,并编写一些 Python/R/SQL 代码等。,但这并不完全模拟我们所追求的确切体验。它对学习一些 SQL 和手工 ETL 工作流的痛苦很有用,但它缺乏远程数据存储、灵活的可伸缩性、配置 CI/CD 工作流以及利用互联网可访问的数据存储作为各种 BI 解决方案的中心的能力。在我教的数据科学课程中,学生们经常表示有兴趣将访问大规模数据仓库*台作为课程的一部分,这显然是非常昂贵的,但我可以理解学生们为什么觉得创建玩具 SQLite 数据库并不能满足他们的需求。
理想的个人数据仓库应该是什么样的?嗯,理想情况下,它应该是便宜的,因为我们大多数人可能都希望避免支付与常见的 SaaS *台相关的高额月费。在可能的情况下,无服务器将比连续服务器更受欢迎。大多数情况下,我们希望数据处于静态(产生最小的费用),只有在加载和转换操作需要时才会产生计算费用。我们可能还希望尽可能地减少配置和管理负担,因为我们不太可能从系统管理员那里获得支持。任何开源组件可能也是可取的。
因此,在我们探索哪些选项符合这些标准之前,让我们首先简要回顾一下我们寻求利用(廉价)或替换的*台的当前生态系统。为了存储我们的数据,我们有几个仓库*台可供选择,包括亚马逊红移,谷歌大查询,以及雪花。
ETL (Extract/Transform/Load)传统上是开发和维护数据仓库中最费力的工作之一,通常涉及 SQL、Python 等重要的软件工程。今天,我们有许多可用的商业*台,它们抽象出了 ETL 系统中固有的大量重复逻辑。其中包括五针、针和针。
在数据可视化方面,我们有 BI *台,包括 Tableau、Looker、PowerBI 等等。其中一些有免费/公共版本,但是我们也有足够的能力通过 Shiny、Jupyter 和更多我不想列举的技术来制作我们自己的仪表板。出于本系列的目的,我们将主要关注栈的数据存储和 ETL 部分。
我确信我想要包括的一个组件是令人惊奇的开源的 dbt。
dbt 是一个开发环境,它使用任何地方的数据分析师的首选语言— SQL。借助 dbt,分析师可以掌控整个分析工程工作流程,从编写数据转换代码到部署和文档。
使用 dbt,您可以按照最古老的软件工程最佳实践之一来编写数据转换代码:模块化。编写模块化 SQL 意味着您的查询更容易更新和故障排除,并且执行速度会大大加快。
简而言之,dbt 是一个强大而方便的框架,用于组织仓库中的所有转换和数据模型。像 Fivetran 和 Stitch 这样的 ETL *台非常适合将数据加载到您的仓库中,但是生成的数据可能不会按照您希望的方式进行组织,并且您可能还希望集成其中的一些数据源。这就是 dbt 的用武之地。该工具本身是免费的,他们的云部署*台也有一个适合个人项目的免费层,还有一个活跃在 Slack 和 Discourse 上的优秀用户社区。

(左)图片由雪花 | (中)图片由谷歌— BigQuery | (右)图片由亚马逊网络服务—雅典娜
数据存储呢?根据我们的搜索标准,基于传统服务器的*台(如 Redshift)不在选择之列。虽然我很喜欢雪花,但它没有任何适合我们需求的(永久)免费层。这是一个现收现付的*台,所以有可能将成本降到最低,但我不太确定成本会维持在多低的水*。事实上,似乎有一个 25 美元的每月最低限额是不可行的,但我不一定完全排除雪花。
AWS Athena 是一个有趣的选择。它是 Presto 的无服务器部署,位于您自己的 S3 对象之上。您只需为运行查询和低得可以忽略不计的 S3 存储成本付费。Athena 有 event dbt 支持,但目前还处于早期开发阶段。雅典娜看起来肯定是个不错的选择。
另一个我之前没有考虑过的选项是 Google 的 BigQuery。我总是把 BigQuery 归为 GCP 的红移或雪花,但事实证明,谷歌实际上提供了一个完整的免费 BigQuery 层,只要你在一定的限制内操作。只要您保持 10GB 的加载存储和 1TB 的查询处理,您就可以完全免费使用 BigQuery!
ETL *台呢?像 Fivetran 和 Stitch 这样的服务对个人来说可能太贵了。Fivetran 最*确实切换到了基于消耗的定价系统,因此它的利用率可能会被限制在一个低廉的水*。然而,这些付费*台的大部分价值与忠实地将复杂的内部数据库镜像到仓库的挑战更直接相关,而不是摄取格式或多或少相同的*面文件。因此,我认为我们可以将从 API、电子邮件和类似来源提取的数据抽象到其他未来项目中。这些未来提取服务的基本端点是将*面文件存放到对象存储中(S3 或其他)。
有了基于 Athena 的仓库,人们只需开发工作流,将数据提取到 S3 进行暂存。AWS 还提供 Glue 和其他一些编排服务,这些服务可能会保持在成本之下。BigQuery 有类似的兄弟服务,包括数据流和数据存储,以及直接从 Google Storage 和 Google Drive 加载数据的能力。还可以选择从 S3 将数据加载到 BigQuery 中。我说过 BI 选择超出了这个搜索的范围,但是同样值得一提的是 BigQuery 直接集成到了 DataStudio 中。
至此,我认为我们已经有了三个合理的候选筹码:
- BigQuery 数据仓库,使用来自 Google Drive 和 S3 数据传输的数据,用于数据建模的 dbt,以及一些带有 DataStudio 的仪表板。
- Athena 数据仓库,使用 S3 分阶段数据,dbt + dbt-athena 插件进行数据建模。
- 雪花数据仓库,使用外部存储集成和 SnowPipe 进行接收,使用 dbt 进行数据建模,使用 Snowsight 进行仪表板。
我将通过在每个*台上配置帐户并使用 dbt 建立一些简单的数据模型,开始尝试这些选项。在第二部分中,我将分享我对最终架构的想法,该架构似乎最适合低成本的个人项目,并开始深入研究特定于所选*台的仓库设计和工作流编排。
你怎么想呢?你最喜欢的云仓库栈会是什么样子?欢迎在评论中留下你的想法!
数据仓库转换代码有味道
留意 SQL 转换中的这些问题迹象

当涉及到转换代码时,在数据工程中有一个奇怪的范例。虽然我们越来越多地将提取和加载(“EL”)编程作为生产软件标准,但是转换代码仍然被视为二等公民。具有讽刺意味的是,转换代码通常包含复杂的业务逻辑,这可以从像对待软件一样对待软件中获益匪浅。
代码气味是一种表面迹象,通常对应于系统中更深层次的问题。“更简单地说,代码气味是软件中的模式,它要求我们更仔细地观察。您应用程序中的代码气味与冰箱中的实际气味没有什么不同:刺鼻的气味可能表明有令人讨厌的东西存在(就像那盒放了十年的木须肉),或者它可能像林堡干酪一样无害。代码味道并不保证问题存在,通常情况下,最佳重构类似于不同的味道。其价值在于,每一次出现都会提示您,哪种解决方案提供了最易读、最易维护的转换代码。
下面是一组特定于多维数据仓库转换的代码味道。遇到它们会让你停下来,给你机会离开代码库,比你发现它的时候更好。
多列联合语句
COALESCE(reciept_price,
COALESCE(label_price,
COALESCE(catalog_price),0))) AS item_price
翻译成英文:“如果没有收据价格,试试标签价格,如果没有标签价格,试试目录价格,如果其他都不行,把价格算成 0。”
为什么会有味道:在少数几列中摸索以获取第一个可用值表明数据没有被很好地理解。要么代码不知道为什么一个列值值得优先选择,要么结果列是几个应该独立的状态的混搭。
可能的重构:上面的嵌套联合很可能表示多个独立的状态被强制为假条件。考虑用显式决策树(通常是一个CASE语句)替换,或者将每个状态分解成不同的事实。
作为标识符的保留字
SELECT user_sp_role AS "ROLE"
翻译成英文:“命名 user_sp_role 列ROLE,大家就知道是什么意思了。”
数据仓库设计的一个核心原则是界面应该简单。使用保留字(甚至是你的特定方言允许的保留字)会带来复杂性和混淆的机会。
可能的重构:坚持使用易于使用的详细标识符,不需要引号,并且将保持所有 SQL 能力的用户都可以访问数据仓库。ROLE可以更直观地命名为web_application_role,避免无谓的混淆。
维度中的基本空值
SELECT
customer_name
,customer_address_id # null means we have no address on file
,customer_phone
FROM
customer
翻译成英文:“如果您想要所有没有注册电话号码的客户,只需选择电话号码为NULL的位置。”
为什么有味道: NULL在数据仓库世界里是一个非常重要的值。如果一个 join 出错,将会有NULL值。如果一个group by失败或者一个窗口函数没有像我们预期的那样滑动,那么就有NULL值。当NULL作为合法数据值执行双重任务时,调试变得几乎不可能。除此之外,BI 工具在呈现NULL值时通常表现不一致,这为 bug 提供了一个完美的藏身之处。
可能的重构:不要在维度中使用NULL值;明确陈述每个可能的条件(即在CASE语句中使用ELSE),这样任何NULL值都会立即引起审查。这不仅会强化您的转换代码,而且有助于最终产品数据的直观性。NULL可以表示很多东西,但是'No Phone Number Available'是非常清楚的。
这种味道只适用于维度属性。NULL数值不仅是正确的,而且是附加事实的重要数据点(如total_sale_value)。
神奇的数字
SELECT
customer_name
,customer_address
,customer_phone
...
WHERE
customer_unit_id IN (1,3,19)
AND
customer_value_type = "a"
翻译成英文:“我们不再使用客户单元 8 或 13,所以我们忽略它们(ted 说 1、3 和 19 才是最重要的)。我们也只关心主要的网站客户价值类型(Bob 说这些是用‘a’表示的)。
为什么有味道:好的代码是自文档化的。这通常意味着你可以在没有解码环的情况下阅读代码并理解它的作用。上面的例子并不是因为复杂的业务逻辑或技术复杂性而具有挑战性,而是因为它充满了部落知识。
可能的重构:cte 是很好的数据映射工具:
WITH
value_types AS (
"a" AS primary_website_customer
...
)
...
AND
customer_value_type = value_types.primary_website_customer
当更大的重构不可行时,注释总比没有好。寻找可以更形象地命名的变量和常量,作为一种大大改进代码库的廉价方法。
数据消除
WITH all_visits AS (
SELECT
*
FROM
website_visits
),
SELECT
*
FROM
website_visits
WHERE
visit_id IS NOT NULL
翻译成英语:“网站访问应该总是有一个visit_id,所以如果他们没有,记录就是坏的,我们应该把它扔出去。”
为什么有味道:任何数据仓库的基础都是真理。不仅仅是一些,而是全部的真相,这是破坏性的转换所不能提供的。缺少记录(甚至是“坏”记录)的数据仓库没有可信度,您会很快发现消费者要求访问原始源。
可能的重构:转换逻辑应该是附加的,为最终用户提供更大的价值。在上面的例子中,一个新的列valid_record将过滤到 BI 层中的同一个数据集,同时为消费者提供访问“所有数据”的信心。
假设的商业逻辑
CASE
WHEN user_time_zone IS NULL THEN (last_login time at time zone 'pst')
ELSE (last_login_time at time zone user_time_zone)
END AS last_login_time
翻译成英语:“我们的大部分网络流量来自旧金山湾区,所以如果一个网络访问丢失了时间戳,我们就把它更新到太*洋标准时间。”
为什么有味道:数据仓库的工作是为用户提供做出明智决策的能力,而不是为他们做决策。每次转换逻辑为数据选择路径时,它都不可避免地在这个过程中删除消费者的选项。
可能的重构:在上面的例子中,最初的last_login_time将理想地呈现last_login_time_without_timezone和last_login_time_with_timezone;最终用户可以自行决定对缺失的时区做出假设。
运行时间作为输入
SELECT
*
FROM
all_records
WHERE
created_at::DATE >= DATEADD('days',-1, CURRENT_DATE())
翻译成英文:“创建日期大于昨天的记录是新记录。”
为什么有异味:任何时候,相同的代码可以针对相同的数据运行两次,并返回不同的结果,请考虑这是一个问题。好的转换逻辑既是幂等的又是确定性的。当前日期或时间等不稳定元素会使代码变得脆弱,如果转换作业失败或运行两次,很容易使系统处于不可纠正的状态。
可能的重构:以自我修复的方式设计转换。使用相同的示例:
- 如果记录保证增加(没有迟到的记录),只需要稍微修改。
SELECT
*
FROM
all_records
WHERE
created_at > (SELECT MAX(created_at) FROM target_table)
- 源数据的更大波动性要求更大的转换复杂性(和更大的计算成本)。根据记录到达的时间有多晚,可以使用谓词语句将代码限制在一个窗口中。
SELECT
all_records.*
FROM
all_records
WHERE
MD5(all_records.*::TEXT) NOT IN (SELECT MD5(target_table.*::TEXT) FROM target_table)
/*
if records are always < 30 days late, you could restrict the lookup ie (SELECT MD5(target_table.*::TEXT) FROM target_table WHERE target_table.created_at::DATE >= DATEADD('days',-30, CURRENT_DATE()))
*/
不一致的时态、前缀和后缀
SELECT
user_id
,id
,identifier
FROM
users
JOIN
site
...
JOIN
dim_visits
翻译成英语:围绕标识符的非结构化语法,列名的不规则前缀,以及缺乏词汇系统。
在数据仓库中,模式就是产品接口。不可预测的词汇会给用户带来不必要的摩擦。桌子是order还是orders?栏目是sale_price还是order_sale_price?没有模式,这些都是数据仓库可用性的开销。
可能的重构:选择约定。记录下来。更新转换代码以反映它们。使用同类语言的相同查询可能如下所示:
SELECT
user_id
,site_id
,visit_id
FROM
user
JOIN
site
...
JOIN
visit
标识符中的技术参考
CREATE OR REPLACE TABLE POSTGRES_USERS AS ...
翻译成英文:任何名称反映源系统(即postgres_user)、提取-加载介质(即DATA_WAREHOUSE.STITCH.USERS)或 ELT 过程的任何其他机械组件(即cron_daily.users)的表、视图、模式、数据库或列。
为什么会有气味:工程师很难走出我们自己的生活空间。这种味道通常是由于设计一个“源代码向下”而不是“最终用户向上”的模式而产生的。数据仓库必须以反映业务领域对象的方式表示信息;举个例子,某医院并没有把自己的消费者想成“账单用户”和“图表系统用户”和“处方用户”,他们都是简单的“患者”。
这是一种特别难察觉的味道,因为业务领域经常与技术领域非常接*,用户可能已经训练自己不正确地将一个与另一个对齐。如果零售商有不同的电子商务和物理销售点系统,很容易认为电子商务系统代表web_users而 POS 系统代表in_store_users。但事实并非如此;这家企业只有CUSTOMERS可能会在商店、网上或两者兼而有之。
可能的重构:把你的数据产品想象成 UX 设计师设计意图驱动的应用程序界面的方式。如果您登录您的 Medium 帐户,系统会要求您输入您的用户名和密码,而不是您的“dynamo _ db”用户名和密码。按照同样的逻辑,你的数据仓库用户群感兴趣的是页面访问量,而不是谷歌分析页面访问量或 Adobe 分析页面访问量。
代码库外部的过程/函数
SELECT
super_amazing_stored_proc(122, 'another_magic_value') AS RPI_VALUE
翻译成英语:不是目标数据仓库的本地 SQL 方言的一部分,也不是作为代码库的一部分创建的函数。
为什么会有味道:如果我们将转换代码库视为构建数据仓库的蓝图,那么存储过程(不是作为代码库的一部分创建的)就是“帐外工作”。代码库不再拥有机器的所有元素,不能有效地复制仓库。这种危险而脆弱的状态使得仓库在实例崩溃时面临灾难性的失败。
可能的重构:如果你正在使用像 DBT 这样的 SQL 框架(或者任何真正的 SQL 预编译),完全避免存储过程和函数。对于那些存储过程或函数是唯一可行的解决方案的罕见情况(或者如果您使用存储过程作为您的转换层),在您的代码库中包含具有DROP.. CREATE或CREATE OR REPLACE模式的过程的定义,以确保每次运行都从您的代码中重新创建。这将最小化代码状态和产品状态之间的差距。
引用标识符
SELECT 1776 AS "FOUNDING_YEAR" FROM countries."America"."Important Dates"
翻译成英文:区分大小写或包含特殊字符或保留字的标识符。
为什么这么说: SQL 是第四代语言,像大小写折叠(将标识符视为不区分大小写的值)这样的约定的目的是为了更好地模拟人与人之间的交流。引用的标识符通常与这种意图背道而驰,迫使用户考虑大写,并可能导致混淆"Leads_Prod"与"leads_prod"的情况(这是两个不同的表!).
可能的重构:永远不要引用标识符。通过对数据库、表/视图和列使用详细的描述性名称来避免混淆和开销。额外的好处是,这样你的代码将是可移植的(case folding 在不同的*台上是不一致的,所以任何引用的标识符都是立即不可移植的)。
在数据仓库的早期,有一种勇敢的努力来引用所有的东西,使得标识符尽可能的漂亮,并且可以用像 T2 这样的列名来准备报告。在当时,这很有意义,因为大部分消费是直接从数据仓库表到报告和电子表格摘录。今天,我认为 BI 工具是这种“表示抛光”的最佳场所,并且数据仓库通过保持标识符的干净和冗长而受益更多。
没有时区的时间戳/时区不在 UTC 中
SELECT
TIMESTAMP '2020-01-01 13:10:02' AS questionable_tstamp
,TIMESTAMP WITH TIME ZONE '2020-01-01 01:11:21+04' AS another_confusing_tstamp
翻译成英文:任何未显式转换为 UTC 值的时间戳,尤其是使用“本地时间”作为标准。
为什么有味道:时间戳是最混乱的数据类型。时间戳的实现和处理因*台、语言和工具的不同而有很大的差异。
可能的重构:显式地将所有时间戳转换为 UTC 进行存储。请注意,这与转换然后剥离时区不同(这是一种奇怪但痛苦的常见做法,可能源于一种信念,即没有时区的时间戳“更容易”)。
统一使用 UTC 将简化新数据集的入职流程,消除夏令时混乱,以及超越单一时区的面向未来的组织知识。让 BI 工具去担心时间戳表示(大多数工具都会这样做,那些“有用的”上游转换可能弊大于利)。
正常化
SELECT
u.user_name
,u.user_area_code
,si.site_name
FROM
users u
INNER JOIN
sites s
ON
u.site_id = s.id
INNER JOIN
site_identifiers si
ON
s.id = si.site_id
翻译成英语:反映传统的 BCNF 的模式,你会期望在事务数据库设计中找到这些模式。在这个例子中,site_identifiers已经从site中规范化出来,以保护引用完整性。
闻起来的原因:数据仓库是 OLAP 结构,它满足了与事务数据库完全不同的需求。规范化和引用约束是 OLTP 系统如何工作的重要部分——但是这些工具不利于知识库的目标。数据仓库并不代表期望的状态(即所有的page_views都有一个存在于traffic_sources表中的source_id,它们代表的是现实(即一个 bug 将一百万个page_views关联到一个不存在的源)。从更高的角度来看,大量规范化的存在可能是一个强有力的指标,表明在整个代码库中已经遵循了其他 OLTP 约定。
可能的重构:维度模型设计超出了本文的范围(为了更好地理解维度模型与事务模型的区别,我强烈推荐 Ralph Kimball 的数据仓库工具包)。一般来说,这些标准化值应该“退化”成宽而*的维度表,如下所示:
SELECT
name
,area_code
,site_name
FROM
users
隐藏的“模糊”逻辑
-- DDL for DATA_WAREHOUSE.SESSIONS
WITH
ordered_sessions AS (
SELECT
*
FROM
sessions
ORDER BY insert_id
)
,session_merger AS (
SELECT
CASE
WHEN TIMESTAMP_DIFF(a.session_end,b.session_start) < 60
AND
ABS(a.thumbprint_hash_points - b.thumbprint_hash_points) < 5
AND
EARTH_DISTNACE(a.location,b.location) < 0.5
THEN LEAST(a.session_id,b.session_id)
ELSE NULL
END AS merged_session_id
FROM
ordered_sessions a
INNER JOIN
ordered_sessions b
ON
a.insert_id +1 = b.insert_id
)
,refined_sessions AS (
SELECT
o.*
FROM
ordered_sessions o
WHERE
o.session_id IN (SELECT merged_session_id FROM session_merger)
)
CREATE TABLE sessions AS
SELECT * FROM refined_sessions
翻译成英文:被看似稳定的标识符掩盖的复杂变换。
为什么有味道:“粘糊糊的”逻辑是任意合理的业务逻辑:在上面的例子中,代码判定“两个间隔不到一分钟、指纹非常接*、来自(几乎)相同位置的会话很可能是同一个用户会话。”这里的味道不是逻辑——这是否是合并浏览器会话的准确方式取决于企业;气味代表“可能与绝对值相同的用户会话”session。
可能的重构:数据仓库转换代码表示已知为真的东西。在这个例子中,我们知道每个会话都存在,而我们假设某些会话实际上是同一个会话。如果假设得到业务的支持,它可以很容易地以likely_parent_session列的形式表示为附加信息。这个假设之上的聚合可以存在于另外的物化中,即dim_collapsed_session和fact_collapsed_conversion等。通常需要不止一个假设来支持业务用例的范围。在这种情况下,每个假设要么可以在特定领域的市场中进一步具体化,要么被“标记”并用于丰富数据仓库中的dim_session。
/* downstream mart */
SELECT
amalgamated_session_id
,duration
...
FROM marketing.amalgamated_sessions
/* "branded" in dim_session */
SELECT
session_id
,aggressive_merge_session_id
,conservative_merge_session_id
,halifax_merge_session_id
...
FROM
dim_session
没有消费者文件
/* what do these mean?!? */
SELECT
halifax_merge_session_id
,aggressive_merge_session_id
FROM
dim_session
翻译成英语:对于使用数据仓库的消费者来说,他们需要来自转换作者的输入。
为什么有味道:数据仓库既是商业工具,也是消费品。像任何商业用途的复杂工具一样,它必须附带全面的文档。想象一下,学习使用 Excel 中的VLOOKUP函数的唯一方法是打电话给微软工程师!没有面向消费者的文档,产品将无法使用。
可能的重构:文档可以存在于很多地方。几乎所有的数据仓库*台都支持 SQL comment meta for objects。如果你使用像 DBT 这样的转换框架,那么面向消费者的文档就和 T6 结合在一起了。文档也可以用类似于 Sphinx 、Read Docs的工具来管理,甚至是简单的 markdown 文件。文档解决方案至少必须:易于消费者访问。作为数据产品的一部分进行维护。支持有效的搜索和导航。尽可能完整,“内部”参考
查询式标识符命名
SELECT
s.order_id
,w.order_id
...
FROM
confirmed_ecom_system_orders s
JOIN
client_side_web_orders w
翻译成英文:使用速记模式的别名,往往一两个字母长。
为什么有味道:缩写的速记对于编写快速的即席查询非常有用。但是像所有好的软件一样,转换代码应该是自文档化的,并使用有含义的对象名。
可能的重构:命名标识符是软件开发中的两大难题之一。使用在转换中具有描述性和唯一性的别名,并传达所表示的表/CTE/数据集的内容:
SELECT
ecom_orders.order_id
,web_orders.order_id
...
FROM
confirmed_ecom_system_orders ecom_orders
JOIN
client_side_web_orders web_orders
KPI 中的迎合逻辑
SELECT
is_conversion_marketing
,is_conversion_business_development
,is_conversion_finance
FROM
web_orders
翻译成英语:“垂直行业拒绝就围绕 KPI 的业务逻辑达成一致,因此我们支持真相的多个版本。”
为什么这么臭: 组织成熟度是任何成功的数据计划的关键要素。如果企业不愿意(或不能)做出有时很困难的决策,并使用统一的事实来源向前推进,这种犹豫不决将反映在数据仓库代码库中。
可能的重构:对这种气味的重构在技术上很简单,但实际上很难。业务必须发展,并宣布一个所有垂直行业都将采用的单一定义。在 SQL 中,这很简单:
SELECT
is_conversion
FROM
web_orders
在现实世界中,这可能是一个政治雷区。
最初发表于https://yoyodynedata.com。
数据仓库:理论
构建数据仓库

由 Unsplash 上的 chuttersnap 拍摄
在数据领域,我们已经到了这样一个地步:跟上不同的技术以及使用和处理数据的不同步骤,就像是一项工作本身;将它们应用到实践中更是如此。有数据的收集,存储,清理,分析,数据的使用:这些步骤中的每一步都有人们可以使用的多种工具和编程语言,这些步骤中的每一步都有许多不同的方法来处理你的数据,在云或公司服务器上,旨在实现相同的目标。最*,我有机会接触数据仓库。
假人介绍
数据仓库(DWH)的一个简单定义是专用于数据分析和报告、维护数据历史的数据库。DWH 应用程序通常被称为 OLAP(在线分析处理),但是它们并没有针对事务处理进行优化,事务处理是 OLTP 系统的领域。数据通常通过不同来源(如 OLTP 应用程序、外部数据提供者或大型机应用程序)的 ETL(提取转换加载)过程加载。用户可以读取数据,但不能写入;他们经常执行与时间相关的数据分析。
数据仓库通常被描述为不同数据源的集合,经过转换以便于查询和维护,适应业务需求以进行分析;商业智能环境的基础。
建设 DWH 的优势有很多,但其中一些最重要的优势是:
- 不同数据源的整合
- 轻松查询/访问数据
- 阶段步骤的历史记录
- 分析不同业务单位的数据
通用模式
与任何其他过程一样,有源头也有目的地。在数据仓库的情况下,数据源可以是任何东西,其思想是我们的目标是将许多不同的源放在一起,如*面 excel 文件或操作系统,将它们提供给仓库,从而准备好供最终用户分析。然而,在建立仓库的整个过程中有一些中间步骤。

作者图片
在数据源和仓库之间有一个中转区。临时区域的目的是作为数据源之间的桥梁,收集来自不同数据源的数据,复制它们并将其与一些系统数据一起存储。它们通常每天加载,但可以更频繁地加载。暂存数据也带来了一些好处:
- 数据历史:数据按时间存储,记录它们的历史
- 隔离:数据仓库与数据源分离
紧接着就是真正的仓库。仓库由一个维度模型组成。DWH 视野开阔,因为它拥有公司内所有不同单位的数据,因此是结构化数据的中心点。因此,在到达最终用户之前,还存在另一个可能的步骤:数据集市。
数据集市是 DWH 的一个子集,具有预处理的数据,面向业务部门进行分析。
数据集市的用途是分离不同单元的数据,减少需要考虑的数据量,使访问数据更容易,并将它们与其余单元隔离开来。然而,数据集市的存在是可选的。
无论有没有数据集市,经过处理和组织良好的数据都将用于其最初的目的:分析数据,试图找到有用的事实和见解,在这些数据的基础上构建报告,使提取的信息可视化,或者做更复杂的事情,如数据挖掘。
维度模型
数据仓库的数据模型称为维度模型。命名的原因来自于模型由维度和事实组成。
事实表是那些衡量业务绩效以及它如何随时间变化的表。
这些表包含两种类型的列:事实和维度表的外键/代理键。它可以包含添加剂、半添加剂和非添加剂计量类型,通常占 DWH 的 90%。它们可以有三种不同的类型:事务性、周期性快照和累积快照。事实表的例子是所有那些跟踪公司内定期(每日、每月、每季度等)活动的表,如员工的日常活动、销售、签票等。
维度表是为事实表提供基础的表,具有用于筛选记录、分组记录和标记报告的描述性属性。
相反,维度表为事实表提供了结构良好的信息,这也意味着它们的主要目的是提供数据的过滤、分组和标记。维度的例子有人员、人员的层次结构、产品、地点等。
设计维度模型的第一步是识别两种类型的表、它们的粒度以及它们之间存在的关系。建议这两个表都有代理键,并保持清晰的命名约定。设计这些表格时要考虑的一个重要方面是渐变维度(SCD)。这种表是那些记录随时间变化的属性的表。例如,在保存雇员职位的表格中,重要的是跟踪职位随时间的变化,以便知道每个职位的开始和结束日期。这些表有 6 种不同的类型,选择哪一种适合您的模型取决于稍后将对这些数据进行分析的业务需求。

虚拟星形模式示例—图片由作者提供
星型模式是数据模型中最基本和最有效的模式,其中事实表位于连接到维度的中心。
该模型还有另一个模式,称为雪花模式。

虚拟雪花示例—作者图片
雪花模式与星型模式非常相似,不同之处在于维度之间也是相互连接的。
星型模式是雪花型模式的一个特例。雪花模式只影响维度,事实表相对于星型模式不会改变:维度以规范化的形式保存,以减少冗余,这使它们易于维护并减少存储空间,但这也导致查询数据时所需的连接数量增加。

虚拟总线矩阵示例—图片由作者提供
当该说的都说了,该做的都做了,按照 Kimball 的建议以及几乎任何类型的文档都需要的,可以生成一个总线矩阵,在这里我们再次显示表之间的关系,在这种情况下,强调事实和维度之间的区别。
谨记在心
与数据世界中的任何其他事物一样,不存在适用于所有情况的金科玉律,因此无法给出非常具体的指导原则,它既取决于手头的数据,也取决于业务需求。因此,在考虑构建数据仓库时,需要考虑的是,在构建模型之前,大部分时间都花在了了解可用数据以及您/业务部门希望从这些数据中获得什么。通过这样做,你就能够想到一个模型,以及如何构建每个单独的表,以及如何将它们连接起来。然而,有两个重要方面需要记住:
- 适应变化 :在构建 DWH 时,可能会有来自业务方面的特定需求,但作为一名数据工程师,您必须考虑可能的发展和不同的未来场景,这将对编写模型时做出的决策产生影响。
- 取决于业务审批:DWH 或数据集市的最终用户也是提供需求的人。只有当模型满足其中涉及的业务单元的需求时,才认为模型是有效的。
来源 :
- 罗斯·金博尔:《数据仓库工具包》
- O'Riley 学习:敏捷数据仓库设计
程式化的事实
📈Python for finance 系列
统计预测未来需要什么?

警告 : 这里没有神奇的公式或圣杯,尽管一个新的世界可能会为你打开大门。
📈Python For Finance 系列
我们总说“让数据自己说话”。但是数据要么大声呼喊,要么低声耳语。一些数据属性很容易发现,而另一些则不那么明显,被淹没在噪声中。就像耳边的低语,你必须努力去理解他们在说什么。一旦你从数据中揭示了隐藏的信息,在某些情况下,你可能有机会通过在当前可用的数据中寻找你认为将持续到未来的统计模式来预测未来。换句话说,找出一种方法,让未来看起来更像现在,只是时间更长。本文的目的是向您展示如何从通常不被注意但很有用的数据中获取这些属性。
在我们开始之前,让我们花一分钟思考一个简单的问题:我们可以从一组随机生成的数据中获取多少信息。大多数人可能会给出一个很长的列表,比如最大值、最小值、*均值、众数、中位数、方差、标准差、范围、等等。。人脑能进行抽象思维,其他动物做不到。这些就是统计有用的原因,因为它可以将数据转换成对人们有意义的信息。更重要的是,推断出的信息可以用来推断一些经验发现,即金融中所谓的程式化的经验事实。
本文末尾引用的程式化事实的定义是:
“资产价格看似随机的变化确实有一些非常重要的统计特性。这种在各种工具、市场和时间段中普遍存在的特性被称为程式化的经验事实
用简单的语言来说,就是说如果你想用过去的数据来预测未来,未来的数据必须和过去的数据有共同点。否则,一切都没有意义。所以,这些数据中过去和未来的常见模式被称为程式化事实。金融资产中有一系列广泛的程式化事实,在参考资料中也有解释。
随着程式化事实的出现,另一个概念出现了,静止。对于时间序列数据,*稳时间序列的统计特性如均值、方差、自相关等。都是不变的。大多数统计预测方法都是基于这样的假设,即通过使用数学变换可以使时间序列*似*稳。然后,通过反转先前使用的任何数学变换,可以“不变换”*稳化序列的预测,以获得原始序列的预测。
好了,关于“程式化的事实”和“固定的”已经说得够多了,让我们做一些编码来说明这两个概念。
1.数据准备
为了保持一致,在所有的📈Python for finance 系列,我会尽量重用相同的数据。关于数据准备的更多细节可以在这里,在这里,在这里找到。
*#import all the libraries*
import pandas as pd
import numpy as np
import seaborn as sns
import scipy.stats as scsimport yfinance as yf *#the stock data from Yahoo Finance*import matplotlib.pyplot as plt #set the parameters for plotting
plt.style.use('seaborn')
plt.rcParams['figure.dpi'] = 300df = yf.download('AAPL',
start = '2000-01-01',
end= '2010-12-31') #download Apple stock priced1 = pd.DataFrame(df['Adj Close'])#create a df with only stock price
d1.rename(columns={'Adj Close':'adj_close'}, inplace=True)
d1['simple_rtn']=d1.adj_close.pct_change()#percentage return
d1['log_rtn'] = np.log(d1.adj_close/d1.adj_close.shift(1))
#log return with 1 day lagd1.head()

我想争论的另一件事是去除异常值,我使用简单的*均值和 2 倍的标准差来设定边界。
*#get mean and std*
mu = d1.describe().loc['mean', 'log_rtn']
sigma = d1.describe().loc['std', 'log_rtn']condition = (d1['log_rtn'] > mu + sigma * 2) | (d1['log_rtn'] < mu - sigma * 2) #set the condition to be 2 times of std around mean
d1['outliers'] = np.where(condition, 1, 0)#like an if, else
d1.head()

然后,我去除所有的异常值。
*#using pd's bool selection to remove outliers*
d1_removed_outliers = d1.loc[d1['outliers'] == 0].iloc[:, :-1]
d1_removed_outliers.head()

d1_removed_outliers.info()

如你所见,2765 个数据点中还剩 2667 个数据点。为了方便起见,让我们再次使用 d1 作为数据帧名称。
d1 = d1_removed_outliers
同样,如何去除异常值的所有细节都可以在这里、这里和这里找到。
对数回报和简单百分比回报之间的差异可以在这里找到。简而言之,变量自然对数的微小变化可以直接解释为百分比变化。换句话说,只要变化足够小(在+/- 5%的范围内),百分比变化和自然对数变化几乎完全相同。事实上,如上表所示,simple_rtn和log_rtn中的数字非常接*。
我们可以检查 simple_rtn 和 log_rtn 的相关性,
#calculate the pearson correlation
d1[['simple_rtn', 'log_rtn']].corr()

这两种回报高度相关。从热图中甚至可以清楚地看出:
#draw heatmap with seaborne
cmap = sns.diverging_palette(220, 20, as_cmap=True)
ax = sns.heatmap(corr, annot=True, cmap=cmap,
square=True, linewidths=3,
linecolor='w')
ax.set_title('Autocorrelation Plots', fontsize=26)
sns.set(font_scale=2);

关于熊猫的一个好处是,很容易直接得到那些描述性的统计数据。
d1.describe().round(4)

2.收益的正态(高斯)分布
讨论最多的程式化事实之一是收益的正态(高斯)分布。大量重要的金融模型都是建立在股票收益是正态分布的假设上,而你在本文结尾会看到,可能并不是这样。因此,正态分布可以被认为是金融中最重要的分布之一,也是许多金融理论的主要统计构件之一。
我们来看看调整后价格、百分比回报、自然对数回报的正态性。首先,我们定义一个函数来从d1.describe()中提取描述性统计数据
*#extract all the stats from describe() function*
def extract_data_stats(col):
d_stat = col.describe()
mu = d_stat['mean']
sigma = d_stat['std']
rtn_range = np.linspace(d_stat['min'], d_stat['max'], num=1000)
norm_pdf = scs.norm.pdf(rtn_range, loc=mu, scale=sigma)
return mu, sigma, rtn_range, norm_pdf
准备好*均值、标准差和正态概率密度函数(PDF)后,我们可以绘制直方图和 PDF。
#*draw the histogram with Probability Density Function*
def draw_hist(col, xlim=(-0.2, 0.2)):
mu, sigma, rtn_range, norm_pdf = extract_data_stats(col) sns.distplot(col, kde=True, norm_hist=True, label='Hist')
plt.plot(rtn_range, norm_pdf, 'r', lw=3,
label=f'N({mu:.3f}, {sigma**2:.4f})')
plt.axvline(x=0, c='c',linestyle='--', lw=3)
plt.title(f'Distribution of {col.name}', fontsize=24)
plt.xlim(xlim)
plt.legend(loc='upper right', fontsize=20,
frameon=True,fancybox=True,
framealpha=1, shadow=True, borderpad=1);
百分比回报的直方图和 PDF。
draw_hist(d1.simple_rtn)

自然对数收益率的直方图和 PDF。
draw_hist(d1.log_rtn)

调整后价格的直方图和 PDF。
draw_hist(d1.adj_close,xlim=(-10,50))

显然,股票价格有趋势或周期,这使其远离正态分布。然而,对数回报率和百分比回报率非常相似,接*正常水*。但是常态能被检验吗?
✍Tip!
以防你的图看起来不一样,这里是我使用的 *matplotlib* 参数:
plt.rcParams['figure.figsize'] = [16, 9]
plt.rcParams['figure.dpi'] = 300
plt.rcParams['font.size'] = 20
plt.rcParams['axes.labelsize'] = 20
plt.rcParams['axes.titlesize'] = 24
plt.rcParams['xtick.labelsize'] = 16
plt.rcParams['ytick.labelsize'] = 16
plt.rcParams['font.family'] = 'serif'
关于matplotlib的更多信息,请访问👉Python 中关于绘图的一切。
3.综合高斯性
有一个程式化的事实来自与常态相关的文章末尾的引用,它说:
"4.随着计算收益的时间尺度的增加,它们的分布看起来越来越像正态分布。特别是,在不同的时间尺度上,分布的形状并不相同。”
让我们看看这是否站得住脚。我们创建了一个新的数据框架来保存所有滞后的股票价格回报。
#*get 5 days lagged return by a for loop*
df_simple_rtn = pd.DataFrame(d1['adj_close'])
lags = 5for lag in range(1, lags+1):
col = f'lag_{lag}_simple_rtn'
df_simple_rtn[col] = df_simple_rtn['adj_close']. \
pct_change(periods=lag)
df_simple_rtn.dropna(inplace=True)
df_simple_rtn.head()

#*get 5 days lagged return by a for loop*
df_log_rtn = pd.DataFrame(d1['adj_close'])
lags = 5for lag in range(1, lags+1):
col = f'lag_{lag}_log_rtn'
df_log_rtn[col] = np.log(df_log_rtn['adj_close']/\
df_log_rtn['adj_close'].shift(lag))
df_log_rtn.dropna(inplace=True)
df_log_rtn.head()

我们可以通过修改前面的函数draw_hist()来绘制直方图和 PDF,赋予它一次绘制多个图的额外能力。
#using ax to draw multi-grahps
def draw_hist_multi(col, xlim=(-0.2, 0.2), ax=None):
mu, sigma, rtn_range, norm_pdf = extract_data_stats(col) sns.distplot(col, kde=True, norm_hist=True, \
label='Hist', ax=ax)
ax.plot(rtn_range, norm_pdf, 'r', lw=3, \
label=f'N({mu:.3f}, {sigma**2:.4f})')
ax.axvline(x=0, c='c',linestyle='--', lw=3)
#*adj_close x axis range is wider*
if ( col.name == 'adj_close'):
ax.set_xlim(-10,50)
else:
ax.set_xlim(xlim)
ax.legend(loc='upper right', fontsize=8,
frameon=True,fancybox=True);
你可能注意到了,我用ax而不是plt来画这些图,原因在中有很好的解释👉 用 Python 谋划一切。
现在我们可以把所有的情节放在一个有 2×3 个支线情节的单一图形中。
#*create subplots figure with each plot drawed by draw_hist_multi()*
def draw_hist_subplots(df):
fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(16,9))
fig.subplots_adjust(hspace = .5) #wspace=.001
fig.suptitle('Distribution of returns with increased \
time scale', fontsize=24)
axs = axs.ravel()
for i, col in enumerate(df.columns):
draw_hist_multi(df[col], ax=axs[i])
在一个循环中绘制多个支线剧情的关键是使用axs = axs.ravel(),通过展*支线剧情矩阵,我们可以逐个遍历所有支线剧情。
draw_hist_subplots(df_simple_rtn)

在自然对数回报方面,和预期的一样,没有明显的区别。
draw_hist_subplots(df_log_rtn)

从滞后对数和百分比回报来看,的确,随着计算回报的时间尺度的增加,它们的分布看起来越来越像正态分布。特别是,在不同的时间尺度上,分布的形状并不相同。
4.正规性检验
从上面的图表来看,尽管趋势很明显,但实际上很难判断常态。通过利用scipy.stats包,我们可以用描述性统计进行更严格的正态性检验。
在我们开始做正态性检验之前,我们需要知道两个概念。在统计学中,偏斜度是概率分布中对称钟形曲线的扭曲程度。而峰度是测量分布的峰值和*坦度。回报分布的高峰值和偏斜度意味着投资者将偶尔经历极端回报(正或负)。

正负峰度

正负偏斜度
对于正态分布的数据,偏斜度应该大约为零。
大于零的偏度值意味着分布的右尾有更多的权重,反之亦然。
#*using DataFrame to contain all the stats*
def build_stats(df):
stats = pd.DataFrame({'skew':scs.skew(df),
'skew_test':scs.skewtest(df)[1],
'kurtosis': scs.kurtosis(df),
'kurtosis_test' : scs.kurtosistest(df)[1],
'normal_test' : scs.normaltest(df)[1]},
index = df.columns)
return stats
对于百分比回报
build_stats(df_simple_rtn)

对于日志返回
build_stats(df_log_rtn)

所有的p-值都远低于 0.05,接*于零。具有统计显著性的测试结果(p-值≤ 0.05)意味着测试假设是错误的或者应该被拒绝。一个p-值大于 0.05 意味着没有观察到影响。当p-值为零时,我们必须拒绝零假设,即样本数据的返回具有与高斯分布相匹配的偏斜度和峰度。
我注意到的一件事是,对数收益的偏斜度和峰度的绝对值实际上比百分比收益的要大。剔除异常值后,均值变大,标准差变小,偏度和峰度没有变化。
5.互相关和自相关
在这篇文章结束之前,我想快速浏览一下滞后回报的相关性,如下面的参考文献中所述。
"1.缺乏自相关性:(线性)资产回报的自相关性通常是不明显的,除了非常小的日内时间范围(20 分钟)之外,微观结构效应在这种时间范围内发挥作用。”
就相关性而言,有 3 种不同的类型,互相关、自相关和循环相关。
百分比回报的交叉相关性为
corr_s = df_simple_rtn.corr()
corr_s

和日志返回的相关性
corr_l = df_log_rtn.corr()
corr_l

百分比回报和对数回报的互相关性都随时间而下降。如热图所示。
#*using seaborne to draw heatmap*
sns.set(style="white")
cmap = sns.diverging_palette(220, 20, as_cmap=True)
ax = sns.heatmap(corr_s, annot=True, cmap=cmap,
square=True, linewidths=3,
linecolor='w')
ax.set_title('Correlation Plots', fontsize=32)
ax.set_xticklabels(
ax.get_xticklabels(),
rotation=45,
horizontalalignment='right');

#*using seaborne to draw heatmap*
sns.set(style="white")
cmap = sns.diverging_palette(220, 20, as_cmap=True)
ax = sns.heatmap(corr_l, annot=True, cmap=cmap,
square=True, linewidths=3,
linecolor='w')
ax.set_title('Correlation Plots', fontsize=32)
ax.set_xticklabels(
ax.get_xticklabels(),
rotation=45,
horizontalalignment='right');

一天滞后(之前或之后)的回报的大多数相关性是相关的,因为它们的系数超过 0.8。但是这种相关性很快就消失了。
我仍然很难完全理解自相关性,尽管绘制自相关性很容易。
#*draw autocorrelation for log return with 50 days time lag*
from statsmodels.graphics.tsaplots import plot_acf
fig, ax = plt.subplots()
acf = plot_acf(d1.log_rtn, lags=50, ax=ax)
ax.set_xlabel('lags')
ax.set_ylabel('auto-correlation');

如果你能解释一下自相关、互相关和部分自相关,并在下面留下你的评论,我将不胜感激,谢谢。
现在有一个很大的问题,如何把你的回报转移到一个正态分布?敬请关注更多,即将推出!
参考
- 资产回报的经验属性:程式化的事实和统计问题。量化金融 2001,1 (2),223–236。
谁的数据?
数据专业关键职位—解释
一个古老而美好的东西..
一个数据分析师和一个数据科学家有什么区别?一个 BI 分析师和一个业务分析师?一个数据架构师和一个数据工程师?
不,没有笑点。
数据职业和职位在过去几年中发生了巨大的变化,新的职位出现了,旧的定义不再适用,很难定义您合适的头衔,在招聘时更难找到满足您需求的角色。
几年前,当我试图为我的团队招聘一名初级数据分析师时,我创建了下面的数据职位字典。虽然没有满,但随着新职位的不断出现,它有望帮助你们中的一些人在组建团队或根据市场衡量自己和规划自己的技能时安排自己的思路。
准备好了吗?

数据分析师 学者,数据艺术家
使用各种工具,如预测模型、统计算法和数据挖掘来解决数据相关问题。
通常采用个案定制的方法,利用分析结果指导大范围的运营。喜欢原始数据,知道什么时候深入研究,什么时候建模,拥有(或将为您提供)所有答案。具有技术头脑和积极实践方法的角色。
最喜欢的任务:应用数据模型获得洞察力
数据科学家 革新者,新时代大师
问题解决者。研究问题的已知和未知的潜在解决方案,考虑业务需求来源的生态系统和手头的可用数据来权衡它们,以选择首选解决方案并将其从研究转化为产品。
最喜欢的任务:尝试应用新的研究作为商业问题的解决方案
数据工程师 足智多谋的数据管道工
铺*道路,构建可扩展、可维护且稳定的管道,整个组织的数据流通过这些管道进行分析。
*衡专业工程与实验数据应用需求。
最喜欢的任务:将新数据流集成到组织数据管道中
数据架构师 数据流的导体
创建和维护跨组织的数据存储和消费标准。将数据计划与技术框架和业务目标结合起来,确定战略举措和优化机会。组织数据攀登架的设计者。
最喜欢的任务:设计新数据流的消费
BI 分析师 密码学家,将数据转化为见解
基于现有数据产生可操作的见解,以引导和支持组织内的决策制定。两者都通过分析数据了解过去和评估现在来维持和改变业务。具有强烈商业视角的报道专家。
最喜欢的任务:为商业利益相关者提供可行的见解
业务分析师(营销、产品、系统、财务..)
数据作者和说书人
精通数据的商业专家。与 BI 分析师相比,不太担心收集数据,更关注业务角度。这位分析师是她所在领域的专家,完全致力于用数据支持定义的业务目标(尽管分析不一定是定量的),同时始终牢记组织的效率和盈利能力。
最喜欢的任务:通过收集相关数据研究业务问题,做出清晰简单的决策
数据治理分析师 组织数据的把关人
监控跨系统和来源的组织数据。分析数据差异、可用性和一致性等问题,以提高对数据的信心。以质量为导向,控制数据流。
最喜欢的任务:分析不规则的生产测量以发现根本原因
数据产品经理 面向业务的数据梦想家
确定在公司产品中使用数据的需求和潜在优势。定义可交付的数据,这些数据可以是现有产品的一部分,也可以是供消费者(内部或外部)使用的独立数据产品。数据驱动产品的战略家和远见者,塑造了数据专业人员的运营框架。
最喜欢的任务:为业务问题定义一个数据解决方案
一般来说,所有数据专业人员的技能可以映射到 3 个主要领域,每个领域的熟练程度不同;
- 研究
包括理论数据科学应用、统计学方面的大量知识,并要求与最*的学术界和行业发展保持同步 - 技术
控制各种工具,实现数据操作、分析、构建数据管道和处理大数据量 - 业务
深入了解和熟悉公司所处的市场,包括竞争对手、客户、产品以及公司的战略
将如上所述的不同职位映射到这些技能领域,如下所示:

一系列有明确重点的技能
不是所有公司的所有数据组都会包括以上所有职位,当然也不是作为单个团队成员。在小公司中,由几个利益相关者负责整个端到端的范围是很常见的。然而,这是我给你的建议——你为这个职位选择角色的方式将极大地影响你的预期产出,所以要明智地选择。
例如,数据科学家和数据工程师的职责有时可以统一在同一个人之下。然而,你应该明智地考虑你真正需要的是什么;有工程能力的数据科学家还是有数据科学取向的工程师?
类似地,当定义你是哪种类型的分析师时,考虑这些:你更关注数据还是业务用例?你是现场专家还是精通事实的记者?
我确信我的定义并不完全符合你认识的每一个专业人士,甚至可能不符合你对自己的定义。
然而,我希望它仍然有助于您了解我们工作的数据职业生态系统,并提出一些要点供您下次招聘/学习新技能/重新定位职业等时考虑。
数据争论
一个无代码介绍摔跤你的比特和字节。

图片由皮克斯拜的 Gerd Altmann 提供
数据采集
首先你得拿到你的数据!这可能涉及到从更大的数据集中提取所需的数据。它可能涉及合并两个或多个数据集。
数据形状
一只狗不仅仅是为了圣诞节,而是为了生活,对吗?好吧,数据争论不仅仅是你在数据科学项目中做一次就再也不会重温的事情。这是一项持续的活动。分析的某些方面适合“长”格式的数据,而其他方面更适合“宽”格式的数据。在适当的时候你会更深刻地理解这些术语,但是现在,我们可以举一个例子。假设你对一组人进行了纵向研究,你测量了他们在节食期间的体重。有些人属于体制 A,有些人属于体制 b。您的数据可能是这样组织的:
受试者 ID |日期|制度|体重
您感兴趣的一项分析可能是绘制每个受试者的体重随时间的变化。在这种情况下,上面的“长”格式是合适的,您可以立即绘制重量作为日期的函数。但是如果你想计算每个受试者的体重变化呢?您想要将上述内容重新格式化为
受试者 ID |制度|第一天的体重|最后一天的体重
随着分析的进行,您可能希望在这些格式之间进行切换。这里的要点是,没有一种数据格式可能在项目的所有阶段都是正确的。但是我们强调数据争论是第一步,因为在您进行任何其他事情之前,有一些关键的数据争论步骤要执行。
数据质量
初始数据争论的另一个重要方面是评估数据质量,并在可能的情况下进行改进。这里一个常见的错误是匆忙使用某种技术来估算(猜测)任何丢失的值。这真是不好的做法。想象一下“你曾经服用过违禁药物吗?”这个问题有答案还有一些空白的地方,人们拒绝回答。大多数人可能会如实回答“不”。用“否”来填充缺失的值是否看起来合理?受试者拒绝回答问题的事实可能是你想要保留的一条信息。
如果您正在构建一个机器学习模型来提前预测河流何时会发生洪水,并且河流水位传感器数据中存在缺失值,那么在盲目地用*均河流水位替换缺失值之前,值得探索这些数据。这种分析很可能揭示出,在缺失值之前,河流水位会快速上升,达到某个极端值,即监测站本身被淹没并停止运行的值!用(低得多的)*均水*替换那些丢失的值不是一个好主意!
是的,一些数据质量问题可以立即得到解决。让我们说,人们可以输入他们的性别自由格式' F ',' F ','女性','女性',' Fem ',' Woman'…你随后的探索将大大有助于首先清理这些一致的标准。
对数据质量的评估也有助于提炼你正在解决的实际问题。让我们回顾一下上面的饮食制度的例子。一个数据质量检查可能是计算每个受试者第一次和最后一次体重测量之间的天数。如果 80%的样本出现了一个月,20%出现了两个月,但你知道试验实际上持续了三个月,那会怎么样?你的数据质量似乎不足以回答这个问题“两种制度中的哪一种最终比另一种更好?”但是你可以修改这个问题来回答一个仍然有意义的问题“在第一个月,任何一种制度比另一种更有效吗?”
摘要
数据的采集显然倾向于在分析开始时预先加载。但这并不是说你不会决定一些额外的信息将是真正有用的,并在以后包括它。在整个项目过程中,数据的适当形状会发生变化,因此预计数据形状的争论将是一项持续的活动。事实上,分组和聚合是数据争论的一种形式,会影响数据的形状。数据质量是开始时需要评估的重要内容;你的项目失败了吗?有些问题可以而且应该在一开始就解决,但是许多问题应该标记出来,稍后再详细解决。记住,某些东西丢失的事实本身就是重要的信息!对您的数据质量持批评态度是您应该在整个工作过程中不断做的事情,而不只是在开始时做一次。
关于这篇文章
这是一个链接系列的第三篇文章,旨在简单介绍如何开始数据科学过程。你可以在这里找到简介,在这里找到上一篇文章,在这里找到系列文章。
Python 中的数据争论和监督学习
预测塞拉利昂的埃博拉疫情
这篇文章是由 尼古拉斯·迪亚兹 、MPP’20 在哈佛肯尼迪学院的一个项目基础上加上 杨子倪阿卜杜拉·赛义夫**
在这里 有一个 GitHub,里面有这个项目的 Jupyter 笔记本。
监督学习是世界上使用最广泛的机器学习形式之一。本文将指导您完成构建模型所需的一些最基本的步骤:导入数据、查看数据、以一致的格式输入数据、使用数据样本来训练和测试算法以及优化算法参数。
代码用 Python 显示,Python 是一种通用的编程语言。
我们选择的挑战是预测 2014-2016 年塞拉利昂爆发期间埃博拉在各地区的传播。
问题动机和目标
西非埃博拉病毒疫情(2014 年至 2016 年)造成 11 325 人死亡和重大社会经济破坏,其中大多数死亡发生在沿海国家塞拉利昂。在疫情期间,国家当局有足够的资源来隔离和治疗所有报告的病例,并阻止病毒的进一步传播。然而,事件总数的意外地方差异造成某些地区的应对能力不足(《世卫组织情况报告》,2014 年)。
在当前和未来的埃博拉紧急情况下,需要一个补充工具来指导跨地区的资源分配和提高应对效力。
数据清理
导入适当的库
首先,我们import 将在整个项目中使用的库。Pandas 是 Python 中主要的数据帧操作库,Sklearn 是运行机器学习模型的直观方式。对于Pandas,我们将使用set_option 更改默认设置,以获得更舒适的大桌子显示。
*import pandas as pd
import numpy as np
import matplotlib.pyplot as pltpd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000from sklearn.metrics import mean_squared_error,median_absolute_error,r2_score,mean_absolute_error, accuracy_score, roc_curve, roc_auc_score, confusion_matrixfrom sklearn.model_selection import train_test_split, cross_val_score, GridSearchCVfrom sklearn.feature_selection import SelectKBest, chi2, f_classif
from sklearn.pipeline import Pipelinefrom sklearn.ensemble import RandomForestRegressor*
检查和理解数据
一旦我们导入了库,我们就用 Pandas 的read_csv()方法加载数据。许多有用的方法允许快速检查数据帧:shape、head()、 tail()和info。
*df = pd.read_csv('sl_ebola.csv')
df.shape*

*df.head(14)*

*df.tail()*

*df.info*

看着上面的变量,我们有兴趣更深入地挖掘一些列。将value_counts()应用到特定的列将返回每个类有多少个实例。
*print(df.Country.value_counts(), '\n')
print(df.District.value_counts(), '\n')
print(df['Ebola measure'].value_counts(), '\n')*

我们可以确认我们所有的行都来自塞拉利昂,并且所有地区都有相同数量的实例,这是我们所期望的。
删除因缺少值或不相关而无用的列
现在,前面的info 方法揭示了我们的一些列包含了大部分缺失的值。我们可以通过在我们的数据框架中使用drop()方法来消除这些。inplace 设置为True 意味着它将修改我们的起始数据帧,我们不必重新定义它。我们可以使用head()方法来查看一切是否正常。
*df.drop(columns=['Age group', 'Gender', 'Data as of', 'Outbreak identifier', 'Country', 'Indicator type'], inplace = True)df.head()*

删除不相关的无用行
我们还需要删除不会用于我们分析的行(例如,当它们是一个聚合时)。我们可以通过使用条件选择(!=表示不同于)并将其保存到一个新的 dataframe 名称df2来实现。我们在这一点上重新定义了数据帧,因为这样我们就不必在出错时从头开始。
*df2 = df[df.District != 'Aggregate']*
使用数据透视表操作重塑我们的数据框架
我们目前构建数据的方式还不能用于分析。现在,每个地区、每个星期、两个数据源中的每一个以及两个病例定义(确诊和可能)中的每一个都有单独的行。
为了运行我们的模型,我们希望确保每一行都代表每个地区每周的数字。我们可以通过结合pivot_tables 和一些快速的数据帧操作来实现。
*df3 = pd.pivot_table(df2, values=['Numeric'], index=['District', 'Epi week', 'Ebola data source'], columns=['Case definition'], aggfunc=np.sum)df3.head()*

*df4 = pd.DataFrame(df3.to_records())df4.rename({'(\'Numeric\', \'Confirmed\')' : 'Confirmed_cases', '(\'Numeric\', \'Probable\')' : 'Probable_cases', }, axis = 1, inplace = True)df4.head(10)*

*df5 = pd.pivot_table(df4, values=['Confirmed_cases', 'Probable_cases'], index=['District', 'Epi week'], columns=['Ebola data source'], aggfunc=np.sum)df6 = pd.DataFrame(df5.to_records())df6.rename({'(\'Confirmed_cases\', \'Patient database\')' : 'patient_database_confirmed', '(\'Confirmed_cases\', \'Situation report\')' : 'situation_report_confirmed', '(\'Probable_cases\', \'Patient database\')' : 'patient_database_probable', '(\'Probable_cases\', \'Situation report\')' : 'situation_report_probable', }, axis = 1, inplace = True)df6.head()*

瞧啊。这就是我们想要的。
让我们看看折叠所有信息后,我们有多少行。
*df6.shape*

导出到 CSV
此时,我们应该导出我们的结果,并在 dataframe 中使用to_csv()方法给它们命名。通过这种方式,我们可以与他人共享我们重新调整的表格。
*df6.to_csv('sl_ebola_pivoted.csv')*
数据连接和特征工程
我们在这里没有显示代码,但下一步是将确认的埃博拉病例数据集与世界卫生组织和世界银行提供的许多不同的人口统计指标相结合。
我们还根据地理界限(哪个地区与哪个地区接壤)并通过在边界和报告病例之间建立“互动”创造了新的特征(或变量)。例如,最*几周在邻*的州有多少病例。
运行机器学习模型进行回归
探索回归的代码
我们现在准备开始构建我们的机器学习模型。此时,启动一个新的 Jupyter 笔记本并导入数据是一个好主意。
*df = pd.read_csv('ebola3.csv', index_col=0)
df.head(2)*

坚持
接下来,为了测试我们的模型的预测性,我们将“抽出”几个星期,这样我们的模型就不会在这些星期中进行训练。最后,我们将比较我们的模型对这三周的预测和实际发生的情况。这被称为“维持验证”,是一种确保我们不只是过度拟合的方法——也就是说,我们的模型基本上是在“记忆”数据集。
我们的三周是爆发的开始、顶点和结束。
*selected_weeks = ['2014-09-06', '2014-10-27','2014-12-29']
df_holdout = df[df.Datetime.isin(selected_weeks)]
df2 = df[~df.Datetime.isin(selected_weeks)]print(df.shape)
print(df_holdout.shape)
print(df2.shape)*

丢弃无关变量
我们将做更多的列删除,然后我们将分割我们的X(预测值)和y(目标变量)。出于本练习的目的,我们将重点关注来自“情况报告”来源的确诊病例。
*df2.drop(columns = ['X', 'District', 'patient_database_confirmed', 'Year', 'Week', 'Day', ‘Epi.week’, 'case_occured_PDC', 'case_occured_SRC'], inplace = True)X = df2.drop(columns = ['any_cases', 'Datetime', 'situation_report_confirmed'])
y = df2.situation_report_confirmed*
拆分数据的另一部分
除了在我们的维持集中分离三个星期,我们还做了一个train_test_split() 来分离 20%的数据集。这是为了获得一些关于我们模型性能的样本外统计数据。
*X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)*
随机森林回归量
我们现在利用我们导入的一种称为随机森林的算法,这是一种集成学习器,即多个决策树的聚合,可用于回归和分类。我们用我们想要的规格为我们的模型创建一个变量,然后我们用我们的火车组fit()它。我们可以使用我们导入的指标之一(mean_squared_error)来看看它的表现。
*random_forest = RandomForestRegressor(n_estimators = 100)
random_forest.fit(X_train, y_train)
mean_squared_error(y_test, random_forest.predict(X_test))*

对最佳参数进行网格搜索
现在,监督学习算法有许多参数可供选择。例如,在随机森林家族中,我们可以使用max_depth 来确定我们的树能长多高(也就是说,我们的决策节点能有多复杂)。先验地,对于树在我们的模型中应该有多高,没有正确或错误的答案。这取决于我们数据的性质。最好的选择是通过交叉验证。
在下面的代码中,我们使用sklearn 的GridSearchCV() 函数告诉 random forest 遍历许多不同的选项,并通过交叉验证返回得分最高的选项。然后,我们用这些最佳参数创建一个新的算法实例。最后,我们看到它的新得分。
为了好玩,这次让我们使用不同的度量(neg_mean_absolute_error)来测试我们的算法做得如何。
*gsc = GridSearchCV(estimator=RandomForestRegressor(),param_grid={
'max_depth': range(3,7),
'n_estimators': (10, 50, 100, 1000),
}, cv=5, scoring='neg_mean_squared_error', verbose=0, n_jobs=-1) grid_result = gsc.fit(X, y)
best_params = grid_result.best_params_rfr = RandomForestRegressor(max_depth=best_params["max_depth"], n_estimators=best_params["n_estimators"], random_state=False, verbose=False)# Perform K-Fold CV
scores = cross_val_score(rfr, X, y, cv=10, scoring='neg_mean_absolute_error')np.mean(scores)*

分析我们坚持的结果
现在,我们可以返回到我们的维持集,并尝试基于我们的随机森林回归器和最佳参数来生成预测。按照与训练数据相同的方式将数据帧划分为X和y后,我们可以使用predict 方法为维持集中的每一行生成预测。
*X_holdout = df_holdout.drop(columns = ['any_cases', 'Datetime', 'situation_report_confirmed', 'X', 'District', 'Epi.week', 'patient_database_confirmed', 'Year', 'Week', 'Day', 'case_occured_PDC', 'case_occured_SRC'])y_holdout = df_holdout.situation_report_confirmeddf_holdout['prediction'] = random_forest.predict(X_holdout)*
我们现在可以在一个单独的数据框架中可视化这些结果,并将它们与实际数字进行比较。
*results = df_holdout[['District', 'Datetime', 'situation_report_confirmed', 'prediction']]results.head(20)*

最终模型描述
我们的最终模型考虑了塞拉利昂每个地区的一系列变量,每个地区过去病例数的信息,以及与周边地区的互动,以预测任何给定的一周是否会爆发埃博拉疫情,如果会,预计会有多少患者。
将我们的模型结果可视化的一种方法是在危机期间拿出三周的数据,然后测试我们的预测与实际发生的情况相比如何。我们选择危机开始时的一周,高峰时的一周,以及蔓延放缓时的一周。

从上面的可视化可以看出,我们的模型并没有产生完美的结果。在第三周的情况下,一些被给予低优先的北部地区最终出现了一些最高集中的病例。另一方面,图 1 中的中间一周准确地预测,病例最集中的地区将是塞拉利昂西北部。
总是想到潜在的偏见
当使用数据科学为政策和运营决策提供信息时,考虑到由于不完善的数据而引入偏差的可能性总是很重要的。
在我们的案例中,2013—2016 年疫情期间的埃博拉病例漏报已经得到广泛认可。根据工作人员的观察,世卫组织声称“报告的病例和死亡人数大大低估了疫情的严重程度”。根据一项估计,实际病例数超过报告病例数 2.5 倍。
由于我们的模型是根据报告的埃博拉病例数训练的,我们的预测*均来说会低估实际的埃博拉病例数。此外,漏报的程度可能与地区特征相关,而地区特征对于公*性的考虑也很重要。例如,较贫困地区的监测系统可能较差,导致未报告的病例数量较高。
因此,实际和预测的埃博拉病例数之间的差距在较贫困地区会更大,这可能导致资源分配不公*地对较贫困地区不利。如果没有进一步的信息来说明漏报是如何因地区而异的,我们就无法用有偏差的数据做出无偏差的预测。因此,如果我们的模型被采用,我们建议同时投资于监测系统,以产生更高质量的结果数据。
技术限制
我们目前方法的最大问题是,模型是根据疫情发生的整个时期做出预测的。换句话说,该模型可以查看数据和感染高峰,并知道预计数字何时增长和下降。在现实生活中,如果我们将这个模型应用于新的疾病爆发,那么我们将只有我们所在的那个星期的数据,但显然我们无法预测未来。如果疫情遵循类似的一般增长模式,这不会是一个问题,但不太可能是这样的情况。
结论
准备用于分析的数据是任何监督学习项目中最关键的一步。在这篇文章中,我们学习了一些有效帮助你成功的基本代码,以及模型训练、评估和优化工作流程的基本要素。
使用熊猫进行数据争论的备忘单
重要的熊猫
将原始数据转换成函数形式

在获取原始数据之后,数据争论是将原始数据转换为更具功能性的形式以用于数据分析、模型构建和数据可视化的最重要步骤。它涉及预处理、重组和清理操作,最终产品是一个易于访问的格式的数据集,可以随时进行分析和可视化。
本文的目的是展示在 pandas 中执行这些任务的一些关键操作,pandas 是一个基于 python 的数据操作工具。这里的想法不是详尽地描述所有可用的 pandas 操作,而是给初级和中级用户一个基本功能的方便指南。
这篇文章的内容被分成以下目录。
A.数据框架简介
- 创建数据帧
- 从数据帧中检索数据
- 汇总数据
B.数据争论
- 组合数据帧
- 重塑数据帧
- 处理空值
注意:除了最上面的图片,所有图片都是作者的,包括最后面的可下载备忘单和代码/代码结果。
数据框架简介
DataFrame 是 pandas 中最常用的结构化 API,用于在行(观察值)和列(变量)中存储数据,就像在表中一样。行标签被称为'索引,而列标签被称为'列。我们首先讨论定义数据帧的两种最常见的方法。虽然本文中的讨论仅限于二维数据集,但这里讨论的框架完全擅长处理高维数据。
创建数据框架
让我们从定义熊猫数据帧开始,如下所示。

作者图片
该数据帧由三列(包含三个标记为:col1、col2、col3 的变量)和三行(包含三个标记为:1、2 和 3 的观察值/索引)组成。定义数据帧最简单的方法是提供一个观察值列表然后在数据帧中按行排列。或者,我们可以提供数据作为一个字典,每个条目作为数据帧中的一列。下面是这两种方法的代码。
# Defining DataFrame by specifing a list of observations
df_1= DataFrame([['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i']],
index = [1,2,3], columns = ['col1', 'col2', 'col3'])# Defining DataFrame by specifing a dictionary of columns
df_2= DataFrame({'col1': ['a', 'd', 'g'],
'col2': ['b', 'e', 'h'],
'col3': ['c', 'f', 'i']},
index = [1,2,3])
上面定义的df_1和df_2是相同的

从数据帧中检索数据
数据帧df_1中存储的索引标签 (1,2,3) 、列标签 (col1,col2,col3) 和数据值 (a 到 i) 可以分别使用df_1.index, df_1.columns,和df_1.values进行检索。
对于本文的大部分内容,我们将使用 Iris 数据集,而不是上面定义的 3X3 数据帧。这个公开可用的数据集以四种不同参数/变量 ( 萼片长度、萼片宽度、花瓣长度和花瓣宽度 ) 的形式包含关于三种不同品种的鸢尾花 (Setosa、Versicolour 和 Virginica) 的数据。我们可以使用 iris = pd.read_csv(‘[https://raw.githubusercontent.com/mwaskom/seaborndata/master/iris.csv'](https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'))导入并保存为熊猫数据帧

loc是基于标签的函数,用于访问特定索引和/或列的数据,并返回为该特定索引/列存储的所有条目。iris.loc[[0,1]]将返回索引为 0 和 1 的行:

相反,如果我们只想要标记为 0 & 1 的行中的某些特定列,我们可以使用 iris.loc[[0,1], [‘sepal_width’, ‘petal_length’]]来指定列标签和行标签。

iloc是切片数据帧的第二个选项。它基本上与loc做同样的事情,但是利用基于整数的位置来访问数据,而不是索引和列标签。如果我们使用iris.iloc[1:4,0:3] : 1:4将返回索引为 1,2 的行& 3 在一个基于 0 的索引的数据帧iris中,0:3将返回索引为 0,1 & 2 的列。

虽然loc和iloc在大多数情况下足以对数据帧进行切片,但是切片方法的完整列表可以在这里找到。
汇总数据
本节列出了一些常用于检查数据帧的操作,以便更好地理解其内容。
iris.head(n)和iris.tail(n)分别返回数据帧的顶部和底部 n 行。iris.describe()返回数据集中所有数值变量(列)的汇总。

iris[‘species’].value_counts()将返回包含变量物种的每个唯一值的行数。

iris[‘sepal_length’].nunique()将返回该列中唯一值的个数,正好是 35- 对列或行可以调用的数值运算有:
min()(最小值)max()(最大值)var()(方差)std()(标准差)sum()(加法)等。
数据争论
组合数据帧
在本节中,我们将讨论两种非常重要的组合数据帧的方法
merge使用一个 公共变量作为参考 来组合来自 不同数据帧 的观测值groupby至 根据参考变量的输入,将数据分组到单个数据帧 中。
让我们从定义两个数据帧开始,这两个数据帧是使用数据切片的iloc操作从前面讨论的 Iris 数据帧中提取的。首先,我们使用df_1 = iris.iloc[[1,51],3:]对第 1 行和第 51 行的最后两列进行切片。

然后,我们使用iris.iloc[[1,51,101],[0,2,4]]定义df_2,这将为我们提供 iris 数据库中索引为 1、51 和 101 的行的第一、第三和第五列。

使用species作为参考变量pd.merge(df_1, df_2, how = ‘outer’, on= ‘species’),操作merge可以合并这两个数据帧。由于df_2中提到的物种并不都在df_1中出现,我们需要使用 how参数指定哪些物种应该包含在合并的数据帧中。how = ‘outer’表示两个数据集中任何一个的所有物种都必须包含在合并的数据集中。因为在df_1中没有物种virginica的条目,所以它的值是合并数据帧中变量petal_width的NaN。

然而,如果我们设置了how = ‘inner’,那么只有那些同时出现在df_1和df_2中的物种才会被包含在合并的数据帧中。pd.merge(df_1, df_2, how = ‘inner’, on= ‘species’) 会给:

下面的文氏图展示了how参数的使用。两个圆圈中的每一个都代表一个数据帧,阴影区域显示将使其成为合并的数据帧的观察结果。

作者图片
现在让我们从原始 iris 数据帧中检索另一个数据帧,这次由 8 行组成df_3 = iris.iloc[[1,2,3,4,51,52,53,54],[0,2,4]]

groupby操作可用于使用df_3.groupby(‘species’)拆分和合并df_3中两个物种(setosa & versicolor)的数据。然后,我们可以使用get_group分别访问两个species的数据。
a.get_group('versicolor')

重塑数据帧
在本节中,我们将讨论重塑数据的关键操作。让我们从定义数据帧df_4 = iris.iloc[1:5,0:3]开始

向df_4添加新列需要指定变量名和相关数据
df_4[‘Species’] = [‘versicolor’, ‘versicolor’, ‘setosa’, ‘setosa’] 。请注意,列表的维度必须与现有数据帧中的行数相匹配。

现在,为了给这个数据帧添加一行,我们使用前面讨论过的loc操作。 df_4.loc[5] = [4.9, 1.4, 1.3, ‘setosa’]将返回:

为了删除行和列,我们使用了drop操作。df_4.drop(‘Species’, axis=1)将删除Species列,而df_4.drop(2, axis = 0)将删除索引为 2 的行。注意,我们在这里指定的是索引和列名,而不是相应的从 0 开始的索引值。axis自变量用于区分行和列。0,默认值用于行,1 用于列。
我们还可以通过指定索引和列标签来同时删除行和列,如df_4.drop(index = 1, columns = [‘Species’]).
要制作包含两个或多个原始数据帧副本的数据帧,我们可以使用concatenate功能。pd.concat([df_4,df_4])将加入df_4如下图所示

注意当两个df_4副本被连接时,原始数据帧的索引标签是如何被保留的。传递一个额外的参数ignore_index=True将导致索引标签的范围从 0 到 9。
在接下来的操作中,我们将使用我保存为 excel 文件并通过df = pd.read_excel(“weather.xlsx”)导入的数据帧

注意这个数据帧的结构。这里有一个单变量temperature。Day和city是两个不同的观察值,因为temperature是在两个不同的city(波士顿和纽约市)的五个Days(周一至周五)记录的。我们可以使用pivot操作df.pivot(index = ‘city’, columns= ‘Day’)重新构建该数据帧,给出:

city是这个重新构造的数据帧中的唯一索引,而Day变量已经被转换成列。这种格式的数据框架更易于阅读,避免了重复的Day变量,并且两个城市的temperature值易于比较,因为它们彼此相邻。
为了介绍下一个整形操作,让我们导入另一个 excel 文件作为数据帧。df_1 = pd.read_excel(‘city_weather.xlsx’)

该数据帧与我们之前讨论的df数据帧具有完全相同的数据,尽管格式非常不同。使用melt操作,我们可以将这个数据帧转换成类似于我们之前从 excel 文件导入的数据帧。
pd.melt(df_1, id_vars = [“day”], var_name = [‘city’], value_name = ’temperature’)

melt因此,与pivot在数据帧重组方面的做法相反。
对于我们将讨论的最后一个数据重组操作,让我们定义一个自定义数据帧,如下所示:
df_2 = DataFrame(np.arange(16).reshape(4,4),
index = [['A', 'A', 'B', 'B'],['a','b','c','d']],
columns = [[1,1,2,2], [11,11,22,22]])
df_2.index.names = ['Index1', 'Index2']
df_2.columns.names = ['City', 'Town']
上面的代码是这样做的:它定义了一个由 0 到 15 的整数组成的数据帧,这些整数以4X4的格式排列。指定了两个不同的索引([‘A’, ‘A’, ‘B’, ‘B’] & [‘a’,’b’,’c’,’d’])和列([1,1,2,2] & [11,11,22,22])标签以及每个标签的名称。生成的数据帧如下所示:

分层索引和列标签在复杂的数据集中并不少见,尤其是在描述许多不同变量之间的关系时。我们现在可以使用stack操作来重构这个数据帧。df_2.stack(level = 0)将在City变量处重构数据帧,给出:-

类似地,df_2.stack(level = 1)将如下转换Town变量

处理空值
由于缺乏数据可用性,原始数据集通常包含一些空值(NaN:非数字)。在进行数据建模和可视化之前,需要考虑和替换这些空值。让我们从定义包含 5 个空值的df_na_1数据帧开始。
npn = np.nan
df_na_1 = DataFrame([[1, 2, 3, 4],
[4, 5, 6, npn],
[6, npn, 7, 8],
[9, npn, npn, npn]])

对该数据帧(df_na_1.isnull())调用isnull操作将为所有空值返回 true

然后,我们可以使用dropna 操作df_na_1.dropna()去掉所有具有单个空值的行/观察值,只剩下第一行。

如果我们想删除只有一个空值的列,设置axis = 1 (df_na_1.dropna(axis=1)),现在我们只剩下第一列。

我们可以用选择的值代替空值,而不是丢弃它们。使用df_na_1.fillna({1:100, 2:200, 3:300}),我们可以用不同列的不同值替换空值。标有1的列中的所有空值都由100, 替换,标有2 的列由200 替换,依此类推。

让我们定义另一个数据帧df_na_2
df_na_2 = DataFrame([[100, 100, 100, 100],
[200, 200, 200, 200],
[300, 300, 300, 300],
[400, 400, 400, 400]])

使用df_na_1.combine_first(df_na_2),我们可以组合两个数据帧,使得df_na_1的值为空时,它将被df_na_2中的相应值替换。

下载备忘单

作者图片
上面显示的备忘单包含了本文中讨论的大部分关键概念,可以从这里下载。为了简洁起见,在 cheetsheet 中不可能给出详细的解释,所以请参考本文的正文。感谢阅读。
数据争论—从原始到干净的转变
简单的三个字的解释

当我第一次用谷歌搜索术语“争吵”时,我得到了一些奇怪的结果。牧马人的意思是围捕或看管牲畜如马而牧马人是看管牲畜、围捕牲畜并把它们组织成一个群体的人。完全相同的概念适用于数据争论。因此,在进行进一步分析之前,你应该争论你的数据,以获得更好的见解。
在这个故事中,我为你提供了一个简单的关于数据争论的三个词的解释。
让我们开始吧…
数据争论是收集数据、评估数据质量和清理数据的过程。

数据争论的 3 个步骤
从各种来源为项目收集的原始数据通常是不同的格式,不适合进一步的分析和建模。有时,这些收集的数据并不是真正干净和结构良好的。这使得处理这样的数据变得困难,从而导致犯错误,得到误导性的见解,并浪费你的宝贵时间。
人们常说,数据争论花费了整个项目时间的 70%到 80%,只留下 20%到 30%的时间用于探索和建模。
在数据争论过程结束时获得的数据然后用于进一步的分析、可视化或使用机器学习建立模型。
数据争论将原始数据转换成干净的、结构良好的数据
下面三张简单易懂的图片会让你对整个数据角力过程有所了解。
1。数据收集
根据您的数据科学项目,所需的数据可以从单个文件中获取,也可以分布在多个资源中以不同的格式获取。
有时,数据收集可能是一项具有挑战性的任务。
别担心!!!
Python 来寻求您的帮助。通过它的库,python 提供了许多有用的函数来从不同的资源中提取数据。根据数据资源及其格式,数据收集可能有不同的步骤。如果数据在一个文件中,那么收集就是下载该文件并将其读入您的项目。对于这个 Python,pandas 提供了广泛的read_函数,如下图所示。

这就是 Python 中收集数据的方式
另一种方法是从数据库中收集数据,从网站上抓取数据,或者在 API 的帮助下收集数据。API 代表应用程序编程接口,它帮助你从 Twitter、脸书、Foursquare 等应用程序中获取数据。
API 是特定于应用程序的现成代码
也可以通过实验和数据记录器收集数据。如果您使用任何应用程序进行实验和数据记录,请搜索它的 API。在我的工作中,我通常使用加热室进行实验,并使用 PicoLog 数据记录器 API 来收集所需的数据。
对如何直接从网页中收集数据感到好奇??这是一篇关于网络抓取的有趣的 4 分钟阅读材料。
从网页中提取数据并存储到 excel 中—只需 4 个简单的步骤
towardsdatascience.com](/web-scraping-make-your-own-dataset-cc973a9f0ee5)
2.数据评估
收集之后,是时候评估你收集的数据了。但是等等...你要评估什么??答案是,
质量 和 整洁度
这不是数据探索,但是您将检查您的数据有多脏多乱。质量差的数据的内容有问题,这样的数据是脏数据。通常观察到的质量相关问题有:缺少值、数据不一致、数据类型不正确和重复。另一方面,杂乱的数据存在结构问题,即整洁性问题。正如 Hadley Wickham 在他的论文整理数据中所说,数据在以下情况下是整理好的,
- 每个变量形成一列。
- 每个观察值形成一行。
- 每种类型的观测单位形成一张表

数据评估中需要检查的内容
此外,数据可以通过视觉 和编程 和 进行评估。
视觉评估很简单,只要用你喜欢的任何应用程序打开数据,滚动它,并寻找质量,整洁的问题。在 Jupyter 笔记本中,可以使用head()、tail()和sample()方法查看数据。
程序化评估使用小代码片段和 Python 函数来检查数据质量。熊猫提供了一系列检查数据质量的方法。

一些用于编程数据评估的 Python 方法
3.数据清理
现在是清理和组织数据的时候了。数据清理步骤始终专注于解决在数据评估阶段发现的质量和整洁问题。作为牧马人,直到现在,你也只是收集了数据,看了看它的问题。现在是时候行动起来,总结并组织好它,以获得更好的结果。

一些数据清理技术
根据问题和数据类型,使用不同的数据清理技术。
使用seaborn . pair plot()可以快速检查不同变量之间的相关性。有了这样的图,您将对哪些变量对您的分析不重要有一个部分的了解,并帮助您决定删除哪些列。
如果在同一个项目中有多个相似类型的数据集,那么最好将这些数据合并到一个数据集中。当执行这种数据合并时,最终数据集中可能存在重复或重复的数据点。这些重复的条目可以简单地删除。
这是一个关于合并数据集的有趣的 5 分钟阅读,
了解 Python pandas 中的 merge()和 concat()
towardsdatascience.com](/join-the-tables-ab7fd4fac26b)
另一个常见的问题是,数据类型不正确。在数据清理时,您应该确保数字存储为数值,日期和时间值应该存储为一个datetime对象,等等。诸如pandas.to_numeric()、pandas.to_datetime()、pandas.to_timedelta() 、pandas.DataFrame.astype()等 Python 函数随时可供您使用。
最终,通过删除或替换不正确的条目、删除不相关的变量以及添加新的变量,脏的和乱的数据会得到纠正。
总结一下,
数据的质量和结构是更好地洞察数据的两个重要方面。即使在数据被清理之后,重新评估数据以确保所需的质量和整洁也是一个好主意。这就是为什么在第一张图中,数据争论被视为一个迭代过程。请记住,高质量和组织良好的数据有助于进一步的分析、可视化和建模。
感谢您的时间和阅读!!
我希望你喜欢这个关于数据争论的三个词的解释。请随时添加您的反馈,并在 LinkedIn 上与我联系。
[## Suraj Gurav -副机械工程师-康耐视公司| LinkedIn
查看 Suraj Gurav 在全球最大的职业社区 LinkedIn 上的个人资料。Suraj 有 8 个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/surajgurav17/)
与 Open Refine 的数据争论

马库斯·斯皮斯克拍摄的照片
大多数时候,当我们听到数据争论时,我们会想到使用 Python 或其他语言进行数据清理和操作。在大多数现实生活中,数据是如此的杂乱或庞大,以至于用一种语言来清理会感觉非常手工和痛苦。
Open Refine 是 Google 的一个免费开源工具,它可以清理杂乱的数据,将数据从一种格式转换为另一种格式,并使用其他 web 服务扩展数据。Open Refine 也可以在本地使用,所以你不用担心你的数据会泄露给公众。
在本文中,我们将介绍一个虚构的阳光药店的数据争论过程,该药店陈述了不同药物的销售情况。我们希望使用 Open Refine 来清理当前数据,使其具有标题:产品 ID、产品名称、包装类型、数量。转让和价格。
drive.google.com](https://drive.google.com/file/d/1wtdsf4R-2V1Gc2Jca4vm9Ln3Puvk720y/view?usp=sharing)
从上面的表格中,我们看到数据相当混乱。数据面临的一些挑战包括:
- 不正确的标题名称
- 不规则数据— (1,200)在假定的
Tranf. Quantity列中。 - 表中嵌入了不需要的数据,例如,表中有我们不感兴趣的药店分支和每个分支的总销售额。
开放式精炼装置
Open Refine 可以在 Windows、Linux 和 Mac 上运行。要获得安装说明,请查看安装页面了解所有细节。
一旦安装并运行了它,您应该会在浏览器上看到这样一个页面:

打开优化起始页(图片由作者提供)
从这个起始页,您可以通过导入杂乱的数据来创建一个项目。请注意,数据可以是我们已经熟悉的形式— csv、json、xls、xlsx等。此外,您可以从多个来源获取数据,如您的计算机、URL、数据库等。让我们从计算机上的文件浏览器导入阳光药房数据,然后单击“下一步”。

项目创建前的格式设置(图片由作者提供)
在创建项目之前,Open Refine 向我们展示了项目的预览,以便我们在开始项目之前进行一些更改。如果我们注意,我们会注意到列标题是不正确的。我们将从这里开始清理我们的数据。当前的标题似乎没有用,所以如果我们删除它们,我们不会丢失任何重要的数据。同样,在第 2 行,我们可以得到更好的列标题,所以我们让 Open Refine 使用第 2 行的数据作为我们的列标题。我们可以通过以下方式做到这一点:

忽略项目中的前两行(图片由作者提供)
通过将ignore first选项更新为 2,忽略前 2 行,并且Parse next选项框使用第 2 行的数据作为新的列标题。

更新的列标题(作者图片)
这些列被更新了,尽管不正确,但它已经大大改善了我们数据的外观。我们将在进行过程中修改列标题。另外,请注意,数字周围的括号已被自动删除,数字已被转换为数字(绿色)。现在,我们可以通过单击 Create Project 按钮来创建项目。

新项目表(图片由作者提供)
我们现在有一个新项目。请注意,它在顶部显示了总行数。此外,每页最多只能显示 50 行,最少只能显示 5 行。这是所有奇迹发生的地方。让我们跳进来吧!
将日期提取到它自己的列中
我们首先将第一列中的日期提取到它自己的一列中——dates列。在 Open Refine 中,我们可以通过在第一列的基础上创建一个新列来实现这一点。

基于另一列添加列(按作者排序的图像)
通过点击列标题上的插入符号,我们得到选项Edit column,然后选择Add column based on this column。这就是 Open Refine 变得非常有趣的地方,您可以编写代码来过滤这个非常混乱的列,以获得日期并将它们放在另一列中。

使用 GREL 过滤日期列(作者图片)
从上图中,我们给新列命名为Date,然后继续使用通用精炼表达式语言来过滤该列。如你所见,它非常简单和干净。由于我们正在处理的工作表是针对三月份的,我们要求如果第一列中的任何一行包含单词“Mar ”,那么该列中的数据应该被复制到新的Date列中。点击 OK,看看我们做了什么。

符合要求的行将被复制到新列中(图片由作者提供)
我们的过滤器工作了,带有日期的行被移动到Date列。我们仍然需要对Date列进行一些清理,因为我们仍然有许多空白和不需要的行。另外,请注意,我必须移动 4 页才能看到第 190 行上的第一个日期。
在日期栏中填写
接下来,我们要做的是对新的Date列进行填充。向下填充用任何正好在它上面的数据填充空白行。此举将有助于填补我们的空白行。

在日期栏中向下填充(作者图片)
单击Date列标题上的插入符号,选择编辑单元格选项,然后单击向下填充选项。最初,如果您在表单的第一页上,您可能看不到任何更改。这是因为在第 190 行之前,Date列中没有数据,所以让我们在接下来的几页中检查一下。

填写日期栏(图片由作者提供)
我们可以有把握地假设第一列中的标题将用于Date列中的第一个日期。此外,由于我们之前已经填充了该列,该列中剩余的空白单元格将用于第一个日期。因此,让我们用 2020 年 3 月 2 日星期一来填充空白处。我们将通过使用文本刻面来做到这一点。文本方面获取列中的每个唯一值,并显示它们的频率。点击日期标题上的插入符号,并选择 Facet - > Text Facet。

在日期列上做文本方面(图片由作者提供)

日期列上的文本方面(作者图片)
您可以在Date列中看到各种不同的条目及其频率。但是,我们对空白单元格感兴趣,因此我们可以填写第一个日期。让我们向下滚动文本方面以查看空白单元格。

频率为 188 的空白单元格(图片由作者提供)
单击(空白)链接,只过滤那些在Date列中有空白单元格的记录。您会看到所有记录都是在 2020 年 3 月 3 日星期二之前的。现在,让我们编辑空白并填入正确的日期。将鼠标悬停在(空白)链接上以查看并单击编辑链接。

编辑空白单元格的编辑链接(作者图片)
这将弹出一个提示,让您填写想要的值。我们将输入Monday, 02 Mar 2020并点击应用。您可以看到,更新后我们有 0 个匹配行,因为在该列中不再有任何空白单元格。关闭日期方面以再次查看整个数据表。

编辑空白单元格(作者图片)
清理列和列标题
让我们重新命名我们的标题,让我们对我们的数据有一个更清晰的概念。在开始,我提到我们希望这个数据有列:发布日期、产品 ID、产品名称、包装类型、数量。Transf。和价格。我们将从重命名第一列开始。让我们从第一列开始。点击第一个标题上的插入符号,并选择编辑列- >重命名该列。这将显示重命名列的提示。

重命名第一列(作者图片)
我们也将对日期列进行同样的操作。我们将把该列的名称改为Post Date。产品代码看起来像是保存了药品名称的数据,所以我们称之为Product Name。列 Product/Name 包含药物的价格,因此我们将其重命名为Price。Curr。成本价列保存售出的数量,因此我们将其重命名为Qty Transf.。我们不需要运输。数量,转移。价值和剩余数量。我们将删除 Transf。数量和转移。首先通过点击标题上的插入符号并选择编辑列- >移除此列来获取值。我们可以将最后一列“剩余数量”重命名为Packing Type。

重命名的列(作者图片)
我们已经重命名了列,但是它仍然不在需求的排列中。我们将从Product ID开始。点击插入符号并选择编辑列- >右移列。这会将列移动到发布日期之后。

向右移动产品 ID(作者图片)
我们将通过单击标题上的插入符号将Price列移动到工作表的末尾,选择编辑列- >将列移动到末尾。最后,我们将Qty Transf.向右移动,就像我们之前对Product ID所做的那样。

清理和重新排列后的标题(图片由作者提供)
删除不需要的数据
我们已经清理了标题,现在,我们清理数据。从第一行中,我们可以看到该行不合适,因为该行中没有产品名称、数量或价格数据。在我们的 6360 记录中有许多这样的行,我们必须清理它们。我们可以通过找到列中的空白单元格来做到这一点。我们将从产品名称开始。我们使用文本方面来获取空白单元格,就像我们对Post Date列所做的那样。然后,我们单击(空白)值,只过滤列中的空白单元格。

产品名称的空白单元格(作者图片)
如果我们仔细观察过滤后的数据,我们会发现这些行是阳光药房不同分支机构的标题。我们不需要这些数据,因此我们将删除匹配的行。我们通过点击 All 列上的插入符号并选择Edit rows->Remove All matching rows来实现这一点。

删除与空白产品 id 匹配的行(按作者排序的图片)
这删除了 103 个不需要的记录,这是我们的方式负载污垢。让我们检查其他列,看看我们是否可以看到更多的空白。我们对Qty Transfer.和Price做同样的事情。对于Qty Transf.,我们做了文本方面,我们注意到我们也有空白和一些应该有数字的列中的文本。检查后,我们看到文本也是数据中的标题,我们不需要,空白代表的行是为了显示每日总销售额,我们也不希望在这里。我们将删除它们,就像我们删除Product Name列一样。

28 行匹配空白数量转换。单元格(作者图片)

26 行匹配数量转换中不需要的数据。专栏(作者图片)
对于Price列,除了一个有趣的大数字之外,一切看起来都很好,这个数字代表了这个月的总销售额。我们不需要它,所以我们会像以前一样删除它。

删除代表总计的行(作者图片)
现在我们已经删除了所有不需要的行和列,一切看起来都很整洁。

清理数据集(图片由作者提供)
我们完了。这看起来真棒,你已经走了很长的路。您可能需要做一些调整,比如将负数改为正数,使用 GREL 将日期改为典型的mm/dd/yyyy格式。我把它留给你去玩。
Open Refine 非常容易用来清理非常大的数据集,特别是如果你不是程序员或者不想经历用编程语言清理的恐惧。
我希望这有所帮助。感谢阅读。
使用基本命令进行数据分析:MySQL 工作台
学习如何使用 MySQL Workbench 创建和操作数据库

管理不同文件中的数据总是有风险的。这通常会导致不一致。一个组织无法通过维护成千上万的文件来有效地跟踪其业务活动。因此,数据库用于高效地访问和管理数据。 DBMS(数据库管理系统)软件在行业中广泛用于分析数据。
在本文中,我们将了解如何使用 MySQL Workbench 中的一些基本命令创建和操作数据库,并使用 SQL 语句分析数据。
使用 MySQL Workbench 创建数据库
在创建数据库之前,我们需要熟悉 DDL 和 DML 语句。
你可以从这里安装 MySQL。
SQL 中可用的命令大致分为两类:
- 数据定义语言
- 数据操作语言

作者图片— SQL 命令
数据定义语言(DDL) DDL 用于创建一个新的数据库以及修改一个现有的数据库。DDL 中可用的典型命令有创建、更改和删除。
创建数据库 我们将看到如何使用 MySQL Workbench 创建数据库。我们需要指定我们已经创建的数据库,因为 MySQL Workbench 不会自动选择我们新创建的数据库。
语法:
- 创建数据库<database_name></database_name>
- 使用<database_name></database_name>
通过使用上述命令,我们创建了一个“market_star_schema”数据库。
请注意,MySQL 中的每条语句都以“;”结尾
创建表格
现在我们有了一个数据库,我们将在其中创建组成表。我们将创建一个包含三列及其各自数据类型的表。
通过上面的代码,我们已经创建了三列。
Mode_of_Shipping用数据类型作为字符类型Vehicle_name用数据类型作为字符类型和Toll_Required接受真或假,即布尔类型
更改表格
现在我们已经在数据库中创建了一个表,我们需要分配一个列作为主键。我们将在改变表格命令的帮助下完成。 Alter 命令用于修改现有的表或任何模式对象。
我们将Mode_of_Shipping作为该表的主键。在上面的代码中,我们可以添加一列、移动一列等,而不是添加约束。除了主键,我们还可以添加外键、唯一键等。
下降表
要删除该表,我们必须使用 drop table 命令。请记住,一旦我们使用 drop 命令删除了表,就无法再次检索数据。
数据操作语言(DML) DML 用于处理数据集中出现的实际数据。DDL 中可用的典型命令有插入、更新和删除。
插入数据
插入命令用于将数据插入到列中。我们使用 insert into 命令选择数据库,同时使用 values 命令输入数据。
更新数据
现在我们已经将值插入到表中,我们可以在 update 命令的帮助下更新数据的现有值。
在上面的代码中,
更新命令用于选择我们想要更新数据的表格。
set命令用于选择我们想要改变数据的列。
使用命令的,以便将上述改变的数据应用于该特定行。
删除数据
我们可以使用删除命令删除数据。
在上面的代码中,
- 删除命令用于删除必要的数据。
- 来自命令的用于知道它必须从哪个表中删除数据。
- 使用 where 命令,删除特定列中所需的数据。
修改列
像 DDL 一样,我们可以在 alter 命令的帮助下在现有的表中添加另一列。
在上面的代码中,
- 在 alter table 和 add 命令的帮助下,我们创建了一个新列。
- 我们使用更新和设置命令来更新列的值
- 通过使用 alter table 和 drop column 命令,我们也可以删除列。
如果有任何差异,了解如何立即修改列以输入正确的数据是非常重要的。这样做,我们可以确保在分析数据时获得正确的见解。
在 MySQL 中查询
我们已经看到了如何创建、数据库和操作数据。现在,我们将看到如何使用 SQL 语句编写查询。
有 7 条 SQL 语句:
- 挑选
- 从
- 在哪里
- 分组依据
- 拥有
- 以...排序
- 限制
我们使用一个样本数据库‘market _ star _ schema’,可以从这里下载。
从中选择&
SQL 中的 SELECT 命令的主要功能是从我们的数据库中获取数据。
FROM 命令表示选择命令正在获取数据的表。
我们将从数据库中访问一个表,并使用 select 语句打印表上的所有内容。
在工作台中,输出看起来像这样,

打印数据库中的表—使用 Select 语句
打印列 要从表格中打印一列,我们必须提到列名而不是*。
现在输出将只有表中的客户名称,

打印表格中的列
打印多列 要打印表中的多列,我们必须在 select 语句中提到所需列的名称。
输出将是,

打印表格中的多列
如果我们在 select 语句本身中观察上面的输出,我们已经更改了列名,而不是显示默认名称。
Count
Count使用 select 中的 count ,我们可以打印该列中存在的行数。
输出将是总行数,

总行数
在哪里
Where 子句主要用于过滤掉我们从 Select 命令中得到的结果。为了从表中选择特定的数据,我们使用了 Where 子句。
假设我们需要在我们一直使用的表中查看有多少客户来自某个特定的州。这里,where 子句将发挥作用。
现在,这个州的顾客总数是,

打印使用的客户数量,其中
我们还可以在 where 子句中使用运算符。
输出将如下所示,

在 Where 子句中使用 AND 运算符
同样,我们也可以根据需要使用或>、<、运算符来代替和。
分组依据
要对表中某一列的值进行分组,我们使用 Group by。
让我们找出每个客户群中来自某个州的客户总数。
现在,输出看起来像这样,

使用分组依据的每个细分市场的客户总数
拥有
Having 子句用于对使用 group by 子句创建的组设置条件。
让我们从数据集中取出另一个表。
桌子看起来像这样,

市场 _ 事实 _ 完整表格
现在,让我们看看每个订单产生了多少利润。我们将根据Ord_id列进行分组。
输出将是这样的,

每个订单 Id 的利润
现在,如果我们想要查看利润超过 1000 的订单 id,我们将使用 having 子句。
输出将只显示利润超过 1000 的订单 id

Having 子句
Having 子句始终位于 Group by 子句之后,并且必须位于 Order by 子句之前
以...排序
如果我们想要对一列或多列的值进行排序,我们将使用 Order by 子句。
假设我们想按字母顺序排列客户姓名。我们可以使用 order by 来实现。
输出将按字母顺序显示客户名称。

按字母顺序排列的客户名称
默认情况下,该顺序将按升序排列。如果我们在 order by 之后传递命令desc,那么输出将按降序排列。
对于上面的相同代码,我们将在最后传递desc命令。
输出将是,

按降序排序
限制
limit 用于限制输出将返回的行数。
让我们打印数据库中market_fact_full表中订购最多的三种产品。
现在输出将只显示前三个订购的产品,

前三种产品使用限制
这些是必要的 SQL 命令,用于分析数据集中某个表的数据。
结论
本文展示了如何在 MySQL 中使用各种 DDL 和 DML 命令来使数据可供分析。
DDL 语句用于改变数据库结构,而 DML 语句用于改变其数据。
使用这七个命令, SELECT,FROM,WHERE,GROUP BY,HAVING,ORDER BY,和 Limit,我们可以对特定的表进行数据分析。
一旦我们掌握了这些命令,我们就可以使用内连接、外连接,创建视图和cte,一次对多个表进行分析。
感谢您阅读和快乐编码!!!
在这里查看我以前关于 Python 的文章
- 探索性数据分析(EDA): Python
- 假设检验:数据科学
- (CLT)中心极限定理:数据科学
- 推断统计:数据分析
- Seaborn: Python
- 熊猫:蟒蛇
- Matplotlib:Python
- NumPy: Python
参考
- 数据仓库:https://en.wikipedia.org/wiki/Data_warehouse
- 数据仓库:https://search Data management . techtarget . com/definition/Data-warehouse
- MySQL:https://www.tutorialspoint.com/mysql/index.htm
- MySQL 教程:https://www.w3resource.com/mysql/mysql-tutorials.php
使用 AWS 数据迁移服务(DMS)进行数据库迁移—一路走来的一些经验教训
Oracle 数据库到 Amazon Aurora PostgreSQL 的异构迁移

图片由 Pixabay 提供
最*,我们将一个相当大的内部 Oracle 数据库迁移到了 Amazon Aurora PostgreSQL。开始不同数据库*台之间的异构迁移从来都不容易。将此与将数据库迁移到云结合起来,无疑增加了挑战。
本文的目的是分享迁移方法,并强调我们遇到的一些问题和陷阱。
关于内部 Oracle 数据库
数据库版本: Oracle 企业版 12
数据大小: 1.6 TB
最大的表大小:90 亿行,超过 2000 个分区和子分区
迁移方法

(图片作者)
由于数据的大小相当大,我们决定不要让 AWS DMS 使用 VPN 连接从本地位置获取源数据。相反,我们选择了 Amazon EC2 上的一个临时 Oracle 实例。毫无疑问,从性能角度来看,这很有意义。
数据恢复
- 客户向我们发送了一个在内部创建的 Oracle 数据泵完整数据库导出(expdp ),并将转储文件复制到亚马逊 S3。转储是使用文件大小=64G 创建的
- 一旦转储文件被复制到亚马逊 S3,我们就在一个临时 Oracle 迁移实例上恢复这些文件。为此,我们在 AWS 上构建了一个m5a . 8x 大型 RHEL 7.6 实例。
- 数据恢复完成后,我们验证了本地 Oracle 数据库与 Oracle 迁移数据库之间的行数。
模式转换
我们使用 AWS 模式转换工具进行异构数据库迁移。这个工具工作起来非常顺畅。任何无法转换的对象都被清楚地标记出来,以便可以手动转换它们来完成迁移。假设您没有很多存储过程、函数和包,那么 AWS 模式转换工具将会转换您的大多数模式对象。
一些经验教训……
- Oracle 中的触发器代码迁移方式略有不同。触发器代码被转换成 PostgreSQL 函数,该函数又从 PostgreSQL 中的触发器调用。
- Oracle 中的数字数据类型被转换为 PostgreSQL 中的 double_precis ion。在正常情况下,这应该不成问题。然而,在数据迁移步骤中,我们确实遇到了数据截断问题。我们将在本文后面更详细地讨论这一点。
- 如果在列名中有一个保留字,那么这个名称就会用双引号括起来,比如“PRECISION”。不幸的是,没有简单的方法来标记这些列并预先修复它们。因此,创建一个脚本并根据 PostgreSQL 保留字列表验证列名是一个好主意。获得保留单词列表的一个简单方法是使用下面的 SQL:
SELECT * FROM pg _ get _ keywords()
模式验证
- 我们使用 pytest 框架进行模式验证。我们首先创建单元测试,用于比较常见的模式对象,如表、索引、约束、视图等。在目标数据库中。这个脚本每天都按计划运行,这样我们就能及时发现任何差异。

(图片作者)
吸取的一些教训…
- 我们错过了为 double_precision 问题添加验证源数据的单元测试。实际问题是在数据迁移阶段发现的,这并不好…对于下一次迁移,最好事先知道这个问题
- 我们还错过了为保留关键字添加单元测试。这个问题是在应用程序测试期间发现的,当时有些列用双引号括起来。最好预先标记这些列,并建议修改列名。
数据迁移
我们使用 AWS 数据库迁移服务将庞大的数据集从 Oracle 迁移到 PostgreSQL。
DMS 复制实例和 DMS 端点
一个 r4.4xlarge 实例。Oracle 和 PostgreSQL 各一个端点。
数据迁移任务
所有维度表都很小,因此我们创建一个 DMS 作业,一次性迁移所有这些表的数据。
对于最大的事实表,我们创建了多个 DMS 作业,每个作业复制 5-6 亿行。分割是使用如下选择过滤器完成的:

(图片作者)
一些经验教训……
- 数据迁移后,我们发现一些列的数据被截断。这些列的数据值大于 40 个精度值。这一次,我们使用 numeric(38,25) 执行了另一次数据复制迭代,但这没有帮助。最终,我们通过将这些列转换为源和目的地的 varchar i n、复制数据并最终在 PostgreSQL 中将这些列重置为 numeric 类型来解决这个问题
- 确保为复制实例提供足够的已分配存储,否则您的作业将运行非常缓慢,甚至会失败。我们最初使用默认的 50 GB 大小,但是作业开始变慢和/或失败。我们花了一段时间才找到问题的根源,但当我们将存储容量更改为 200 GB 时,所有作业都成功完成了。以下指标将清楚地向您展示在实施分配的存储更改后,写入和读取延迟下降的确切时间点…此后一帆风顺

(图片作者)
数据有效性
这是我们花时间最多的部分。我们的目标是比较 Oracle 和 PostgreSQL 的每一行数据。
我们首先创建了一个数据验证框架,它使用 JDBC 连接从 Oracle 表中获取数据。然后将每个块与 PostgreSQL 中相应的块进行比较。我们确实预料到 JDBC 方法会很慢,但是该框架在正确性和性能的测试迁移中工作得相当好。然而,在生产运行期间,由于数据量的增加,事情很快就变糟了。在某一点上,我们计算出框架需要一个月的时间来做比较…同样不好。
我们通过改变方法解决了上述问题。我们没有选择 JDBC,而是选择将 Oracle 和 PostgreSQL 表作为 Parquet 格式文件转储到亚马逊 S3 上。然后,我们编写了一个简单的 Pyspark 程序,使用 Datafames 执行比较。我们使用一个 EMR 集群启动了 Spark 程序,该集群有 1 个 m5.xlarge 主节点和 4 个使用 c4.8xlarge 点实例的核心节点。一个月的工作缩短到不到 1.5 天…..还不错。
最后,Pyspark 脚本的结果……听起来很不错。查看 failed_count 列。

(作者图片)
希望这篇文章对你有所帮助。我希望它能在您的迁移过程中节省一些时间和烦恼。如果您需要 Pyspark 脚本,请随时 ping 我。我很乐意提供给你。
我希望这篇文章是有帮助的。AWS 数据迁移服务是由 Datafence Cloud Academy 提供的 AWS 大数据分析课程的一部分。课程是周末自己在网上教的。
数据库 101:数据科学家数据库简介
如何开始接触数据库世界?

图片由作者提供(使用 Canva 制作)
数据科学是快速发展的领域之一,我看不到它会很快放缓。我们对数据的依赖与日俱增。数据科学是关于数据的,收集它,清理它,分析它,可视化它,并使用它来改善我们的生活。
对于数据科学家来说,处理大量数据可能是一项具有挑战性的任务。大多数时候,我们需要处理和分析的数据比我们设备的容量(RAM 的大小)大得多。将信息存储在硬盘上可能会导致我们的代码变慢。
更不用说为了理解数据,并有效地处理数据,我们需要以某种方式对数据进行排序。这就是数据库发挥作用的地方。
数据库被定义为保存在计算机内存或云中的结构化数据集,可以通过多种方式进行访问。
作为一名数据科学家,在您将要从事的大多数项目中,您都需要设计、创建数据库并与之交互。有时您需要从头开始创建一切,而在其他时候,您只需要知道如何与已经存在的数据库进行通信。
当我第一次开始我的数据科学之旅时,处理数据库是最具挑战性的方面之一。这就是为什么我决定写一系列关于一切数据库的文章。
本文将对数据库进行简要介绍。什么是 SQL?我们为什么需要数据库?以及不同类型的数据库。
为什么使用数据库?
数据围绕着我们;我们日常生活中使用的一切都是基于海量的数据。你打开网飞,它会根据你之前的选择建议你接下来应该看什么。你打开 Spotify 应用;它告诉你根据你的喜好想要你可能喜欢的歌曲。
收集和分析数据是个性化我们每个人的体验的方式之一。这是一种打造适合所有人的产品的方式。
但是,
要做到这一点,需要将这些数据存储和组织在某个地方,某个易于访问、提供快速通信且安全的地方。
数据库使结构化存储变得安全、高效和快速。它们为如何存储、构造和检索数据提供了一个框架。有了数据库,您就不必在每个新项目中考虑如何处理数据了。
数据库的类型

图片由作者提供(使用 Canva 制作)
关系数据库
在关系数据库中,数据被组织和存储到可以使用某种关系相互链接的表中。例如,一家航空公司可以有一个所有航班的乘客表,还有一个特定航班的乘客表。航班代码可以连接这两个表。
作为开发人员和数据科学家,拥有连接表的这种能力使我们能够更好地理解表的不同元素之间的关系。理解这种关系可以给我们提示和洞察力,使分析和可视化数据的过程变得更容易。
与关系数据库通信和交互的方法是使用 SQL 语言。
非关系数据库
非关系数据库,也称为 NoSQL 数据库。这些数据库是通过类别而不是关系来连接存储在其中的信息的数据库。
NoSQL 数据库最流行的形式是键值对,你可以像对待 Python 字典一样看待它。键必须是惟一的,只要它们是惟一的,一个键-值对就可以在一个文档中存储所有的关系。
关系数据库使用表作为核心存储单元。数据库中的表由行和列的集合组成,您可以使用关系连接几个表。然而,在 NoSQL,数据存储在类似文档的存储设备上。只要知道文档的结构,您仍然可以执行所有日常任务,如添加、删除、更新数据。
结构化查询语言(SQL)
SQL 是一种功能强大的编程语言,用于在关系数据库管理系统(RDBMS)中操作数据。SQL 相对简单,却如此强大和高效。开发人员和数据科学家使用 SQL 在关系数据库上添加、删除、更新或执行特定操作。
SQL 不仅仅是对数据库执行简单的操作;它还可以用于设计数据库或对存储的数据进行一些分析。
为什么是 SQL?
SQL 非常受欢迎,通常广泛用于软件开发,尤其是数据科学,原因有很多,包括:
- 灵活性: SQL 允许您添加或删除新的列、表、重命名关系,并在数据库启动和运行以及进行查询时进行其他更改。此外,它可以轻松地集成到许多脚本语言中。
- 易用性:学习 SQL 的基础知识既简单又直接。使用 SQL 不需要掌握令人困惑的隐藏提示语法。
- 没有冗余:由于 SQL 的关系特性,您可以在同一个位置获得关于一个条目的所有信息,因此您不需要在所有表中重复相同的信息。
- 可靠性:大多数关系数据库都可以导出和导入,使备份和恢复变得轻而易举。这些导出可以在数据库运行时执行,从而使故障恢复变得容易。
SQL 与非 SQL 数据库
每当你被分配一个新项目或试图设计一个 w 数据库,你可能问自己的第一个问题是“我应该使用哪个数据库?SQL 还是 NoSQL?”。
事情是这样的,当试图选择一个正确的数据库类型时,我经常参考 CAP 定理。CAP 定理描述了数据库的三个方面之间的关系:可用性、一致性和分区容差。
- 一致性:这意味着对数据库的每次查询都应该返回最新的值。一致性有 5 个不同的级别,从强有力的即时结果到最终过时的结果。
- 可用性:这意味着任何人都可以请求数据并得到响应,即使数据库的一项或多项出现故障。
- 分区容错:一个分区是一个系统内的通信中断。容差意味着即使数据库各方面之间的通信中断,数据库也应该正常工作。
要选择一种数据库类型,您需要优先考虑 CAP 定理三个方面中的两个。如果您更关心一致性和可用性,那么您应该选择关系数据库。但是,如果您更关心可用性和分区容差,或者一致性和分区容差,那么 NoSQL 数据库将更适合您的项目。

图片由作者提供(使用 Canva 制作)
结论
数据是数据科学最关键的部分;没有数据就没有数据科学。对于任何数据科学家来说,设计、创建和交流数据库都是发展其职业生涯和丰富其知识库的必要条件。
数据库是一个广阔的领域;我无法在一篇文章中囊括所有内容。这就是为什么我决定将这个主题分成三篇文章,涵盖数据科学家应该了解的所有重要和必要的数据科学知识。
接下来的文章将涵盖数据库设计和交互的基础知识(SQL 介绍)。最后一篇文章将介绍 Python 中常用的数据库库,以及如何为您的数据和应用程序选择正确的库。
数据库 101: SQL 与 NoSQL:哪个更适合你的数据?
差异和最佳实践

图片由作者提供(使用 Canva 制作)
数据是数据科学所有子领域的支柱。无论你正在建造的建筑的规模或用途如何,你都需要获取和分析数据。通常,您需要的这些数据存储在 DBMS(数据库管理系统)中。
要与 DBMS 交互和通信,您需要使用它的语言或它能理解的语言。用于与 DBMSs 交互的语言是 SQL(结构化查询语言)。
*年来,数据库领域出现了另一个术语,即 NoSQL 数据库。如果您刚开始接触数据科学,您可能听说过 SQL 和 NoSQL 数据库。
但是,它们有什么区别,什么时候使用呢?
让我们为绝对的开始而开始。为什么我们有两种与数据库交互的方法?
简单、SQL 和 NoSQL 与不同类型的数据库交互。SQL 是用于与关系数据库交互的方法,而 NoSQL 用于与非理性数据库交互。
关系数据库
数据存储在关系数据库中不同的表中,每个表包含多个记录(行)。这些表使用一个或多个关系相互连接。
键定义了表之间的关系。一个键是包含每条记录的唯一值的表字段(列)。如果一个字段被定义为一个表的主键,这个字段可以包含在多个表中,并且可以用来同时访问不同的表。一旦使用主键将其表连接到另一个表,它将在另一个表中被称为外键。
例如,下图显示了航空公司数据库的一部分。我们有两张表,飞行员表和航班表。这两个表被连接起来,用作飞行员表“PilotId”中的主键我可以使用飞行员的 Id 来访问飞行员表中关于该飞行员的信息,以及该飞行员正在处理的航班。

图片由作者提供(使用 Canva 制作)
因此,在飞行员表中,PoilotId 是主键,而在 flights 表中是外键。PilotId 在这里用于形成两个表之间的关系。
非关系数据库
与关系数据库不同,非关系数据库(NoSQL 数据库)不在表和记录中存储数据。相反,在这些类型的数据库中,数据存储结构是为特定需求而设计和优化的。
与关系数据库使用的 SQL 不同,NoSQL 数据库使用对象关系映射(ORM)来促进与其数据的通信。
NoSQL 数据库的四种流行类型,面向列、面向文档、键值对和图形数据库。这些类型可以单独使用或组合使用。选择将取决于您的应用程序和您需要存储的数据类型。
面向列的数据库
顾名思义,在面向列的数据库中,数据以列的形式存储和组织。如果需要存储稀疏数据,这种类型的数据库非常有用。稀疏数据更趋向于面向列的数据组织方法。
面向文档的数据库
在面向文档的数据库中,排序的数据的结构不需要很严格。它是文档结构中字段和数据值的集合。这些面向文档的数据库通常存储为 JSON 字符串,可以使用 YAML、XML 或纯文本编码来保护数据。
使用面向文档的数据库的一个好处是,您不需要让所有的文档都使用相同的结构。这给了开发人员在同一个数据库中对不同数据类型进行排序的自由。在 Python 中,MongoDB 是面向文档的数据库的一个例子。
键值数据库
如果你熟悉 Python,你可以把键值数据库想象成一个 Python 字典。数据库中的每个数据对象都将被存储为一对键和值。
图形数据库
当您的数据高度互联时,您将需要使用一个允许您高效实现这一点的数据库。图形数据库被认为是最复杂的 NoSQL 数据库。然而,它非常通用,这使得它非常适合许多应用程序。

图片由作者提供(使用 Canva 制作)
如何在 SQL 和 NoSQL 之间选择?
那么,我们如何在 SQL 和 NoSQL 数据库之间做出选择呢?
为了回答这个问题,你需要考虑 4 个方面:灵活性、可伸缩性、一致性和可用的技术。
- 灵活性:有时候,当你的数据有不同的结构和不同的类型。根据定义,NoSQL 数据库给你更多的自由来设计你的模式和在同一个数据库中存储不同的数据结构。另一方面,SQL 数据库具有更严格的结构和模式。
- 扩展性:你见过日本车停车电梯吗?它可以让你把车一辆挨着一辆停放。现在,我想让你问问自己,增加电梯层数和建造新的电梯哪个效率更高? SQL 数据库是垂直可伸缩的,这意味着你可以增加它的级别(增加它的负载)。虽然 NoSQL 数据库是水*可伸缩的,但是您可以通过将工作分配给多个服务器来增加其负载。
- 一致性 : SQL 数据库拥有高度一致的设计。然而,基于 DBMS,NoSQL 数据库可以是一致的,也可以是不一致的。比如 MongoDB 是一致的,而 Cassandra 这样的数据库就不是。
- 可用技术:您可能会考虑的一个方面是数据库技术的当前发展阶段。因为 SQL 数据库已经存在了很长时间,所以它比 NoSQL 数据库发展得更快。所以,对于初学者来说,从 SQL 开始,然后转移到 NoSQL 可能是最好的选择。
根据经验,如果您正在处理 RDBMS(关系数据库管理系统),想要分析数据的行为或想要构建定制的仪表板,SQL 是更好的选择。此外,SQL 通常允许更快的数据存储和恢复,并且更好地处理复杂的查询。
另一方面,我们有 NoSQL 数据库,如果您想扩展 RDBMS 的标准结构,或者您需要创建一个灵活的模式,这是更好的选择。当您存储的数据和日志来自分布式来源,或者您只需要临时存储时,NoSQL 数据库也更好。
外卖食品
最后,我不能说 SQL 绝对比 NoSQL 好,或者相反。它们每一个都有自己的优点和缺点,您的选择将基于您的数据、您的应用程序以及什么使开发过程对您来说更容易。
SQL 数据库更古老,因此研究得更多,也更确定了固定的模式设计和结构。由于其灵活的模式,NoSQL 数据库易于扩展、灵活且使用相对简单。
那么,您的数据需求是什么?你的数据结构良好吗?您正在处理大量数据吗?
永远听从你的数据,你会做出正确的选择。
数据库:概述

第 2 部分:MongoDB 和 HBase 分布式文件系统的底层架构以及 Python 中的数据库操作
在本文中,我们将讨论当今世界提供大数据解决方案所基于的架构,即分布式文件系统,并了解它们实际上是如何实现的。在本系列的第 1 部分中,我们已经讨论了基本的数据库概念和安装过程。作为先决条件,请随意检查。
MongoDB 和 Hbase 都是分布式 NoSQL 数据库,广泛用于处理大型数据问题。让我们进入架构和实现细节。
MongoDB
MongoDB 是一个基于文档的 NoSQL 数据库。它不需要固定的模式定义。Mongo DB 将数据存储为二进制 JSON 或 BSON。它支持水*缩放。几个服务器实例组成一个集群来支持 Mongo DB 作为一个分布式系统。
MongoDB 使用 MongoDB 查询语言,并支持即席查询、复制和分片。分片是 MongoDB 的一个特性,有助于它作为分布式数据系统运行。让我们看看 MongoDB 是如何实现这些特性的。
Mongo 中的复制
复制是一项非常重要的功能,可以防止一台服务器上的数据丢失,提高数据的可用性,并提供故障保护。
MongoDB 使用概念副本集实现复制。副本集是一组托管相同数据集的 mongod 实例。选择其中一个节点作为主要节点。这称为主节点。所有其他节点称为次节点。主节点接收来自用户的所有操作,并且通过使用相同的操作从主节点更新辅助节点以保持一致性。如果主节点关闭,则选择一个次节点作为主节点,并继续执行操作。当故障节点恢复时,它作为辅助节点加入集群。我们可以使用 mongo Atlas 来控制我们的 Mongo 实例集群。 Mongo 集群是基于水*扩展和添加实例的思想创建的。

副本集示意图:作者提供的图像
Mongo DB 中的分片
MongoDB 使用分片来跨多台机器存储数据。它使用水*扩展来添加更多的机器,以根据负载和需求的增长来分发数据和操作。
MongoDB 中的分片安排主要有三个组件:
- 碎片或副本集:每个碎片充当一个单独的副本集。他们存储所有的数据。他们的目标是提高数据的一致性和可用性。
- 配置服务器:它们就像集群的管理者。这些服务器包含集群的元数据。他们实际上拥有集群数据到碎片的映射。当查询到来时,查询路由器使用来自配置服务器的这些映射来定位所需的碎片。
- 查询路由器:查询路由器是作为用户应用程序接口的 mongo 实例。它们接受来自应用程序的用户查询,并向应用程序提供所需的结果。通常,每个集群有多个查询路由器用于负载分布。

作者图片
上图展示了 MongoDB 的分片安排。尽管该映像只有 2 个查询服务器和分片,但实际集群中通常有更多,尽管默认情况下集群中有 3 个配置服务器。
我们上面谈到的思想是 MongoDB 操作及其分布式数据系统架构背后的两个最重要的思想。
现在,让我们看看 Apache HBase 是如何实现分布式系统的思想的。
Apache HBase
Apache HBase 是一个基于列值的 NoSQL 数据库。它基本上存储了基于表或模式的 MySQL 数据库所存储内容的转置。不同的行或记录有不同数量的列或字段。在操作过程中,可以在任何地方插入或更新列。该模式是完全动态的,因此不需要预先声明。最适合非结构化数据。它是水*可伸缩的,特别适合稀疏数据。
HBase 实际上是为处理海量数据而设计的,广泛用于社交媒体运营,每天都会产生大量数据。因此,HBase 通常用于集群中至少有 5 台服务器,并且复制系数至少为 3 的情况。
Apache HBase 是使用 MapReduce 和 Google FileTable 背后的思想开发的,作为一个由 Apache 保护伞支持的开源数据库。Apache HBase 使用了几个有趣的概念,作为领先的技术巨头使用的其他数据库的基本思想。
MapReduce
MapReduce 是一个框架,它的目标是以一种更快、更好维护的方式处理大量数据。它还打算引入并行访问,以便加快速度。MapReduce 的思想主要包含两个部分:映射和简化,正如它的名字所描述的那样。
映射部分由称为映射器的组件执行。映射器检查数据库中插入的每一行数据,并将它们分解成一种键值对。因此,它接收原始输入数据并创建更小的数据块。这是第一阶段。
还原部分基本包含洗牌和还原两个部分。这些操作由称为减速器的部件来完成。reducers 的功能是将映射器的输出进一步分解成更紧凑的键值对。Reducers 的输出存储在底层文件系统中。
输入数据进入文件系统,从那里它被发送到映射器,然后到缩减器。缩减器的输出被保存回文件系统。文件系统中有控制转发流量和网络流量的主节点。
整个系统是用 JAVA 开发的。

MapReduce 架构:作者图片
Hadoop 文件系统
HBase 使用 Hadoop 文件系统作为底层架构。Hadoop 文件系统是由 Apache 开发人员在 Google 的文件表论文中提出这个想法后构建的。让我们检查一下文件系统架构的工作基础。

作者图片
上图描述了 HBase 底层的 Hadoop 文件系统。它有一些基本组件:
Namenode:Namenode 是一个包含 Hadoop 集群元数据的 Linux 系统。它管理客户端数据访问,也管理文件系统的命名空间。
数据节点:数据节点是 Linux 系统,它根据用户或客户端的请求对数据进行读写指令,并根据 Namenodes 的请求进行创建、删除和复制。
系统中还有其他重要部分,如 Jobtracker 和 TaskTracker。在启动 Hbase 之前,我们需要运行 HDFS 系统,并使名称和数据节点联机。
让我们看看 HBase 的架构组件:
HBase 架构

作者图片
上图显示了 HBase 的架构。它主要包含两个主要部分:
- HMaster :组件不存储数据。它是一种控制器。它控制 HRegion 服务器和客户端请求。它有元数据,充当集群的主节点。
- HBase 客户端:这是 HBase 通过其与应用程序进行交互的组件。
- HRegion Server: 这个组件实际存储数据。一个集群有多个 HRegion 服务器。数据基于块分布在多个 HRegion 服务器上。

作者图片
因此,基本上,插入的数据块被分解成块,这些块分布在 HRegion 服务器中,并由集群的 HMaster 管理。
读/写架构
写作:

作者图片
在 HBase 中,写操作如上图所示。HBase 创建一个名为 Memstore 的有限内存缓存。客户端在 Memstore 中写入。现在,由于内存有限,Memstore 很快就满了。每当 Memstore 完全填满时,就会创建一个 Memstore 快照并保存为 HFile。HFile 随后被转移到磁盘上进行永久存储。Memstore 是临时存储器。因此,如果出现故障,可能会丢失数据。为了防止 Hbase 维护称为 WAL 或预写日志的东西。它是保存在光盘中的记录或日志。如果一些记录丢失了,就从磁盘上的 WAL 中检索出来。
阅读:

作者图片
阅读就是这样做的。一旦内存存储的快照保存为 HFile,内存存储就会被刷新。因此,必须搜索所有的 HFile 和光盘来获取信息。这就导致了大量的时间消耗。因此,为了节省时间,创建了称为块缓存的东西来保存频繁访问的信息。因此,首先搜索 Memstore 来访问数据,然后在失败时,搜索块缓存。之后,搜索 Hfiles。
更新和删除
更新和删除不是在客户端传递命令的瞬间完成的。这些命令被保存为标志、更新标志或删除标志。Hfiles 是不可变的,也就是说,一旦写入,就不能更改。因此,当这些 Hfiles 被合并以写入光盘时,这些值被更新或删除。因此,为了访问数据,HBase 还需要检查 Hfiles,以在返回查询结果之前查看是否有这样的标志。
我们已经讨论了 HBase 的所有整体思想和概念。
我们看到的 Hbase 和 MongoDB 的概念是大多数当前 NoSQL 数据库使用的一般概念。
用 Python 实现
让我们看看 python 如何使用和访问数据库。首先,我们需要了解 MySQL、MongoDB 和 HBase 之间的基本结构差异。
MySQL 在最顶层有数据库。在第二层,有表格。在最低级别或最后一级,有记录或行。所以,每个数据库都有表,每个表都有记录
MongoDB 有数据库。每个数据库都有集合而不是表。每个集合都有最低层的文档,描述键值对。
HBase 的最高级别只有表。然后它有行索引或索引,就像每个记录的主键。要在 HBase 中执行任何操作,我们需要知道必须是唯一的行或记录 id。HBase 也有柱族的概念。它没有固定的模式,但是列族有助于全面了解表的数据记录中的列。每个表只能有一个列族。
MySQL:
实现 MySQL-python 和 mysql-connector-python 是为了从 python 提示符或使用 python 代码访问正在运行的 MySQL 数据库。
MySQL-python 可以从 这里 安装。
mysql-connector-python 可以从这里的安装。
语法:
关系
**import** **MySQLdb**
**import** **mysql.connector**
conn= mysql.connector.connect(host="localhost",user="abhijit",passwd="1234",db="users" )
mycursor = conn.cursor()
插入:
mycursor = conn.cursor()
mycursor.execute('INSERT INTO user_details (id,email,password) VALUES("**%s**","**%s**","**%s**")'%(id1,email,passwd))
conn.commit()
查询:
query="""SELECT * FROM user_details WHERE email='**%s**'"""%(email)
mycursor = conn.cursor()
mycursor.execute(query)
dup=mycursor.fetchall()
i=mycursor.rowcount
MongoDB
PyMongo 库用于从 Python 提示符访问 MongoDB。
pymongo 库可以从这里的 安装。
Pymongo 的官方教程可以在这里 找到 。
语法:
连接:
**import** **pymongo**
**from** **pymongo** **import** MongoClient
client = MongoClient()
client = MongoClient('localhost', 27017)
db_mongo = client['user_connections'] #selecting database
m_user_recs= db_mongo['user_records'] #selecting collections
插入:
data={
'c_id':'abhi',
'connections':['123','myac.a','abhir'],
'posts':[]}
m_user_recs.insert(data)
因此,我们可以在 mongo 文档中插入任何数据类型。它可以是列表,甚至是子文档。
查询:
recs=m_user_recs.find({"c_id":id1}) #(1)
f**or** r **in** recs:
frnds=r['connections'] #(2)
查询(1)返回字段“c_id”的值为 id1 的文档。(2)代码片段从返回的文档中选择“连接”字段。
更新:
myquery = { "c_id": id1 }
new_val={"$set": { "req_sent": cons }}
m_user_recs.update(myquery, new_val)
该查询将“req_sent”字段的值设置为由变量“cons”给出,其中字段“c_id”具有由变量 id1 给出的值。
HBase
HappyBase 库用于从 Python 访问 Apache HBase。
Happybase 可以从 这里 安装。
Hbase 的官方教程是 这里是 。
$ create 'table_name', 'column-family'
上述语法可用于从 HBase shell 创建 HBase 表。
语法:
连接:
**import** **happybase**
conn=happybase.Connection('localhost')
table=conn.table('users')
插入:
table.put(id_u, {b'cf_user_1:name': record[1],b'cf_user_1:from': record[2],b'cf_user_1:Education': record[3],b'cf_user_1:Profession': record[4],b'cf_user_1:location': record[5],b'cf_user_1:birthday': record[6],b'cf_user_1:profile_pic': record[7]})
上述语法可用于从 python 插入 HBase 表。这里的“id_u”是具有行键的变量。b'cf_user_1 '是列系列,而' name '、' from '是行的字段。
查询:
row_f=table.row("Roy Key")
loc=(row_f[b'cf_user_1:location'])
fr=(row_f[b'cf_user_1:from'])
edu=(row_f[b'cf_user_1:Education'])
代码片段的第一行可以访问该行。接下来的几行访问相应的字段。
我们已经看到了这些库以及它们在 python 中的相应用法。
结论
在当前世界中,随着社交媒体网站和云的概念日益发展,大数据的概念越来越受到关注。每天都有大量的数据上传到云端。所以,我们已经越过了这个点,数据量可以由世界各地的一百或一千台计算机来处理。现在,分布式系统将会越来越受欢迎。像 Cassandra、FileTable、CouchDB 和 Hadoop 这样的数据库开始被 Linkedin 和脸书这样的普通和最大的社交媒体网站所使用。
在本文中,我们已经看到了 python 中的概念及其工作方式和库。如果你想要一个工作实例,请在这里 找到我的 GitHub 库 。
希望这有所帮助。
数据库:概述

入门
第 1 部分:概念和安装:MySQL、HBase、MongoDB
在当今世界,我们必须处理大量的数据,并以一种有利的方式存储这些数据。如今,每天都有大量的数据来自脸书和 Twitter 等社交媒体网站。以前,我们主要处理结构化数据,即可以包含在表格结构中的数据,因此,我们在所有情况下都使用 MySQL。在当前的场景中,首先,数据是以非结构化的方式获取的,并且需要以非结构化的方式存储;其次,数据是以海量的方式获取的。因此,不可能在一台服务器上存储一个数据库的全部内容,需要同时访问多台服务器。当前的数据库还需要容错,即如果一个数据库服务器由于某种原因出现故障,数据不会丢失,并且如果该服务器上的数据被用户访问,其他服务器会响应请求。
所有这些原因导致了 NoSQL 和分布式数据库系统的设计。目前,Oracle、PostgreSQL、Microsoft SQL services 等 SQL 数据库被广泛用于处理结构化数据,而 MongoDB、Hadoop、Amazon 的 DynamoDB 和 Hbase 等 NoSQL 数据库被用于处理非结构化数据。
属性和概念
如今,我们广泛使用 SQL 和 NoSQL 数据库。它们没有一个比另一个更好,它们是根据情况的要求来选择的。NoSQL 数据库支持变量模式,因此在声明期间不需要模式定义。它们最适合动态数据。SQL 数据库需要模式定义,但是拥有一种结构化语言并具有像 JOIN 这样的属性,易于使用并与复杂查询兼容。
让我们检查一些重要的概念。
原则:SQL 和 NoSQL 都遵循一些原则。它们是:
酸性
- 原子性:SQL 数据库上的事务或操作要么完全执行,要么根本不执行。
- 一致性:在 SQL 数据库上执行操作或事务前后,数据库的状态保持不变。例如:A 在银行有 2000 单位的存款,B 有 1000 单位,总数是 3000。现在,如果 A 转账 500 给 B,同样在操作之后,总额保持不变。这就叫一致性。
- 隔离:该属性确保即使几个事务同时发生,所有的事务都是互斥的,换句话说,是隔离的
- 持久性:该属性确保一旦事务被提交,它就被保存并且不再被修改
上限理论
- 一致性:表示服务器网络中存储相同数据的所有节点读取最*写入的值,并相应地进行更新。
- 可用性:它声明每个请求都应该收到一个响应,无论是成功还是失败,并且它可以处理多个请求。
- 分区容差:表示数据库成功运行,没有数据或消息丢失或系统的任何部分出现故障。
缩放

伸缩的概念在分布式系统的开发中起着巨大的作用。扩展是一种系统,它允许服务器不断发展,以应对不断增长的数据量。主要有两种方式。第一个是垂直缩放。这个概念以前使用过。这个概念表明,我们一直使用一个实例,并随着数据负载的增加而更新实例的大小和性能。这个过程非常昂贵,但易于实施。一些 SQL 数据库使用垂直缩放
第二个概念是水*缩放。一些 NoSQL 数据库,如 MongoDB 和 CouchDB,使用水*伸缩。分布式系统是使用这个概念实现的。创建了几个服务器计算机集群。每台服务器计算机称为一个实例。水*扩展意味着我们应该向集群添加更多的实例来处理更多的数据。
复制

复制的概念是当前分布式数据库系统中另一个非常重要的概念。来自一个数据库服务器的数据被复制到其他副本服务器。因此,数据是分布式的。这一概念创建了备份并提高了可用性。在 MongoDB 的例子中。服务器中的数据分布在该集群中的其他服务器中。其中一台服务器充当主服务器,其他服务器充当副本服务器。如果主服务器出现故障,将选择其中一个副本服务器作为主服务器。一旦故障服务器保持运行,它将作为副本加入群集。在数据更新的情况下,主服务器从应用程序获取更新,然后更新的数据与所有副本同步以保持一致性。
NoSQL 数据库:类型
NoSQL 不仅代表 SQL。非结构化数据是指不能以表格方式存储的数据。设计了几种 NoSQL 方法来处理这些类型的数据。其中最常见的是:
文档数据库:这些数据库以 JSON 格式保存数据。他们使用键值对。它们是可定制的,最适合动态数据。每个键可能有也可能没有相同数量的字段。例如:MongoDB 和 CouchDB。结构:

列数据库:这些数据库将数据写入列而不是行。每一行都有一个特定的行 id。这里的每个操作都是使用行 id 执行的。这种类型的数据库背后的想法是,每条记录可能不包含所有列的值。因此,我们修复 row_id 并按列输入数据。每条记录的列数可能相同,也可能不同。比方说,在 facebook 注册中,需要很多数据。不同的用户填写不同数量的字段,在这种情况下,基于列的数据库广泛用于仅存储输入的数据。例如:Apache Cassandra、Apache Hbase

对于基于列的结构,我们需要为表定义一个列族。它类似于表定义的一部分,尽管它并不严格。
键值存储:这些类型的数据库工作起来像哈希函数或哈希表,它们是不可定制的。例如:Redis
基于图形的数据库:这些数据库把每一条记录看作一个节点,把值看作节点的特征。例如:Neo4J
在系列文章中,我们将讨论三个最常用的数据库:MySQL、MongoDB 和 HBase 以及它们在 python 中的实现。
安装
我用的是 Ubuntu 18.04 系统。我正在为 ubuntu 系统提供安装。
MySQL
它是一个关系数据库。它是一个免费的发行版,由 oracle 提供支持。它可以独立安装并从终端使用,也可以使用 PHPMyAdmin。对于第二个选项,需要安装 apache 服务器,或者可以通过 LAMP (Linux、Apache、MySQL、PHP/Python/Perl)堆栈应用程序(如 XAMPP)使用。

Xampp 应用程序
对于 MySQL 安全安装。执行给定的步骤:
$ sudo apt update
$ sudo apt install mysql-server
$ sudo mysql_secure_installation
这些步骤将以安全的方式安装 MySQL。最后一步将让您创建安全用户并为他们设置密码。
MongoDB
MongoDB 是使用最多的 NoSQL 数据库。它的工作原理是分布式数据库系统。我们可以使用下面给出的步骤在我们的系统上设置一个单一的机器集群数据库。MongoDB 是一个文档数据库,使用键值对。该安装仅适用于 ubuntu 18.04。对于其他版本,相应的 Ubuntu 版本是不同的。安装步骤:
$ wget -qO - [https://www.mongodb.org/static/pgp/server-4.4.asc](https://www.mongodb.org/static/pgp/server-4.4.asc) | sudo apt-key add -
$ echo "deb [ arch=amd64,arm64 ] [https://repo.mongodb.org/apt/ubuntu](https://repo.mongodb.org/apt/ubuntu) bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
以上代码为相应的发行版安装了最新版本的 MongoDB。
要启用或启动 mongo:
$ sudo systemctl status mongodb
$ sudo systemctl mongodb start
MongoDB 通常在本地主机和端口 27017 上运行。启动 MongoDB 的大多数错误都是在端口上运行其他操作时发生的。MongoDB 创建一个“data”文件夹来保存 Mongo 的数据和元数据。有些错误是由于无法访问数据文件夹而引发的。
第一个错误可以使用以下命令来纠正:
$ ~ netstat -an | grep 27017
这将列出端口上所有活动的进程。您需要终止这些进程并重新启动 mongo。
对于第二个错误,我们需要在外部创建 data 文件夹,并让 mongo 使用它。步骤:
$ cd /Users
$ cd home
$ mkdir data
$ cd data
$ mkdir db
$ mongod --dbpath ~/data/db
重启 mongo,我们就可以开始了。
通常在重启 mongo 服务时会停止。在进行调试步骤之前,请检查 mongo DB 的状态,如果没有运行,请重新启动它们。
我们可以使用 Mongo Compass 来使用 Mongo 的 GUI 版本。这里的是免费且容易获得的。
HBase
HBase 是一个 NoSQL 数据库。这是一个基于列的数据库。它用于非结构化数据,并且是可伸缩的。HBase 是一个由自由分布的数据库驱动的 apache。它也可以使用系统集群,但是我们可以创建一个单独的系统集群。
HBase 在底层使用 Hadoop 数据库文件系统,所以我们需要先安装 Hadoop,它也可以在 java 上工作,所以我们需要安装 Java 来操作 Hbase。
因此,要安装 Hadoop,请遵循以下步骤:
$ sudo apt update
$ sudo apt install openjdk-8-jdk -y
$ java -version; javac -version
这些命令将安装 java,最后一行将提供安装的 Java JDK 的路径和版本。我们需要拯救这条路。
接下来,开始步骤:
sudo apt install openssh-server openssh-client -y
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
ssh localhost
这些步骤将允许用户连接到本地主机。
接下来,进入 Hadoop 的官方页面,选择版本并下载二进制版本。这可以手动完成,或者我们可以使用“wget”命令来安装。对于版本 3.2.1,我们可以使用代码片段
**wget** [**https://mirrors.estointernet.in/apache/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz**](https://mirrors.estointernet.in/apache/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz)
我们的 Hadoop 将被下载。
为了安装,我们需要配置 Hadoop 文件和 Bash 来更新环境变量。按照步骤进行配置
$ sudo gedit .bashrc
在 Bashrc 中粘贴以下行:
export HADOOP_HOME=/home/abhijit/hadoop-3.2.1
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/binexport JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH=$JAVA_HOME/bin
这些只是环境变量和下载路径。请根据您的下载位置进行检查。如果出现错误,请相应地更改 Hadoop 主路径,因为该文件夹保存在您的系统上。要让更新后的 bash 工作,请使用:
$ source ~/.bashrc
接下来,使用
$ cd hadoop-3.2.1
$ cd etc
$ cd hadoop
$ ls
在这里,我们必须更新文件:
- hadoop-env.sh
- 核心网站. xml
- hdfs-site.xml
- mapred-site-xml
- yarn-site.xml
因此,使用“gedit”打开每个文件,粘贴相应的行并进行更改。
hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
该行存在,但被注释掉了。我们只需要取消注释并进行修改。我们必须确保路径与我们保存在 bash 文件中的路径相同。
core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/abhijit/tmpdata</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
</configuration>
请相应地更新值部分。我在用我的分机。这些文件在安装时自动创建。如果未创建“tmpdata”文件夹,请手动创建并更新路径
$ mkdir tmpdata
hdfs-site.xml
<configuration>
<property>
<name>dfs.data.dir</name>
<value>/home/abhijit/dfsdata/namenode</value>
</property>
<property>
<name>dfs.data.dir</name><value>/home/abhijit/dfsdata/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
该文件包含基本的 Hadoop 文件系统配置。
mapred-site-xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>127.0.0.1</value>
</property>
<property>
<name>yarn.acl.enable</name>
<value>0</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PERPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
保存所有文件,我们就可以开始了
接下来,返回“hadoop-3.2.1”主文件夹,使用以下命令:
hdfs namenode -format
这将格式化创建的 namenode 文件夹。
接下来,使用:
$ cd sbin
$ ./start-all.sh
最后一个命令启动所有服务。
运行后,它将看起来像:

我们可以使用“jps”命令来列出正在运行的守护进程
现在,我们准备安装 HBase。
要安装,我们可以使用 wget 命令,也可以从下载 URL 手动下载
我使用过 HBase-2.2.6,使用:
wget [http://www.apache.org/dyn/closer.lua/hbase/](http://www.apache.org/dyn/closer.lua/hbase/)[hbase-2.2.6-bin.tar.gz](https://mirrors.estointernet.in/apache/hbase/2.2.6/hbase-2.2.6-bin.tar.gz)
如果您是手动下载,请将其粘贴到主目录中。
接下来,在 Hbase 中,我们还需要进行一些配置。我们需要在环境变量中添加 Hbase 路径:
$ gedit .bashrc
然后,我们需要粘贴这些行来更新环境变量:
export HBASE_HOME=/home/abhijit/hbase-2.2.6
export PATH=$PATH:$HBASE_HOME/binNow, close the file and use *source ~/.bashrc*
我们需要去 conf 文件夹。
$ cd hbase-2.2.6
$ cd conf
在 conf 中,我们需要打开“hbase-env.sh”文件,并粘贴下面给出的行,就像我们在前面的例子中所做的一样:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
接下来,我们需要更新 hbase-site.xml
hbase-site.xml
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>./tmp</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://127.0.0.1:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name><value>/home/abhijit/zookeeper</value>
</property>
</configuration>
请相应地注意“tmp”和“zookeeper”文件夹的文件位置。
现在,我们可以走了。
我们需要转移到“hbase-2.2.6/bin”并使用。/start-hbase.sh 启动服务。
$ cd hbase-2.2.6/bin
$ ./start-hbase.sh

在这里,我们可以看到 HMaster、HRegionServer 和 HQuorumPeer 正在运行。这表明我们的 HBase 服务器已经启动并正在运行。
我们可以使用 HBase shell 来访问我们的 HBase:

通常 Hbase 在端口 9000 上运行。
如果我们想用 python 访问 Hbase,它有一个‘happy base’库。它使用节俭网关访问 Hbase。为此,我们还需要在 9090 端口上运行 thrift,使用:
hbase thrift start -p 9090

我们也将能够看到我们的节俭服务器运行。我们现在可以使用 Hbase 了。
结论
在本文中,我们已经了解了如何安装数据库以及数据库中的一些基本概念。本系列的第 2 部分讨论了 python 中的概念和工作示例。
希望这有所帮助。
fastai 中使用 Lego Minifigures 数据集的数据块 API 和图像分类
我可以一整天都这样——史蒂夫·罗杰斯
本帖涵盖的主题如下
您可以点击上面的任何主题,导航到相应的部分

介绍
图像分类自古以来就是一项非常常见的任务,然而直到深度学习之后,计算机才能够熟练地完成这项任务。随着卷积神经网络的出现,这项任务变得如此出色,以至于*年来计算机在一些分类应用中也击败了人类。建立一个模型来进行图像分类(MNIST 数字识别)标志着许多初学者深度学习之旅的开始。因此,让我们做同样的事情,只是让它变得更令人兴奋,通过使用一个在 Kaggle 上策划的数据集,叫做乐高迷你人物分类。
由杰瑞米·霍华德和西尔万·古格开发的 fastai 是一个基于 PyTorch 构建的库,用于深度学习实践者简化构建/训练和从 DL 模型进行推断的过程。用相对较短的代码,您可以为几乎所有的任务(分类、回归(结构化和非结构化数据)、协作过滤等)建立最先进的模型。)使用这个库;这就是制作它所付出的努力。所以让我们充分利用它,从图像分类这个任务开始。
任务
我们有 27 个由乐高建造的不同迷你人物的图像,这些图像是从 Kaggle 这里获得的。我们必须建立一个分类器,当给定一个特定的迷你人物的图像时,它可以告诉哪个超级英雄/角色。让我们读入数据集,看看其中的几个条目。

图片由 Vinayak 提供
正如我们所看到的,索引文件保存了加载需要提供给模型的数据所需的信息,元数据包含了关于不同类的信息。
当我们仔细观察迷你人像时,可以观察到 class_id 1 和 class_id 17 都代表蜘蛛侠。id 17 中的蜘蛛侠是漫威超级英雄系列中的一个,因此被相应地重新命名为漫威蜘蛛侠。一旦完成,我们就可以将 class_id 上的索引和元数据文件作为主键连接起来。
此外,数据块 API 期望列 train-valid 是一列布尔值,如果该行属于验证集,则该列的值为 true,否则为 false。因此也进行了更改,完成所有这些后,最终的数据帧如下所示。

图片由 Vinayak 提供
让我们分别看看训练集和验证集中的图像数量。一般来说,它们的比例相等是好的,而且它们应该属于同一个种群。让我们看看数据的分布情况。

图片由 Vinayak 提供
数据集看起来非常*衡,在训练集和验证集中各有* 150 个元素。嗯,关于图像标准,这个数字对于训练神经网络分类器来说是相当低的。当有大量图像时,深度神经网络学习良好的表示函数。相对于正常的深度学习标准,每个分类标签有数百或数千张图像是非常正常的。在这里,我们有 27 个类的 300 多张图片,这意味着我们每个类的图片不超过 10-12 张。让我们看看使用这些数据可以建立多好的模型。
fastai 数据块 API
在任何应用中,将大量时间消耗在以适合于馈送到深度学习模型的格式来管理数据上。为了简化这一过程,以便任何 DL 实践者都可以专注于模型构建和解释,而不是数据管理,fastai 提出了 DataBlock API,它在数据管理方面非常出色。
通常,数据以下列两种方式之一进行组织
Imagenet 目录结构

图片由 Vinayak 提供
在这种格式中,数据是以文件夹方式管理的。训练集和验证集有单独的文件夹,并且它们中的每一个都有对应于各自类别的文件夹,这些类别具有对应于那些类别的相关数据。除此之外,树结构是针对一个以 Imagenet 目录形式管理的猫狗数据集的。
将信息包装在 csv 中

图片由 Vinayak 提供
在这种方法中,关于数据结构的信息被包装在一个 csv 中。它包含所有信息,如数据的路径、数据的类别、项目是否属于定型集或验证集等等。我们当前的数据集是以这种特殊格式管理的,我们将利用它来创建数据块。
fastai 的 datablock API 提供了对这两种结构甚至更多结构的支持,但是,我们将看看 API 的一般结构,以及我们如何使用它来解决这个问题。
datablock API 接受几个参数,有些是强制的,有些是可选的。我们将按顺序逐一讲解。
- 块:为了指定输入和输出。这里,我们有一个图像作为输入,一个类别/标签作为输出。我们的输出是 CategoryBlock,但其他输出可以是 ImageBlock(用于自动编码器),MultiCategoryBlock(用于多标签分类)等。
- splitter: Jeremy 总是强调验证集的重要性,以便评估模型的性能,这是对的!如果不这样做,我们永远不会真正了解我们的模型表现得有多好。要做到这一点,我们可以指定一个 RandomSplitter 或者在我们的例子中指定一个条目是属于训练集还是验证集的列。
- get_x: 该参数要求输入的位置,即此处的图像块。在我们的数据帧中,第一列即 path 列包含路径,因此我们指定 cols = 0。我们也可以选择使用 pref 和 suff 参数在这里添加前缀和后缀。因为我们有图像的相对路径,要获得绝对路径,需要前缀。在 CSV 中,有时会删除路径列中项的扩展名,这正是后缀参数派上用场的地方。
- get_y: 该参数要求输出值。在 dataframe 中,由于第 4 列即 minifigure_name 是我们想要预测的标签,我们在 get_y 参数的 ColReader 对象中指定 cols = 3。
- item_tfms: 在为神经网络训练制作一批项目之前,我们需要应用一些变换来确保它们都是相同的大小(通常是正方形),并且在某些其他情况下,还需要一些其他变换。这些在这个论点中都有提及。
- batch_tfms: 这些是您希望用于通过裁剪、缩放、透视扭曲和其他此类变换使模型学习一般特征的增强方法。如果您已经有一个包含大量图像的大型数据集,您可以选择忽略此参数,否则,添加变换来学习一般化的模型而不是过度拟合的模型总是有帮助的。
一旦我们有了 DataBlock API 对象,我们就可以使用这个对象创建数据加载器,并将其输入到模型中进行训练。在创建 dataloader 之后,我们可以看到如何使用 show_batch 方法将数据输入到模型中,随后可以使用 vocab 属性来查看数据集中作为一个整体出现了多少个类/标签。

图片由 Vinayak 提供
dataloaders 对象包含训练和验证数据加载器。vocab 中的项目对应于与列车数据加载器相关的类别,验证数据加载器的标签/类别数量可能少于或等于列车数据加载器的标签/类别数量。另外,请注意,在 show_batch 方法中,您可以提供想要查看的项目数量,但是如果该数量大于批处理大小(9,而不是 bs 的 8),那么您将只能看到与批处理大小一样多的图像。
训练分类模型
一旦你有了一个数据加载器,下一步就是创建一个模型,并用一个合适的优化算法来训练它。fastai 已经抽象了很多这些东西,并为你提供了一个非常简单的学习对象,它也有很多参数,但让我强调下面最重要的几个。

图片由 Vinayak 提供
我们的学习者对象采用的强制参数如下:
- dls: 我们使用上面的数据块 API 定义的 dataloader 对象。它包含训练和验证数据集及其标签。
- 模型:这是您想要使用的模型架构。因为我们正在进行迁移学习,所以我们将使用一个根据 ImageNet 权重训练的预定义 resnet101 模型。但是,如果您愿意,您可以通过继承 nn 来构建自己的 PyTorch 模型。模块类及其转发方法的实现;这超出了本文的范围,所以我们不在这里讨论。
- loss_func: 也称为目标/成本函数,这是优化算法试图最小化的函数(在大多数情况下;除非你定义了一个最大化的目标)。对于分类,交叉熵损失和回归 MSE 损失是最常用的损失函数。
其他可选但重要的参数是 opt_func 和 metrics,opt _ func 指定用于训练模型的优化算法,metrics 指定衡量性能的指标(可以是准确度、精确度、召回率、任何自定义指标)。还有一个调用不同回调的功能,这不在本文的讨论范围之内。你可以参考这里了解更多关于相同的东西。
一旦我们有了学习者对象,我们就可以利用 lr_find 函数为我们的模型找到一个最优的学习率。查看损失与学习率曲线,我们应该选择损失最小的学习率或略低于该点的学习率。对学习速率保持保守是有好处的,因为在我个人看来,延迟收敛比超过最佳点更容易容忍。

图片由 Vinayak 提供。
该函数还给出 lr_min 和观察到损耗下降最大的点的建议。lr_min 是对最小学习速率的估计,应该选择该最小学习速率,以便看到适当的训练速度,而不会非常担心跳过损失面中的最佳点,同时确保模型正在学习某些东西并且参数更新正在发生。因此,在这种情况下,让我们选择 0.01 的学习率并开始训练。

图片由 Vinayak 提供
由于我们只有大约 154 个训练图像,每个历元花费大约 4 秒进行验证和度量计算。在这种情况下,对于 resnet101 预训练模型,其顶部 fc 层和几个倒数第二卷积层获得权重更新,而网络的其余部分被冻结,即权重更新不会再向后传播。根据经验,这种微调方法在为定制任务采用预先训练的模型时是最好的;然而,经过实质性的改进后,例如当错误率下降到 10%或准确率达到* 90%时,我们也可以解冻网络的这一部分,并使用现在贯穿整个神经网络的参数更新来再次训练模型。

图片由 Vinayak 提供
这正是我们在这里所做的。在训练了 25 个时期后,我们解冻了模型,并在 lr_find 的帮助下检查了良好的学习率,并运行了 5 个时期的训练循环。然而,我们没有发现错误率有任何实质性的改善。从 10.27%下降到 8.9%;这表明模型现在已经饱和,无论您对模型做什么,除非您提供新的数据,否则不会对模型的准确性产生任何重大影响。
为了保存这个模型以便将来解释,您可以简单地使用命令
learn.export("filename.pkl")
这将把模型保存为一个名为 filename 的 pkl 文件,以后可以重新加载该文件进行推理。现在我们已经完成了所有的训练部分,让我们来解释这个模型,看看它已经做出的预测。
解释分类模型
在建立模型之后,需要测量模型的性能以确保其可用性,fastai 为此提供了一个类分类解释。我们可以用适合培训部分的学习者对象创建这个类的一个实例。
一旦我们做到了这一点,我们就可以观察验证数据的混淆矩阵,看看错误发生在哪里以及有多少个错误。

图片由 Vinayak 提供
这个整体结构看起来不错。在理想情况下,对角线完全饱和,所有其他非对角线元素为零。这里我们可以看到事实并非如此。这意味着我们的模型把一些动作人物分类错了,例如罗恩·韦斯莱被错误地归类为哈利·波特,一个 YODA 的人物被错误地归类为罗恩·韦斯莱,等等。为了特别突出那些被错误分类的,ClassificationInterpretation 类还多了一个方法。

图片由 Vinayak 提供
这里我们可以看到错误分类项目的元组。每个元组的结构分别为(基础事实、预测、误分类数)。可选地,您还可以提供一个参数,该参数只查看那些被错误分类超过某个阈值次数的对。这可以帮助我们确定需要更多关注的配对。因此,我们可以做出决定,如添加更多的数据或删除错误标记的数据等。
虽然在我的应用程序中,所有的东西都被整齐地标记了,但还是会有如下的错误标记。上面的代码有助于在笔记本中创建一个内嵌的 GUI,基本上可以用来保存/删除/移动项目。这存在于 fastai.vision 包的 widgets 类中。如果您有时不确定数据集中的标签,像这样审核数据集值得一试。

图片由 Vinayak 提供
这就是这篇文章的内容。我希望你了解开始使用 fastai 制作你自己的图像分类器的步骤。它在数据预处理、模型训练和模型解释方面为我节省了大量时间,特别是在深度学习方面。与 PyTorch 不同,在 py torch 中,我们必须定义数据集和数据加载器,datablock API 消除了对这一步骤的需要,因为它很好地将一切打包到一个函数调用中。希望你喜欢这篇文章,感谢你通读!
参考
数据湖之上的数据库—第 1 部分
第 1 部分(共 2 部分)—了解 Databricks Delta Lake 的基础知识—ACID 事务、检查点、事务日志和时间旅行

图片由皮克斯拜的 Gerd Altmann 提供
回到 8 年前,我仍然记得我采用 Hadoop 和 Spark 等大数据框架的日子。由于许多原因,来自数据库背景的这种适应具有挑战性。最大的挑战是大数据框架中缺少类似数据库的事务。为了弥补这个缺失的功能,我们必须开发几个例程来执行必要的检查和测量。然而,这一过程既繁琐又耗时,而且很容易出错。
另一个让我夜不能寐问题是可怕的变更数据捕获(CDC)。数据库有一种方便的方式来更新记录并向用户显示记录的最新状态。另一方面,在大数据中,我们接收数据并将其存储为文件。因此,每日增量摄取可能包含新插入、更新或删除的数据的组合。这意味着我们最终会在数据湖中多次存储同一行。这产生了两个问题:
- 重复数据—在某些情况下,同一行存在多次(更新和删除的数据)
- 数据分析—除非数据已经过重复数据消除,否则用户在看到同一行的多个实例时会感到困惑
那么,到目前为止,我们是如何处理这种情况的:
- 一天—接收完整数据集—完整表格
- 第 2 天-第 n 天—确保交付的增量数据(增量)带有记录更新时间戳和模式(插入/更新/删除)
- 在原始区域中接收数据后,运行 Hive/Mapreduce/Spark 修复作业,将增量数据与完整数据合并。
- 然而,在这个阶段,它巧妙地使用了移除重复项的功能,比如对主键分区的 RANK()和记录更新时间戳 DESC
- 过滤秩=1 的行会给出最*更新的行
- 用 Mode=Delete 删除行
- 将上述数据集保存到监管区——然后与用户社区共享这些数据,以便进一步分析
如你所见,上述过程非常复杂。需要一种更好的方法。
三角洲湖的救援
由 Databricks 开发的 Delta Lake 为批处理和流操作的数据湖带来了 ACID 事务支持。Delta Lake 是一个开源存储层,用于 HDFS、AWS S3、Azure 数据湖存储或谷歌云存储上的大数据工作负载。
Delta Lake 包含许多对数据工程师有用的酷功能。让我们在两部分系列中探索其中的一些特性:
第 1 部分:ACID 事务、检查点、事务日志和时间旅行
第二部分:真空,图式进化,历史
用例:一个电子商务网站销售来自多家供应商的产品。每个供应商每天都会发送其产品的最新价格。

产品 _aug20.csv

产品 _aug21.csv
该电子商务公司希望根据供应商每天发送的最新价格来调整其网站上的定价信息。此外,他们希望跟踪 ML 型号的价格。左边是每天收到的数据文件的示例。
让我们从下载数据开始:
$ git clone https://github.com/mkukreja1/blogs.git
假设今天是 8 月 20 日,您收到了文件— products_aug20.csv
将数据文件保存到 HDFS
$ hadoop fs -mkdir -p /delta_lake/raw
$ hadoop fs -put blogs/delta-lake/products_aug20.csv /delta_lake/raw
完整的笔记本可在/delta _ lake/delta _ lake-demo-1 . ipynb 获得。让我解释一下下面的每个步骤:
首先用 Delta Lake 包启动 Spark 会话,然后导入 Python APIs
from pyspark.sql import SparkSession
import pyspark
from pyspark.sql.functions import *
spark = pyspark.sql.SparkSession.builder.appName("Product_Price_Tracking") \
.config("spark.jars.packages", "io.delta:delta-core_2.12:0.7.0") \
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
.getOrCreate()from delta.tables import *
使用最*收到的数据——products _ aug 20 . CSV——创建 Spark 数据框架
df_productsaug20 = spark.read.csv('hdfs:///delta_lake/raw/products_aug20.csv', header=True, inferSchema=True)
df_productsaug20.show()+---------+----------+-----+
|ProductID| Date|Price|
+---------+----------+-----+
| 200|2020-08-20| 20.5|
| 210|2020-08-20| 45.0|
| 220|2020-08-20|34.56|
| 230|2020-08-20|23.67|
| 240|2020-08-20|89.76|
+---------+----------+-----+
现在让我们将数据存储在三角洲湖中。Delta Lake 使用版本化的拼花文件将您的数据存储在您的云存储中。此外,还会存储一个事务日志来跟踪数据随时间的变化。
df_productsaug20.write.format("delta").option("path", "hdfs:///delta_lake/products").saveAsTable("products")
让我们看看日期在 HDFS 是如何存储的。记下存储一段时间内的更改的 _delta_log 目录。
每次提交= 1 个 JSON 文件,以 00000000000000000.json 开始
每 10 次提交,就会执行一个检查点,将以前的 JSON 文件合并成一个 parquet 文件。
$ hadoop fs -ls /delta_lake/products
Found 2 items
drwxr-xr-x - mkukreja supergroup 0 2020-08-26 20:43 /delta_lake/products/_delta_log
-rw-r--r-- 2 mkukreja supergroup 1027 2020-08-26 20:43 /delta_lake/products/part-00000-37f5ec8d-5e21-4a01-9f19-7e9942196ef6-c000.snappy.parquet$ hadoop fs -cat /delta_lake/products/_delta_log/00000000000000000000.json
2020-08-26 20:44:42,159 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
{"commitInfo":{"timestamp":1598489011963,"operation":"CREATE TABLE AS SELECT","operationParameters":{"isManaged":"false","description":null,"partitionBy":"[]","properties":"{}"},"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"1027","numOutputRows":"5"}}}
{"protocol":{"minReaderVersion":1,"minWriterVersion":2}}
{"metaData":{"id":"7788c86b-ae7e-47be-ac43-76c1f3f0506f","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"ProductID\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}},{\"name\":\"Date\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"Price\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1598489010883}}
{"add":{"path":"part-00000-37f5ec8d-5e21-4a01-9f19-7e9942196ef6-c000.snappy.parquet","partitionValues":{},"size":1027,"modificationTime":1598489011874,"dataChange":true}}$ hadoop fs -cat /delta_lake/products/_delta_log/00000000000000000000.json
2020-08-26 20:44:42,159 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
{"commitInfo":{"timestamp":1598489011963,"operation":"CREATE TABLE AS SELECT","operationParameters":{"isManaged":"false","description":null,"partitionBy":"[]","properties":"{}"},"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"1027","numOutputRows":"5"}}}
{"protocol":{"minReaderVersion":1,"minWriterVersion":2}}
{"metaData":{"id":"7788c86b-ae7e-47be-ac43-76c1f3f0506f","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"ProductID\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}},{\"name\":\"Date\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"Price\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1598489010883}}
{"add":{"path":"part-00000-37f5ec8d-5e21-4a01-9f19-7e9942196ef6-c000.snappy.parquet","partitionValues":{},"size":1027,"modificationTime":1598489011874,"dataChange":true}}
这就是我们如何使用 Spark SQL 查询 Delta Lake 中最*保存的数据
spark.sql('SELECT * FROM products').show()+---------+----------+-----+
|ProductID| Date|Price|
+---------+----------+-----+
| 200|2020-08-20| 20.5|
| 210|2020-08-20| 45.0|
| 220|2020-08-20|34.56|
| 230|2020-08-20|23.67|
| 240|2020-08-20|89.76|
+---------+----------+-----+
您可以使用时间旅行来查询增量表的以前快照。如果想在数据被覆盖之前访问它,可以使用versionAsOf选项查询表的快照。
deltaTable.update("ProductID = '200'", { "Price": "'48.00'" } )df = spark.read.format("delta").option(**"versionAsOf", 1**).load("hdfs:///delta_lake/products")
df.show()*# Notice the value of Price for ProductID=200 has changed in version 1 of the table*+---------+----------+-----+
|ProductID| Date|Price|
+---------+----------+-----+
| 200|2020-08-20| **48.0**|
| 210|2020-08-20| 45.0|
| 220|2020-08-20|34.56|
| 230|2020-08-20|23.67|
| 240|2020-08-20|89.76|
+---------+----------+-----+df = spark.read.format("delta").option(**"versionAsOf", 0**).load("hdfs:///delta_lake/products")
df.show()*# Notice the value of Price for ProductID=200 is the older snapshot in version 0*+---------+----------+-----+
|ProductID| Date|Price|
+---------+----------+-----+
| 200|2020-08-20| **20.5**|
| 210|2020-08-20| 45.0|
| 220|2020-08-20|34.56|
| 230|2020-08-20|23.67|
| 240|2020-08-20|89.76|
+---------+----------+-----+
让我们执行另一个 DML 操作,这次删除 ProductID=210。
deltaTable.delete("ProductID = 210")
df = spark.read.format("delta").option(**"versionAsOf", 2**).load("hdfs:///delta_lake/products")
df.show()*# Notice the value of Price for ProductID=210 is missing in Version 2*+---------+----------+-----+
|ProductID| Date|Price|
+---------+----------+-----+
| 200|2020-08-20| 48.0|
| 220|2020-08-20|34.56|
| 230|2020-08-20|23.67|
| 240|2020-08-20|89.76|
+---------+----------+-----+
请注意,事务日志有所进展,每个事务一个日志
$ hadoop fs -ls /delta_lake/products/_delta_log
Found 3 items
-rw-r--r-- 2 mkukreja supergroup 912 2020-08-21 13:14 /delta_lake/products/_delta_log/00000000000000000000.json
-rw-r--r-- 2 mkukreja supergroup 579 2020-08-24 11:03 /delta_lake/products/_delta_log/00000000000000000001.json
-rw-r--r-- 2 mkukreja supergroup 592 2020-08-24 11:14 /delta_lake/products/_delta_log/00000000000000000002.json
特别注意事务日志的 JSON 中的操作属性
$ hadoop fs -cat /delta_lake/products/_delta_log/*.json{"commitInfo":{"timestamp":1598489978902,**"operation":"CREATE TABLE AS SELECT"**,"operationParameters":{"isManaged":"false","description":null,"partitionBy":"[]","properties":"{}"},"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"1027","numOutputRows":"5"}}}
{"protocol":{"minReaderVersion":1,"minWriterVersion":2}}
{"metaData":{"id":"47d211fc-7148-4c85-aa80-7d9aa8f0b7a2","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"ProductID\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}},{\"name\":\"Date\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"Price\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1598489977907}}
{"add":{"path":"part-00000-8c43a47a-02bf-4bc2-a3be-aaabe9c409bd-c000.snappy.parquet","partitionValues":{},"size":1027,"modificationTime":1598489978816,"dataChange":true}}
2020-08-26 21:07:41,120 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
{"commitInfo":{"timestamp":1598490235896,**"operation":"UPDATE"**,"operationParameters":{"predicate":"(ProductID#609 = 200)"},"readVersion":0,"isBlindAppend":false,"operationMetrics":{"numRemovedFiles":"1","numAddedFiles":"1","numUpdatedRows":"1","numCopiedRows":"4"}}}
{"remove":{"path":"part-00000-8c43a47a-02bf-4bc2-a3be-aaabe9c409bd-c000.snappy.parquet","deletionTimestamp":1598490235237,"dataChange":true}}
{"add":{"path":"part-00000-272c0f65-433e-4901-83fd-70b78667ede0-c000.snappy.parquet","partitionValues":{},"size":1025,"modificationTime":1598490235886,"dataChange":true}}
2020-08-26 21:07:41,123 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
{"commitInfo":{"timestamp":1598490393953,**"operation":"DELETE"**,"operationParameters":{"predicate":"[\"(`ProductID` = 210)\"]"},"readVersion":1,"isBlindAppend":false,"operationMetrics":{"numRemovedFiles":"1","numDeletedRows":"1","numAddedFiles":"1","numCopiedRows":"4"}}}
{"remove":{"path":"part-00000-272c0f65-433e-4901-83fd-70b78667ede0-c000.snappy.parquet","deletionTimestamp":1598490393950,"dataChange":true}}
{"add":{"path":"part-00000-73a381e1-fa68-4323-81b9-c42dea484542-c000.snappy.parquet","partitionValues":{},"size":1015,"modificationTime":1598490393946,"dataChange":true}}
现在是第二天,你收到了一个新的数据文件。现在让我们将第二天的新数据集(products_aug21.csv)合并到 Delta Lake 中
$ hadoop fs -put csv/products_aug21.csv /delta_lake/raw
$ hadoop fs -ls /delta_lake/raw
Found 2 items
-rw-r--r-- 2 mkukreja supergroup 132 2020-08-21 13:00 /delta_lake/raw/products_aug20.csv
-rw-r--r-- 2 mkukreja supergroup 220 2020-08-24 11:33 /delta_lake/raw/products_aug21.csv
执行向上插入操作。这意味着,如果新文件(products_aug21.csv)中的数据与 Delta Lake 中的任何现有数据匹配(基于 ProductID 上的连接条件),则更新价格,否则插入新行。
df_productsaug21 = spark.read.csv('hdfs:///delta_lake/raw/products_aug21.csv', header=True, inferSchema=True)
df_productsaug21.show()deltaTable.alias("products").merge(
df_productsaug21.alias("products_new"),
"products.ProductID = products_new.ProductID") \
.**whenMatchedUpdate**(set = { "Price" : "products_new.Price" } ) \
.**whenNotMatchedInsert**(values =
{
"ProductID": "products_new.ProductID",
"Date": "products_new.Date",
"Price": "products_new.Price"
}
).execute()
更新后检查表格的最新版本。您可能注意到 ProductID=240 经历了 whenMatchedUpdate 操作,而 ProductID=240 直到 280 经历了 whenNotMatchedInsert 操作。
spark.table("products").show()+---------+----------+-----+
|ProductID| Date|Price|
+---------+----------+-----+
| 230|2020-08-20|23.67|
| 210|2020-08-21| 46.0|
| 250|2020-08-21|89.76|
| 220|2020-08-20|34.56|
| 240|2020-08-20|90.82|
| 200|2020-08-20| 25.5|
| 260|2020-08-21|54.55|
| 280|2020-08-21|44.78|
| 270|2020-08-21|96.32|
+---------+----------+-----+
对于每 10 次提交,Delta Lake 都会在_delta_log子目录中以 Parquet 格式保存一个检查点文件。因为检查点文件是 Parquet 格式的,所以与低效的 JSON 文件相比,它允许 Spark 执行更快的读取。
让我们通过更新几行来看看这是如何发生的:
deltaTable.update("ProductID = '230'", { "Price": "'33.67'" } )
deltaTable.update("ProductID = '210'", { "Price": "'56.00'" } )
deltaTable.update("ProductID = '250'", { "Price": "'99.76'" } )
deltaTable.update("ProductID = '220'", { "Price": "'44.56'" } )
deltaTable.update("ProductID = '240'", { "Price": "'100.82'" } )
deltaTable.update("ProductID = '200'", { "Price": "'35.5'" } )
deltaTable.update("ProductID = '260'", { "Price": "'64.55'" } )
deltaTable.update("ProductID = '280'", { "Price": "'54.78'" } )
deltaTable.update("ProductID = '270'", { "Price": "'106.32'" } )
检查_delta_log子目录。在 10 次提交之后,创建了 0000000000000010 . check point . parquet 文件。检查点文件以 Parquet 格式保存表在某个时间点的状态,这样就可以非常高效地检索历史。
$ hadoop fs -ls /delta_lake/products/_delta_log
Found 15 items
-rw-r--r-- 2 mkukreja supergroup 912 2020-08-21 13:14 /delta_lake/products/_delta_log/00000000000000000000.json
-rw-r--r-- 2 mkukreja supergroup 579 2020-08-24 11:03 /delta_lake/products/_delta_log/00000000000000000001.json
-rw-r--r-- 2 mkukreja supergroup 592 2020-08-24 11:14 /delta_lake/products/_delta_log/00000000000000000002.json
-rw-r--r-- 2 mkukreja supergroup 2255 2020-08-24 11:39 /delta_lake/products/_delta_log/00000000000000000003.json
-rw-r--r-- 2 mkukreja supergroup 578 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000004.json
-rw-r--r-- 2 mkukreja supergroup 578 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000005.json
-rw-r--r-- 2 mkukreja supergroup 578 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000006.json
-rw-r--r-- 2 mkukreja supergroup 578 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000007.json
-rw-r--r-- 2 mkukreja supergroup 578 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000008.json
-rw-r--r-- 2 mkukreja supergroup 578 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000009.json
**-rw-r--r-- 2 mkukreja supergroup 14756 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000010.checkpoint.parquet**
-rw-r--r-- 2 mkukreja supergroup 578 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000010.json
-rw-r--r-- 2 mkukreja supergroup 579 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000011.json
-rw-r--r-- 2 mkukreja supergroup 579 2020-08-24 12:05 /delta_lake/products/_delta_log/00000000000000000012.json
-rw-r--r-- 2 mkukreja supergroup 25 2020-08-24 12:05 /delta_lake/products/_delta_log/_last_checkpoint
很多好东西。我在数据工程和数据科学领域已经玩了几年了,我可以有把握地告诉你,这些特性是一种生活品味。无需再为存储和显示数据库中的最新变更数据集而费尽周折。
在下一部分中,我们将深入探讨 Delta Lake 的一些高级主题,包括分区、模式演化、数据血统和真空。
我希望这篇文章是有帮助的。三角洲湖作为大数据 Hadoop、Spark & Kafka 课程的一部分,由 Datafence 云学院提供。课程是周末自己在网上教的。
数据湖之上的数据库第二部分
第 2 部分,共 2 部分——了解 Databricks Delta Lake 的基础知识——分区、模式演变、数据沿袭和真空

图片由皮克斯拜的 Gerd Altmann 提供
在第 1 部分中,我们探讨了 Delta Lake 特性(如 ACID 事务、检查点、事务日志和时间旅行)如何对变更数据捕获、处理和管理产生积极影响。在本文中,我们将继续推进我们对一些高级特性的理解,比如分区、模式演化、数据沿袭和真空
数据起源/数据血统
从摄取到管理和转换数据经历了一个旅程。这个旅程被称为 adT5 数据血统。如今,监管机构对跟踪和审计数据实施了非常严格的指导方针。因此,验证数据沿袭是满足法规遵从性和治理要求的关键活动。
Delta Lake 将每次写入表的数据沿袭信息存储 30 天。
$ git clone [https://github.com/mkukreja1/blogs.git](https://github.com/mkukreja1/blogs.git)
完整的笔记本可从/delta _ lake/delta _ lake-demo-2 . ipynb 获得。让我解释一下下面的每个步骤:
deltaTable = DeltaTable.forPath(spark, "hdfs:///delta_lake/products")df_history = deltaTable.history()
df_history.show(20, False)+-------+-----------------------+------+--------+----------------------+-------------------------------------------------------------------------+----+--------+---------+-----------+--------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
|version|timestamp |userId|userName|operation |operationParameters |job |notebook|clusterId|readVersion|isolationLevel|isBlindAppend|operationMetrics |userMetadata|
+-------+-----------------------+------+--------+----------------------+-------------------------------------------------------------------------+----+--------+---------+-----------+--------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
|12 |2020-09-01 16:48:45.792|null |null |UPDATE |[predicate -> (ProductID#529 = 270)] |null|null |null |11 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|11 |2020-09-01 16:48:43.906|null |null |UPDATE |[predicate -> (ProductID#529 = 280)] |null|null |null |10 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|10 |2020-09-01 16:48:41.15 |null |null |UPDATE |[predicate -> (ProductID#529 = 260)] |null|null |null |9 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|9 |2020-09-01 16:48:39.497|null |null |UPDATE |[predicate -> (ProductID#529 = 200)] |null|null |null |8 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|8 |2020-09-01 16:48:37.695|null |null |UPDATE |[predicate -> (ProductID#529 = 240)] |null|null |null |7 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|7 |2020-09-01 16:48:35.437|null |null |UPDATE |[predicate -> (ProductID#529 = 220)] |null|null |null |6 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|6 |2020-09-01 16:48:33.499|null |null |UPDATE |[predicate -> (ProductID#529 = 250)] |null|null |null |5 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|5 |2020-09-01 16:48:31.559|null |null |UPDATE |[predicate -> (ProductID#529 = 210)] |null|null |null |4 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|4 |2020-09-01 16:48:29.492|null |null |UPDATE |[predicate -> (ProductID#529 = 230)] |null|null |null |3 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 0] |null |
|3 |2020-09-01 16:48:26.544|null |null |MERGE |[predicate -> (products.`ProductID` = products_new.`ProductID`)] |null|null |null |2 |null |false |[numTargetRowsCopied -> 0, numTargetRowsDeleted -> 0, numTargetFilesAdded -> 10, numTargetRowsInserted -> 5, numTargetRowsUpdated -> 4, numOutputRows -> 9, numSourceRows -> 9, numTargetFilesRemoved -> 1]|null |
|2 |2020-09-01 16:48:19.493|null |null |DELETE |[predicate -> ["(`ProductID` = 210)"]] |null|null |null |1 |null |false |[numRemovedFiles -> 1, numDeletedRows -> 1, numAddedFiles -> 1, numCopiedRows -> 4] |null |
|1 |2020-09-01 16:48:12.635|null |null |UPDATE |[predicate -> (ProductID#529 = 200)] |null|null |null |0 |null |false |[numRemovedFiles -> 1, numAddedFiles -> 1, numUpdatedRows -> 1, numCopiedRows -> 4] |null |
|0 |2020-09-01 16:47:31.819|null |null |CREATE TABLE AS SELECT|[isManaged -> false, description ->, partitionBy -> [], properties -> {}]|null|null |null |null |null |true |[numFiles -> 1, numOutputBytes -> 1027, numOutputRows -> 5] |null |
+-------+-----------------------+------+--------+----------------------+-------------------------------------------------------------------------+----+--------+---------+-----------+--------------+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+
不需要担心数据审计,因为对数据的每一次更改都有完整的更改审计跟踪作为备份。
简单看一下表上的最后一个操作如下:
df_lastOperation = deltaTable.history(1)
df_lastOperation.show()+-------+--------------------+------+--------+---------+--------------------+----+--------+---------+-----------+--------------+-------------+--------------------+------------+
|version| timestamp|userId|userName|operation| operationParameters| job|notebook|clusterId|readVersion|isolationLevel|isBlindAppend| operationMetrics|userMetadata|
+-------+--------------------+------+--------+---------+--------------------+----+--------+---------+-----------+--------------+-------------+--------------------+------------+
| 12|2020-09-01 16:48:...| null| null| UPDATE|[predicate -> (Pr...|null| null| null| 11| null| false|[numRemovedFiles ...| null|
+-------+--------------------+------+--------+---------+--------------------+----+--------+---------+-----------+--------------+-------------+--------------------+------------+
模式演变——检测和适应模式变化
一直在创建数据管道的人肯定会对这个问题感兴趣。我们使用通常在项目开始时提供给我们的给定模式来创建和部署管道。在一段时间内,一切都很好,直到有一天管道出错。原来传入文件的模式已经改变。就我个人而言,我已经多次被同一个问题所困扰。在我的第一次攻击中,数据遭到了大范围的破坏,因为我们没有在破坏数据之前发现它。我仍然记得我们不得不花费无数的时间来处理损坏——修复代码和回溯数据。
那天我学到了重要的一课— 在接收数据之前验证模式。这是以后另一篇文章的主题。现在,让我们把注意力集中在三角洲湖如何能有所帮助。
Delta Lake 可以通过在写入时执行模式验证来保护数据。那是什么意思?
- 这意味着在写入时,新输入数据的模式会与过去的数据进行比较。
- 如果发现差异,则取消事务—没有数据写入存储—为用户引发异常。现在让我们来看看它的运行情况。这是我们之前摄取的最后一个文件。

产品 _aug21.csv
这是第二天的新文件。请注意,文件的模式已经更改,添加了新的列数量。

产品 _aug22.csv
让我们回顾一下 pypark 代码:
df_productsaug22 = spark.read.csv('hdfs:///delta_lake/raw/products_aug22.csv', header=True, inferSchema=True)
df_productsaug22.show()deltaTable = DeltaTable.forPath(spark, "hdfs:///delta_lake/products")df_productsaug22.write.format("delta").mode("append").save("hdfs:///delta_lake/products")AnalysisException Traceback (most recent call last)
<ipython-input-15-85affcb142df> in <module>
----> 1 df_productsaug22.write.format("delta").mode("append").save("hdfs:///delta_lake/products")
/opt/spark/python/pyspark/sql/readwriter.py in save(self, path, format, mode, partitionBy, **options)
825 self._jwrite.save()
826 else:
--> 827 self._jwrite.save(path)
828
829 @since(1.4)
~/.local/lib/python3.6/site-packages/py4j/java_gateway.py in __call__(self, *args)
1303 answer = self.gateway_client.send_command(command)
1304 return_value = get_return_value(
-> 1305 answer, self.gateway_client, self.target_id, self.name)
1306
1307 for temp_arg in temp_args:
/opt/spark/python/pyspark/sql/utils.py in deco(*a, **kw)
135 # Hide where the exception came from that shows a non-Pythonic
136 # JVM exception message.
--> 137 raise_from(converted)
138 else:
139 raise
/opt/spark/python/pyspark/sql/utils.py in raise_from(e)
**AnalysisException: A schema mismatch detected when writing to the Delta table** (Table ID: 320f5591-72dd-4f4c-bdac-38f560e90dba).
To enable schema migration using DataFrameWriter or DataStreamWriter, please set:
'.option("mergeSchema", "true")'.
For other operations, set the session configuration
spark.databricks.delta.schema.autoMerge.enabled to "true". See the documentation
specific to the operation for details.
Table schema:
root
-- ProductID: integer (nullable = true)
-- Date: string (nullable = true)
-- Price: double (nullable = true)
Data schema:
root
-- ProductID: integer (nullable = true)
-- Date: string (nullable = true)
-- Price: double (nullable = true)
-- Quantity: integer (nullable = true)
;
Delta Lake 立即拒绝新文件,因为模式不匹配。相当酷。
如果您对新列没有意见,也就是说,即使存在模式不匹配,您也希望接收数据,那会怎么样呢?使用 option("mergeSchema "," true ")进行如下操作。
df_productsaug22.write.format("delta").mode("append").option("mergeSchema", "true").save("hdfs:///delta_lake/products")spark.table("products").show()+---------+----------+------+--------+
|ProductID| Date| Price|Quantity|
+---------+----------+------+--------+
| 200|2020-08-22| 25.5| 2|
| 210|2020-08-22| 46.0| 5|
| 220|2020-08-22| 34.56| 6|
| 230|2020-08-22| 23.67| 11|
| 200|2020-08-20| 25.5| null|
| 250|2020-08-21| 99.76| null|
| 230|2020-08-20| 23.67| null|
| 210|2020-08-21| 46.0| null|
| 220|2020-08-20| 34.56| null|
| 260|2020-08-21| 64.55| null|
| 280|2020-08-21| 54.78| null|
| 270|2020-08-21|106.32| null|
| 240|2020-08-20|100.82| null|
+---------+----------+------+--------+
新列现在是三角洲湖元数据的一部分。注意,数量数据为以前的数据(< 2020–08–22) has been set to )null。
分割
为了显著提高 Delta Lake 中的查询性能,您应该考虑创建一个按列分区的表。选择正确的分区柱非常重要。
- 选择具有低基数的列,如 date,绝对不要选择顺序 ID 列
- 选择大小均匀且数据量大(希望大于 1 GB)列
df_productsaug_partition = spark.read.csv('hdfs:///delta_lake/raw/*.csv', header=True, inferSchema=True)df_productsaug_partition.write.format("delta").partitionBy("Date").option("path", "hdfs:///delta_lake/products_p").saveAsTable("products_p")$ hadoop fs -ls /delta_lake/products_p
Found 4 items
drwxr-xr-x - mkukreja supergroup 0 2020-09-01 17:19 /delta_lake/products_p/**Date=2020-08-20**
drwxr-xr-x - mkukreja supergroup 0 2020-09-01 17:19 /delta_lake/products_p/**Date=2020-08-21**
drwxr-xr-x - mkukreja supergroup 0 2020-09-01 17:19 /delta_lake/products_p/**Date=2020-08-22**
drwxr-xr-x - mkukreja supergroup 0 2020-09-01 17:19 /delta_lake/products_p/_delta_log
请注意,Delta Lake 已经基于日期列创建了一个分区文件夹结构。
真空
Delta Lake 实现了数据版本化,因此它可以按需提供旧版本的数据。随着时间的推移,存储同一数据的多个版本可能会变得非常昂贵。因此,Delta Lake 包含了一个叫做真空的清理机制,可以删除旧版本的数据。
deltaTable.vacuum()
我希望这篇文章是有帮助的。三角洲湖作为大数据 Hadoop、Spark & Kafka 课程的一部分,由 Datafence 云学院提供。课程是周末自己在网上教的。
DataCamp —您使用它的方式正确吗?
这就是如何使用 DataCamp *台最大化您的数据科学学习。

克里斯里德在 Unsplash 上的照片
我们每天产生大约 2.5 万亿字节,对数据科学家的需求比以往任何时候都要多。毕竟,许多*台都在提供让你为数据科学职业做准备的课程,这并不奇怪!到目前为止,我最喜欢的是数据营。但是你使用*台的方式正确吗?
从高质量的内容到用户友好的界面,该*台拥有您开始掌握该领域基础知识所需的一切。以下是您应该牢记的一些事情,以最大限度地提高您的学习效果,并充分利用*台体验。
“职业轨迹”很棒!但是不要错过那些隐藏在“课程”部分的宝石。
难道你不喜欢大多数数据科学*台为用户精心定制的职业轨迹吗?无论你是渴望成为 Python 数据科学家、数据工程师还是 R 数据分析师,DataCamp 都会精心挑选渐进课程,为你构建一条“轨迹”(或其他*台所谓的“路径”)。你开始以线性的方式学习,在大约 26 门课程后,你完成了你选择的轨道。你也获得了证书!
但这就够了吗?肯定不是!该*台非常清楚需要其他课程来补充这些课程。假设你作为一名 Python 数据科学家选择了(就像我们许多人刚刚开始做的那样)一个方向。策划的轨道为您提供一切,从 Python 编程语言的介绍,到数据操作和清理,到一些机器学习课程等…
您最终错过的是一些更高级和更有针对性的课程,这些课程隐藏在“课程”选项卡中,在策划的课程之外!像“Python 深度学习入门”、“Python 自然语言处理入门”、“Python Dask 并行编程”、“Python 可视化地理空间数据”、“Python Keras 图像处理”、“Python 数据科学家软件工程”等课程,以及大量其他内容丰富且非常必要的课程,以便更全面地了解该领域。
学习很棒!但是你每天都在应用你所学的一切吗?
被动地坐以待毙,吸收新信息,这是非常危险的(所有学习*台都有这种危险)。你在看视频讲座吗?每次看完视频后,你会尝试编码练习吗?正在将你在别处学到的方法和技术应用到你正在做的数据集和附带项目中吗?你是在尝试向朋友或精通数据的同事解释你刚刚学到的概念吗?

如果你想确保你的学习是积极的、有目的的,这些都是你应该经常问自己的问题。毕竟,你知道多少熊猫的技术和技巧并不重要!重要的是,在你的计划中,有多少是可以用在正确的地方和环境中的。永远记住,学习一件事的最好方法是继续尝试向别人解释它。
现在就开始使用 DataCamp 的指导项目构建投资组合
比特币加密货币市场让你着迷吗?有没有想过做《权力的游戏》的网络分析?也许你是一个棒球迷或音乐家,想探索这些主题的数据集?嗯,DataCamp“项目”部分有适合每个人的东西!
这些指导性的项目是无价的,可以让你感觉到应用你实际学到的东西意味着什么。他们也为你在工作中独立工作做好准备(提供指导)!这不是很好吗?我的建议是不要跳过在一个选定的轨道内的课程之间穿插的项目。事实上,我会更进一步。完成这些,并在“项目”标签中查看其他项目,这样你就可以得到一些实践!
哦,说到练习,我有没有告诉你这个*台有一个“练习”部分,我的大多数朋友甚至不知道它的存在/曾经使用过?
用数据营的 MCQ 的做法来保持数据敏锐!
我认为这个功能(在移动应用程序上也有)绝对是无价的。我喜欢休息,在我的手机上加载应用程序,并完成*台上几乎每门课程的几个选择题!这些非常有趣,可以确保你学到的东西保持新鲜。

练习!练习!练习!这些 MCQ 很有趣,内容丰富,写得很好,是你在练习的课程中学到的概念的很好的总结!每堂练习课都以复习使用简单抽认卡制作的基础课程概念开始。然后你开始回答关于课程主题的问题。为了增加乐趣。你积累(我喜欢认为这是胜利)XPs!你可以根据自己的需要多次重复练习,以确保你理解了所有问题的答案。
不确定您的数据科学技能提高了多少?不要错过尝试 DataCamp 评估的机会!

我要提到的最后一个我非常喜欢在他们*台上使用的功能是“评估”功能。你不仅可以通过评估或多或少地了解自己目前的状况,还可以定期进行评估,不断检查自己进步了多少。
甚至更好?评估是自适应的,并根据您的技能水*和您提供的答案进行相应的调整。
我发现这也是为一些技术评估做好准备,当你开始找工作和准备获得第一份数据科学工作时,公司会让你完成这些评估。
这是一个在这个领域找到工作并拥有数据仓库来为我们能让这个世界变得更好的无数方法做出贡献的最佳时机。
感谢 DataCamp 团队启动了许多人的数据科学之旅!
如果有兴趣阅读我的更多故事,请阅读一本关于培养习惯的书如何帮助我更有效地学习数据科学:
数组、链表、栈、队列和哈希表。
towardsdatascience.com](/python-data-structures-your-starter-kit-to-learning-algorithms-f8993039b86) [## 一本关于培养习惯的书如何帮助我更有效地学习数据科学
作为一名数据科学家,我从 James Clear 的原子习惯中学到了什么
towardsdatascience.com](/how-a-book-about-building-habits-helped-me-learn-data-science-more-effectively-b176e2fd572f)
比较托管机器学习*台
data iku vs . alter yx vs . Sagemaker vs . data robot vs . data bricks

来源:作者

Alteryx 和 Databricks 处于领先地位,并且仍在不断普及。来源:作者
什么是托管机器学习*台?
代码只是任何机器学习解决方案的一小部分。通常,公司必须使用不同的工具和服务来端到端地管理机器学习解决方案,包括:
- 计算服务整理数据,训练机器学习模型;
- 数据管理清理、修改、跟踪和保护数据的工具;
- 软件工程编写和维护代码的工具;
- 仪表板工具与解决方案互动并查看结果。

托管机器学习服务的四个核心组件。来源:作者
托管机器学习服务的目标是将这些组件集中到一个打包的解决方案中。
但并不是所有的托管机器学习服务都是完全可比的。像 AWS Sagemaker 这样的工具可以帮助你管理任何机器学习解决方案中固有的复杂性,但仍然希望你的团队中有能够构建和理解代码的工程师。这些工具更侧重于计算层。像 Alteryx 这样的工具更专注于表示层,他们试图隐藏的复杂性,提供无代码的用户界面来集成基本的机器学习。
更一般地说,这些*台通常集成了仪表板工具和/或工作流程编排工具,我们在之前的文章中已经比较过了。所以像 Alteryx 这样的工具可以被认为是一个更高层次的抽象,与直接使用低级工具相比,以牺牲灵活性为代价实现了更多的统一。
我们比较了最受欢迎的托管*台,以帮助您做出明智的选择,选择最适合您的*台。
告诉我用哪一个
和往常一样,“视情况而定”——但是如果你在寻找一个快速的答案,你可能应该使用:
- 如果您还没有自己的一套开发、编排和机器学习工具,并且想要一个预定义的一体化解决方案。你的团队需要有一些技术知识,但不一定主要由软件工程师组成。
- 如果您专注于市场营销和分析,并且希望在不编写代码的情况下访问机器学习和数据管理。
- Knime 如果你想要一个不太贵、不太精致但更灵活的 Alteryx 版本。
- Sagemaker 如果你的团队有工程知识,但希望在你的机器学习基础设施上有更高层次的抽象。
- Datarobot 如果您将数据存储在电子表格中,并希望以最简单(但最不灵活)的方式运行预测分析。
- 如果您已经投资了 Apache Spark 作为一个*台,并且正在寻找一种更简单的方式来运行它。
【还要不要更多这样的文章?注册我们的每周简讯。]
快速概述
在我们进入详细的比较之前,这里有一个每个*台的快速概述。
- Dataiku 是一个跨*台的桌面应用程序,包括广泛的工具,如笔记本(类似于 Jupyter Notebook)、工作流管理(类似于 Apache Airflow)和自动机器学习。总的来说,Dataiku 的目标是取代你现有的许多工具,而不是与它们集成。
- Alteryx 是一个专注于分析的*台,与 Tableau 等仪表板解决方案更具可比性,但包括集成的机器学习组件。它专注于为机器学习、高级分析和其他通常需要代码的组件提供无代码替代方案。
- Knime 类似于 Alteryx,但是它有一个开源的自托管选项,并且它的付费版本更便宜。它包括机器学习组件和模块化设计的分析集成。
- Datarobot 专注于自动化机器学习。你以类似电子表格的格式上传数据,它会自动找到一个好的模型和参数来预测特定的列。
- Databricks 主要是一个托管的 Apache Spark 环境,它还包括与 MLFlow 等工具的集成,用于工作流编排。
- Sagemaker 专注于抽象出训练和服务模型所需的基础设施,但现在还包括自动驾驶(类似于 Datarobot)和 Sagemaker Studio (类似于 Dataiku)。

来源:作者
我们根据几个标准给每个图书馆打了大致的分数:
- 成熟度:存在多久了,有多稳定。
- 受欢迎程度:有多少人在谷歌上搜索该工具。
- 广度:工具是否有特定的侧重点或者试图做到全部。
这些不是严格或科学的基准,但它们旨在让您快速了解这些工具是如何重叠的,以及它们有什么不同。有关更多详细信息,请参见下面的一对一比较。
达泰库对奥特里克斯
Dataiku 和 Alteryx 都是托管的机器学习*台,但 Dataiku 侧重于工程方面,而 Alteryx 侧重于分析和演示。
Dataiku 提供了 Data Science Studio (DSS),这是一个跨*台的桌面应用程序,包括一个供工程师编写代码的笔记本(类似于 Jupyter 笔记本)和一个管理数据和任务的工作流编排工具(类似于 Apache Airflow)。虽然它提供了一些用户界面,但仍然强调编写代码。相比之下,Alteryx 提供了更好的仪表板体验,但灵活性较差:在 Alteryx 中,您使用 UI 来创建无代码的机器学习组件。
- 如果您的团队是技术性的,并且您希望您的数据科学家、工程师和分析师都使用相同的工具,请使用 Dataiku 。
- 如果您的团队技术含量较低,并且您希望使用预建组件进行高级分析,请使用 Alteryx 。
Dataiku vs. Databricks
Dataiku 和 Databricks 都旨在让数据科学家、工程师和分析师使用一个统一的*台,但 Dataiku 依赖于自己的定制软件,而 Databricks 则集成了现有的工具。Databricks 充当了 Apache Spark 、AWS 或 Azure 和 MLFlow 之间的粘合剂,并提供了连接这些组件的集中接口。
Dataiku 是一个更高级的工具,集成了 Tensorflow 等机器学习库和 AutoML 接口,可以对电子表格格式的数据进行机器学习。
- 如果您喜欢管理自己的基础设施,但希望有一个*台来管理您的机器学习管道和分析,请使用 Dataiku 。
- 如果您想要一个*台来管理您的基础设施,并且您对 Apache Spark 很熟悉,那么请使用 Databricks 。
数据机器人大战数据机器人
Datarobot 和 Dataiku 都提供了 AutoML:一个无代码的机器学习*台,你可以将数据上传为电子表格,选择目标变量,并让*台为你选择和优化机器学习模型。
值得注意的是,这是 Datarobot 的核心焦点,但它只是 Dataiku 的一个组件,data iku 还提供了一整套数据科学工具,包括 IDE、任务协调器和可视化工具。
- 使用 Datarobot 如果您有现有的干净数据集,并且希望使用预定义的机器学习模型来分析您的数据,不需要任何工程技能。
- 如果你需要更灵活的东西来帮助你设计和构建你自己的定制机器学习模型,请使用 Dataiku 。
达泰库对萨格马克
Dataiku 专注于为数据科学家和工程师提供编码和分析工具,而 Sagemaker 专注于底层基础设施:运行和服务这些模型的服务器。Dataiku 为提供了对 Sagemaker 的集成,但 Sagemaker 也在发布与 Dataiku 直接竞争的工具: Sagemaker Studio 和 Sagemaker Autopilot 。
您可以结合使用这些*台,使用 Dataiku 来构建和管理您的模型,使用 Sagemaker 来培训和服务它们,或者您可以使用 Sagemaker 做任何事情。
- 如果您需要一个更成熟的*台,专注于用户界面和用户体验,一个您的工程师和分析师都可以使用的*台,请使用 Dataiku 。
- 使用 Sagemaker 如果你的工程师比分析师多,你需要更大的灵活性,你不介意界面还在迭代,缺乏润色。
Alteryx vs. Datarobot
Alteryx 是一个更广泛的解决方案,提供分析、数据管理和仪表板组件以及无代码机器学习。Datarobot 对无代码机器学习的关注范围更窄。
- 如果您的重点是数据和分析,并且您需要一个适用于整个组织的*台,请使用 Alteryx 。
- 如果您有一个现有的数据集,并且希望使用预定义和精选的机器学习模型来分析它,请使用 Datarobot 。
Alteryx 对 Knime
Alteryx 和 Knime 是类似的工具,它们的功能在很大程度上是重叠的。Alteryx 更商业化,只提供付费*台,而 Knime 也有免费的开源选项。Knime 缺少 Alteryx 的一些优点,但是它提供了更多的灵活性。
- 如果你的团队中业务分析师多于工程师,并且你需要精致的报告和仪表板,那么使用 Alteryx 。
- 如果你预算有限,而且灵活性对你来说比表达更重要,那就使用 Knime 。
Sagemaker vs. Databricks
Sagemaker 为您提供了一种在 AWS 基础设施上使用各种机器学习框架来部署和服务您的机器学习模型的方法。Databricks 让您可以在 Apache Spark 集群上运行 Jupyter 笔记本电脑(而 Apache Spark 集群又可以在 AWS 上运行)。
Databricks 专注于大数据分析,让您可以在计算集群上运行数据处理代码。Sagemaker 专注于实验跟踪和模型部署。这两种工具都允许数据科学家在熟悉的笔记本环境中编写代码,并在可扩展的基础设施上运行。
- 如果您需要一个通用*台来开发、训练、部署和服务您的机器学习模型,请使用 Sagemaker 。
- 如果你特别想用 Apache Spark 和 MLFlow 来管理你的机器学习管道,就用 Databricks 。
Sagemaker vs. Datarobot
Sagemaker 包括 Sagemaker 自动驾驶,类似于 Datarobot。这两个工具都允许您上传电子表格格式的简单数据集,选择目标变量,并让*台自动运行实验,为您的数据选择最佳的机器学习模型。
因为这个所谓的“AutoML”是 Datarobot 的核心焦点,Datarobot 已经策划和调整了比 Sagemaker 更广泛的模型库。因此,在这个特定的用例中,Sagemaker 仍在追赶 Datarobot,但总的来说,Sagemaker 是一个功能更全、更灵活的*台,用于模型构建、部署、服务和实验跟踪。
- 如果你需要一个包含 AutoML 的更灵活的*台,使用 Sagemaker 。
- 如果你想要一个更简单的*台,拥有更精确、随时可用的模型,请使用 Datarobot 。
结束语
如果你访问这些*台的任何一个网站,你会看到他们大言不惭地宣称它们有多么强大,多么容易使用。请记住,它们都旨在解决非常困难的问题,加入其中任何一个都可能是一个漫长而昂贵的过程,需要克服一些障碍。
所有这些工具和服务都旨在提供数据处理、机器学习和分析的捷径。但这意味着它们也比你想象的更加严格。如果机器学习是你业务的核心,那么建立你自己的管道通常仍然是最好的选择。有许多优秀、成熟的开源*台可以用来构建完全定制的解决方案。
这些托管的机器学习*台销售的概念是,非技术人员可以在没有工程师的情况下构建机器学习解决方案。但在实践中,通常是经验丰富的机器学习工程师最成功地使用这些工具和服务。对底层系统和权衡有深刻理解的人可以使用托管*台作为构建概念证明的捷径;因为他们了解该工具旨在简化的过程,他们知道如何有效地使用它。但是那些没有这种经验的人经常发现托管*台太有限,不能满足他们的确切需求,并且对于非技术团队成员来说太复杂,不容易使用。
如果你正在研究机器学习问题,需要帮助,联系我们。
数据主义世界——大数据和数据主义时代
意见
虽然大数据看似让收集更多数据以发现更多有用信息成为可能,但事实是,更多数据并不一定意味着更多有用信息。
人工智能最*的快速发展,在很大程度上归功于大数据,增强了人们对数据及其基于数据的机器学习算法的信心。支持大数据的最知名技术之一是大数据分析形式的人工智能(AI)。

能够处理今天巨大数据流的算法直接从数据中提取信息和知识。此外,机器生成的信息或知识被认为比人类思维更加透明和可靠。空前数量的数字数据正以手机、*板电脑、电脑和其他数字设备的形式存储。大数据—支持技术使我们能够搜索和分析它们,从而建立联系并产生我们以前无法获得的洞察力。
现在,要分析的数据不仅很大,而且由各种类型的数据组成,包括流数据(67%)。大数据有许多影响,可能会改变统计数据分析的方法。首先,构建者和用户不再局限于单个数据源,比如数据库服务器。这种全新的分析类别意味着世界正在发生变化,但不仅仅是在数据收集和分析以及数据处理方面。

在数据主义的世界观中,人类的经验能够产生数据,这些数据可以放在一起向数据流致敬。对于数据专家来说,数据和算法被注入了处理数据和寻找意义的高级工具。2013 年,大卫·布鲁克斯在《纽约时报》上总结并首次使用了大数据的新兴意义。然而,在 2016 年,尤瓦尔·诺亚·哈拉里(Yuval Noah Harari)在他的著作《德乌斯人:明日简史》(Homo Japan:A Brief History of Tomorrow)中扩大了对它的描述。

作者 Matveydar——自己的作品,CC0,https://commons.wikimedia.org/w/index.php?curid=85041358
越来越多的设备连接到互联网,并被设计为不断地生成和来回发送数据。不可否认的是,社会正在走向一个数据流不断增长和扩大的世界。任何类型的网络公司都声称有权跟踪、收集、分析、货币化和出售网站上的用户行为数据,这已经成为常态。例如,脸书、Google +、Twitter、Facebook Messenger 或谷歌地图等常规应用程序需要用户在线并分享他们的位置数据才能运行。
大量的数据和信息被生成和共享,各种各样的社交媒体*台参与其中。真实的或欺诈性的网络机构通过诱惑渴望点击的广告商,找到将故事带入主流的方法。

如今,简单地问数据显示了什么似乎数据可以取代思维已经变得时髦得多。如果算法已经知道我们在想什么,想要什么,需要什么,为什么还要麻烦政客和代议制政府?我们的代议制民主输给了技术宗教,这可能正是恢复代议制民主的防御所需要的震动。
技术必然性将质疑和限制技术发展等同于阻碍社会本身的繁荣。技术沙文主义声称技术带来了社会和经济性质的一切,无论是社会的还是经济的,它总是改善人们的生活。它以代议制民主为前提,有不寻常的分散的既得利益和抽象的意见,更不用说自由开放的社会了。

那些相信科学已经向我们展示了我们继承了我们的生物学的人也持有类似的观点。他们认为有机体只是一个数据处理系统,一个在我们的社会中无处不在的算法,他们描述了这种控制是如何发生的。
这导致许多人预测,机器将很快取代目前由人类执行的认知任务。鉴于这种预测被广泛接受,在我们的社会中,信心和对数据的依赖正在增加也就不足为奇了。

虽然它的起源模糊不清,但这种层次结构仍然是想象大数据时代正在收集和使用的信息的良好起点。大数据是同一个主题的变体,多年来一直从事数据工作的人已经明白这一点。即使大数据似乎可以收集更多的数据来找到更多有用的信息,但事实是,更多的数据并不一定意味着更多的有用信息。
数量、速度和多样性带来了技术挑战和解决方案,使我们能够访问比几年前想象的更多的信息。虽然技术和工具强大多了,数据还是数据,只是换了一种方式是数据。现在应该很明显,大数据和人工智能具有更高的道德价值。我不相信,经过仔细考虑后,人们会给一个算法政治权力,即使是一个掩盖其进展的算法。在未来,我们可能不像所有技术精英那样聪明,但我们肯定会比他们聪明。
引用来源
- http://www . info today . com/online searcher/Articles/Technology-and-Power/The-Peril-of-data ism-135012 . shtml
- 【https://en.wikipedia.org/wiki/Dataism 号
- https://www . ibmbigdatahub . com/blog/age-data-and-opportunities
- https://www.vxchnge.com/blog/managing-social-media-data
- https://www . smart data collective . com/good-management-essential-age-of-big-data-ml/
- https://www . si sense . com/white papers/every-company-a-data-company-building-in-age-of-big-data-ai/
- https://journalofbigdata . springer open . com/articles/10.1186/s 40537-015-0030-3
- https://www.iedp.com/articles/the-big-data-revolution/
- https://www . information-management . com/opinion/in-the-age-of-big-data-the-more-things-change-the-more-they-that-they-they-that-they-that-they-that-his-stay-same
- https://www . discovery . org/leadership/blog/from-Darwinism-to-data ism-will-we-lose-our-representative-democracy-to-techno-religion
数据湖文件摄取:从 FTP 到 AWS S3
使用 Python 中的 Paramiko 将文件从 FTP 服务器传输到 AWS s3

大家好。在开发 Datalake 管道时,数据接收是整个过程中的一个重要步骤。我们需要一个可靠,安全和容错的方法来把我们的文件从源(客户端 FTP 服务器)到我们的目标(AWS S3)。考虑到这一步的重要性,我用 python 开发了一个实现,可以用来将文件从 FTP 服务器接收到 AWS s3。我以这样的方式设计代码,它可以在托管(AWS Glue)或未托管(本地机器)环境中使用,以将文件从 FTP 服务器传输到 AWS s3。
在本文中,我将解释如何使用 Python 中的 Paramiko 库将存在于 FileZilla 等 FTP 服务器上的文件传输到 Amazon s3。
文件摄取代码可以在我的 GitHub 库中找到。文件接收代码执行以下操作:
- 使用 Paramiko 创建与文件服务器的安全 ssh SFTP 连接。
- 根据文件大小自动处理单部分和多部分上传(多部分在 100MB 或以上)。
- 在多零件上传期间,如果零件上传失败,会自动处理报废。
- 基于当前年、月、日、小时对 s3 中的数据进行分区。
- 确保哪个文件已经上传
- 可以在 AWS Glue 中用作 python 作业,使用 AWS Glue 将文件从 FTP 传输到 S3。
为了更好地理解,我将一步一步地介绍代码的每一部分。所以让我们开始吧。
先决条件
在开始之前,我们需要在本地机器上做一些安装设置,并在 FTP 服务器上设置一个目录。
本地机器设置
我假设你们已经在机器上安装了 python。如果你还没有安装 python,访问这个链接在你的机器上安装 python。
在进入代码之前,我们需要确保我们已经安装了以下模块:
首先我们将安装 Paramiko。
pip install paramiko
因为我们将上传文件到 s3,我们将需要 boto3 客户端。
pip install boto3
FTP 服务器目录设置
我们需要在我们的 FTP 服务器上创建几个我们将在实现中使用的目录。
注意:这个目录设置是一次性的,我们不必每次都做。
连接到您的 FTP 服务器。我在我的案例中使用 FileZilla。转到站点管理器。在协议下拉菜单中选择 SFTP 选项。输入您的主机、ip、用户名和密码,然后按连接。

连接后,在 FTP 服务器上创建两个目录:
- 您将上传文件的父目录。
- 经过处理的目录。这个目录将用于跟踪哪些文件已经上传到 s3。
完成以上两个步骤后,我们现在已经安装了所有必要的模块和目录结构。我们现在可以开始实际的实现了。
FTP 到 S3 的实现
让我们首先简单地浏览一下 git 存储库中的两个文件。
python _ glue _ injestion _ job . py
我们的整个 FTPIngestion 类实现如下。我将逐一解释代码的每个部分。
python_glue_injestion_job.py
注意:我称之为 python glue 作业,因为我们可以在 AWS Glue python shell 环境中运行相同的代码,并使用 AWS Glue 实现相同的 FTP 文件传输功能。
配置. py
这个文件将定义我们所有的配置,如主机名、IP、端口、用户名、密码、s3 存储桶名、ftp 目录路径等。将所有配置保存在一个单独的文件中是一个很好的编程习惯。这使得我们的代码更易于管理。
我们通过将该文件导入 python_glue_ingestion_job.py 文件来使用它。我们的 config.py 文件如下所示:
配置. py
在简要概述了我们的两个文件之后,让我们深入到代码的每一部分。
代码流
我们的代码从 main 方法开始。我们首先创建一个 FTPIngestion 类的对象。在创建对象时,调用 init(self) 方法来设置所有的配置值。
主要方法
然后 ftp_obj 调用initiate _ ingestion(self)方法,该方法将首先使用 create_ssh_connection(self)方法创建一个与我们的 ftp 服务器的 ssh 连接。成功连接后,将使用create _ sftp _ connection(self)方法创建一个 SFTP 连接,我们将用它来访问 FTP 服务器。
一旦建立了 SFTP 连接,我们执行以下操作
- 将当前目录更改为父目录
self.sftp_client.chdir(self.ftp_directory_path)
- 获取所有要上传到 S3 的文件
files_to_upload = self.sftp_client.listdir()
- 使用create _ s3 _ partition(self)方法创建 S3 分区结构。我使用当前日期时间来设置分区结构,如下所示:
/ <目录 _ 名称>/年= <年> /月= <月> /日= <日> /小时= <小时>/文件
- 之后,我们开始一个接一个地上传文件。列表中的每个文件都被传递给S3 _ upload _ file _ multipart()方法。如果文件大小大于 100Mb,文件将通过多部分上传,否则作为标准文件上传。
for ftp_file in files_to_upload:
sftp_file_obj = self.sftp_client.file(ftp_file, mode='r')
if self.s3_upload_file_multipart(sftp_file_obj,
s3_partition+ftp_file):
print('file uploaded to s3')
files_to_move.append(ftp_file)
- 在每次成功上传时,使用我们在 FTP 服务器上创建的move _ files _ to _ processed()方法将文件移动到已处理的目录中。这样做是为了跟踪已经成功上传到 s3 的所有文件。
if files_to_move:
for uploaded_file in files_to_move:
self.move_files_to_processed(uploaded_file)
else:
print("nothing to upload")
- 所有文件成功上传后,我们使用 close_connections(self) 方法关闭所有连接。
更深入地了解我们的代码:
现在让我们详细讨论一下 FTPIngestion 类的每一部分。
初始化方法
这是 init 方法,也称为我们类的构造函数。当我们创建一个 FTPIngestion 类的对象时,所有的属性都是在对象创建时设置的。每个属性的值都是从 config.py 类中获取的,我们在这个类中定义了它们的值。我们将 config.py 文件作为 cfg 导入,并为每个属性设置相应的值。
初始化方法
推荐:我们可以使用 AWS SSM 来代替 config.py 类,在这里我们为每个属性定义键值对,就像在 config.py 文件中一样。使用 SSM 更加可靠和安全。
创建 ssh 连接方法
这个方法使用给定的凭证创建一个与我们的 FTP 服务器的安全 ssh 连接。成功连接后,它会将 self.ssh_ok 属性设置为 True 并返回。否则 self.ssh_ok 设置为 False 并返回。
这个方法中需要注意的一点是self . ssh _ client . set _ missing _ host _ key _ policy(paramiko。AutoAddPolicy())。我们将其配置为使用自动生成的策略设置缺失的主机密钥。如果您打算在 AWS Glue 中作为 python shell 作业运行此任务,请使用主机策略,而不是添加自动添加策略。为此,请在代码中执行以下操作
#self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# in production, use load_system_host_keys
self.ssh_client.load_system_host_keys()
创建 _ sftp _ 连接方法
这个方法调用 create_ssh_connection 方法创建 ssh 连接,然后继续打开 SFTP 连接。如果连接成功,它会将 self.sftp_ok 设置为真,如果连接失败,则将其设置为假并返回值。
创建 _ sftp _ 连接方法
移动文件到已处理的方法
文件成功上传到 s3 后,在 initiate_ingestion 方法中调用该方法。这个方法以文件名作为参数。将 FTP 服务器上的源路径和目的路径设置为 src 和 dest ,然后执行以下命令,将文件从 src 路径移动到 dest 路径。
try:
_, _, _ = self.ssh_client.exec_command("mv " + src+" " + dest) except Exception as error:
print("error moving files to processed directory, error: ", error)
我们的move _ files _ to _ processed方法如下:
移动文件到已处理的方法
创建 _ s3 _ 分区方法
这个方法创建 s3 分区结构。分区由根目录名后跟年、月、日、小时组成。通过这种方式,我们可以获得基于时间的分区数据。
创建 _ s3 _ 分区方法
s3 _ 上传 _ 文件 _ 多部分方法
该方法将文件上传到指定的 s3 存储桶。它使用 TransferConfig 类来处理多部分上传。我们为 TransferConfig 指定如下配置:
config = TransferConfig(multipart_threshold=cfg.MULTIPART_THRESHOLD,
multipart_chunksize=cfg.MULTIPART_CHUNKSIZE,
max_concurrency=cfg.MAX_CONCURRENCY,
use_threads=cfg.USER_THREADS
)
- multipart_threshold 参数确定文件的最小大小,超过该值后,文件将通过 multipart 上传。AWS 建议所有大于 100MB 的文件通过 multipart 上传,所以我把这个参数设置为 100MB。这可以在 config.py 文件中更改。
- multipart_chunksize 参数决定了多部分上传期间每个部分的大小。我把它设置为 20MB。
- max_concurrency 参数决定了用于上传每个部分的并发 S3 API 传输操作的最大数量。默认值为 10。
- 最后, use_threads 参数决定传输操作是否使用线程来实现并发。通过将 use_threads 属性设置为 False,可以禁用线程使用。如果禁用线程使用,则不会发生传输并发。因此,max_concurrency 属性的值将被忽略。
我们将这个配置对象作为参数传递给我们的 s 3.upload_fileobj
self.s3.upload_fileobj(source_file, self.s3_bucket_name,
s3_target_file, Config=config)
TransferConfig 类自动检查文件是作为单个部分上传还是通过多部分上传。它会自动处理失败的上传,并在失败时进行重试。
s3 _ 上传 _ 文件 _ 多部分方法
initiate _ 摄取方法
这个方法启动建立 ssh 和 sftp 连接的调用。将 FTP 目录路径更改为文件所在的指定路径。获取 FTP 指定路径中所有文件的列表,并开始上传到 s3。成功上传到 S3 的文件被移动到 FTP 服务器上的已处理目录中。所有文件上传后,关闭所有连接。
关闭连接方法
这种方法用于关闭 ssh 和 sftp 连接。
将代码用作 AWS 粘合工作
如前所述,同样的实现可以用在 AWS Glue 这样的托管环境中。如果用户有文件在特定时间段(小时、天、月等)到达 FTP 服务器,他可以安排作业在特定时间运行,将所有文件从 FTP 服务器接收到 s3。
我们必须修改代码中的一些内容,以便能够将这个实现作为 AWS Glue Python shell 作业来运行
- 在我们的python _ glue _ in jestion _ job . py文件的 imports 部分中,取消对以下导入的注释。我们使用 easy install 在 Glue 环境中安装 paramiko 模块,因为它没有默认的 Python 安装。
install_path = os.environ['GLUE_INSTALLATION']easy_install.main( ["--install-dir", install_path, "https://files.pythonhosted.org/packages/ac/15/4351003352e11300b9f44 a13576bff52dcdc6e4a911129c07447bda0a358/paramiko-2.7.1.tar.gz"] )reload(site)
- 在 create_ssh_connection 方法中注释如下
#self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
并取消对以下内容的注释
self.ssh_client.load_system_host_keys()
我们所做的不是使用自动生成的策略,而是使用我们所处环境的主机密钥。
完成上述步骤后,我们可以在 AWS Glue 中将这段代码作为 Python shell 作业运行。
摘要
在本文中,我们研究了如何执行 Datalake 管道的数据接收步骤。我们学习了如何使用 paramiko 库创建与 FTP 服务器的安全 ssh SFTP 连接,并将文件从服务器上传到我们的 AWS S3 存储桶。我们还简要介绍了如何在 AWS Glue 这样的托管环境中使用给定的实现。
链接到我的 Github 库:
[## furqanshahid 85-Python/Python-FTP-文件-摄取
这个模块提供了从 FTP 服务器上传文件到 s3 的功能。SFTP 连接是通过…创建的
github.com](https://github.com/furqanshahid85-python/Python-FTP-File-Ingestion)
DataOps —使用 AWS Lambda 和 Amazon EMR 的全自动低成本数据管道
使用 S3 事件通知、AWS Lambda 和亚马逊 EMR 实现数据处理管道完全自动化的指南。

进展是连续的。回顾我在信息技术领域 25 年的职业生涯,我经历了几个阶段的进步和适应。
从一个仔细观察每条 SQL 命令运行完成的新员工,到一个自信的 DBA,他编写了数百条 SQL 脚本,并使用 Cron 调度程序将它们作为批处理作业一起运行。在现代,我适应了像 Oozie 和 Airflow 这样的 DAG 工具,它们不仅提供作业调度,还可以以自动化的方式运行一系列作业作为数据管道。
最*,云的采用改变了自动化的全部含义。
存储很便宜,计算很贵
在云时代,我们可以设计出以前闻所未闻的自动化方法。我承认云存储资源一天比一天便宜,但是计算资源(高 CPU 和内存)仍然相对昂贵。记住这一点,如果 DataOps 可以帮助我们节省计算成本,那岂不是太酷了。让我们来看看如何做到这一点:
通常,我们按如下方式运行数据管道:
数据收集定期(每天,每小时或每分钟)保存到存储像 S3。这之后通常是使用永久衍生的分布式计算集群(如 EMR)的数据处理作业。
优点:处理任务按计划运行。永久集群可用于其他目的,如使用 Hive 进行查询、流式工作负载等。
缺点:数据到达和处理之间可能会有延迟。计算资源可能没有得到最佳利用。有时可能会出现利用率不足的情况,从而浪费昂贵的美元

(图片由作者提供)
这里有一个替代方案,可以帮助实现运营和成本之间的*衡。这种方法可能并不适用于所有的用例,但是如果确实如此,那么请放心,它将为您节省大量的美元。

(图片由作者提供)
在这种方法中,存储层基本保持不变,只是在存储中添加了一个事件通知,在新数据到达时调用 Lambda 函数。反过来,Lambda 函数调用用于数据处理的瞬态 EMR 集群的创建。瞬态 EMR 集群是一种特殊类型的集群,它部署、运行数据处理作业,然后自毁。
优点:一旦数据可用,处理作业就可以开始。没有等待。计算资源得到最佳利用。只为您使用的东西付费,节省$$$。
缺点:集群不能用于其他目的,如使用 Hive 进行查询、流式工作负载等。
以下是整个过程的技术处理方式:
假设数据文件被传送到 S3://
克隆我的 git repo:
$ git clone https://github.com/mkukreja1/blogs.git
创建一个新的 S3 桶来运行演示。请记住更改时段名称,因为 S3 时段名称是全球唯一的。
$ S3_BUCKET=lambda-emr-pipeline #Edit as per your bucket name$ REGION='us-east-1' #Edit as per your AWS region$ JOB_DATE='[2020-08-07_2PM'](https://s3.console.aws.amazon.com/s3/#) #Do not Edit this$ aws s3 mb s3://$S3_BUCKET$ aws s3 cp blogs/lambda-emr/emr.sh s3://$S3_BUCKET/bootstrap/$ aws s3 cp blogs/lambda-emr/hydropower-processing.py s3://$S3_BUCKET/spark/
为 Lambda 函数创建角色
$ aws iam create-role --role-name trigger-pipeline-role --assume-role-policy-document file://blogs/lambda-emr//lambda-policy.json$ aws iam attach-role-policy --role-name trigger-pipeline-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole$ aws iam attach-role-policy --role-name trigger-pipeline-role --policy-arn arn:aws:iam::aws:policy/AmazonElasticMapReduceFullAccess
在 AWS 中创建 Lambda 函数
$ ROLE_ARN=`aws iam get-role --role-name trigger-pipeline-role | grep Arn |sed 's/"Arn"://' |sed 's/,//' | sed 's/"//g'`;echo $ROLE_ARN$ cat blogs/lambda-emr/trigger-pipeline.py | sed "s/YOUR_BUCKET/$S3_BUCKET/g" | sed "s/YOUR_REGION/'$REGION'/g" > lambda_function.py$ zip trigger-pipeline.zip lambda_function.py$ aws lambda delete-function --function-name trigger-pipeline$ LAMBDA_ARN=` aws lambda create-function --function-name trigger-pipeline --runtime python3.6 --role $ROLE_ARN --handler lambda_function.lambda_handler --timeout 60 --zip-file fileb://trigger-pipeline.zip | grep FunctionArn | sed -e 's/"//g' -e 's/,//g' -e 's/FunctionArn//g' -e 's/: //g' `;echo $LAMBDA_ARN$ aws lambda add-permission --function-name trigger-pipeline --statement-id 1 --action lambda:InvokeFunction --principal s3.amazonaws.com
最后,让我们创建 S3 事件通知。这个通知将调用上面的 Lambda 函数。
$ cat blogs/lambda-emr/notification.json | sed "s/YOUR_LAMBDA_ARN/$LAMBDA_ARN/g" | sed "s/\ arn/arn/" > notification.json$ aws s3api put-bucket-notification-configuration --bucket $S3_BUCKET --notification-configuration file://notification.json

(图片由作者提供)
让我们从将数据复制到 S3 开始这一过程
$ aws s3 rm s3://$S3_BUCKET/curated/ --recursive
$ aws s3 rm s3://$S3_BUCKET/data/ --recursive$ aws s3 sync blogs/lambda-emr/data/ s3://$S3_BUCKET/data/
如果一切运行正常,您应该能够在 EMR 中看到一个正在运行的集群,状态= 开始

(图片由作者提供)
一段时间后,EMR 集群应该变为 Status= Terminated。

(图片由作者提供)
要检查 Spark 计划是否成功,请检查 S3 文件夹,如下所示:
$ aws s3 ls s3://$S3_BUCKET/curated/2020-08-07_2PM/
2020-08-10 17:10:36 0 _SUCCESS
2020-08-10 17:10:35 18206 part-00000-12921d5b-ea28-4e7f-afad-477aca948beb-c000.snappy.parquet
进入数据工程和数据科学的下一阶段,数据管道的自动化正在成为一项关键操作。如果操作得当,它不仅有可能简化操作,还可能降低资源成本。
希望你能从上面的文章中获得一些有价值的见解。如果您需要进一步的澄清和建议,请随时联系我。
我希望这篇文章是有帮助的。 AWS 数据湖& DataOps 是由 Datafence Cloud Academy 提供的 AWS 大数据分析课程的一部分。课程是周末自己在网上教的。
Dataprep.eda:加速您的 eda
关于 dataprepare.eda 你需要知道的一切。

来源:MicroStockHub,via:Getty Images/istock photo
导师: 王剑南博士 ,主任,的专业硕士项目(大数据与网络安全和视觉计算)
“数字有一个重要的故事要讲。他们依靠你给他们一个清晰而有说服力的声音
如今,大多数行业都认识到数据是一种宝贵的资产。然而,你如何处理这些数据,如何利用这些数据,才能帮助你获得额外的利润数字,或者带来一场革命的新发现。
当您开始处理数据集时,大多数趋势和模式并不明显。探索性数据分析有助于人们通过分析透镜仔细分析数据。它有助于我们得出结论,对数据发生的情况有一个总体的了解。揭示这些隐藏的关系和模式对于在数据基础上构建分析和学习模型至关重要。
EDA 的一般工作流程如下:

Dataprep.eda 简介:
Data prepare是由 SFU 数据科学研究组为加速数据科学而发起的一项倡议。 Dataprep.eda 试图用非常少的代码行来简化整个 eda 过程。因为我们知道 EDA 是数据科学管道中非常重要和耗时的一部分,所以拥有一个简化这一过程的工具是一件好事。**
这个博客旨在为你提供一个简单的实践经验,让你了解你可以用 dataprepare.eda 做的所有事情。所以我们开始吧,好吗?
**#installing dataprep.eda
#open your terminalpip install dataprep**
为了简化事情,我们研究了一个欺诈检测数据集。该数据包括金额、原始余额、原始账户、目的账户等列。最后是一个标签列,指示该交易实际上是否是欺诈交易。
**#importing all the libraries
import pandas as pd
from dataprep.eda import plot, plot_correlation, plot_missing#importing data and dropping missing values
df = pd.read_csv("capdata.csv")**
数据如下所示:

dataprep.eda 包有 4 个子模块。我们将逐一解释:
- 【剧情() :分析分布
我们提供了一个 API plot() 来允许用户分析数据集的基本特征。它为每一列绘制分布图或条形图,让用户对数据集有一个基本的了解。
**#API Plot
plot(df)**

图 1:所有列的数据分布
如果用户对一两个特定的列感兴趣,它会通过将列名作为参数传递来为特定的列提供更详细的绘图。
**plot(df, "newbalanceDest", bins=20)**

图 2:单个列的数据分布
如果 x 包含分类值,则绘制条形图和饼图。
**plot(df,"type")**

图 3:分类属性的数据分布
如果 x 包含数值,则绘制直方图、核密度估计图、箱线图和 qq 图。
**plot(df, "newbalanceDest", "oldbalanceDest")**

图 4:两个属性之间的详细数据分布
如果 x 和 y 包含数值,则绘制散点图、六边形图和箱线图。如果 x 和 y 中的一个包含分类值,而另一个包含数值,则绘制一个箱线图和多线直方图。如果 x 和 y 包含分类值,则会绘制嵌套条形图、堆积条形图和热图。
2。plot _ correlation():分析相关性**
我们提供一个 API plot_correlation 来分析列之间的相关性。它绘制了列之间的相关矩阵。如果用户对特定列的相关列感兴趣,例如与列“A”最相关的列,API 可以通过将列名作为参数传递来提供更详细的分析。
**#API Correlation
plot_correlation(df)**

图 5:所有列的关联热图
**plot_correlation(df, k=1)**
前“k”个属性的关联热图(这里 k=1)

图 6:前“k”个属性的相关性热图(这里 k=1)
**plot_correlation(df, "newbalanceOrig")**
指定元素与所有其他属性的相关性。(即。newbalanceOrig 与其他一切)。

图 7:指定元素与所有其他属性的相关性
**plot_correlation(df, "newbalanceOrig", value_range=[-1, 0.3])**
给定范围内的所有相关值。对于 newbalanceOrig,(-1,0.3)将出现在绘图中。

图 8:给定范围内的相关值
**plot_correlation(df, x="newbalanceDest", y="oldbalanceDest", k=5)**
具有最佳拟合线和最有影响点的两个属性之间的相关性。

图 9:具有最佳拟合线和最有影响点的两个属性之间的相关性
3。【plot _ missing():分析缺失值**
我们提供了一个 API plot_missing 来分析缺失值的模式和影响。乍一看,它显示了缺失值的位置,这使用户能够了解每一列的数据质量,或者找到缺失值的任何潜在模式。
**#API Missing Value
plot_missing(df)**

图 10:每列的缺失值
若要了解特定列中缺少值的影响,用户可以将列名传递到参数中。它将比较给定列中有无缺失值的每一列的分布,以便用户可以了解缺失值的影响。
**plot_missing(df, "isFraud", "type") #count of rows with and without dropping the missing values**

图 11:按类型划分的一个属性(isFraud)的影响
4.create _ report:从一个熊猫数据帧生成 profile 报告。****
create_report 的目标是从 pandas 数据框架生成配置文件报告。create_report 利用 dataprep 的功能并格式化图。它提供的信息包括概述、变量、分位数统计(最小值、Q1、中值、Q3、最大值、范围、四分位数范围)、描述性统计(*均值、众数、标准差、总和、中值绝对偏差、变异系数、峰度、偏斜度)、长度文本分析、样本和字母、相关性和缺失值。
**from dataprepare.eda import create_report
df **=** pd**.**read_csv**(**"https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"**)** create_report**(**df**)****

图 12:泰坦尼克号数据集的详细报告
数据准备与传统方式
以上 3 个 API 的组合有助于简化 EDA 过程。
为了支持这一点,我们进行了一项调查来比较 dataprep.eda 和传统的 python EDA 实现。我们调查了 10 个人(包括现实世界的数据科学家和学习数据科学的大学生)。该调查基于 3 个关键绩效指标:
- ****需要:这里我们分析了数据专业人员每个项目在 EDA 上花费的分钟数。

正如我们所看到的,大多数人*均在 EDA 上花费大约一个半小时。这一结果表明,我们需要工具来加速 EDA 过程。
2.可读性:这里我们对这两种方法进行了比较,看看它们的可读性如何。

显然,dataprepare.eda 提供了一个更加清晰易读的代码。
3.代码行数:data prep . EDA 真的减少了代码长度吗?

除了上述关键性能指标之外,dataprep.eda 还在其他几个方面比普通 python 实现甚至现有的数据分析库(如 pandas profiling)更好。让我们来看看这三种方法相互竞争时的表现。
- 当我们将其他两种方法的效率与 Dataprep.eda 进行比较时,它被证明更加高效。

2.当我们谈到这些方法及其支持内存外数据的能力时,Dataprepare.eda 是唯一支持内存外数据处理的方法。事实证明,这在当今的大数据时代非常有用。

修改自:来源:【dreamstime.com】T4,转自:ilustración 9436463 Pixbox—Dreamstime.com
3.dataprep.eda 生成的图都是交互式的,但 matplotlib 和 seaborn 只创建静态图。这有助于加深对情节的理解。
我们请了几位行业专业人士和大学生对这个神奇的工具给出反馈。
以下是他们中的一些人要说的话:
“图书馆看起来真不错。大大简化了工作。亚马逊软件开发人员 Dhruva Gaidhani 说
“发现缺失值非常有效。我通常花很多时间在 EDA 上。该库确实简化了一些功能。”——SFU 大学校友马南·帕拉舍
结论
就在我们说话的时候,数据科学正在适应每一秒。我们正在探索几乎所有领域的长度和宽度,从体育分析到医学成像。这些时代要求我们将人工智能和机器学习的力量用于开发能够产生影响并节省时间的东西。拥有像数据准备这样的工具可以让我们更有效地完成准备工作。
一般来说,Dataprepare.eda 擅长检查数据分布、相关性、缺失值和 eda 过程等任务。编码的简易性和可读性也方便了新手使用 dataprepare 库。总而言之,Dataprepare.eda 是执行所有准备性分析任务的一站式库。这是一个即将到来的图书馆,有着光明的未来!
数据机器人让生活变得简单
汽车系列之四——设计之美

图片由皮克斯拜的 Gerd Altmann 提供
我偏离了本系列的前几篇文章。我将回顾两个远远超过其他工具的工具。设计和美丽的视觉效果并不便宜。这并不意味着我们不能钦佩他们,并把他们作为我们奋斗的目标。我将从 DataRobot 开始。这是一个企业工具,你可能会发现自己在工作或学校中可以使用它。
为什么是 DataRobot?
我有使用这个工具的经验,并且喜欢它用于我使用它的商业案例。我的商业案例是为非数据科学家提供一个简单明了的接口,以自动化的方式运行和部署模型。DataRobot 定期添加新功能,每个功能都很好地构建在现有的用户体验中。我可以继续谈论它的好处,但是我会控制我内心的粉丝。
为了与其他工具保持一致,我将专注于最基本的任务来运行一个简单的。csv 文件,无需任何手动干预或超参数调整。
设置和成本
坦率地说,DataRobot 超出了数据科学家个人的预算范围。实现和成本肯定是在商业领域。AWS Marketplace 提供 98,000 美元的一年订阅。口袋里的零钱,我肯定。但如果你用 AWS govCloud,就是【9.33 美元/小时(不一)。有意思。
数据
为了保持本系列中各种工具的*等性,我将坚持使用 Kaggle 培训文件。矛盾,我亲爱的华生。使用 TPUs 检测多语言文本中的矛盾和蕴涵。在这个入门竞赛中,我们将句子对(由一个前提和一个假设组成)分为三类——蕴涵、矛盾或中性。
6 列 x 13k+行—斯坦福 NLP 文档
- 身份证明(identification)
- 前提
- 假设
- 朗 abv
- 语言
- 标签
加载数据
您可以通过上传数据集来创建项目。这个界面是您开始的地方。

作者截图
加载数据后,有机会更改数据类型或移除要素。有一些数据分布数据。额外的好处是,如果可能有数据泄漏,会有警告。如果检测到数据泄漏,DataRobot 会从最终的训练数据集中删除该特征。

作者项目截图

作者截图
训练您的模型
一旦你选择了你的目标,你点击大启动按钮,将建模模式设置为自动驾驶。当你这样做的时候,你会在右边看到进步。随着模型的训练,它们在完成后会出现在排行榜上。
访问早期模型结果的一个好处是,您可以查看重要的问题。很多时候,一些数据问题随着洞察力变得非常明显,我可以停止这个过程,再试一次。这种快速简单的审查有助于快速迭代。
评估培训结果
排行榜开始填满已完成的模型。您可以在下拉列表中选择几个有效的指标。也有一些有用的标签,让你知道为什么领导人在顶部。

排行榜截图作者
你可以将这些模型相互比较。

作者的学习曲线截图
我经常使用的一个标签是速度与准确性。如果准确性下降很小,当你获得数百万条记录时,速度会胜过准确性。

速度与准确性由作者截图

头对头模型对比作者截图
Insights 选项卡很方便。您可以快速查看您的某个功能是否弹出。这取决于你的商业专业知识,知道这是否合适。此选项卡是我在 autoML 模型培训早期发现数据问题的地方。如果我看到一些似乎不正确的东西,我可以比等待整个过程结束更快地迭代。

见解作者截图
DataRobot model explainability 是迄今为止我评论过的最好的工具。每个预测都被分配了影响最终得分的特征,不仅表明了强度,还表明了方向。

作者预测解释截图
不要低估,文档会消耗你的时间。对于这个简单的数据集,DataRobot 生成一个 7000 多字的文档,其中包含所有的图表、模型参数和 challenger 模型的详细信息。这个文档是一个独特的特性,我在任何其他工具中都没有发现,尽管我在被问到时要求过。只需一次点击即可完成。

作者提供的合规报告截图

作者提供的合规文档截图
结论
为了松散地比较工具之间的结果,我在分类模式下重新运行数据集。指标只是略高于 Azure。在很大程度上,模型结果是相似的。
对于我的商业案例,这是目前为止最重要的。图像处理或时间序列中的头对头可能会提供不同的结果。这将是另一个系列的挑战。
易用性、可视化、对 challenger 模型细节的访问、模型可解释性和自动化文档从其他方面脱颖而出。当然,你为此付出了高昂的代价。
接下来我给大家展示 H2O.ai 无人驾驶 ai。在我看来,他们是此时与 DataRobot 最接*的对比。他们竭尽全力让顶尖的数据可视化设计师参与这个项目,所以我期待着伟大的事情。
如果你错过了这个系列中的一篇文章,我会把它们贴在下面。
[## AWS Sagemaker Studio 自动驾驶仪准备好迎接黄金时段了吗?
带有一些评论的自动驾驶界面演示
towardsdatascience.com](/is-aws-sagemaker-studio-autopilot-ready-for-prime-time-dcbca718bae7) [## 免费体验 Google autoML 表格
autoML 工具用户体验评论系列之二。
towardsdatascience.com](/experience-google-automl-tables-for-free-d5648ae3d0e5) [## Azure Automated ML 倾听他们的设计师
本 autoML 系列的第 3 部分,微软,绝地大师
towardsdatascience.com](/azure-automated-ml-listens-to-their-designers-7f1c68d19eb4)
数据是测试版:利用数据提高攀岩和其他运动

凯瑟琳·玛丽和康纳·德法尔科在香港的魔鬼峰爬山。—作者照片
展示用于提高您在攀岩或一般运动中的表现的数据科学策略。
攀岩是一项每个人都在不断努力提高的运动。此外,与许多其他运动相反,在这些运动中,你的个人表现要么是主观的,要么依赖于他人,有非常明确的量化指标来评估你的攀岩水*:每一条路线都有攀岩难度等级,你是用身体、个人能力而不是其他任何东西来攀岩的。这可能是超级激励,也可能是一个大挫折。然后,这种变得更好的追求通常伴随着寻找原因和答案,为什么你仍然没有你希望的那么好。在攀岩中,你会不断听到:
- “啊,如果我再高一点点”
- “啊,如果我再轻一点”
- “啊,如果我再坚强一点”
- “啊,如果我从年轻时开始”
在众多借口中,有很多是关于为什么攀岩者的表现没有他们希望的那么好。
攀岩数据
然后,过去许多数据驱动的攀岩爱好者承担了分析几个变量与攀岩性能之间关系的任务,通常专注于体重、身高、身体质量指数和年龄。另一篇媒体文章中的图片就是这种分析的一个例子。

马克·达德对身体质量指数和身高与最大坡度的分析
将你的假设如此清晰地可视化,并在数据中找到趋势和相关性可能会非常令人兴奋,它甚至可以揭示一些反直觉的结果。例如,我相信大多数攀岩者期望与身高成正相关,而数据似乎表明并非如此。然而,所讨论的数据的性质也是一件非常重要的事情。知道对于强壮的攀岩者来说,在高度上有一个最佳点,我得到了什么?这不像我可以简单地增加或缩小 10 厘米来达到最佳高度。知道这一点只能作为一个额外的借口(大多数攀岩者都喜欢)来证明我们的表现,或者作为一个额外的打击士气的因素,以防你有最佳的参数但仍然表现不佳。
"比我高 5 厘米的攀岩者往往比和我一样高的攀岩者更努力."那又怎样?我希望我的分析结果能指导我实际上可以做些什么来改进,而不是简单地陈述我档案中不变方面的统计趋势。带着这个动机,我创建了一个调查来收集攀岩者的数据,这样我就可以进行更全面的分析,作为攀岩表现改善策略的基础。
调查的描述
该调查包括 44 个问题,分为 5 个不同的部分,以收集不同类型的信息:
- 个人简介 :关于攀岩社区个人方面的问题,如年龄、性别、国籍、职业、攀岩原因等。
- 训练简介 :关于他们多久攀登一次、多久训练一次、持续多长时间、如何训练、训练时注重什么能力等问题。
- 投影轮廓 :关于对投影路线的态度和策略的问题。
- 抱石性能 :记录攀岩者在不同条件下的最大攀爬等级,用于抱石。
- 运动攀登表演 :记录攀登者在不同条件下的最大攀登等级,用于运动攀登。
在进行分析时,该调查已有 160 名登山者回答,因此它在统计上并不显著,此处显示的关系不应视为真实,它只是这类方法的概念证明。
受访者人口统计
查看受访者的人口统计数据,我们可以看到数据看起来像一个正态分布的样本,没有显示出大的偏差。
- 受访者来自欧洲、大洋洲、亚洲、北美洲和南美洲。
- 男女比例合理

年龄和性别分布
- 有各种体重、身高和年龄的登山者。

受访者的年龄、身高和体重分布
因此,考虑到数据似乎是有效的,并且接*真实的表示,我开始着手进行适当的分析。
比较和关联
在展示现代数据科学技术(包括机器学习模型或人工智能算法等工具)的真正力量之前,我想展示即使是一些简单的技术,如方法和直接比较,如果使用正确的数据和焦点,也可以提供非常有价值的见解。
我将用例子来展示这些:

男女攀岩运动成绩的差异。
该图展示了样本中男性和女性攀岩者在运动攀岩表现上的差异。我们不能概括这些倾向,但我们可以看到,至少在这 160 名登山者中:
- 男性攀爬的难度比女性高 1-2%
- 女性在成功攀爬某一特定坡度时的一致性要高 5%
子集分析的另一个例子是比较声称训练的登山者和声称不训练的登山者:

声称训练的攀岩者和不训练的攀岩者之间的表现差异
尽管这很直观,也在意料之中,但由于这里的数据,我们可以看到并最终展示培训益处的事实证据。训练的登山者:
- *均攀爬难度增加了 7%,
- 在持续闪光/曝光方面提高了约 6%
- 在重新定位方面提高了 8%
有趣的是,数据显示不训练的登山者:
- 有更大的未实现的改进潜力
事情开始变得有趣起来,现在让我们来看看投影的影响:

攀岩者和不攀岩者的百分比差异
似乎投射的影响比训练的影响更大。投射的人:
- *均攀爬难度增加 11%,
- 对完成路线和获得红点有更高的信心
- 间接显示闪光的提高,所以他们作为整体攀登者提高,而不仅仅是他们的最高等级
有趣的是,数据显示不投射的攀岩者:
- 有更大的未实现的改进潜力
- 是更坚持不懈的攀登者
描述性与可操作性的洞察力
所以,看起来很好看,但是这些见解和前面说的体重身高见解有什么区别呢?可控诉的情形
虽然你不能改变你的身高、性别或年龄,但你实际上可以决定开始训练,开始计划,或开始做任何可行的策略,这些策略可以改善数据,并提供事实数据来证明所做的建议。
到目前为止,我们已经任意选择了一些变量,然后查看它们对性能的影响,但是我们可以采用其他几种方法。
让我们比较一下最强的 20%攀登者和最弱的 20%攀登者,看看他们有什么不同:

最强和最弱攀岩者之间的差异
现在,我们开始看到一些我们还没有做出任何假设的见解,数据简单地表明了这一点。更强壮的登山者…
- 投射更多
- 度假的重点是爬山
- 少旅行(他们专注于同一个悬崖,而不是去所有的地方)
- 多爬几次
- 更高更重
- 更年轻/攀岩时间更长/开始攀岩更早
- 要么自己训练,要么利用书本信息(而较弱的攀岩者要么不训练,要么和教练一起训练)
- 训练更多天和更长时间
- 多尝试几次路线,通常在以后的尝试中会比第一次更好
- 他们的训练主要集中在爆发力、手指力量、力量耐力和有氧运动上
- 每次抽签时,我都会努力观察或攀爬并休息
而表现较差的攀岩者…
- 去尝试许多不同的峭壁
- 要么在教练的指导下训练,要么简单地多爬一些来提高自己
- 尝试更少的路线,并在更早的攀爬中获得最佳表现
- 将他们的训练主要集中在耐力、步法、柔韧性、特定序列、核心和不同的攀爬上
- 要么先顶绳,要么在尝试之前尝试每一个抓手
有些事情是意料之中的,但有些确实出乎我的意料,但一旦你仔细想想,它们确实有道理。表现较差的攀岩者仍然需要专注于他们的步法和基本耐力,而不是爆发力或手指力量,因为困难和容易的攀岩对身体的要求非常不同,这是在攀岩者生命的不同阶段发展的。
相关性和信息增益
然后,尽管这仍然只是一个比较分析,但已经出现了一些有趣的事情,例如训练的不同重点,他们训练的方式,对投射和旅行的心态等。但是,使用线性相关和信息增益分析等策略,甚至有“更好”的方法来获得这些见解。不用深入细节,这些只是简单地找出一个变量对确定另一个变量的值有多重要的方法,因此我们可以找出哪些变量对确定某人的攀登等级最重要。

40 个最相关变量与运动攀登成绩的相关性。
那么如何解释相关性呢?很简单,这基本上意味着知道关于那个变量的信息可以让你更好地预测性能。在这种情况下,人们可以修改并对攀岩者在运动路线上的表现产生较大影响的因素依次为:
- 他们一周爬多少天(包括室内)
- 如果他们制定了自己的训练计划或他们读到的东西(或负相关,如果他们只是通过攀爬更多来“训练”)
- 如果他们专门为登山旅行度假
- 专注于攀岩运动(或者负相关,如果他们专注于抱石运动)
- 如果他们攀登是为了竞争(或者负相关,如果他们认为这只是一个健康的爱好)
- 如果他们把注意力集中在户外
- 如果他们训练力量耐力,爆发力(或负相关,如果他们训练步法和弯曲)
- 如果他们穿更紧的鞋子
- 如果他们投射
- 如果他们尝试了几次路线
- 如果他们在月球板上训练
- 如果他们每次攀登都爬更多的路线
- 如果他们热身(或负相关,如果他们直接进入硬的东西)
其他具有高度相关性但无法改变的是…
- 他们爬山有多长时间了/他们多年轻就开始爬山了
- 如果他们有更高的猿类指数
有趣的是,身高、体重和当前年龄似乎不在最高度相关的变量中,这是一件非常好的事情。这表明,体型通常并不是表现的真正限制因素。
根据这些见解,我们可以做几件事:
- 首先,体育专业人员或教练可以直接查看数据,并根据他们的个人经验使用这些数据来制定策略。
- 第二,信息最丰富的变量可以用来创建一个计算机模型,该模型可以模拟攀岩者,以便根据攀岩者的特征来预测攀岩表现。
体育运动中的数据驱动智能系统
无需深入研究计算机建模方法背后的科学原理,只需考虑我们创建了一个计算机模型,它能够根据登山者有关以下变量的信息来预测他们的表现:
- 他/她开始爬山的年龄
- 他/她爬了多少年了
- 他/她如何训练(独自或有教练指导)
- 他/她一周训练几天和几个小时
- 如果他/她集中训练爆发力
- 他/她一天爬多少条路线
- 他/她一天内尝试他的项目几次
- 他/她如何穿鞋
- 他/她如何看待假期(是登山旅行,还是非登山旅行)

模型的训练和测试。
图像显示了用于创建模型的代码片段,与其他登山者一起训练它,然后用列表中的登山者#10 (climberID,任意选择)测试它。目前,climber10 在 0 到 25 (5.8 和 5.15d)的范围内具有 3.5 的实际爬升*均等级(在 5.10b/6a+和 5.10c/6b 之间),我们的模型仅使用列表中的变量预测它相当准确(它预测 3.9,仍在 5.10b/6a+和 5.10c/6b 之间)。虽然对于这个特定的模型来说,精度可能不太精确,但这主要是因为样本数据的大小。只有大约 160 个攀登者来覆盖从 5.8 到 5.15d 的 25 个等级的整个范围,这给出了算法正确学习模式的每个等级的非常少的例子。但是,用一个大几十倍、几百倍或几千倍的数据库来复制同样的策略,会产生好得多的结果。
这本身就已经很有价值了,因为它允许根据攀岩者的个人资料对他们的表现进行正确的评估。然而,它也让我们有可能探索如果这些变量中的任何一个发生变化,性能会如何。

测试攀登者描述
只是陈述一些特性,现在我们的登山者…
- 20 岁开始攀岩
- 每周攀岩 3 天
- 每天攀登 3 条路线
- 已经爬了 3 年了
- 通过简单的攀爬来训练,而不是自己制定训练计划
- 每天尝试两次艰难的路线
- 攀升至 5.10b/5.10c 左右
在此基础上,使用该模型,让我们探索和预测以下变化的爬坡性能…
- 答:每周攀岩 5 天,而不是 3 天
- b:每天爬 6 条路线,而不是 3 条
- c:再爬 6 个月
- d:转而遵循个人训练计划,而不仅仅是攀岩
- e:每天尝试 3 次艰难路线
- f:结合 A、B 和 E(增加攀爬量和尝试次数)
- g:结合 C、D(开始一个个人训练计划,并坚持 6 个月)

不同策略的模型输出
有了这些例子,我们可以根据其他攀岩者成功经验的历史数据,了解每种可能策略的预期结果。举例来说,这可以指导攀登者或教练哪一个是最有效的改进路径,因为一个人不能简单地同时做所有的事情,改变通常应该是渐进的。
在这个例子中,如果攀岩者每次去峭壁都爬 6 条路线而不是 3 条路线,似乎会带来最大的改善,几乎一直到 5.10d/6b+,这是攀岩者完全可以控制的,而不是增长 8 厘米。
到目前为止,我们尝试了我们提出的策略,但我们也可以使用该模型来逆向工程该过程,并找到最佳值。用下面的代码,我测试了在其他条件不变的情况下,一天爬多少次会给攀登者带来最大的进步。

给定每天不同攀爬次数的攀爬性能
在本例中,在预测了每天攀爬 1-31 条路线的坡度后,算法发现,假设其他条件不变,每天攀爬 8 条路线将达到最佳坡度。
在这种情况下,我们只关注单个变量进行优化,实际上,您可以尝试同时优化所有变量,因为它们的影响是相互关联的。对于这些类型的多变量优化有许多其他算法,例如遗传算法。我们不会探究它们,但是它们可以用于更健壮的优化。
结论
这就是你如何使用数据来准备自己成为一个更好的攀岩者,来评估你与那些有着相似经历但做得更好的人相比缺乏什么,来以最佳的方式集中你有限的努力,并开始攀登。
数据科学已经在工业中广泛使用,但由于某种原因,它没有在许多其他可以增加价值的领域中使用,例如登山或一般的体育运动。这只是展示了数据科学的许多潜在用例,以帮助高性能攀岩者和许多其他运动员的教练和培训。数据可以以多种方式使用:仅仅作为描述符,作为专业人员做出自己明智决策的原始数据输入,作为通过智能系统提出潜在更好或新策略的工具,或者作为所有这些的组合。
数据科学非常依赖于数据的数量和质量。这是仅使用我自己创建的调查的 156 个响应(非常少的数据库)来执行的,我是一个具有数据科学知识但没有任何关于攀岩或运动科学的适当知识的人,也没有获得更详细的量化信息的工具(没有健身房设备或设施来进行适当的健身测试,等等。).通过更多的响应,或者在真正的体育专业人士的帮助下创建更合适的调查来收集实际有用的信息,这些类型的分析的性能将大大提高,结果将更加明显,并且发现变得更加有用。
答案和你提出的问题一样好,在这种情况下,我提出了非常基本的问题。如果有人开始提出正确的问题,就会产生更多有价值的见解。
代码和数据
我将本文制作过程中使用的所有代码和数据都留给了对处理数据感兴趣的人,或者为了自己制作类似的东西而学习数据科学的人。它以教程的形式呈现,以便初学者能够理解。
https://github.com/alexcasar/Data-Science-Climbing-Demo
数据剽窃
机器学习艺术
机器学习在艺术上的例子 myFATHERintheCloud.ai
🔵这里: 获得全媒体访问权限 🟠

GAN 如何从数据库中学习数据触发器
数据出错。这是我在工作中使用的一个过程,所以我想把这个故事分成三个部分。首先,是数据雕刻的定义,然后是我在 2019 年开始的 myFATHERintheCloud 项目的介绍,最后,在第三部分,是我如何使用数据雕刻来生成雕塑的例子。
这是很多人都在疑惑的问题。你应该如何开始你的 AI 艺术冒险?嗯,这一切都是从…
mlearning.substack.com](https://mlearning.substack.com/p/how-to-start-with-ai-art?r=z7zu8&utm_campaign=post&utm_medium=web&utm_source=copy)
数据剽窃

数据剽窃存在于视觉艺术领域,但也包括数据科学的一些部分,当然还有机器学习。它使用随着数据科学的发展而产生的工具:深度学习、数据库(这是数据雕刻的一个非常重要的元素)。它在可用工具的帮助下可视化数据……所有这些都构成了“数据雕刻”的开放概念。
数据雕刻是一个创造性的过程,其中数据是作品成形的材料
由 MLearning.ai 生成的数据错误
如果我基于实例向您描述什么是数据雕刻,这可能是最好的。
这是第一幅作品,创作于 1993 年。这是一个老丨虎丨机,其中的数据集由三部分组成:名词,动词,形容词。玩这个独臂强盗游戏的人被展示随机生成的单词,这些单词组成了一个想要的句子。如果这个句子被认为是“有吸引力的”,那么这个玩家就会得到一笔奖金,或者赢得一场比赛。在这里,数据也是这个解决方案的一个重要元素。这个过程是完全自动化的——我的工作主要是选择那些单词,这些单词可以随机组成句子。

另一件作品——在某种程度上也是一种碰运气的游戏——叫做“危险的玩家”,是一件在索波特赌场创作的装置作品。你在前景看到的游戏桌,

1996 年项目 【风险玩家】 赌场大酒店 Sopot
从周围环境中收集数据,并将其指定为一个从 0 到 100 的连续数字。根据数字,图像中可见的镜子——一面黑色的镜子,它根据人流量和周围发生的事情的强度而凸出。因此,它与周围环境相互作用。这是一个非常有趣的实验。赌场里的人对周围发生的事情反应非常强烈。这些东西对他们来说非常重要;他们认为这对他们的表现有很大的影响,所以他们与工作的互动非常有趣。我工作中的这种互动感很重要,因为它收集的数据因地而异。同样的装置被设置在美术馆,在课程中收集的数据与赌场中的数据在强度和特征上完全不同。因此,作品没有如此动态地反应,曲面镜没有像在赌场中那样清晰地凸出。
你需要了解的人工智能工具
medium.com](https://medium.com/mlearning-ai/is-gpt-3-for-free-7ec8c2d904b6)
下一件作品是 2004 年在波兹南创作的。它与收藏有关

2004 年第十四届 波兹南国际雕塑双年展
由这种形式的观察者产生的内容形式的数据。这种形式是同质的,只有一种颜色。内容由访问过的人生成。人们一个接一个地进入其中——这造成了一定程度的隔离,让他们在没有额外刺激的情况下集中注意力。单一颜色的形式消除了任何外部刺激,任何额外的噪音——所以这个房间是完全隔离的。
myFATHERintheCloud.ai
我在 2019 年开始了这个项目,此后它一直专注于我父亲的作品。
我父亲已经做了六十年的雕刻家,所以这个项目的目标是训练一个机器学习模型,它将按照我父亲的风格雕刻,从而延续他的遗产。
他的雕塑是具象的,宗教风格和主题。他使用的主要材料是木头。作为项目的一部分,我的目标是在工业机器人的帮助下实现他的作品,这种机器人将有能力用同样的工具按照我父亲的风格进行雕刻。
2020 年,我获得了文化部的奖学金。它涉及建立数据库的准备工作。为此,创建了网站 w-imie-ojca.gross.art.pl 。请访问——在这一页上,您可以看到该数据库的组成部分,即 3D 扫描,以及球形全景,所有这些都可以在这一页上找到。你可以看到我父亲的作品在哪里展出——由于他作品的特殊性,这一点非常重要。记录这一切开始的时间和地点对我来说也很重要——在我看来,这可能对将来训练模型很重要。

2020 年#维米耶奥赫卡
所有扫描的模型都可以通过浏览器访问。你可以在 3D 里看到我父亲的作品是什么样子。此外,网站上还有一份时事通讯。如果你对数据雕刻这个话题感兴趣,欢迎订阅。你不仅可以收到关于数据雕刻的最新消息,还可以看到 GANs 和机器学习在艺术中的应用。
该项目的最重要的部分是数据库。它由数千张雕塑照片组成。这些照片然后被进一步处理。照片的每一个元素在模特训练的时候都很重要。你会在生成的雕塑示例中看到,背景很重要,灯光也很重要,从照片是否着色到如何格式化,一切都在这个过程中起着关键作用。我准备这些照片的方式使它们不会失去比例——这对造型很重要。我将光线正常化,通过处理照片来“扩充”数据集,包括对称反射,正如我之前提到的——光线的变化,颜色的变化。我用不同的方法让最后的效果尽可能接*我父亲的风格。

雕塑的产生
我用各种 GAN 生成雕塑,包括 StyleGAN2(NVidia)。我已经准备了一个数据库和模型,查看由我父亲的人物照片组成的数据库,生成与我父亲的人物风格相似的新人物。本视频展示了 GAN 如何从数据库中学习。这个训练过程需要很多时间,输出图片。该数据库还包括最*制作的抽象雕塑,这扩展了该数据库,并允许现在正在创作的作品,尽管是我父亲的风格,但唤起了一种新的品质。这是 GAN 训练的样子,这是一个视频例子,所有生成的图像都被排列成了一个电影。它们展示了从抽象到具象表现的生成过程。
我生产的所有东西都是开源的,你可以在 我的 Substack feed 上跟随这个过程。
[## m learning . ai Art | data scull tor
创意经济的人工智能艺术解决方案。点击阅读 MLearning.ai Art,作者 Datasculptor,是一个子堆栈出版物,包含…
mlearning.substack.com](https://mlearning.substack.com) 
看本视频全过程(代码+更多实验)//英文字幕
感谢您的阅读,您可能还会喜欢其他一些文章:
[## 机器学习与艺术杂志
这是会员专用的吗?不,还有一个你可以订阅的免费版本。如果你喜欢你收到的东西…
www.getrevue.co](https://www.getrevue.co/profile/mlearning_ai/members) [## 艾:“我期待着将来和你一起工作”
人类创造力的终结?(代码示例)
medium.com](https://medium.com/the-innovation/ai-i-look-forward-to-working-with-you-in-the-future-4068bc639074) [## 参加这些 ML 故事的虚拟现实之旅
使用虚拟现实的 MLearning.ai 顶级作家故事之旅
medium.com](https://medium.com/mlearning-ai/take-vr-tour-of-these-ml-stories-a7550340a6a2)
所有图片均由作者创作。
[## 通过我的推荐链接加入 Medium-Dariusz Gross # data culptor
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
datasculptor.medium.com](https://datasculptor.medium.com/membership)
- 查看我的insta gram每周都有新素材
- 如果你喜欢这个, 跟我上媒 了解更多
- 想要合作?让我们连线上LinkedIn
- 想去探索 3D 模型吗?访问sketch fab
麦当娜由 MLearning.ai 生成
🔵 获得全媒体访问
使用 Octoparse 软件为初学者创建数据集
这是一种有趣的学习方式,可以在几分钟内抓取 1000 个网页。

迈克尔·波德格在 Unsplash 上的照片
介绍
为什么是这篇文章?
本文是网络抓取系列的第二部分。
正如我之前在我的第一篇文章中提到的,我选择写一篇关于抓取的文章,因为在构建我的项目假新闻检测系统期间,我花了几天时间进行相应的研究,因为我无法找到我需要的数据集。
所以,如果你没有看完我的第一篇文章,我强烈建议你看一遍,如果你有编程背景,那么你必须阅读这个系列的第一篇文章。
这篇文章对谁有用?
因为,对于有编程背景的用户,我已经写了一个博客,并且有关于 python 的具体知识,我会建议使用它而不是任何软件来做抓取,因为我发现使用 python 比花几天时间去理解任何特定软件的接口更容易。
但是那些没有任何编程背景的人,你可以跟着我一起熟悉这个软件的界面和工作。
概观
本文是这个系列的第二部分,使用软件抓取网页: Octoparse 。
然而,有许多软件,你可以很容易地在互联网上找到自动化的目的,如
ParseHub , ScarpeSimple , Diffbot , Mozenda 。
不同自动化软件简介:
1。parse hub:网站:https://www.parsehub.com/
目的: Parsehub 是一个非凡的工具,它无需编码就能构建网页抓取器来提取大量数据。它被数据科学家、数据记者、数据分析师、电子商务网站、求职板、市场营销、金融等更多的人使用。
特点:它的界面使用起来非常简单,你只需点击你想要的数据就可以构建网页抓取器。然后,它以 JSON 或 Excel 格式导出数据。它有许多方便的功能,如自动 IP 轮换,允许在登录墙后抓取,浏览下拉列表和标签,从表格和地图中获取数据,等等。此外,它有一个慷慨的免费层,允许用户在短短 40 分钟内收集多达 200 页的数据!Parsehub 的优点还在于它为 Windows、Mac OS 和 Linux 提供了桌面客户端,因此无论运行什么系统,您都可以在自己的电脑上使用它们。
2。简单的刮擦:
网站:https://www.scrapesimple.com
目的:对于想要定制铲运机的人来说,ScrapeSimple 是完美的服务。Web 抓取非常简单,只需填写一张表格,说明您需要哪种数据。
功能: ScrapeSimple 名副其实,它提供完全托管的服务,为客户构建和维护定制的 web 抓取工具。只要告诉他们你需要从哪些网站获取什么信息,他们就会设计一个定制的 web scraper,定期(可以是每天、每周、每月或任何时间)将 CSV 格式的信息直接发送到你的收件箱。这项服务非常适合那些只需要一个 HTML 刮刀而不需要自己编写任何代码的企业。响应时间很快,服务非常友好和有帮助,这使得这项服务非常适合那些只需要完整数据提取过程的人。
3。Diffbot:
网站:https://www.diffbot.com
用途:有特定数据抓取和屏幕抓取需求的企业,尤其是抓取经常改变 HTML 结构的网站的企业。
特性: Diffbot 与大多数页面抓取工具不同,它使用计算机视觉(而不是 HTML 解析)来识别页面上的相关信息。这意味着即使一个页面的 HTML 结构改变了,只要页面看起来没有变化,你的网页抓取器就不会崩溃。对于长期运行的关键任务 web 抓取作业来说,这是一个不可思议的功能。虽然它们可能有点贵(最便宜的计划是每月 299 美元),但它们在提供优质服务方面做得很好,对于大客户来说,这可能是值得的。
4。莫曾达:网站:https://www.mozenda.com/
目的:寻找基于云的自助式网页抓取*台的企业无需再犹豫。Mozenda 已经抓取了超过 70 亿个页面,拥有服务全球企业客户的丰富经验。
功能: Mozenda 允许企业客户在其强大的云*台上运行 web 抓取器。他们在客户服务中脱颖而出(为所有付费客户提供电话和电子邮件支持)。它的*台是高度可扩展的,也允许本地托管。像 Diffbot 一样,它们有点贵,它们的最低计划起价为 250 美元/月。
- 虽然我打算在这篇文章中详细讨论八解符,因为我只使用过它。
八解析
网址:http://agent.octoparse.com/ws/435
目的: Octoparse 是一个非常棒的工具,适合那些希望从网站中提取数据而无需编码,同时仍能通过其易于使用的用户界面控制整个过程的人。
特性:octoporse 对于那些不需要学习编码就想抓取网站的人来说是一个完美的工具。它具有一个指针和点击屏幕抓取器,允许用户抓取登录表单,填写表单,输入搜索词,滚动无限滚动,呈现 javascript 等等。它还包括一个站点解析器和一个托管解决方案,供希望在云中运行其抓取器的用户使用。最重要的是,它有一个慷慨的免费层,允许用户免费建立多达 10 个爬虫。对于企业级客户,他们还提供完全定制的爬虫和托管解决方案,他们负责为您运行一切,并直接向您提供数据。
从 1000 篇新闻文章中提取数据的逐步解释
第一步:下载 Octoparse
- 转到网站:http://agent.octoparse.com/ws/435
- 并遵循社区的指导方针。
- 如果你想购买这项服务,你可以在这里探索所有的计划:http://agent.octoparse.com/ws/436。
第二步:报名
- 完成下载和安装后,如果您以前没有创建过帐户,请注册一个。
第三步:探索它
- 在您自己开始之前,我强烈建议您探索它的不同部分,这些部分最终将帮助您在以后的工作中与这个界面进行交互。
- 浏览热门模板部分,那里有一些热门网站的热门模板,你可能会在那里找到你需要的数据。
- 浏览模板模式和高级模式的教程
第四步:输入网址
- 如果你只想从一个网站抓取数据,你可以简单地将你复制的网址粘贴到主页上,然后点击开始。

Octoparse 软件截图
- 但是如果你想从多个网站收集数据。然后,转到新的选项卡&然后,单击高级选项。

来自 Octoparse 的截图
- 你会看到一个像这样的新窗口,在这个窗口中,你可以用更高级的选项轻松地组织你的工作,也可以跟踪你的目录。

来自 Octoparse 的截图
- 因此,你可以在这里上传多达 10k 个不同的网址,但条件是这些不同的网址的布局应该是相同的,以便能够提取数据,否则,它会自动完成这个过程,但会给你不同网站的布局单独的结果。所以你不会得到所有的数据合并在一起。
第五步:指定刮削细节&属性
点击保存,你会看到这样一个窗口:
左边部分是维护工作流程,中间会显示你输入的第一个 URL 的网页,下面部分会显示数据预览。

来自 Octoparse 的截图
- 在那里,你有两个选项来进一步移动:自动检测网页数据
你可以选择“自动检测网页数据”,根据它的理解抓取 imp 特性并返回五个不同的结果。其中你可以选择跳过对你没用的东西,或者保留它,如果它按照你的意愿刮去了所有属性的话。

来自 Octoparse 的截图
在下面的对话框中,您可以根据需要选择进行编辑。

来自 Octoparse 的截图
因此,在上面的图像中,您可以根据需要启用或禁用 3 个选项。
- 首先:向下滚动页面以加载更多数据。因此,如果一个网页没有分成不同的页面,所有的数据可能都在同一个页面上&要提取所有数据,您只需启用“加载更多数据”选项。
- 第二:点击下一页按钮抓取多个页面
启用它将对您选择作为下一页按钮的页面进行分页。 - 因此它将允许您检查或编辑下一步按钮。点击检查,您将看到下一步按钮在自动检测的网页部分高亮显示。
- 如果自动检测不正确,点击编辑 >现在点击网页屏幕上您想要检测为“下一个按钮的任何内容。例如,假设没有"下一页"按钮,而是" > "作为"下一页按钮"或者如果您不想自动抓取网页的最后一页,您可以选择分页到特定的页面,如:" 1 "、" 2 "、" 3 " &等等…
- 第三:点击 state_url,在之后的页面上抓取数据
- 它将允许您捕获随后页面的内容或文本,并创建另一个包含文本的属性(意味着在单击特定 URL 时页面内容会打开)。

来自 Octoparse 的截图
- 在提示中还有一个选项,“切换自动检测结果(1/5) ”,因此单击此链接,您将能够看到 5 组不同的自动检测数据集。你可以根据需要保留它。
- 编辑完成后,点击保存设置
- 您可以在数据预览中看到抓取的结果,也可以编辑“属性名称”。

来自 Octoparse 的截图
- 您将看到工作流程中的如下变化:

来自 Octoparse 的截图
手动编辑任务工作流
- 或者您可以根据需要选择手动编辑工作流&从 web 页面中选择一个特定的元素作为属性显示在您的数据集中。

来自 Octoparse 的截图
- 在那里,在指向下的箭头上,您会发现一个“+”号,可以根据您的需要添加元素。

来自 Octoparse 的截图
- 这将有助于你明确和组织你的工作。与前面自动检测数据的情况一样,它自动抓取了太多不相关的属性。所以具体到你需要什么,我会建议选择第二个选项。
- 它还允许您重命名、删除或编辑任何特定元素,或者您可以根据需要选择更改设置。
- 我将向您演示一个提取 1000 篇具有 6 个属性的文章的示例:新闻标题、链接、来源、陈述于、日期、图片 _url 。
手动提取数据
- 要提取所有内容,请转到网页部分>选择第一篇文章的具体细节,如:“新闻标题”、“新闻链接”、“新闻来源”、“声明日期”、“日期”>只需在第一篇文章上单击这些项目>该部分将被突出显示,如下所示:

来自 Octoparse 的截图
对所列网址首页的所有新闻文章进行数据提取
- 然后,选择“全选”选项将会选择每篇文章的相同具体细节,直到网页的最后。您将在数据预览中看到捕获的 30 行,如下所示:

来自 Octoparse 的截图
- 现在,点击“提取数据”选项,将提取所输入网址的第一页上列出的所有文章的所有详细信息。
- 您现在可以看到工作流程中的更改:

来自 Octoparse 的截图
- 将打开一个对话框,要求提取更多元素:

来自 Octoparse 的截图
- 由于我们还没有抓取 image_url,我们将单独选择它,并按照上面列出的相同步骤操作:
- 选择网页部分上的图像:

- 将出现一个对话框,带有 diff options > Select "Select All选项。

来自 Octoparse 的截图
- 另一个弹出窗口将会出现,要求 diff 选项选择>选择"提取图像 URL"

来自 Octoparse 的截图
- 对于第一页上的所有新闻文章,您已经完成了抓取图像 URL 的工作&这将为您的数据预览添加一个新属性。
- 这是编辑属性名称后数据预览的外观:

来自 Octoparse 的截图
- 一个弹出窗口将再次出现,要求提取更多的元素,因为我们希望从多个页面提取数据,我们将进行分页。
分页
- 现在,如果您需要大量数据,您可以循环到特定页面或所列 URL 的最后一页。
- 要进行分页,您所需要的只是搜索为特定网页指定下一页的关键字,例如:“ next ”、“ > ”或任何内容。>点击关键字>在我的例子中,它是“下一个”按钮本身>点击它>它将被高亮显示&一个新窗口将会弹出。

来自 Octoparse 的截图
- 选择循环点击下一页
- 完成后,您的工作流现在看起来有点像 auto one 的工作流。

来自 Octoparse 的截图
- 完成所有编辑并组织好数据后,单击保存并运行。

来自 Octoparse 的截图
第六步:将数据导出到你的机器
- 点击保存 & 运行选项将打开带有新窗口清单 3 的选项来选择如何运行它。

来自 Octoparse 的截图
- 如果你是一个高级用户,只有这样你才能访问最后两个选项,这些选项提供了像每天,每周,每月抓取任何网站的功能和许多其他功能。他们的服务器会照顾你的数据,并在根据你选择做的事情进行组织后发送给你。
- 如果您不是自由用户,请选择第一个选项,“在您的设备上运行任务”
- 它将开始提取所有数据,而且在提取数据时,您需要稍微注意一下,虽然这是通过自动化完成的,因为如果数据限制超过 10k,它将停止,您将不得不再等一个小时来从头提取数据。
您还需要唤醒您的系统,因为如果您的屏幕在提取数据时休眠,它可能会停止提取数据&您将不得不再次启动它来提取更多或尽可能多的数据。
- 选择导出数据:

来自 Octoparse 的截图
- 选择保存文件的格式:

来自 Octoparse 的截图
- 因此,我选择将我的文件提取为. csv 文件,并将其保存到我的桌面上,不要关闭此窗口,我们将使用它来提取数据。又是 xlsx 格式。

来自 Octoparse 的截图
- 现在,让我们来看看我们提取的数据。

哦哦!😐这是一种可疑的形式,不可读&根本没有条理。
让我们再次转到导出窗口:导出数据>选择。xlsx 格式这次>点击确定。
- 现在,让我们看看中导出的数据。xlsx 格式。

瞧啊。现在,这确实有意义,所有的模糊性都从我们的数据中消除了。
步骤 7:使用公式格式化 Excel 文件
检查数据集
- 你要做的第一件事是检查你的数据集,在检查我的数据集时,我发现一些不相关的东西,我无法在抓取时编辑。

因此,我们将对 excel 文件执行一些格式化任务。
I. 查看我的“图片 URL ”属性,所以我提取图片 URL,从中提取标签。由于标签值写在图像 URL 中,我没有找到任何更好的选项来提取它。

- 所以如果你仔细注意到“图片 URL ”属性,有一个小字符串“”。jpg " &一个更大的字符串"https://static.politifact.com/img/meter-",它对于所有行的"图像 URL 属性都是通用的。
- 因此,我们将用“
”替换这两个字符串,以获得我的标签值。 - 按 ctrl+H >填充字段"查找什么"用"。jpg" &然后,将字段"替换为"填充为"<空白区域>"(表示您不必在那里指定任何内容)>单击"替换所有 " >按"确定 " &您就完成了您的标签。
1。


2。

这是您的属性格式化后的样子,
3。

- 正如你所看到的,它还有两个问题,首先是第一个单元格中的值是一个超链接。第二是多余的空间。
- 要从特定单元格中“移除超链接”>右击它>从下拉菜单中选择“移除超链接”。要从整列中移除>选择整列>右击它>从下拉菜单中选择“移除超链接”。
- 要删除特定属性中的“多余空格”,请>转到任何空白单元格>编写公式: =TRIM(属性的第一个单元格的地址) >按 enter 键>您将看到第一个单元格的格式化值>将更改应用到所有单元格>拖动&将第一个单元格拖放到特定属性的最后一个单元格。>您将看到所有以应用格式插入的值>现在通过选择整个新列用旧列替换新列>>复制它>然后,在需要粘贴的地方选择整个旧列>转到粘贴选项>从下拉列表中选择粘贴值(V)选项。

太棒了。您已经完成了“标签列。
现在看一看:

二。看看我的另一个属性在上的表述,其中我关注的数据是唯一的日期。

要删除除此之外的文本,我们将分两步进行:
- 正如您已经看到的,对于在整个列中重复的字符串的相似模式,我们可以使用前面的模式来查找它&用 nothing 替换它。因此,对于子字符串“stated on ”,我们将用 nothing 替换它。
这就是我们专栏的样子:

- 注意到上面的图片,你会发现这个列的所有行的另一个子字符串是不同的,那么该怎么办呢,因为我们只需要一个日期,我们这次将提取它:
让我们看看:在一个新的空单元格中键入 command " =MID(所述属性的第一个单元格的地址,你要提取的字符串的起始索引,你要提取的字符数 " >按 enter >你会看到第一个格式化的值>然后,重复上述步骤来改变所有值&用新值替换它。
编写公式的格式:


按回车键时:

看看属性上新的说明:

三。在“ Date ”属性中,我们不需要日期以外的文本,我们也不能在这里使用“ mid ”公式,因为日期是在字符串&的后缀中指定的,没有明确的起点,因为它对于所有的比较单元格都是变化的。
因此,我们将通过使用“ RIGHT ”来实现此任务:
转到 new empty cell > type command "RIGHT(E2,LEN(E20-FIND(",E2)) " >按 enter >键,执行与上述相同的步骤,用旧值替换新列插入的值。
- 编写公式:

2.按回车键:

3.新列将如下所示:

所有格式化后的最终数据集:

所以,这些数据现在都已经整理好了,可以使用了,我希望你们会发现这篇文章对你们有用。请在评论框中分享你的想法&如果你有任何疑问,请告诉我。✌️
所以,如果我的博客帖子对你有所帮助,而你此刻觉得很慷慨,请不要犹豫,请给我买杯咖啡。☕😍
是的,点击我。
And yes, buying me a coffee **(and lots of it if you are feeling extra generous)** goes a long way in ensuring that I keep producing content every day in the years to come.
您可以通过以下方式联系我:
- 订阅我的 YouTube 频道 视频内容即将上线 这里
- 跟我上 中
- 通过 LinkedIn 联系我
- 跟随我的博客之旅:-https://kajalyadav.com/
- 成为会员:https://techykajal.medium.com/membershipT21
也可以看看我的其他博客:
有趣的项目想法与源代码和参考文章,也附上一些研究论文。
towardsdatascience.com](/8-ml-ai-projects-to-make-your-portfolio-stand-out-bfc5be94e063) [## 基于 Python 的推特情感分析预测美国总统大选
修订数据科学基础的有趣项目,从数据集创建到数据分析再到数据可视化
使用 Open Refine 操作数据集

图片由皮克斯拜的 Gerd Altmann 提供
Open Refine 是一个用于清理、转换和丰富数据集的 web 应用程序。可以在以下地址下载:【http://openrefine.org。在下载部分,您可以下载适用于 Windows、Linux 和 Mac OS 的最新稳定版本。下载安装程序后,就可以运行了。一旦执行,该应用程序就可以在以下地址由浏览器使用: http://127.0.0.1:3333 。
Open Refine 允许您执行各种操作。在本教程中,我们将只看到以下内容:
- 上传 CSV 格式的数据集(也支持其他格式)
- 对列的操作
- 在现有列的基础上添加新列
- 从柱中提取元素
- 用外部数据丰富数据集
对于数据操作,Open Refine 使用 GREL(通用精炼表达式语言)。
数据集的上传
例如,我们采用包含 2015 年托斯卡纳地区编辑作品的数据集。在数据集下载之后,运行 Open Refine 并从左侧的菜单中选择 Create Project 项。然后选择我们要从计算机导入的文件,并按下一步按钮。此时,会出现项目的预览。在下半部分,出现另一个菜单(见下图),从中可以选择一些选项,如 CSV 字段的分隔字符(由标题指示,列由分隔)和右侧的其他选项(ad 示例将下一行解析为 setnames 的下一列标题列)。位于左上角的另一个选项提供了设置编码的可能性。在我们的例子中,预览中的数据集存在一些编码问题,因此我们可以从选项字符编码中选择 utf8 编码。至此,我们的数据集的编码问题应该解决了。

作者图片
此时,在页面的右上部分,我们可以更改项目的名称(在项目名称下),然后按下按钮创建项目。应用程序屏幕应该如下图所示:

作者图片
列操作
首先,我们希望在 Author 列中分离作者,并为每个作者创建一个列。为此,根据作者列的标题,单击箭头,从打开的下拉菜单中(见下图),选择编辑列,然后拆分为几列。

作者图片
在打开的窗口中(见下图),您可以选择各种选项,包括如何划分列。在我们的例子中,默认选项就可以了,即使用逗号作为字段分隔符。我们按下 ok 按钮,我们看到我们的表已经改变。原来的列已经被删除,并且创建了许多列,每一列都以该列的旧名称作为名称,后跟一个渐进的数字。

作者图片
现在让我们删除所有添加的列,除了第一列。这样我们就只有每篇编辑作品的第一作者了。为此,对于要删除的每一列,始终从列名旁边的箭头中选择“编辑列”选项,然后删除该列(见下图)。

作者图片
此时,我们只有一个列有第一作者的名字。我们把专栏改名为“第一作者”吧。为此,我们从列名旁边的箭头选择编辑列,然后重命名该列:

作者图片
现在,假设我们想要创建两个新列,一个包含第一作者的姓名,另一个包含第一作者的姓氏。为此,从箭头中选择编辑列,然后基于此列添加列:

作者图片
在打开的窗口中,您必须指明要创建的列的名称,然后用 GREL 语言指定表达式来操作该列。让我们来插一句 GREL 语。在 GREL,你可以使用变量、控件和函数。变量代表表中的行。有不同类型的变量:
- 值—表示对应于选定列的单元格值
- 单元格—表示对应于选定列的单元格。可以对该变量执行两个操作:执行 cell.value(对应于 value)和 cell.recon(允许获得与外部数据的协调过程的结果)
- 单元格—表示整行。若要访问列的值,必须使用以下语法:cells ["column name"]。价值。
至于控件,有不同的类型,包括 if 和 foreach。有关更多详细信息,请参见文档。最后是函数,可以是不同的类型。其中最重要的是字符串操作。有关更多详细信息,请参见文档。
让我们回到我们的数据集。我们说过要创建两个新列,一个包含作者的名字,另一个包含作者的名字。为此,我们可以使用之前使用的拆分列,但是我们会丢失原始列。要保留起始列,我们可以使用添加列。在为 GREL 表达式保留的字段中,我们可以使用 substring 函数创建包含姓名的第一列,该函数从传递的字符串中提取一个子字符串。我们将 substring 函数应用于当前单元格的值(由 value 变量表示),它接收子字符串的极值(起始索引,到达索引)。起始索引为 0,而到达索引由空格字符的位置给出,可通过indexOf function识别,始终应用于变量值:
value.substring (0, value.indexOf (“”))
这样我们就知道了作者的名字。要获得姓氏,您需要创建一个新列,然后再次选择 add column based on this column,然后通过 GREL 以如下方式操作字符串:您必须从字符空格+ 1 的位置开始从 value 变量中提取一个子字符串:
value .substring (value.indexOf (““))
此时,结果应该如下图所示:

作者图片
要向左或向右移动列,您可以从箭头中选择“编辑列”菜单,然后向左或向右移动列(见下图)。

作者图片
丰富数据集
现在假设我们要为带有 ISBN 码的图书添加标识码。为此,我们可以查询 opac.sbn.it 网站,该网站提供了一个 API,用于接收输入的 ISBN 代码并返回一系列信息。API 可以按如下方式调用:
http://opac.sbn.it/opacmobilegw/search.json?isbn=numeroisbn
结果是一个 json,其中还包含图书的识别码。在我们的例子中,我们选择对应于 ISBN 的列,然后编辑列,然后通过获取 URL 添加列:

作者图片
在与 GREL 语言相对应的方框中,我们必须区分包含 ISBN 的行和不包含 ISBN 的行。我们可以将不包含 ISBN 的行识别为长度为 1 的行。因此,我们可以使用 IF 类型控件来检查该行是否包含 ISBN。if 检查的工作方式如下:
if (condition, true expression, false expression)
如果条件出现,则执行真表达式,否则执行假表达式。在我们的案例中:
if (value.length () == 1, null, *load_identification_code*)
要加载标识码,您需要调用 API。为此,只需输入带引号的 API URL,并使用+运算符添加任何变量。在我们的例子中,有必要指定 ISBN,它有时会等于当前行的值(value):
“http://opac.sbn.it/opacmobilegw/search.json?isbn=" + value
那么要插入 GREL 盒的完整代码是这样的:
if (value.length () == 1, null, “http://opac.sbn.it/opacmobilegw/search.json?isbn=" + value)
让我们为新列命名(例如 JSON ),然后点击 ok。我们等待结果。当系统完成这个过程时,会出现一个名为 JSON 的新列,其中包含一个 JSON,包含从 API 中提取的所有信息。现在要提取标识码字段,我们需要解析 JSON。我们选择 JSON 列,并从菜单“编辑列”中选择“基于此列添加列”。我们插入新列的名称(标识代码),并在与 GREL 语言相关的空间中插入代码来操作 JSON。首先,我们需要检查:如果字段为 null,我们不需要做任何事情,否则我们必须解析 JSON。我们使用 isNull 函数来检查变量是否为空:
if (isNull (value), null, *parsing_del_json*)
现在让我们来处理 JSON 的解析。我们将 parseJson()函数应用于 value 变量,该变量将 Json 转换为一个数组,因此我们可以直接访问数组的字段。识别码位于简要记录阵列的第一个位置。因此,我们可以按如下方式访问它:
value.parseJson () [“briefRecords”] [0] [“Identification”]
代码将插入为 GREL 语言保留的空间中的完整代码如下:
if (isNull (value), null, value.parseJson () [“briefRecords”] [0] [“Identification code”])
现在按 ok 按钮,我们将看到一个新的列出现,它带有与 ISBN 代码行相对应的识别码。
摘要
在本教程中,我演示了如何使用 Open Refine 提供的基本功能,这是一个非常强大的数据集操作工具。Open Refine 结合了图形操作和用 GREL 语言执行的高级操作。
如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。
Python 中的数据集
5 个软件包,可轻松访问各种数据集
有一些有用的 Python 包,只需要几行代码就可以加载公开可用的数据集。在本帖中,我们将看看 5 个包,它们提供了对一系列数据集的即时访问。对于每个包,我们将了解如何检查其可用数据集列表以及如何将示例数据集加载到熊猫数据框架。

0.Python 设置🔧
我假设读者(👀是的,你!)可以访问并熟悉 Python,包括安装包、定义函数和其他基本任务。如果你是 Python 的新手,这个是一个很好的入门地方。
我已经在 Jupyter Notebook 中使用并测试了 Python 3.7.1 中的脚本。在我们开始之前,让我们确保您已经安装了相关的软件包:
◼️ ️ pydataset :数据集包,
◼️ ️ seaborn :数据可视化包,
◼️ ️ sklearn: 机器学习包,
◼️ ️ statsmodel :统计模型包,
◼️ ️ nltk: 自然语言工具包包
对于每个包,我们将检查示例数据集的形状、头部和尾部。为了避免重复我们自己,让我们快速制作一个函数:
# Create a function to glimpse the data
def glimpse(df):
print(f"{df.shape[0]} rows and {df.shape[1]} columns")
display(df.head())
display(df.tail())
好了,我们准备好潜水了!🐳
1.PyDataset📚
我们要看的第一个包是 PyDataset 。它易于使用,可以访问 700 多个数据集。这个包的灵感来自于在 R 中访问数据集的便利性,并致力于在 Python 中实现这种便利性。让我们来看看数据集列表:
# Import package
from pydataset import data# Check out datasets
data()

这将返回一个数据帧,其中包含您可以浏览的所有数据集的 dataset_id 和 title 。目前,有 757 个数据集。现在,让我们加载著名的 iris 数据集作为示例:
# Load as a dataframe
df = data('iris')
glimpse(df)

导入包后,将数据集加载到 dataframe 只需要一行代码。就这么简单,对吧?需要注意的是,在这个数据集中,行索引从 1 开始,而不是从 0 开始。
🔗要了解更多信息,请查看 PyDataset 的 GitHub 库。
2.海生的🌊
Seaborn 是另一个软件包,它提供了对示例数据集的简单访问。要找到数据集的完整列表,你可以浏览 GitHub 库,或者你可以像这样用 Python 查看:
# Import seaborn
import seaborn as sns# Check out available datasets
print(sns.get_dataset_names())

目前,有 17 个数据集可用。让我们以加载虹膜数据集为例:
# Load as a dataframe
df = sns.load_dataset('iris')
glimpse(df)

导入包后,只需一行代码就可以将数据集作为 dataframe 加载。
🔗要了解更多信息,请查看 load_dataset 的文档页面。
3.sci kit-学习📓
s cikit-learn 不仅在功能工程和构建模型方面表现出色,它还附带玩具数据集,并提供下载和加载真实世界数据集的便捷途径。玩具和真实数据集的列表以及其他细节可在这里获得。您可以通过滚动链接或参考各个函数的文档来了解有关数据集的更多详细信息。值得一提的是,在这些数据集中,有一些玩具和真实的图像数据集 ,如数字数据集和奥利维蒂人脸数据集。
现在,让我们通过一个示例来看看如何加载真实数据集:
# Import package
from sklearn.datasets import fetch_california_housing# Load data (will download the data if it's the first time loading)
housing = fetch_california_housing(as_frame=True)# Create a dataframe
df = housing['data'].join(housing['target'])
glimpse(df)

下面是如何加载一个示例玩具数据集, iris :
# Import package
from sklearn.datasets import load_iris# Load data
iris = load_iris(as_frame=True)# Create a dataframe
df = iris['data'].join(iris['target'])# Map target names (only for categorical target)
df['target'].replace(dict(enumerate(iris['target_names'])),
inplace=True)
glimpse(df)

💡如果您得到一个关于 as_frame 参数的错误,请将您的 sklearn 版本更新到 0.23 或更高版本,或者使用下面的脚本:
# Import packages
import pandas as pd
from sklearn.datasets import load_iris# Load data
iris = load_iris()# Create a dataframe
X = pd.DataFrame(iris['data'], columns=iris['feature_names'])
y = pd.DataFrame(iris['target'], columns=['target'])
df = X.join(y)# Map target names (only for categorical target)
df['target'].replace(dict(enumerate(iris['target_names'])),
inplace=True)
glimpse(df)
🔗欲了解更多信息,请查看 scikit-learn 的文档页面。
4.统计模型📔
另一个我们可以用来访问数据的包是 s tatsmodels 。可用的内置数据集列在他们网站上的这里。让我们选择‘美国宏观经济数据’作为例子并加载它:
# Import package
import statsmodels.api as sm# Load data as a dataframe
df = sm.datasets.macrodata.load_pandas()['data']
glimpse(df)

你可能已经注意到,我们用来访问‘美国宏观经济数据’的名字是宏观数据。要找到其他数据集的等效名称,请查看该数据集文档的 URL 末尾。例如,如果您点击可用数据集部分中的“美国宏观经济数据”并查看浏览器中的地址栏,您会在 URL 的末尾看到“macro data . html”。
Statsmodels 还允许使用 get_rdataset 函数从 R 加载数据集。此处的可用数据集列表为和。以 iris 数据集为例,我们可以这样加载数据:
# Load data as a dataframe
df = sm.datasets.get_rdataset(dataname='iris', package='datasets')['data']
glimpse(df)

🔗欲了解更多信息,请查看数据集的文档页面。
5.自然语言工具包| NLTK📜
这个包与其他包略有不同,因为它只提供对文本数据集的访问。这里是可用的文本数据集列表(Psst,请注意列表中的一些项目是模型)。使用 id ,我们可以从 NLTK 访问相关的文本数据集。我们以情感极性数据集为例。它的 id 是电影 _ 评论。让我们先用下面的脚本下载它:
# Import package
import nltk# Download the corpus (only need to do once)
nltk.download('movie_reviews')
如果已经下载了,运行它会通知您已经下载了。下载后,我们可以将数据加载到数据帧中,如下所示:
# Import packages
import pandas as pd
from nltk.corpus import movie_reviews# Convert to dataframe
documents = []
for fileid in movie_reviews.fileids():
tag, filename = fileid.split('/')
documents.append((tag, movie_reviews.raw(fileid)))
df = pd.DataFrame(documents, columns=['target', 'document'])
glimpse(df)

在将文本数据从 NLTK 转换为 dataframe 时,没有一种适合所有情况的方法。这意味着您需要根据具体情况寻找转换为数据帧的适当方法。
🔗欲了解更多信息,请查看关于访问文本语料库和词汇资源的资源。
这就是你要的,5 个允许轻松访问数据集的包。现在您知道如何从这些包中加载数据集了。这些包中可用的数据集将来可能会改变,但是你知道如何找到所有可用的数据集!🙆

克里斯汀娜·戈塔迪在 Unsplash 上的照片
您想访问更多这样的内容吗?媒体会员可以无限制地访问媒体上的任何文章。如果你使用 我的推荐链接成为会员,你的一部分会费会直接去支持我。
谢谢你看我的帖子。希望你找到了有用的东西,✂️.如果你感兴趣,这里有我的一些其他帖子的链接:
◼️️ 给熊猫用户的 5 个提示
◼️️️️ 如何在熊猫数据框架中转换变量
◼️ TF-IDF 解释
◼️python 中的监督文本分类模型
再见🏃💨
SQL 中的日期/时间函数
如何使用 CAST、EXTRACT 和 DATE_TRUNC 的教程

什么是时序数据?
在使用 SQL 时,处理日期和时间是一种常见的做法。使用日期,我们可以计算随时间的变化,数据的趋势,执行区间运算。更好地理解潜在业务问题的影响。
时序数据作为一系列数据点,随着时间的推移测量同一事物,按时间顺序存储。
时序数据的一些常见用途
- 股票价格变动
- 传感器跟踪(例如,天气跟踪)
- 租赁服务(如自行车或踏板车租赁)
我们开始吧
对于本教程,我将假设您具有中级 SQL 技能。我们将讨论三个函数并使用 PostgreSQL 语法。
- 投
- 提取
- 日期 _TRUNC
当分解包含大量数据的数据集时,这些函数都很有用。当我们通过一些例子浏览代码时,我们将会看到每种方法的优点。
铸造功能
一个CAST函数将选择的数据类型转换成另一种类型。相当直接。它把一种类型变成你喜欢的类型。语法如下。
CAST(expression AS **datatype**)
下面是一个如何应用于日期和时间的例子。
SELECT
NOW(),
CAST(NOW() AS TIMESTAMP),
CAST(NOW() AS DATE),
CAST(NOW() AS TIME),
CURRENT_DATE,
CURRENT_TIME
在这个查询中,我们期望有 6 个输出。如果您不熟悉NOW()、CURRENT_DATE、CURRENT_TIME,它们是检索当前时间或日期的 SQL 函数。以下是按顺序排列的查询的所有输出。(注意—由于这些函数调用的是确切的时间或日期,因此您将获得不同的数字)
- 2020–03–28 23:18:20.261879+00:00
- 2020–03–28 23:18:20.261879
- 2020–03–28
- 23:18:20.261879
- 2020–03–28
- 23:18:20.261879+00:00
查看来自单独使用的NOW()的第一个结果,我们得到一个完整的时间戳值,包括时区。现在我们来看第二个输出,我们使用CAST只检索时间戳,不包括来自NOW()的时区。现在我们可以看到 cast 是如何工作的了。我们传入一个我们想要转换的值,然后声明我们想要的类型。
接下来,我们在NOW()上使用CAST(),但是传入DATE作为我们想要的类型。我们现在得到了一个时间戳,只保留了年/月/日格式。类似地,看看只有TIME和NOW()的CAST()函数,我们得到的只是没有日期的时间值。
我们可以看到CAST函数如何与时间一起工作,使用CURRENT_DATE和CURRENT_TIME的最后两个输出只是为了让您看到结果的比较。
更多示例—不带时间戳
SQL 还允许CAST()函数用于没有时间戳的类型。
SELECT
CAST(1.34 AS INT),
CAST(1 AS BOOLEAN),
CAST(2.65 AS DEC(3,0))
该查询的结果是,
- 1 →因为整数不能有小数,所以会四舍五入到最接*的整数值
- true → 1 作为布尔值为真,0 为假
- 3 →使用
DEC()我们也可以做第一次整数转换的反向操作。
间隔
在 SQL 中,您还可以使用INTERVAL为您拥有的任何时间戳添加更多时间。对于下面的例子,您不需要使用CAST()函数,但是我选择这样做只是为了得到日期。
SELECT
CAST(NOW() AS DATE) AS TODAY_DATE,
CAST((**INTERVAL** '3 DAYS' + NOW()) AS DATE) AS three_days,
CAST((**INTERVAL** '3 WEEKS' + NOW()) AS DATE) AS three_weeks,
CAST((**INTERVAL** '3 MONTHS' + NOW()) AS DATE) AS three_months,
CAST((**INTERVAL** '3 YEARS' + NOW()) AS DATE) AS three_years

输出
我们可以看到,除了以天、周、月或年为单位的时间间隔长度之外,使用INTERVAL会为您拥有的任何日期增加更多时间——在本例中,当前日期是从NOW()获得的。
提取()
接下来,我们可以看看从时间戳中提取特定的格式。目标是从时间戳中提取一部分。例如,如果我们只需要 2018 年 12 月 10 日的月份,我们将得到 12 月(12)。
让我们来看看EXTRACT的语法
EXTRACT(part FROM date)
我们声明我们想要的提取类型为部分,然后是要提取的源日期。EXTRACT是时间序列数据分析的重要工具。它可以帮助您隔离时间戳中的组,以便基于精确的计时来聚合数据。例如,如果一家汽车租赁店想在每个MAY找到MONDAYS最繁忙的租赁HOUR,您可以使用EXTRACT来完成。你可以深入细节,看到更多有价值的见解。
假设我们运行NOW(),我们的时间戳是2020–03–29 00:27:51.677318+00:00,我们可以使用EXTRACT得到以下内容。
SELECT
EXTRACT(MINUTE FROM NOW()) AS MINUTE,
EXTRACT(HOUR FROM NOW()) AS HOUR,
EXTRACT(DAY FROM NOW()) AS DAY,
EXTRACT(WEEK FROM NOW()) AS WEEK,
EXTRACT(MONTH FROM NOW()) AS MONTH,
EXTRACT(YEAR FROM NOW()) AS YEAR,
EXTRACT(DOW FROM NOW()) AS DAY_OF_WEEK,
EXTRACT(DOY FROM NOW()) AS DAY_OF_YEAR,
EXTRACT(QUARTER FROM NOW()) AS QUARTER,
EXTRACT(TIMEZONE FROM NOW()) AS TIMEZONE

输出
我们看到,我们可以深入了解如何从时间戳中提取信息。注意— DOW —一周中的某一天是星期日(0)到星期六(6)。
我们可以在前面的租车例子的基础上,看看它是如何工作的。
SELECT
EXTRACT(HOUR FROM RENTAL_DATE) AS HOUR,
COUNT(*) as RENTALS
FROM RENTAL
WHERE
EXTRACT(DOW FROM RENTAL_DATE) = 1 AND
EXTRACT(MONTH FROM RENTAL_DATE) = 5
GROUP BY 1
ORDER BY RENTALS DESC
请记住,我们希望每个MAY的MONDAYS有最繁忙的出租HOUR。首先,我们在SELECT中使用EXTRCT来声明,我们只需要HOUR和总计COUNT。然后我们在WHERE子句中为传递两个EXTRACT函数,以便只过滤MONDAYS和MAY。看下面的表格,上午 11 点是 5 月份每周一最受欢迎的出租时间,共有 11 次出租。

输出
日期 _TRUNC
截断——通过或仿佛通过切断来缩短
在 SQL 中截断日期的目的是以绝对精度返回一个间隔。精度值是可用于EXTRACT的字段标识符的子集。DATE_TRUNC将返回一个时间间隔或时间戳而不是一个数字。
DATE_TRUNC、time_column的语法是包含您想要舍入的时间戳的数据库列,而‘[interval]’表示您想要的精度级别。
DATE_TRUNC(‘[interval]’, time_column)
让我们假设我们的NOW()返回相同的2020–03–29 00:27:51.677318+00:00,我们可以使用date_part得到如下。
SELECT
CAST(DATE_TRUNC('DAY', NOW()) AS DATE) AS DAY,
CAST(DATE_TRUNC('WEEK', NOW()) AS DATE) AS WEEK,
CAST(DATE_TRUNC('MONTH', NOW()) AS DATE) AS MONTH,
CAST(DATE_TRUNC('YEAR', NOW()) AS DATE) AS YEAR

输出
可以把使用DATE_TRUNC看作是获取当前位置的间隔,间隔的每一层都是日期被修整的方式。注意——在这个例子中,我们不需要使用CAST。我用它来确保格式干净,便于分析。
我们可以在前面的租车场景中使用DATE_TRUNC,并尝试找出一年中的哪一天(不考虑时间)更受欢迎。
SELECT
CAST(DATE_TRUNC('DAY', RENTAL_DATE) AS DATE) AS RENTAL_DAY,
COUNT(*) AS RENTALS
FROM RENTAL
GROUP BY
RENTAL_DAY
ORDER BY RENTALS DESC

输出
把所有的放在一起
既然我们已经看到了如何使用CAST、EXTRACT和DATE_TRUNC,我们可以将我们学到的一些技术整合到一个实际的例子中。
对于本例,我们将添加一个名为AGE的新时间函数,它接受 2 个日期作为参数,并输出“年龄”或日期之间的年和月时间。
让我们通过从2019–05–01 + 30 days中提取租赁持续时间最长(AGE)的客户列表来结束本教程。
SELECT
CUSTOMER_ID,
**EXTRACT**(DOW FROM RENTAL_DATE) AS DAY_OF_WEEK,
**AGE**(RETURN_DATE, RENTAL_DATE) AS RENTAL_DAYS
FROM
RENTAL
WHERE
RENTAL_DATE
BETWEEN **CAST**('2019-05-01' AS TIMESTAMP) AND
**CAST**('2019-05-01' AS TIMESTAMP) + **INTERVAL** '30 DAY'
ORDER BY 3 DESC

输出
最终结果
我希望您对在 SQL 中使用时间戳感到舒适。你已经学会使用CAST、EXTRACT、INTERVAL、DATE_TRUNC、AGE。您应该做好充分准备来处理与趋势相关的分析,并更深入地挖掘数据,以找到您以前可能无法找到的见解!
如果你对更多的 SQL 教程感兴趣,可以看看我的其他帖子。
幂 BI 中的日期
与日期打交道——可能有些有趣。

柯蒂斯·麦克牛顿在 Unsplash 上的照片
在 Power BI 中,许多专家强烈推荐的方法是在处理日期时创建一个日期表格。我在没有它的情况下工作过,这绝对不是一个好主意。这让我头疼,也给了我不必要的痛苦。

作者图片
日期表很重要!这里有三个原因。
日期计算 — DAX 需要一个日期表来进行日期计算!没有它,那些 SAMEPERIODLASTYEAR、LASTQUARTER 或 DATESBETWEEN 类型的计算就无法工作。也许会,但会非常复杂。为什么伤你的头?
周末/节假日 —如果您需要在计算中排除节假日,并且您没有日期表?这将非常困难。
不同的粒度 —有时,您需要在基于月的表和基于日的表之间进行比较。你需要一些东西来加入他们,这样你才能充分地报道。
在本文中,我将向您展示如何在 M (Power Query)和 DAX 中创建日历表。
我们开始吧!
创建日期表
我们打开幂查询吧(如果不知道从哪里打开,看看这篇文章里的基础知识。)
我想要的表是一个财政年度所有日期的列表,包括星期几、月份和周数…如果可能的话,还包括节假日。我们只想标记这些。
像下面这样的会很好。

作者图片
为了在 Power Query 中做到这一点,我们需要创建一个新的查询。
创建一个新的查询—右键点击查询窗格>选择新的空白查询>选择高级编辑器(顶部的按钮)
完成后,将此功能插入高级编辑器。
Source = List.Dates(#date(2019,04,01),365,#duration(1,0,0,0))
好吧,那到底是什么意思?

这意味着我正在使用一个列表。Dates 函数,创建一个日期表,从 2019 年 4 月 1 日开始,持续时间为 365 天。
一旦你输入这个,Power Query 会给我们一个从 2020 年 4 月 1 日到 365 天之后的所有日期的列表。

作者图片
现在它以列表格式出现,所以我们必须将它转换成表格,以便使用我们的其他函数。您可以选择列>右键>到表格。它会帮你把它变成一张桌子。
现在让我们添加一些其他功能。

在这里您可以浏览许多其他功能。您可以使用这些函数,方法是获取所列函数的名称,并将其引用到您的日期列。
例如,如果我对添加星期几感兴趣,我可以输入日期。DayOfWeekName([日期]) 。此外,如果我只对数字感兴趣,即一周中的实际日期,我可以使用日期。day ofweek([日期]) 。
链接中列出了许多功能,需要做很多实验,所以我只使用了我最常用的功能。我并不都记得。
最后,你会得到一个如下图所示的表格。

作者图片
现在为你的 PBI 报告输入所有这些内容是相当乏味的,所以我为你创建了一个简单的脚本。将数据加载到 PBI 时,您可能需要调整数据类型。
下面是一个基本数据表的脚本—复制下面的右键单击>选择新的空白查询>选择高级编辑器>粘贴下面的
根据您的需要添加 4 个参数,您就可以开始了。
(Year as number, Month as number, Days as number, Duration as number) =>let
Source = List.Dates(#date(Year,Month,Days),Duration,#duration(1,0,0,0)),
#"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Added Custom" = Table.AddColumn(#"Converted to Table", "Custom", each Date.DayOfWeek([Column1])),
#"Renamed Columns5" = Table.RenameColumns(#"Added Custom",{{"Column1", "Date"}}),
#"Added Custom1" = Table.AddColumn(#"Renamed Columns5", "Custom.1", each Date.DayOfWeekName([Date])),
#"Renamed Columns" = Table.RenameColumns(#"Added Custom1",{{"Custom", "Day of Week"}, {"Custom.1", "Day of Week Name"}}),
#"Added Custom2" = Table.AddColumn(#"Renamed Columns", "Custom", each Date.DayOfYear([Date])),
#"Renamed Columns1" = Table.RenameColumns(#"Added Custom2",{{"Custom", "Day of Year"}}),
#"Added Custom3" = Table.AddColumn(#"Renamed Columns1", "Custom", each Date.Month([Date])),
#"Renamed Columns2" = Table.RenameColumns(#"Added Custom3",{{"Custom", "Month"}}),
#"Added Custom4" = Table.AddColumn(#"Renamed Columns2", "Custom", each Date.MonthName([Date])),
#"Renamed Columns3" = Table.RenameColumns(#"Added Custom4",{{"Custom", "Month Name"}})
in
#"Renamed Columns3"
一旦输入,电源查询将为您带来一个日期表。现在,您可以根据需要输入周长。

作者图片
当加载到报表中时,您只需将您的表标记为日期表。将表标记为日期表的说明如下。
然后,您将有一个日期表。
DAX 中的日期表
在 DAX 中创建日期表的过程非常相似。
您必须在 Power BI 报告视图中选择表格工具>新表格,完成后,您可以通过此功能填充您的表格。
Table = CALENDAR(DATE(2019,04,01),DATE(2020,03,31))

作者图片
一旦您使用这个函数创建了一个新表,您将得到如下结果。

作者图片
现在,转到表格工具>标记为日期表格将其标记为日期表格
Power BI 将要求您选择日期列。一旦选中,它将验证该表是一个日期表。

作者图片
完成后,您可以使用 FORMAT 函数添加其他列。在这里,我添加了格式(表格[日期]," DD ")和其他格式,我选择了一些我常用的格式,但是你也可以添加你自己的格式样式,看看下面的最后一个专栏。

作者图片
当然也有其他格式。你可以在这里获得更多信息
接下来呢?
您现在知道了如何使用 DAX 和 m 创建一个简单的日期表,那么这一切有什么意义呢?这是为了将您的表(可能是事实表)与您的日期表连接起来。
类似这样的东西可能会帮助你。

作者图片
现在,您可以在事实表和日期表之间创建多对一联接。
由于您的日期现在反映在日期表中,您现在可以进行如下计算。

作者图片
我个人的最爱。
获取两个日期之间的总销售额。

作者图片
现在,这些 DAX 日期计算只有在你有一个日期表,并且以这种方式连接的情况下才有效。也许您的事实表很小,您可以在事实表中包含一个日期列,但它不会很漂亮。
还有很多很多很酷的 DAX 日期时间智能函数都是这里。
日期栏一开始就搞砸了——所以我不能加入。
我也明白了。“您向我展示了如何在 DAX 和 M 中构建一个日期表,以及一些使用时间智能的方法,这很好,但是我甚至无法开始,因为事实表中的日期列一开始就被搞砸了!”

作者图片
以下是你可以做的——而且对我来说几乎一直都有效。希望你的表没有被弄得一排排颠倒月份和日期..那可能本身就是另一篇文章了。
我建议在幂查询中使用“列按例”。这里的“人工智能”在查询。我不能在这里使用日期列,因为它是文本格式的,即使转换成日期,它也会抛出错误。

作者图片
开始自己填充日期列,AI 将会选择你正在做的事情并为你创建新的日期列。

注意当你添加斜线的时候,它是如何选择你正在做的事情的?

它得到了你想要做的事情!

作者图片

现在,您可以对日期表进行连接了。
希望你喜欢这篇文章!
保持鼓励,保持安全,祝您的数据之旅好运!
Datetime2 —为什么应该(不应该)使用它?
选择正确的数据类型并不像您第一眼看到的那样简单

乔恩·泰森在 Unsplash 上的照片
几周前,我正在处理一个业务请求,为客户调查准备一个数据集成场景。在最初的概念阶段和逻辑数据建模之后,在物理数据建模阶段,我在考虑既能满足业务需求又能确保 SQL Server 资源得到最佳利用的某些数据类型。
我的建议是对所有 Datetime 列使用 Datetime2 数据类型,而我的老板坚持使用老式的 Datetime 。我想,他是一个老派的家伙,习惯于使用传统的数据类型,所以我将证明他是错的,并说服他改用更新的(顺便说一下,也是微软推荐的)数据类型。
介绍
在继续之前,我需要简要强调一下 Datetime 和 Datetime2 数据类型之间的主要特征和差异。
下表给出了这两者的简要概述:

日期时间
Datetime 是一种“传统”数据类型,用于存储关于日期和时间的数据。它占用 8 个字节的内存,4 个字节用于日期部分,4 个字节用于时间部分。
所以,让我们来看看幕后发生了什么:
DECLARE @dt DATETIME = '2020-05-28 12:00:00.000';
SELECT CAST(@dt as varbinary(8));
我们得到了以下十六进制值:0x0000ABC900C5C100
因此,如果我们取前 8 个字符(0000ABC9)并将其转换为十进制,我们将得到 43977 个整数值。该值显示自 1900–01–01 以来的天数,可以按如下方式进行测试:
SELECT DATEADD(DD, 43977, '1900-01-01') AS DateTimeTest
我们看到我们之前“定义”的日期(2020 年 5 月 28 日)就在那里。
让我们检查时间部分,去掉最后 8 个字符(00C5C100)。把它转换成十进制,得到 12960000。这个数字表示从午夜开始的时钟滴答数。而且,由于精度为 1/300 秒,我们可以进行以下计算,以获得更多人类可读的结果:
SELECT 12960000/ 300 AS SecFromMidnight
,12960000/ ( 300 * 60) AS MinsFromMidnight
,12960000/ ( 300 * 60 * 60) as HoursFromMidnight

一旦我们将这个时间部分“添加”到前一个日期部分,我们将得到 2020–05–28 12:00:00.000,就像第一个声明中一样。
日期时间 2
Datetime2 是在 SQL Server 2008 中引入的,所以它在这里足够长,可以与它的“哥哥”进行一些比较。主要区别在于数据存储的方式:在 Datetime 类型中,先日期后时间,在 Datetime2 中,3 个字节,最后表示日期部分!
让我们用与前面相同的数据进行检查:
DECLARE @dt DATETIME2(3) = '2020-05-28 12:00:00.000';
SELECT CAST(@dt as varbinary(8));
现在,十六进制值是:0x03002E930224410B
所以,我们取日期的最后 6 个字符(3 个字节),但是最右边的字节在数据时间 2 中是最重要的,所以它先取:0B4124。把它转换成十进制,我们得到 737572。当我们将其添加到日期时间 2 数据类型的“0001–01–01”起点时,我们将日期(2020–05–28)恢复为:
SELECT DATEADD(DD,737572,convert(date,'0001-01-01')) AS DateTimeTest
对于时间部分,事情变得更加复杂,因为它依赖于定义的精度。在我们的例子中,它是 3 位精度,但它可以达到 7 位(这是默认的,以防我们没有定义任何特定的值)。根据精度不同, Datetime2 占用 6 到 8 个字节的存储空间。
回到我们的例子:
SELECT CAST(0x02932E00 AS INT)/ POWER(10,3) AS SecFromMidnight
,CAST(0x02932E00 AS INT)/ (POWER(10,3) * 60) AS MinsFromMidnight
,CAST(0x02932E00 AS INT)/ (POWER(10,3) * 60 * 60) as HoursFromMidnight

同样,我们得到了预期的结果。
回到我们最初的场景…
好了,这是两种数据类型的简要概述。创建表时,在许多情况下,人们无法预见特定表中将存储多少数据。有时,你创建了一个表,认为它不会超过某个阈值,但过了一会儿,你意识到你的假设是不正确的。
然而,我们确信这张桌子会很大!我说的大,是指一两年后可能接* 1 亿行。回到我们最初创建最优表的请求,我认为将数据存储为 2 位数精度的 Datetime2 (需要 6 个字节),乘以至少 5 个 Datetime 列,可以为我们节省大量空间。
需要更少的存储,更高的精度,更大的日期范围,符合 SQL 标准…
为什么还有人使用日期时间呢?
但是,我开始深入挖掘。并尝试在网上搜索寻找专家对这个话题的看法。我想,Datetime2 一定有什么(我的意思是,我的老板通常知道他在说什么,呵呵)。所以,我发现这个讨论有着 Datetime2 的被充分证明的缺点。
主要问题是缺乏对日期进行基本数学运算的(简单)可能性,例如计算两个日期之间的天数、小时数、分钟数等。
下面是一个关于日期时间类型的基本示例:
SELECT CONVERT(DATE, GETDATE()+1) AS Tomorrow;
如果您试图对 Datetime2 做同样的事情,您将得到一个错误:
SELECT CONVERT(DATE,SYSDATETIME()+1) AS Tomorrow;

另一个非常明显的缺点是,如果您试图计算当月的第一天,这是一种非常常见的情况:
SELECT CurrentMonthStart = DATEADD(mm,DATEDIFF(mm,0,SYSDATETIME()),0);
结果是意料之中的:

但是,你不会想到它的数据类型是:日期时间,而不是日期时间 2 !
SELECT SQL_VARIANT_PROPERTY(DATEADD(mm,DATEDIFF(mm,0,SYSDATETIME()),0),'BASETYPE') AS DataTypeTest

这意味着每次使用这些计算进行比较时,您都将完成隐式数据转换!
另一个真正重要的考虑来自于这样一个事实,即由于数据存储的方式(还记得前面解释过的字节逆序),SQL Server 不能正确地对 Datetime2 列使用统计信息。关于这些问题的更多信息,请参见亚伦·贝特朗的文章。
错误的估计会导致非最优的查询计划,从而降低性能,这是一个更大的缺点。
因此,结果是错误的估计和糟糕的查询计划,常见场景中的隐式数据转换,无法使用基本的数学运算进行日期计算…
究竟为什么有人想使用 Datetime2?
我用机器学习和人工智能做了一个约会算法
为约会应用程序利用无监督机器学习

亚历山大·辛恩在 Unsplash 上的照片
对单身的人来说,约会是艰难的。约会应用程序可能更难。约会应用程序使用的算法在很大程度上被使用它们的不同公司保密。今天,我们将尝试通过使用人工智能和机器学习构建一个约会算法来揭示这些算法。更具体地说,我们将以聚类的形式利用无监督的机器学习。
希望我们可以通过使用机器学习将用户配对来改善约会简档匹配的过程。如果像 Tinder 或 Hinge 这样的约会公司已经利用了这些技术,那么我们至少会多了解一点他们的档案匹配过程和一些无监督的机器学习概念。然而,如果他们不使用机器学习,那么也许我们肯定可以自己改进配对过程。
将机器学习用于约会应用和算法背后的想法已经在下面的前一篇文章中进行了探索和详细描述:
medium.com](https://medium.com/datadriveninvestor/applying-machine-learning-to-find-love-3558dafcc4a1)
这篇文章讨论了人工智能和约会应用的应用。它列出了项目的大纲,我们将在本文中完成。总体概念和应用很简单。我们将使用 K-Means 聚类 或 分层凝聚聚类 来对约会简档进行聚类。通过这样做,我们希望为这些假设的用户提供更多与他们相似的匹配,而不是与他们不同的个人资料。
现在我们已经有了开始创建这个机器学习约会算法的大纲,我们可以开始用 Python 来编码了!
获取约会档案数据
由于公开的约会档案很少或不可能得到,这是可以理解的,因为安全和隐私风险,我们将不得不求助于假的约会档案来测试我们的机器学习算法。下面的文章概述了收集这些虚假约会资料的过程:
towardsdatascience.com](/generating-fake-dating-profiles-for-data-science-cd3b929972bc)
一旦我们有了伪造的约会档案,我们就可以开始使用 【自然语言处理(NLP) 来探索和分析我们的数据,特别是用户的 bios。我们有另一篇文章详细介绍了整个过程:
medium.com](https://medium.com/swlh/using-nlp-machine-learning-on-dating-profiles-1d9328484e85)
有了收集和分析的数据,我们将能够继续进行项目的下一个激动人心的部分— 集群!
准备配置文件数据
首先,我们必须首先导入我们需要的所有必要的库,以便这个聚类算法能够正确运行。我们还将加载熊猫数据框架,这是我们在伪造假约会资料时创建的。

数据框包含我们所有的数据为每个假的约会配置文件
数据集准备就绪后,我们可以开始聚类算法的下一步。
缩放数据
下一步,将有助于我们的聚类算法的性能,是扩大约会类别(电影,电视,宗教等)。这将潜在地减少将我们的聚类算法适应和转换到数据集所花费的时间。
# Instantiating the Scaler
scaler = MinMaxScaler()# Scaling the categories then replacing the old values
df = df[['Bios']].join(
pd.DataFrame(
scaler.fit_transform(
df.drop('Bios',axis=1)),
columns=df.columns[1:],
index=df.index))
向量化 Bios
接下来,我们将不得不矢量化我们从假的个人资料。我们将创建一个包含矢量化 bios 的新数据框架,并删除原来的“ Bio ”列。对于矢量化,我们将实施两种不同的方法,看看它们是否对聚类算法有显著影响。这两种矢量化方法是: 计数矢量化 和 TFIDF 矢量化 。我们将尝试这两种方法,以找到最佳的矢量化方法。
这里,我们可以选择使用CountVectorizer()或TfidfVectorizer()来矢量化约会简介 bios。当 Bios 被矢量化并放置到它们自己的数据框架中时,我们将把它们与缩放的日期类别连接起来,以创建一个具有我们需要的所有功能的新数据框架。

我们的 DF 包括矢量化的 bios 和定年类别
基于这个最终的 DF,我们有 100 多个特性。因此,我们必须使用主成分分析(PCA)来降低数据集的维数。
数据帧上的 PCA
为了缩减这个庞大的特征集,我们必须实现【PCA】。这项技术将减少我们的数据集的维度,但仍然保留了许多可变性或有价值的统计信息。
我们在这里做的是拟合和转换我们最后的 DF,然后绘制方差和特征数。该图将直观地告诉我们有多少特征导致了差异。

占差异百分比的特征数
运行我们的代码后,占方差 95% 的特征数为 74 。记住这个数字,我们可以将它应用到我们的 PCA 函数中,以从 117 减少最后一个 DF 中的主成分或特征到 74 的数量。这些特征现在将被用来代替原来的 DF 来适应我们的聚类算法。
聚类约会简档
随着我们的数据缩放,矢量化,主成分分析,我们可以开始聚类的日期配置文件。为了将我们的配置文件聚集在一起,我们必须首先找到要创建的最佳集群数量。
聚类的评估指标
聚类的最佳数量将基于特定的评估度量来确定,这些评估度量将量化聚类算法的性能。由于没有确定的集群创建数量,我们将使用几个不同的评估指标来确定集群的最佳数量。这些指标是 轮廓系数 和 戴维斯-波尔丁评分 。
这些指标各有优缺点。选择使用哪一个纯粹是主观的,如果你愿意,你可以自由地使用另一个指标。
找到正确的集群数量
下面,我们将运行一些代码,这些代码将使用不同数量的聚类来运行我们的聚类算法。
通过运行这段代码,我们将经历几个步骤:
- 为我们的聚类算法遍历不同数量的聚类。
- 使算法适合我们的 PCA 数据框架。
- 将配置文件分配给它们的集群。
- 将各自的评估分数附加到列表中。稍后将使用该列表来确定最佳聚类数。
此外,还可以选择在循环中运行两种类型的聚类算法:分层凝聚聚类和k 均值聚类。有一个取消注释所需聚类算法的选项。
评估集群
为了评估聚类算法,我们将创建一个评估函数来运行我们的分数列表。
使用该函数,我们可以评估所获得的分数列表,并绘制出这些值,以确定最佳聚类数。

戴维斯-波尔丁评分

轮廓系数得分
基于这两个图表和评估指标,集群的最佳数量似乎是 12 。对于算法的最后一次运行,我们将使用:
- CountVectorizer 代替 TfidfVectorizer 对 bios 进行矢量化。
- 分层凝聚聚类代替 KMeans 聚类。
- 12 个集群
有了这些参数或函数,我们将对我们的约会档案进行聚类,并为每个档案分配一个编号,以确定它们属于哪个聚类。
运行最终的聚类算法
万事俱备,我们终于可以发现每个约会档案的聚类分配了。
我们最终聚类算法的代码
一旦我们运行了代码,我们就可以创建一个包含集群分配的新列。这个新的数据框架现在显示了每个约会概况的分配。

我们已经成功地将我们的约会档案分组!现在,我们可以通过仅选择特定的集群编号来过滤数据帧中的选择。也许可以做得更多,但为了简单起见,这种聚类算法运行良好。
结束语
通过利用无监督的机器学习技术,如分层凝聚聚类,我们成功地将超过 5000 个不同的约会概况聚类在一起。请随意更改和试验代码,看看是否有可能改善整体结果。希望在本文结束时,您能够了解更多关于 NLP 和无监督机器学习的知识。
该项目还有其他潜在的改进,例如实现一种方法来包含新的用户输入数据,以查看他们可能与谁匹配或聚集在一起。也许创建一个仪表板来完全实现这个聚类算法,作为一个原型约会应用程序。总是有新的令人兴奋的方法来继续这个项目,也许最终,我们可以通过这个项目帮助解决人们的约会困境。
看看下面这篇文章,看看我们是如何为这个约会应用程序创建 web 应用程序的:
[## 我如何使用 Streamlit 构建 Web 应用程序
towardsdatascience.com](/how-to-use-streamlit-to-create-web-applications-218af44064f5)
资源
github.com](https://github.com/marcosan93/AI-Matchmaker) [## 我在约会档案上使用了机器学习 NLP
medium.com](https://medium.com/swlh/using-nlp-machine-learning-on-dating-profiles-1d9328484e85) [## 我为数据科学制作了 1000 份假的约会资料
towardsdatascience.com](/generating-fake-dating-profiles-for-data-science-cd3b929972bc) [## 可以用机器学习来寻找爱情吗?
medium.com](https://medium.com/datadriveninvestor/applying-machine-learning-to-find-love-3558dafcc4a1)
#NLP365 的第 101 天:深入研究 RASA 的饮食结构
内线艾 NLP365
用于意图和实体分类的最新架构
大家好,我的名字是瑞安。我在伦敦做数据科学家。我对自然语言处理(NLP)非常有热情,我目前正在从事项目#NLP365 (+1),在那里我记录了我在 2020 年的每一天的 NLP 学习旅程。请随意查看我在过去 100 天里学到的东西这里。
今天的帖子是关于 RASA 的饮食结构。我真的很喜欢 RASA 的饮食结构,虽然我发现 RASA 的解释视频非常有用,但我不想在将来再次访问饮食结构时重新观看整个视频,所以下面是我对 RASA 饮食的所有笔记:)
饮食有什么特别的?
DIET 代表双重意图和实体转换器。DIET 是一个多任务转换器架构,可以同时执行意图分类和实体识别。它由多个组件组成,允许我们灵活地更换不同的组件。例如,我们可以尝试使用不同的单词嵌入,比如 BERT 和 GloVe。
许多预先训练的语言模型非常沉重,因为它需要很大的计算能力,推理时间很长,所以尽管它们的性能很强,但它们不是为对话式人工智能应用程序设计的。饮食不同,因为它:
- 是一种模块化体系结构,允许软件开发人员在实验中有更大的灵活性
- 在准确性方面与预先训练的语言模型相匹配
- 优于当前的 SOTA,训练速度快 6 倍

饮食模型的高级概述[1]
饮食建筑是什么?

饮食结构的深入概述[2]
首先,我们需要哪些训练数据来训练饮食模型?该架构要求数据集具有输入文本、意图标签和实体标签。
该架构有许多组件,需要优化(最小化)的总损耗由三个损耗组成:
- 实体损失
- 意向损失
- 掩模损失
实体损失
训练时输入的句子如何与实体损失联系起来?以下是将输入句子与实体损失联系起来的层次:
- 个体令牌路径
- 变压器层
- 条件随机场
个体令牌路径被分成两个子路径
- 预埋预埋。这可以是伯特或手套。在这里,您可以尝试不同的嵌入。输出是令牌的数字表示
- 稀疏特征+前馈神经网络。由作为特征的字符级 N-grams 的单热编码器组成,并被传递到前馈层
两个子路径的输出合并在一起,并馈入另一个 FFNN。FFNN 的输出是一个 256 维向量。
单个令牌路径的输出被馈入 2 层变压器层。点击这里看一篇关于变形金刚的好文章。随后,变换器层的输出被馈入条件随机场(CRF)层。在 CRF 中,我们有一个 FFNN,它获取 transformer 层的输出,并对输出的实体进行分类。例如,单词“ping”具有 game_name 的实体。在这些 FFNN 之间,我们有一个转移矩阵。转移矩阵背后的思想是捕捉这样一种情况,即如果有一个令牌是一个实体,那么它的相邻令牌也很有可能是一个实体。对于每个令牌,我们都有地面真实实体的标签,这可以在训练期间用来训练我们的 FFNN 和转移矩阵(它们的权重)。

实体损失和输入令牌之间的联系[2]
意向损失
上图饮食建筑图中有一个特殊的类令牌(CLS)。这个特殊的类标记背后的思想是,它将总结整个输入句子,并导出代表整个输入句子的数字表示。这个特殊的类标记遵循与个体标记相同的路径,然而,预训练的嵌入和稀疏特征的输出略有不同:
- 预训练嵌入的输出现在是句子嵌入。根据所使用的预训练嵌入,计算方式会有所不同。
- 特殊类标记的稀疏特征是各个标记的所有单独稀疏特征的总和。
因为类标记是整个输入句子的总结,所以类标记应该能够预测意图。特殊的类令牌将通过单独的令牌路径、转换器层,然后到达嵌入层。同时,输入句子的真实意图通过嵌入层。正在计算两个嵌入层的输出之间的相似性(以及意图损失)。

意图丧失与特殊阶级令牌 CLS(绿线)之间的联系[2]
掩模损失
在体系结构中添加这个掩码标记是为了使模型也可以作为语言模型来训练。语言模型是在给定一组输入标记的情况下,模型预测最合适的下一个标记。在训练期间,模型会随机屏蔽一些单词,算法的目标是预测被屏蔽的原始单词是什么。下图显示了这是如何工作的。掩码令牌将通过转换器传递到嵌入层。同时,被屏蔽的令牌(图中的单词 pong)通过单独的令牌路径,并且也进入嵌入层。计算这两个嵌入之间的相似性函数。该模型的目标之一是最小化掩模损失。屏蔽损失越低,模型预测屏蔽令牌就越好。

掩码丢失和掩码令牌之间的联系[2]
FFNN 特性
关于结构中所有 FFNN 的两个特别注意事项。首先,它们没有完全连接。FFNN 从一开始就有 80%左右的辍学率。这使得 FFNN 更加轻便。第二,所有的 FFNN 共享相同的权重。所有 FFNN 后稀疏特征共享权重(W1),并且所有 FFNN 后合并两条路径的输出共享另一组权重(W2)。
结束的
当他们已经在使用预训练的模型时,为什么他们使用掩码令牌并再次训练语言模型?以允许模型适应数据集的域。特别是在聊天机器人或社交媒体上下文中,有更多拼写错误的单词或俚语或命令文本,因此再次训练语言模型将允许模型捕捉这些领域特定的语言。
该架构旨在允许模型学习我们输入句子的更一般的表示。在训练过程中,所有的权重都必须基于三种不同的损失进行优化:实体、意图和屏蔽损失,因此,模型不能只学习一种使其中一种损失最小化的表示。此外,该架构的设计方式使您可以打开或关闭多个组件。该架构旨在处理意图和实体分类,但如果我们只想让模型进行意图分类,我们可以“关闭”实体和屏蔽损失,只专注于优化训练期间的意图损失。我非常喜欢学习 RASA 的饮食模式,下一步是尝试 RASA 图书馆。
来源:
- https://blog . rasa . com/introducing-dual-intent-and-entity-transformer-diet-state-of-art-performance-on-a-lightweight-architecture/
- https://www.youtube.com/watch?v=vWStcJDuOUk&list = pl 75 E0 QA 87 DLG-za 8 Eli 6t 0 _ PBX afk-cxb
- 【https://www.youtube.com/watch?v=KUGGuJ0aTL8】&list = pl 75 E0 QA 87 DLG-za 8 Eli 6t 0 _ PBX afk-cxb&index = 3
#NLP365 第 102 天:NLP 论文摘要——财经微博中的隐式和显式方面提取

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 100 天里学到了什么。
今天的 NLP 论文是财经微博中的隐式和显式方面提取。以下是研究论文的要点。
目标和贡献
使用无监督和有监督技术从金融微博中进行方面提取。贡献在于它提取了特定领域(金融)的方面,并处理了隐式和显式方面的提取。
注记和数据集
- 预定义了一个股票投资分类法,以提取隐含和明确的方面
- 创建了一个包含 7 个方面类和 32 个方面子类的语料库。语料库有 368 条信息,其中 218 条是隐含方面,150 条是明确方面
模型
- 分布式语义模型
- 监督 ML 模型 XGBoost、随机森林、SVM 和条件随机场
分布式语义模型
本质上,它使用单词嵌入来计算语义相关度。有两个步骤:
- 提取候选人。使用形态句法模式选择相关的名词和动词短语,包括副词、形容词等修饰语。例如,“收入下降”。
- 计算与类别的相关度。一旦提取了候选项,计算语义相关度包括将候选项向量与方面子类向量进行比较。多个候选单词被组合成一个向量。为每个消息中所有可能的成对记号组合计算余弦相似度,并保留最高得分对。
监督 ML 模型
这是一个多类监督分类问题。它涉及特征工程、机器学习算法优化以及模型选择和评估:
- 特征工程。这包括 BoW(二进制计数、频率计数和 TFIDF)、词性标注、数字和预测的实体情感
- ML 算法优化。选择了 4 ML 算法:XGBoost、随机森林、SVM 和条件随机场。超参数调整使用粒子群优化(PSO)方法
- 模型选择和评估。选择 DSM 和 ML 模型中的最佳模型(使用 CV ),并使用留一法选项验证所选模型
结果
XGBoost 得分最高,被选中。下图显示了 XGBoost 在方面类和方面子类分类以及隐式和显式方面分类上的结果。XGBoost 在 7 个方面的分类上取得了 71%的准确率,在显式方面分类上取得了 82%的准确率,在隐式方面分类上取得了 35%的准确率。

模型验证和隐式与显式方面的结果分解[1]
结论
显式方面分类表现良好,但是隐式方面分类仍然需要更多工作,且可以用更大的数据集和更好的特征工程来处理。
来源:
[1]盖拉特,托马斯等,“财经微博中的隐性和显性体抽取。”计算语言学协会年会)。计算语言学协会,2018。网址:【https://www.aclweb.org/anthology/W18-3108.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 11 日。
#NLP365 的第 103 天:NLP 论文摘要——通过构造辅助句利用 BERT 进行基于方面的情感分析

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 100 天里学到了什么。
今天的 NLP 论文是 通过构造辅助句 利用 BERT 进行基于方面的情感分析。以下是研究论文的要点。
目标和贡献
针对基于方面的目标情感分析(TABSA),微调预训练的 BERT。TABSA 是一项任务,通过这项任务,您可以针对与给定目标相关的特定方面识别出细粒度的意见极性。在基于方面的情感分析(ABSA)中,你没有目标-方面对,只有方面。本文的贡献在于:
- 一种新的处理 TABSA 的方法,通过创建辅助句把它当作一个句子对分类任务
- 通过使用微调的 BERT 在 SentiHood 和 SemEval-2014 任务 4 数据集上实现 SOTA 结果
数据集
感知
- 5215 个句子,其中 3862 个包含单个目标,其余包含多个目标
- 每个句子包含一个带有情感极性的目标体对列表
- 给定一个句子和目标,我们需要 a)检测对目标体的提及,b)确定检测到的目标体对的极性

感知标签示例[1]
塞姆瓦尔-2014 年任务 4
这是 ABSA 而不是塔布萨,所以他们没有目标-方面对,只有方面。允许模型同时处理子任务 3(方面检测)和子任务 4(方面极性)。
方法学

所有助句方法概述
本文采用四种方法构造辅助句,将 TABSA 转换为句子对分类任务。使用(位置 1,安全)作为目标-特征对示例:
问答的句子
- 使用目标-体对生成一个问题。格式必须保持不变
- 例如,“你认为 location-1 的安全性如何?”
对 NLI 的判决
- 这里创造的句子不是一个标准句子,而是一个含有目标体对的假句子
- 例如,“位置-1-安全”
问答部分的句子
- 为句子添加情感标签,并将其视为二元分类问题,将每个句子分类为是或否
- 每个目标-特征对将有三个新的序列。下面是一个例子:
位置-1 的安全方面的极性为正
位置-1 的安全方面的极性为负
位置-1 的特征安全性的极性为“无”
- 我们将具有最高匹配分数概率的类别作为预测类别
对 NLI 的判决-B
- 同样,对于 NLI-B,助动词句从真题变成伪句如下:
位置— 1 —安全—积极
位置-1-安全-负
位置-1-安全-无
实验和结果
这里有两个实验设置,因为我们有两个不同的数据集。
感知实验设置
感知度的评估只考虑数据集中最常见的 4 个方面(一般、价格、交通位置、安全)。以下是选择用于比较的模型:
- 。具有 n 元语法和位置标签功能的 LR
- LSTM——决赛 。以最终状态表示的 biLSTM
- LSTM-洛克 。以与目标位置相关联的状态作为表示
- LSTM+TA+SA 。具有复杂目标级和句子级注意机制的 biLSTM
- SenticLSTM 。LSTM+TA+SA 升级版,引入 Sentic Net 外部信息
- Dmu-Entnet 。具有跟踪实体的延迟存储器更新机制的外部存储器链的双向 EntNet
感知结果

感知结果——所选模型、BERT-single 和 BERT-pair 之间的比较[1]
- BERT-single 在特征检测方面优于 Dmu-Entnet,但在情感分类准确性方面得分较低
- BERT-pair 在特征检测和情感分类方面远远超过其他模型。伯特对问答模型往往在情感分析上表现更好,而伯特对 NLI 模型往往在方面检测上表现更好
SemEval-2014 任务 4 实验设置
BERT-pair 模型与性能最好的系统进行了比较,即 XRCE、NRC-Canada 和 ATAE-LSTM。
SemEval-2014 年任务 4 成果

SemEval-2014 任务 4 子任务 3(表 4)和子任务 4(表 5)之间的结果细分。子任务 3 是方面检测,子任务 4 是方面极性[1]
- BERT-single 模型足以在两个子任务上取得更好的结果
- 伯特对模型实现了对伯特单模型的进一步改进
结论和未来工作
为什么 BERT-pair 的实验结果好那么多?
- 把目标体对转换成辅助句相当于扩大了语料库,因此,我们的模型有了更多的数据
- 伯特似乎在问答和 NLI 任务中表现良好,表明在处理句子对分类方面的优势。这可能归因于无监督的掩蔽语言模型和下一句预测任务
- 在 TABSA 上直接微调预训练的 BERT 不会产生好的结果。通过将 TABSA 转换为句子对分类任务,上下文现在类似于问答和 NLI,因此可以利用预训练 BERT 的优势
从单句分类到句子对分类任务的转换已经产生了强有力的结果。未来的工作可以将这种转换方法应用于其他类似的任务。
来源:
*[1]孙,迟,,黄,邱希鹏."通过构造辅助句,利用 bert 进行基于方面的情感分析." arXiv 预印本 arXiv:1903.09588 (2019)。网址:【https://arxiv.org/pdf/1903.09588.pdf *
【https://ryanong.co.uk】原载于 2020 年 4 月 12 日。
#NLP365 的第 104 天:NLP 论文摘要——感知:城市街区基于目标特征的情感分析数据集

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。请随意查看我在过去 100 天里学到的东西这里。
今天的 NLP 论文是sensitivity:城市街区基于目标特征的情感分析数据集 。以下是研究论文的要点。
目标和贡献
介绍了基于方面的目标情感分析(TABSA)的任务。这项工作扩展了基于方面的情感分析和目标情感分析,前者假设每个文档只有一个实体,后者假设对目标实体只有一个情感。这些贡献如下:
- 介绍基于方面的目标情感分析(TABSA)的任务
- 介绍了基于雅虎问答*台文本的感知数据集。
- 使用逻辑回归和 LSTM 为未来的基准测试开发几个强基线模型
基于方面的情感分析(ABSA)和目标情感分析的局限性
情绪分析(总体情绪)-> ABSA 和针对性情绪分析->针对性 ABSA。
ABSA 涉及在同一文本单元中提取对一个实体的不同方面的情感。用于 ABSA 的数据集主要假设在一个评论片段中只讨论一个实体,但是可以表达对多个方面的意见。目标情感分析针对给定句子中提到的某个目标实体执行情感分析。该任务假设每个实体只有一个情感,并且数据集到目前为止每个文本单元只包含一个目标实体。
塔布萨 vs ABSA
我认为通过一个例子来说明这两个任务的区别是最好的方法。
ABSA 数据集的一个示例:
"空间的设计令人惊叹,但服务却糟透了!"
ABSA 的任务是识别对环境方面的积极情绪和对服务方面的消极情绪。然而,假设这两种意见都是关于同一家餐馆的。
TABSA 数据集的合成示例:
“麦当劳的空间设计很棒,但服务很糟糕,另一方面,肯德基的员工非常友好,食物也总是很美味。”
在这个例子中,有两个目标实体:麦当劳和肯德基。当前的 ABSA 任务只能识别对服务方面表达的正面和负面意见,但不能识别这些意见的目标实体。TABSA 旨在提取目标实体及其各个方面和相关情感。
感知数据集

TABSA 的标签示例[1]
- 包含带有一个或两个位置实体提及的注释句子
- 它有 5215 个句子,其中 3862 个句子包含一个位置实体,1353 个句子包含两个位置实体
- 下面是数据集中不同方面的图表,以及属于每个方面的句子数量。数据集只有正面或负面情绪:

按方面和情感细分的句子数量[1]
- 位置实体名称被位置 1 和位置 2 屏蔽
- 数据集还包括极性类别“无”,其中句子不包含对位置 l 的方面 a 的意见
TABSA 任务本质上是给定一个句子,提供元组(l,a,p)的列表,其中 p 是实体 l 的方面 a 的极性
实验
从数据集中选择了四个最常见的方面:“价格”、“安全”、“运输位置”和“一般”。结果被分解为单个位置的句子、两个位置的句子和整个测试集。其想法是,单个位置句子的结果将展示模型执行正确情感分析的能力,而两个位置句子的结果将展示模型检测某个方面的相关情感并识别意见的目标实体的能力。
基线模型
- 逻辑回归的不同变异与语言特征
- 具有最终和位置输出状态的 LSTM
估价
- F1 分数—特征检测
- 准确性——情感分类
- AUC(ROC 曲线下面积)—特征和情感检测
结果

总体结果比较[1]

按方面细分的结果[1]

单位置和两位置句子的结果比较[1]
- 表现最好的模型是带有位置掩蔽和位置信息的逻辑回归。LSTM 表现不佳可能是由于缺乏训练数据。
- 逻辑回归对 LSTM 的持续优于突出了当数据量低时特征工程的优势。
结论和未来工作
- 改进基线的方法可以包括使用解析树来识别每个位置的上下文
- 数据扩充可用于使模型对数据的变化更加稳健
来源:
[1] Saeidi,Marzieh 等人,“感知:城市街区基于目标特征的情感分析数据集。” arXiv 预印本 arXiv:1610.03771 (2016)。网址:【https://www.aclweb.org/anthology/C16-1146.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 13 日。
#NLP365 的第 105 天:NLP 论文摘要——用注意力超过注意力的神经网络进行方面级情感分类

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 100 天里学到了什么。
今天的 NLP 论文是 方面级情感分类与注意力过度注意神经网络 s。下面是研究论文的关键要点。
目标和贡献
介绍了一种用于基于方面的情感分析的 AOA 神经网络。AOA 模块联合学习方面和句子的表示,并且明确地捕捉方面和上下文句子之间的交互。在笔记本电脑和餐馆数据集上的结果优于以前基于 LSTM 的架构。
数据集
使用来自 SemEval 2014 任务 4 的两个特定领域数据集进行实验:笔记本电脑和餐馆。准确性是评估标准。数据集汇总如下图所示:

带有情感的数据集汇总统计数据[1]
方法学
在这个任务中,我们被给定一个句子和一个体目标,我们的目标是对句子中体目标的情感极性进行分类。在下面显示的架构中有 4 个主要组件:单词嵌入、双 LSTM、注意力超过注意力(AOA)和最终预测。

基于方面的情感分析的建议架构[1]
单词嵌入和双 LSTM
单词嵌入是一个标准化的步骤,我们将文本句子和方面目标转换成它的数字表示。这里没什么特别的。一旦我们得到了词向量,我们就把它们分别输入到两个双 LSTM 中,来学习词在句子和体目标中隐藏的语义。
注意力过度集中(AOA)
下一步是使用 AOA 模块计算文本的注意力权重。下面是以下步骤:
- 计算两个隐藏状态之间的成对交互矩阵,其中每个条目的值代表句子和目标之间的词对的相关性
- 执行列级 softmax 以获得𝛼,目标到句子的关注
- 执行行方式 softmax 以获得𝛽,句子到目标的注意
- 计算𝛽的列*均值,以获得目标级别的关注度𝛽,它告诉我们方面目标中的重要部分
- 最终句子级注意力𝛾是每个单独的目标到句子注意力𝛼的加权和,如下所示:𝛾=𝛼𝛽 𝑇
最终预测
通过将来自 AOA 模块的句子注意力应用于句子隐藏状态来计算最终的句子表示,如下所示:𝑟=ℎ_𝑠^𝑇 *𝛾.这个最终句子表示被馈送到具有 softmax 函数的线性层中,以输出情感类别的概率。给定方面目标,具有最高概率的情感类是句子的预测标签。
实验和结果
模型比较
- 多数 。简单基线,获取训练集中出现最频繁的情感,并将其分配给测试集中的样本
- T5【LSTM】T6
- TD-LSTM 。使用 LSTMs 来捕获方面术语周围的上下文
- AT——LSTM。结合 LSTM 隐藏状态和方面嵌入计算注意向量
- ATAE-LSTM 。AT-LSTM 的扩展,它将方面嵌入附加到每个单词嵌入中
- 伊恩 。计算句子和体项的隐藏表示,并使用它来计算目标的注意力向量。句子和目标嵌入用于最终分类
结果

跨两个数据集的模型比较(准确性)[1]

展示句子中的哪些标记对最终的情感分类贡献最大[1]
- 根据结果表,AOA-LSTM 在与其他基线方法的比较中表现最佳
- 我们还包括了一个表格,通过可视化句子注意向量𝛾.来展示哪个单词对体情感极性贡献最大
结论和未来工作
在误差分析中,存在模型不能有效处理的情况。一是复杂的情感表达。另一个是生僻的成语。在未来的工作中,我们可以将句子的语法结构或先前的语言知识输入 AOA 神经网络。
来源:
[1]黄、、、欧和凯瑟琳·m·卡利。"方面级情感分类与注意力-注意力神经网络."社会计算、行为文化建模和预测以及建模和仿真中的行为表现国际会议。施普林格,查姆,2018。网址:【https://arxiv.org/pdf/1804.06536v1.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 14 日。
#NLP365 的第 106 天:NLP 论文摘要——用于特征提取的无监督神经注意模型

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 100 天里学到了什么。
今天的 NLP 论文是 一个用于方面提取的无监督神经注意模型 。以下是研究论文的要点。
目标和贡献
目标是改进一致方面的发现,因为现有的工作没有产生高度一致的方面。本文提出了一种新的神经模型,基于注意力的方面提取(ABAE ),它通过使用单词嵌入来利用单词共现的分布来提高连贯性。该模型还使用一种注意机制来在训练过程中削弱不相关的单词,这进一步提高了方面的一致性。
传统 LDA 的弱点
- 不要直接对单词共现统计进行编码,这很重要,因为它们可以保持主题的连贯性
- LDA 模型需要估计每个文档的主题分布。然而,评论文档往往很短,这使得估计每个文档的主题分布更加困难
数据集
两个真实世界的数据集:Citysearch(餐馆)和 BeerAdvocate(啤酒)。

两个评估数据集的汇总统计数据[1]
城市搜索语料库
这是一个餐馆评论文集。有 3400 个手动标记的方面。这些注释用于方面提取的评估。有 6 个定义的方面标签:食物、员工、氛围、价格、趣闻和杂项。
BeerAdvocate
大约有 1000 篇评论(9245 句话)被标注了 5 个方面的标签:感觉、外观、气味、味道、整体。
基于注意力的特征抽取(ABAE)
提出的模型,基于注意力的方面提取(ABAE),使用单词嵌入显式编码单词出现统计,使用降维来提取最重要的方面,并使用注意力机制来移除不相关的单词以进一步提高方面的一致性。
最终目标是学习方面嵌入并将其映射到嵌入空间。以下是 ABAE 建筑图以及主要步骤的突出显示:

ABAE 模型架构[1]
- 将我们词汇表中的每个单词映射到它们各自的单词嵌入中。体嵌入是用来逼*我们词汇中的体词的
- 利用注意机制过滤掉非体貌词并构造一个句子嵌入,𝑧𝑠.注意力机制告诉模型应该对单词 I 关注多少,以便捕捉句子的主要方面
- 将句子嵌入重构为来自 T(方面嵌入矩阵)的方面嵌入的线性组合。𝑝𝑡是 k 个方面嵌入的权重向量,它告诉模型输入句子与相关方面的相关程度。通过将𝑧𝑠的维数从 d 维降低到 k(方面的数量)维和 softmax 非线性来获得𝑝𝑡。这个降维和重构的过程保留了嵌入体中的体词的大部分信息
培训目标是最大限度地减少重建损失。换句话说,该模型旨在尽量缩小𝑟𝑠和𝑧𝑠.之间的差异
实验
基线模型
- LocLDA :标准 LDA。每个句子都被视为一个单独的文档
- K-means :使用单词嵌入的 K-means 质心计算初始方面矩阵
- SAS :提取方面和特定方面意见的混合模型
- BTM:为短文本设计的双主题模型。它对无序词对的共现进行建模,以解决数据稀疏问题
估价
基于现有的工作,作者将餐馆和啤酒语料库的方面数量设置为 14 个。他们根据两个标准评价 ABAE:
- 架构能识别有意义的和语义一致的方面吗?
- 该架构能提高方面检测的性能吗?
结果
外观质量

由模型分类并映射到相应黄金方面的推断方面列表[1]
推断方面比黄金方面更精细。例如,它可以区分主菜和甜点。为了评估方面的质量,我们使用一致性分数。更高的一致性分数表明更好的方面可解释性,因此更有意义和语义一致性。下面是餐馆和啤酒语料库中每个模型的*均一致性分数。两个发现:1) ABAE 优于先前的模型,以及 2) k-means 在单词嵌入上足以比所有主题模型执行得更好,向我们显示单词嵌入是比 LDA 更强的用于捕获共现的模型。

主题中顶级术语的数量与这些术语的连贯性之间的关系[1]
作者还进行了人体评估。首先,人类法官必须评估他们有多少连贯的方面。如果一个方面的前 50 个术语中的大部分一致地表示该方面,则该方面是一致的。结果如下,ABAE 发现了最多的相干态。

ABAE 模型发现的相干态数目[1]
第二,人类裁判必须评估某个方面的顶项是否正确。只有当大多数裁判认为顶部术语反映了相关方面时,它才被认为是正确的。如下图所示。

ABAE 模型对不同主题的术语进行分类的精确度[1]
方面检测

方面召回餐馆数据集上的结果[1]
给定一个评论句子,ABAE 首先分配一个推断的方面标签,然后映射到适当的黄金标准标签。上表显示了餐馆语料库的结果。表中的 SERBM 模型报告了在餐馆语料库上的方面检测的 SOTA 结果,并且 ABAE 能够在员工和氛围方面胜过它。
啤酒语料库的结果如下所示。请注意,作者将味觉和嗅觉结合在一起,因为它们都高度相关。ABAE 在各方面都超过了所有车型,除了口味方面。

方面召回啤酒数据集上的结果[1]
另一个发现是,注意力机制被证明是驱动 ABAE 表现的关键因素。下表显示了 ABAE 和 ABAE 之间的性能比较,其中 ABAE 是没有注意机制的 ABAE 模型。ABAE 在所有方面,所有指标上都超过了 ABAE。

ABAE 和 ABAE——(无注意机制)模型的消融研究[1]
结论和未来工作
与 LDA 模型相比,ABAE 显式地捕捉单词共现,并克服了数据稀疏的问题。实验结果表明,与以前的模型相比,ABAE 学习了更高质量的方面,并且在捕捉评论方面更有效。基于这篇论文,这是第一个用于方面提取的无监督神经技术。ABAE 是一个简单而有效的神经注意模型,它的规模很大。
来源:
[1]何,r .,李,W.S .,吴,H.T .和达尔迈尔,d .,2017 年 7 月。用于特征提取的无监督神经注意模型。在计算语言学协会第 55 届年会会议录(第 1 卷:长篇论文)(第 388–397 页)。网址:【https://www.aclweb.org/anthology/P17-1036.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 15 日。
#NLP365 的第 107 天:NLP 论文摘要——让领导偏向于你:一个简单有效的新闻摘要方法

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 100 天里学到了什么。
今天的 NLP 论文是 让铅偏向于你:一种简单有效的新闻摘要方法 。以下是研究论文的要点。
目标和贡献
目的是使用新闻数据中现有的领先偏倚来预训练无标记数据集上的摘要模型。我们希望该模型使用文章的其余部分来预测引导句。引导偏差是新闻数据集中的一个常见问题,文章开头的几个句子包含最重要的信息,因此在新闻数据集上训练的模型会偏向于选择这些句子,而忽略文章后面的句子。
数据集
我们根据前 3 个句子与文章其余部分的重叠不停顿词比率过滤文章后,收集了 21.4M 篇文章(2016 年 6 月—2019 年 6 月)。高重叠不间断单词比率告诉我们有很强的语义联系。
在三个基准新闻摘要数据集上进行评估:
- 纽约时报(NYT)语料库— 104K 新闻文章
- Xsum — 227K 新闻文章
- CNN/每日邮报— 312K 新闻文章
方法学

使用 lead-3 作为摘要的数据集创建流程[1]
给定一篇新闻文章,我们把 lead-3 作为目标摘要,把文章的其余部分作为新闻内容,如上图所示。这允许我们利用未标记的新闻数据集来训练我们的摘要模型。这种预训练方法可以应用于任何具有结构偏差的数据集,例如,具有摘要的学术论文或具有目录的书籍。然而,预训练需要仔细的检查和清理,以确保我们对我们的内容有一个好的目标总结。
实验
抽象概括模型是传统的变换器编码器-解码器架构。我们不会在此详述架构。用未标记的导联-3 (PL)对目标数据集进行微调的预训练被表示为 PL-FT,而没有微调的被表示为 PL-NoFT。
数据清理流程是怎样的?
- 使用正则表达式删除媒体机构、日期和其他无关内容
- 只保留前三句有 10-150 个单词的文章,文章的其余部分有 150-1200 个单词。此外,删除所有在文章其余部分重复出现 lead-3 句子的文章。这是为了过滤掉太长或太短的文章,并鼓励抽象的总结
- 删除含有“不相关”前 3 句的文章。使用前导 3 句子和文章其余部分之间的重叠单词的比率来计算相关性。高重叠词比率意味着前三句是文章其余部分的典型总结。阈值比率为 0.65。
模型比较
- Lead-X:使用前 X 个句子作为摘要(对于 NYT 和 CNN/DM,X = 3;对于 XSum,X = 1)
- 指针生成器网络
- DRM:使用深度强化学习
- TConvS2S:卷积神经网络
- 自下而上:总结的两步方法
- SEQ:使用重构和话题丢失
- GPT-2:预训练语言模型
结果
评估指标是传统的 ROUGE 分数(ROUGE-1、ROUGE-2 和 ROUGE-1)。所有三个评估数据集的结果如下图所示:

NYT 和 CNN/每日邮报测试集的 ROUGE 分数[1]

XSum 测试集[1]的 ROUGE 分数
- PL-FT 模型在 NYT 和 Xsum 数据集上都优于所有基线模型。在美国有线电视新闻网/每日邮报上,除了自下而上,它的表现超过了所有
- PL-NoFT 在 CNN/Daily Mail 上的表现远远超过了所有无监督的模型。在 Xsum 中也表现不错。PL-NoFT 在所有三个数据集上都是相同的模型,展示了它的泛化能力
抽象性
PL-noFT 和 PL-FT 生成的摘要比参考摘要具有更新颖的单字。PL-noFT 与其他 n-grams 中的参考具有相似的新颖率,但是 PL-FT 在微调后具有相对较低的新颖率。

新 n 元语法在生成的摘要中所占的百分比,用于衡量抽象性[1]
人类评估
对 PL 模型和指针生成器网络生成的摘要进行人工评估。评分系统和结果如下所示。结果表明,PL-noFT 和 PL-FT 都优于指针生成器网络。这展示了预训练和微调策略的威力。

人体评价时的评分标准和评价结果[1]
结论和未来工作
本文利用新闻数据中存在的倾向性作为目标摘要和训练前摘要模型。我们的未经微调的预训练模型在不同的新闻摘要数据集上取得了 SOTA 结果。通过微调,性能进一步提高。总的来说,这种预训练方法可以应用于任何存在结构偏差的数据集。
来源:
[1]朱,,等.“使引导偏向于你:一种简单而有效的新闻摘要方法” arXiv 预印本 arXiv:1912.11602 (2019)。网址:【https://arxiv.org/pdf/1912.11602.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 16 日。
#NLP365 的第 108 天:NLP 论文摘要——用于关系提取和语义角色标注的简单 BERT 模型

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 100 天里学到了什么。
今天的 NLP 论文是 用于关系抽取和语义角色标注的简单 BERT 模型 。以下是研究论文的要点。
目标和贡献
使用基于 BERT 的模型来实现关系提取和语义角色标记的 SOTA 性能。该论文声称是第一个成功地将 BERT 应用于关系抽取和语义角色标注的论文。
什么是语义角色标注?
对于语义角色标注,目标是提取句子的述元结构。这意味着我们要找出是什么事件,什么时候发生的,谁参与了,在哪里发生的等等。这对于逻辑推理很重要的下游 NLP 任务很有用。
用于关系抽取的 BERT
给定一个句子和两个实体跨度(非重叠),我们的目标是预测两个实体之间的关系。下图是 BERT 架构的示意图。

用于关系抽取的 BERT 体系结构[1]
流程如下:
- 向输入句子添加特殊标记([CLS]和[SEP]),并用屏蔽标记屏蔽实体提及,以防止过度拟合。有两种论元类型(主语和宾语)和两种实体类型(位置和人)。例如,[S-PER]表示主体实体是人。请参见上图中带有特殊标记的输入句子示例。
- 使用单词块标记器进行标记化,并输入 BERT 编码器以获得上下文化的表示
- 删除第一个[SEP]标记后的任何序列
- 计算相对于主体实体和客体实体的位置序列
- 将两个位置序列转换为位置嵌入,并将其连接到上下文化的表示中
- 把它放进一个单层的 BiLSTM
- 两个方向上的最终隐藏状态被送入一个多层(一个隐藏层)感知器
结果
用于关系提取的评估数据集是 TAC 关系提取数据集(TACRED)。结果如下所示。BERT-base 模型能够胜过所有其他现有的独立模型,然而,当与集合模型比较时,它仍然下降。

关于关系抽取任务的 BERT 结果[1]
语义角色标注的 BERT
语义角色标记由 4 个子任务组成:
- 谓词检测
- 谓词意义歧义消除
- 变元识别
- 论点分类
可以使用基于跨度和/或基于依赖来完成参数注释。本文将这两种标注方法统一起来。
谓词意义歧义消除
这里的目标是正确标记上下文中谓词的含义。步骤如下:
- 使用单词块标记器的标记化
- 谓词(或标记)用适当的标签进行标记
- 其余的单词用“O”或“X”标记。“o”代表任何单词的第一个标记,而“X”代表单词的剩余部分
- 将序列馈入 BERT 编码器以获得上下文化的表示
- 将谓词指示符嵌入连接到上下文化嵌入,以让模型知道哪些标记是谓词标记
- 将级联的嵌入和标签集馈送到 MLP 中用于最终预测
论点识别和分类

语义角色标注的 BERT 架构[1]
这里的目标是识别论元跨度或句法中心,并将它们映射到正确的语义角色标签。我们的输入是一个句子-谓词对,我们需要预测一个序列,其中标签集在生物标签方案和谓词参数之间重叠。模型如上图所示。
- 将句子格式输入到[CLS]句子[SEP]谓词[SEP]中,以便谓词可以通过注意机制与整个句子进行交互
- 将输入馈入 BERT 编码器
- 将输出与谓词指示器嵌入连接起来
- 将连接的输出送入一层 BiLSTM
- 每个标记隐藏状态与谓词隐藏状态连接在一起,并被送入 MLP 进行最终预测
结果
对于基于跨度的语义角色标注,评估数据集是 CoNLL 2005 和 2012。对于基于依赖的语义角色标记,评估数据集是 CoNLL 2009。
结果如下所示。在表 2 中,我们有谓词意义消歧的准确性结果。以前的 SOTA 是一个具有语言学特征的 BiLSTM,基于 BERT 的模型能够胜过使用 MLP 模型的模型。表 3 展示了排除谓词意义歧义的论证识别和分类的结果。在比较中,基于 BERT 的模型再次胜过所有模型。

语义角色标注的 BERT 结果[1]
表 4 和表 5 显示了基于依赖性和基于跨度的语义角色标记的端到端结果。我们可以在表 4 中看到,伯特-LSTM-大型模型能够在 F1 分数方面胜过之前的 SOTA,并且击败没有任何语言特征的不同集成模型。对于基于跨度的语义角色标注,伯特-LSTM-大型模型优于包括集成模型在内的所有模型,但在 CoNLL 2012 数据集上,其 F1 分数略低于集成模型。

BERT 与基于依赖和基于跨度的 SRL 的结果比较[1]
结论和未来工作
基于 BERT 的简单模型产生的结果为未来的研究提供了强有力的基线。潜在的未来工作可能涉及重新引入句法特征,以评估它是否进一步改善目前的结果。额外的工作可以是多任务学习,看看我们是否能从同时学习关系提取和语义角色标记中受益。
来源:
[1]石,p .和林,j . 2019 .用于关系抽取和语义角色标注的简单 BERT 模型。 arXiv 预印本 arXiv:1904.05255 。网址:【https://arxiv.org/pdf/1904.05255.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 17 日。
#NLP365 的第 109 天:NLP 论文摘要—研究适当评分范围内的摘要评估指标

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 100 天里学到了什么。
今天的 NLP 论文是 研究适当评分范围 内的摘要评价度量。以下是研究论文的要点。
目标和贡献
评估指标的作用极其重要,因为它们在很大程度上指导着特定领域的研究进展。自动评估指标的目标是准确地评估生成的接*人类判断的摘要。该论文表明,在表现相似的评价指标和得分较高的评价指标之间存在强烈的分歧。这种分歧意味着我们不知道在评估我们生成的摘要时应该信任哪些指标。本文的贡献如下:
- 引入一种方法学来研究高分范围内的评价指标,发现指标之间存在低/负相关性。这项工作希望鼓励研究人员在适当的评分范围内收集更多的人类注释
没有很多手动标注的数据集,现有的数据集是在 2008 年的共享任务中创建的,因此与当前水*相比,标注的摘要是*均水*。下图对此进行了说明。如你所见,基本事实摘要的分数分布(蓝色)不同于现代摘要系统生成的摘要的分数分布(红色)。不能保证评估指标在红色分布(高分范围)中的行为与人工评估相似,本文的目的是评估高分范围中的评估指标,以评估它们的评估能力是否与人工评估一致和相关。该文件计算不同评分范围中的度量对之间的相关性,而不需要人工评估。

不同分数级别摘要之间的分布[1]
实验设置—数据生成
本文研究了以下指标:
- 胭脂-2 (R-2) 。生成的摘要和基本事实之间的二元模型重叠
- 胭脂-L (R-L) 。生成的摘要和地面实况之间的最长公共子序列
- 胭脂-WE (R-WE) 。基于余弦相似度和单词嵌入的软匹配
- JS 发散(JS-2) 。使用 Jensen-Shannon 散度来衡量二元模型分布之间的差异
- S3 。最大化其与手动金字塔注释相关性的度量
作者使用遗传算法进行总结,以生成优化每个指标的总结。生成的数据集(表示为 W)由 160,523 个汇总组成,每个指标大约有 1763 个汇总。为了关注高分摘要,我们使用 LexRank 过滤掉表现不佳的摘要。在去除重复和过滤之后,这导致了每个主题大约 102 个摘要的最终数据集(T)。人类判断摘要被表示为。
相关分析
辛普森悖论

不同评分级别摘要上不同评估指标之间的成对相关性[1]
从上图中,我们可以看到,对于数据集 A 和 W,评估指标之间有很高的相关性,其中 R-2 和 JS-2 的相关性最强。这可以用他们都是基于二元模型的事实来解释。R-L 与其他指标的相关性最小。然而,在高分汇总(T)中,度量之间的相关性很低,有些甚至是负的。当我们检查比 LexRank 更好的摘要时,衡量改进的度量标准之间没有全球一致的意见。事实上,结果显示,这种分歧随着得分较高的总结而增加,如下图所示。

汇总分数的度量标准之间的不一致程度[1]
这就是众所周知的辛普森悖论,根据你从哪个亚人群中得出不同的结论。结果告诉我们,我们当前的评估标准善于区分非常差的概要和非常好的概要,但是不能区分高分的概要。
跨指标衡量一致的改进
给定一组评估指标,为了跨指标测量一致的改进(指标彼此一致),我们计算以下 F/N 比:
- 选择一个摘要
- 在这些摘要中,哪一个比 s 好一个度量(N)
- 在所有指标(F)的总结中,哪些优于 s
- f 除以 N 得到比值
下图显示了对 5000 个随机样本汇总重复的这一过程。结果表明,随着总结*均分的增加,持续改进的比例(F/N 比)迅速下降。通过使用多个彼此不一致的评估度量,很难识别出具有高置信度的高分摘要。

随着总结得分的增加,对持续改进的衡量[1]
结论和未来工作
高分汇总中评估指标之间的不一致意味着很难评估高分汇总,研究人员面临辛普森悖论的风险很高。该分析是在 TAC-2008 和 TAC-2009 数据集上进行的,因为它们是评估评估指标的标准数据集。未来的工作可以将这种分析扩展到其他数据集和/或其他 NLP 任务,如机器翻译。
来源:
[1] Peyrard,m .,2019 年 7 月。在适当的评分范围内研究总结评估指标。《计算语言学协会第 57 届年会会议录》(第 5093–5100 页)。网址:【https://www.aclweb.org/anthology/P19-1502.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 18 日。
#NLP365 的第 110 天:NLP 论文摘要——方面提取的双重嵌入和基于 CNN 的序列标记

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 100 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 双重嵌入和基于 CNN 的序列标注进行方面提取 。以下是研究论文的要点。
目标和贡献
提出了一种新的双嵌入卷积神经网络(DE-CNN)模型用于有监督的特征提取。这两种预训练嵌入是通用嵌入和特定领域嵌入。本文首次将双重嵌入和 CNN 模型用于特征提取,性能优于 SOTA 方法。
数据集
有两个来自 SemEval 2014 和 2016 的评估数据集:笔记本电脑领域和餐馆领域数据集。请参见下面的数据集统计摘要。

笔记本电脑和餐厅数据集的汇总统计数据[1]
双重嵌入 CNN(去 CNN)
当构建方面提取的模型时(或者一般而言),除了实现 SOTA 结果之外,还有另外两个重要的方面:
- 自动化特征学习
- 由于推理速度和实用性,简化和轻量级模型总是首选
DE-CNN(上图)就是针对这两个方面提出来的。第一个方面使用通用嵌入和特定领域嵌入的双重嵌入机制来解决。嵌入的质量至关重要,因为它们通常是 NLP 管道中的第一步。大多数方面提取只包括通用的嵌入,如 Word2Vec 或 GloVe。这可能不合适,因为不管上下文如何,对某些方面单词的通用嵌入保持不变。这就是为什么在处理细粒度含义时,特定于领域的嵌入在方面提取中非常有用。第二个方面是通过下述事实解决的,即 DE-CNN 是用于序列标记的纯 CNN 模型。下面是体系结构图和每个组件的简短描述:

DE-CNN 的模型架构[1]
- 输入单词序列经过两个独立的嵌入层,得到两个连续的表示:输入的一般嵌入和特定领域嵌入
- 将这两个嵌入连接在一起
- 将级联嵌入馈送到 4 层 CNN,并获得所有单词的表示。注意,这些 CNN 层没有 max-pooling 层,因为我们需要模型很好地表示输入序列中的每个单词
- 我们将 CNN 的输出输入到一个全连接的层,使用 softmax 函数计算输入序列中每个单词的标签概率分布。标签是{B,I,O}。b 和 I 代表体短语的开始词和非开始词,O 代表非体词
实验
模型比较
本文中的基准模型分为以下三组:
单一任务方法
- 条件随机场。使用手套嵌入
- HIS_RD 。SemEval 任务中的最佳系统
- NLANGP 。SemEval 任务中的最佳系统
- WBEmb 。使用具有 3 种不同嵌入的 CRF
- BiLSTM。
- 比尔斯特姆-CNN-CRF 。命名实体识别的 SOTA 模型
多任务方法
- RNCRF 依赖树神经网络和条件随机场的联合模型
- CMLA 。多层耦合注意网络
- 最小。由三个 LSTM 组成,其中两个 lstm 共同学习提取方面和观点,最后一个 LSTM 学习区分情感和非情感句子
去 CNN 的变体
- GloVe-CNN 。没有特定领域的嵌入
- 域-CNN 。没有通用嵌入
- MaxPool-DE-CNN 。包括最大池层
- DE-OOD-CNN 。用域外嵌入替换特定于域的嵌入
- 去 Google-CNN 。使用 GoogleNews 嵌入代替手套
- 去 CNN-CRF 。用 CRF 层替换 softmax 函数
结果

DE-CNN 和基线模型的变化之间的 F1 分数比较[1]
上面的结果表显示,DE-CNN 的性能优于所有基准模型。结果表明,拥有一个独立的嵌入层,无论是通用的还是特定领域的,都不足以获得好的结果。不同领域的特定领域嵌入是不同的,笔记本电脑和餐馆数据集之间的结果差异向我们表明,DE-CNN 在具有许多特定领域方面的领域中将表现得更好。
结论和未来工作
通过错误分析,DE-CNN 似乎有两大错误:
- 标签不一致。同一个方面有时被标记,有时不被标记
- 看不见的方面。该模型未能提取彼此密切相关的一对方面。这可能是一个潜在的未来工作,包括连接词的语义
来源:
[1]徐,h,刘,b,舒,l 和余,p . s . 2018 .面向方面提取的双重嵌入和基于 cnn 的序列标记。 arXiv 预印本 arXiv:1805.04601 。网址:【https://www.aclweb.org/anthology/P18-2094.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 19 日。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1b 27
其他人
#NLP365 第 111 天:NLP 论文摘要——仇恨言论检测中的种族偏见风险

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。请随意查看我在过去 182 天里学到的东西这里。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 仇恨言论检测中种族偏见的风险 。以下是研究论文的要点。
目标和贡献
调查种族偏见是如何被标注者引入到仇恨言论检测的数据集中,增加了对少数民族的伤害,并提出了一种方法来改善方言和种族,以减少标注中的种族偏见。本文的贡献如下:
- 在一些常见的仇恨言论数据集中,发现了非裔美国人英语(AAE)的表面市场与毒性评级之间的意外关联
- 我发现,在这些数据集上训练的模型传播了这些偏见,AAE 的推文被贴上攻击性标签的可能性增加了一倍
- 提出了一种方言和种族启动,通过突出推文中推断的方言或作者的种族背景来减少标注中的种族偏见
方法学
这篇论文用 AAE 方言来代表种族。这意味着每条推文将被归类为 AAE 推文或不是。选择 AAE 方言的理由是,它是美国黑人在社交媒体中常用的语言。使用链接到 AAE 英语或白人英语的词汇检测器来进行方言估计。给定一条推文,检测器将输出该推文是 AAE 语或白色对齐英语的概率。
有毒语言数据集中的偏见
该分析是在仇恨言论检测中常见的两个推特数据集上进行的:
- DWMW17 。2.5 万条推文带有 3 个攻击性标签:仇恨言论、攻击性或无
- FDCL18 。10 万条推文带有 4 个攻击性标签:仇恨、辱骂、垃圾邮件或无
数据偏差
该论文计算了每个攻击性标签和方言之间的相关性,以及它是 AAE 推文的概率。结果如下表所示,AAE 推文和不同的仇恨言论标签之间有很强的相关性。例如,AAE 推文和攻击性标签之间的相关性为 0.42,这意味着如果一条推文被分类为攻击性的,那么它很有可能是 AAE 推文。

按类别细分的数据集[1]
模型中的偏差传播
这项调查分为两步:
- 找出 AAE 和白人对齐的英语推文之间的假阳性(FP)的差异
- 使用我们训练好的模型(在 DWMW17 和 FDCL18 数据集上)计算 Demographic16 和 Userlevelrace18 twitter 有毒语言数据集上的*均毒性率
结果如下图所示。左图是第一步的结果,中图和右图展示了第二步的结果。左边的表格告诉我们,尽管模型在两个数据集上都取得了很高的准确率,但 DWMW17 分类器预测大约 46%的非冒犯性 AAE 推文是冒犯性的。在 FDCL18 分类器中也发现了类似的发现。与此同时,两个分类器都倾向于在白色对齐的 tweets 的“无”类别上具有高 FP 率,这表明模型的潜在歧视。
这些结果得到了第二步结果的进一步支持,在人口统计学 16 数据集中,AAE 的推文被归类为攻击性或辱骂性的可能性增加了一倍。在 Userlevelrace18 数据集中也发现了类似的种族偏见。

按种族和人口统计进行分类准确性和深入结果分析[1]
方言和种族启动效应
使用 Amazon Mechanical Turk 进行了一项实验,以评估方言信息对攻击性评级的影响。流程如下:
- 要求员工对一条推文是否冒犯他们进行分类(否/可能/是)
- 让员工对一条推文是否冒犯了任何人进行分类(否/可能/是)
然而,当工作人员对推文进行分类时,有三种情况:
- 控制
- 方言
- 人种
在方言启动中,工作人员被给予推文的方言(这可能是 AAE 推文),并被指示使用推文的方言作为作者种族的代表。在种族启动中,工作人员被指示根据推文作者推断的方言来考虑其最可能的种族背景。结果如下所示:

AAE 推文的攻击性注释比例[1]
结果表明,在方言和种族条件下启动工作人员减少了 AAE 推文的攻击性分类数量。其他发现包括注释者更有可能将一条推文归类为冒犯他人,而不是冒犯自己,这显示了冒犯性语言的主观性。
结论和未来工作
结果表明,提出的方言和种族启动降低了 AAE 推文被贴上攻击性标签的可能性。这告诉我们,我们应该额外注意注释过程,以避免仇恨言论检测中的任何意外偏差。
来源:
[1] Sap,m .,Card,d .,Gabriel,s .,Choi,y .和 Smith,N.A .,2019,7 月。仇恨言论检测中的种族偏见风险。在计算语言学协会第 57 届年会的会议录(第 1668-1678 页)。网址:【https://homes.cs.washington.edu/~msap/pdfs/sap2019risk.pdf
【https://ryanong.co.uk】原载于 2020 年 4 月 20 日。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1b 27
其他人
#NLP365 的第 112 天:NLP 论文摘要——基于方面的情感分析的挑战数据集和有效模型

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 257 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 基于方面的情感分析的挑战数据集和有效模型 。以下是研究论文的要点。
目标和贡献
引入了一种新的基于方面的情感分析(ABSA)数据集,称为多方面多情感(MAMS),其中每个句子包含至少两个不同的方面和两个不同的情感。提出的 MAMS 数据集可以解决现有 ABSA 数据集的共同问题,其中大多数句子包含不同方面的相同情感,从而将 ABSA 退化为句子级情感分析。论文还为数据集提出了一个简单的基线模型 CapsNet-BERT。
数据集构建
MAMS 的数据集构建分为三个步骤:
- 数据收集
- 数据注释
- 数据集分析
数据收集
对 Citysearch New York 数据集进行类似于 SemEval-2014 数据集的注记。删除任何超过 70 个单词的句子。
数据注释
创建了两个版本的 MAMS 数据集来处理基于方面的情感分析的两个领域:方面-术语情感分析(ATSA)和方面-类别情感分析(ACSA)。对于 ATSA,我们提取句子中的方面术语,并将它们与适当的情感进行映射,并删除具有相同情感的一个方面或多个方面的任何句子。数据集还包括每个特征项的开始和结束位置。对于 ACSA,我们预定义了八个方面类别:食物、服务、员工、价格、氛围、菜单、地点和其他。每个句子都被映射到一个方面类别,以及对该方面类别的适当情感。该数据集仅包括具有至少两个不同情感的独特体类别的句子。
数据集分析
ATSA 包含 13854 个句子,*均 2.62 个体项。ACSA 有 8879 个句子,*均 2.25 个体范畴。请注意,MAMS 中的所有句子都包含不同情绪的多个方面。现有的 ABSA 数据集(SemEval-2014 和 Twitter)包含的多方面多情感句子不超过 30%,有些甚至不到 1%。

MAMS 数据集的描述性统计[1]
CapsNet-BERT
给定一个句子和一个方面术语或一个方面类别,我们希望该模型预测该句子关于方面的情感。提议的模型是 CapsNet-BERT,它由 4 层组成:
- 嵌入层
- 编码层
- 初级被膜层
- 类别胶囊层

CapsNet-BERT [1]
嵌入层
在这一层,我们将输入的句子和体转换成单词嵌入。对于方面项嵌入,我们将其计算为方面词嵌入的*均值。对于方面类别嵌入,我们随机初始化嵌入并在训练中学习。嵌入层的输出是方面感知的句子嵌入,其中我们将方面嵌入与句子中的每个单词嵌入连接起来。
编码层
我们采用体貌感知句子嵌入,并通过剩余连接将其输入到双向 GRU 中,以获得上下文化的表示。
初级被膜层
使用线性变换和挤压激活,我们使用上下文化表示得到主胶囊 P,使用来自嵌入层的方面嵌入得到方面胶囊。这一层还有两种机制:
- 方面感知标准化。这是为了应对句子长度的变化导致训练不稳定的事实,因此我们使用方面胶囊来归一化主胶囊权重,以选择重要的主胶囊。
- 胶囊引导路由。这利用了情感类别的先验知识来改进路由过程。在训练期间,情感矩阵被初始化,并被输入到 squash 激活中以获得情感胶囊。然后通过测量主胶囊和情感胶囊之间的相似性来计算路由权重。
类别胶囊层
使用初级胶囊、方面感知的标准化权重和胶囊引导的路由权重,我们可以计算最终类别胶囊。注意,对于 CapsNet-BERT,嵌入和编码层被替换为预训练的 BERT。
实验和结果
有三个评估数据集:ATSA、ACSA 和 SemEval-2014 餐厅评论。
模型比较
模型分为 4 类:
- 总部设在 LSTM
- 基于 CNN 的
- 基于注意力
- 消融研究,以比较 CapsNet 和 BERT 组合的有效性以及所提出的机制的效果
结果

ATSA 和 ACSA 子任务的实验结果[1]
- 如上所述,句子级情感分类器(TextCNN 和 LSTM)在 SemEval-2014 中表现有竞争力,但在 MAMS 数据集上表现不佳
- SemEval-2014 上的 SOTA ABSA 方法在 MAMS 数据集上表现不佳或一般,表明 MAMS 数据集的高难度水*
- 没有正确模拟单词序列的基于注意力的模型在 MAMS 中表现很差,因为它们丢失了句子的序列信息,因此无法将上下文与方面联系起来
- CapsNet 在 6 个数据集的 4 个数据集上表现优于 BERT,显示了 CapsNet 的实力。CapsNet-BERT 的组合在所有数据集上都优于所有模型
- CapsNet-DR 和 CapsNet-BERT-DR 用于测量胶囊导向路径的有效性。我们使用标准化的动态路由(DR ),这降低了模型的性能,性能不如我们的 CapsNet-BERT
来源:
[1]蒋,q,陈,l,徐,r,敖,x,杨,m,2019,11 月。基于方面的情感分析的挑战数据集和有效模型。在2019 自然语言处理经验方法会议和第九届自然语言处理国际联合会议(EMNLP-IJCNLP) (第 6281–6286 页)的会议录中。
原载于 2020 年 4 月 21 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitivity-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
#NLP365 的第 113 天:NLP 论文摘要——关于使用 Transformer 语言模型的提取和抽象神经文档摘要

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 257 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 关于使用 Transformer 语言模型 的提取和抽象神经文档摘要。以下是研究论文的要点。
目标和贡献
提出了一种长文档的抽象摘要方法。这是通过提取和抽象概括的两步过程实现的。提取步骤的输出用于训练抽象转换器语言模型。这一提取步骤对最终总结结果非常重要。此外,生成的抽象概要比使用复制机制的先前工作更抽象,并且还产生更高的 ROUGE 分数。这些贡献是:
- 展示了 transformer 语言模型在总结长篇科学文章方面的有效性,优于 Seq2Seq 模型
- 与以前的工作相比,提出的模型能够产生更抽象的摘要,并且仍然获得更高的 ROUGE 分数
人类总结过程
- 阅读并理解源文件
- 选择源文档中最重要的部分
- 解释这些重要部分中的关键概念
- 生成连贯流畅的输出摘要
数据集
有四种不同的长文档汇总数据集:
- arXiv
- Pubmed
- 大专利
- 报刊阅览室

汇总数据集的描述性统计[1]
结构
提议的框架分为两个独立的部分:
- 摘录总结。一种分层文档模型,它复制或分类文档中的句子以构建摘录摘要
- 抽象概括。摘录摘要以及文档用于调节转换器语言模型
摘录摘要
提取步骤包括使用两种不同的分层文档模型进行句子提取:分层 seq2seq 句子指针和句子分类器。目标是过滤掉嘈杂的句子,提取重要的句子,更好地训练我们的 transformer 语言模型。分级 seq2seq 语句指针具有编码器-解码器架构:
- 编码器是单词和句子级别(分级)的双向 LSTM
- 解码器是自回归 LSTM
分级编码器结合了单词级和句子级的方向 LSTM。令牌级 biLSTM 对文档中的每个句子进行编码,以获得句子嵌入。句子级 biLSTM 对这些句子嵌入进行编码,以获得文档表示。解码器是一个自回归 LSTM,它将先前提取的句子的隐藏状态作为输入,并预测下一个要提取的句子。
类似于指针网络,句子分类器使用分级 LSTM 来编码文档并产生句子嵌入序列。最终的文档表示是这些句子嵌入的*均值。最终的文档表示被连接到每个嵌入的句子,并被馈送到具有 sigmoid 函数的神经网络中,以获得每个句子被包括在摘要中的概率。
抽象概括
我们使用“格式化的”数据从头开始训练一个单一的 transformer 语言模型。转换器语言模型是 GPT-2。通过自回归分解单词的联合分布来训练语言模型。这启发我们以特定的格式组织训练数据,我们将基础事实摘要放在模型通常用来生成摘要的信息之后。这样,我们在训练期间对文档和摘要的联合分布进行建模,并在推理时使用条件分布(给定文档)来生成摘要。因此,训练数据被格式化为 4 个不同的部分:
- 论文简介。假设简介应包含足够的内容以生成摘要
- 摘录摘要(摘自摘录摘要)
- 摘要(地面实况总结)
- 论文其余部分。用于训练语言模型以理解领域语言
对于一些数据集,引言部分将是整个文档,因为没有论文部分的其余部分。下图展示了整体框架。

建议对研究论文进行抽象概括的训练过程[1]
结果和分析
表 2 和表 4 显示,我们的提取模型在 arXiv 和 PubMed 数据集上都优于所有以前的提取基线。在新闻编辑室数据集(表 6)上,我们的 TLM 远远超过了另一个抽象模型 Seq2Seq,也超过了指针生成器网络。然而,消费后模型主导了提取和混合结果。


arXiv 和 PubMed 上的总结结果[1]


bigPatent 和新闻编辑室的总结结果[1]
性能最好的 TLM (TLM-I+E (G,M))在除了 ROUGE-L 之外的大多数 ROUGE 得分指标上都超过了以前的抽象结果。我们认为这可能是因为我们没有适当的复制机制,这使得在大型 n 元文法上获得精确匹配非常具有挑战性。下图支持了这一假设,因为话语感知模型的复制机制可以从源文档中复制多达 25 个字母。此外,下图还展示了我们的 TLM 通过生成的摘要和源文档之间低百分比的 n 元语法重叠生成了比以前的工作更抽象的摘要。

对生成的摘要进行 n 元语法重叠分析[1]
我们还通过在训练和测试中包括基本事实提取的句子来测量我们的 TLM (TLM-I+E (G,G))的上限性能。最后,下图展示了 TLM 生成的摘要的定性结果。

提议模型生成的摘要示例[1]
结论和未来工作
生成的摘要的流畅性和连贯性是很强的。然而,仍然存在抽象概要产生虚构/不准确内容的问题。在评估总结模型时,潜在的未来工作可以更加关注事实的正确性和一致性。
来源:
[1] Subramanian,s .,Li,r .,Pilault,j .和 Pal,c .,2019。基于 transformer 语言模型的抽取和抽象神经文档摘要。 arXiv 预印本 arXiv:1909.03186 。
原载于 2020 年 4 月 22 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitivity-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
#NLP365 的第 114 天:NLP 论文摘要——科学文献的摘要系统

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 257 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 一个科学文献的摘要系统 。以下是研究论文的要点。
目标和贡献
用于总结计算机科学研究论文的 IBM Science Summariser。该系统可以识别不同的场景,例如科学文档的发现、探索和理解。提议的系统以两种方式总结研究论文:自由文本查询或通过选择分类值,如科学任务、数据集等。提议的系统吸收了 270,000 篇论文。
IBM Science Summariser 生成关注用户查询的摘要(以查询为中心的摘要)。它独立地总结了论文的各个部分,允许用户只关注相关的部分。这允许用户的查询和论文中的各种实体之间的交互。
下图展示了 IBM Science Summariser 的用户界面。用户提出他们的查询(或使用元数据字段上的过滤器)。然后,相关论文连同总结结果一起返回。每个部分都清楚地显示,实体精确地突出显示。

IBM Science Summariser 的用户界面[1]
科学文章的总结——什么,为什么,如何?
科学论文的摘要系统由什么组成?
- 提取结构
- 从 PDF 中提取表格和图表
- 识别重要的实体
- 生成有用的摘要
为什么需要这样做?
以下是学术研究人员的痛点:
- 及时了解当前工作
- 准备研究项目/拨款申请
- 写论文时准备相关作品
- 检验一个想法的新颖性
第一个痛点往往发生在每天/每周,信息过载,大量时间花在阅读论文上。难点 2-4 很重要,但不太常见。
研究人员如何搜索和阅读研究论文?
- 研究人员通过关键词、实体(如任务名称、数据集名称或模型等)或引文进行搜索。例如,“班的最先进的结果”
- 阅读标题->摘要。然而,研究人员提到,摘要的信息量不足以确定相关性
系统概况

IBM 科学摘要的总体框架[1]
该系统(如上图)有两个组件:
- 摄取管道和搜索引擎(Elasticsearch)
- 总结
摄入管道
该系统包含来自 arXiv 和 ACL 的 270,000 篇论文。管道由 3 个主要步骤组成:
- 提取论文的正文、表格和图表
- 使用注释和实体丰富元数据
- 实体提取
该系统使用 Science-Parse 提取 PDF 文本、表格和图表。Science-Parse 支持将图形和表格提取到图像文件(及其标题文本)中。检测文本段落中的图表引用。我们还提取了任务、数据集和指标。输出以 JSON 格式返回。Elasticsearch 用于索引论文,我们索引其标题、摘要文本、章节文本和一些元数据。
该系统有三种类型的实体:任务、数据集和指标。实现了基于字典和基于学习的方法。基于字典的是使用 paperswithcode 网站手工创建的。为了涵盖所有不断发展的主题,我们采用了基于学习的方法来分析整篇论文,以提取三种类型的实体。这被视为一个文本蕴涵任务,其中论文内容是文本和目标任务-数据集-指标(TDM)三元组作为假设。这种方法迫使模型学习文本和三元组之间的相似性模式。总体而言,该系统已经索引了来自整个语料库的 872 个任务、345 个数据集和 62 个指标。
总结
摘要可以是通用的,也可以是针对查询的。各节之间的语言可能有很大的不同,因此各节被独立地总结,然后这些基于节的总结被组合在一起成为一个总结。摘要的输入是查询(可选)、实体和搜索引擎返回的相关论文。总结分为多个步骤:
- 查询处理
- 预处理
- 总结
如果给出查询 Q,它可以非常精确,也可以非常详细。如果它简短而精确,我们将使用查询扩展来扩展它,查询扩展将 Q 转换为 100 个单字项(通过分析从 Q 返回的顶级论文获得)。如果 Q 是 verbose,则使用定点加权模式对查询词进行排序。如果没有问题,论文的关键短语被用作查询的代理。
在预处理方面,我们执行句子标记化、单词标记化、小写和停用词的去除。每个句子然后被转换成单字母和双字母 BoW 表示。
在摘要方面,我们使用了 SOTA 无监督的、提取的、查询聚焦的摘要算法。该算法接受论文部分、查询 Q、期望的摘要长度(10 个句子)和一组链接到查询的实体。生成的摘要是通过非监督优化方案从论文部分选择的句子的子集。这句话的选择是提出了一个多标准优化问题,其中几个总结质量目标的考虑。这些汇总质量是:
- 查询显著度。摘要是否包含许多与查询相关的术语(余弦相似度)?
- 实体覆盖。摘要中包含的实体与我们的实体集匹配吗?
- 文字报道。总结涵盖了论文部分的多少内容?
- 句子长度。我们希望摘要偏向于更长的句子,这样会提供更多的信息。
人类评估
评估设置
我们接触了 12 位作者,请他们评价他们合著的两篇论文的摘要。这样我们总共有 24 篇论文。对于每篇论文,我们生成两种类型的摘要:基于章节的摘要和与章节无关的摘要(将论文内容视为*面文本)。这是为了让我们评估部门总结的好处。这使我们总共有 48 个摘要需要评估。
作者需要对每个摘要执行 3 项任务:
- 对于每个句子,确定该句子是否应该作为摘要的一部分(精度的二进制度量)
- 总结中涵盖论文各部分的程度(回忆的衡量标准,1-5 分,3 分为好)
- 评估摘要的整体质量(1-5 分,3 分为好)
结果
结果如下图所示。在任务 2 中,68%的论文以章节为基础的总结得分较高。基于章节的摘要的*均分数是 3.32,这突出了基于章节的摘要的质量。

总结结果——不可知部分与基于部分的对比[1]
结论和未来工作
作为未来的工作,IBM Science Summariser 计划增加对更多实体的支持,并吸收更多的论文。正在进行更多的定性研究,以评估其使用情况和摘要质量,包括摘要的自动评价。
来源:
[1] Erera,s .,shmu Eli-朔伊尔,m .,Feigenblat,g .,Nakash,O.P .,Boni,o .,Roitman,h .,Cohen,d .,Weiner,b .,Mass,y .,Rivlin,o .和 Lev,g .,2019 .科学文献摘要系统。 arXiv 预印本 arXiv:1908.11152 。
原载于 2020 年 4 月 23 日 https://ryanong.co.uk。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
#NLP365 第 115 天:NLP 论文摘要——sci Bert:科学文本的预训练语言模型

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 257 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 SCIBERT:科学文本的预训练语言模型 。以下是研究论文的要点。
目标和贡献
发布了 SCIBERT,这是一个在多个科学语料库上训练的预训练语言模型,用于执行不同的下游科学 NLP 任务。这些任务包括序列标记、句子分类、依存句法分析等等。在这些下游任务中,SCIBERT 已经取得了新的 SOTA 结果。我们还对微调与特定任务架构的性能、冻结嵌入的效果以及域内词汇的效果进行了广泛的实验。
方法学
西伯特和伯特有什么不同?
- 科学词汇
- 科学团体训练
SCIBERT 基于 BERT 架构。一切都和 BERT 一样,除了它是在科学实验体上预先训练的。BERT 使用 WordPiece 来标记输入文本,并为模型构建词汇表(BASEVOCAB)。词汇表包含最常用的单词/子单词单元。我们使用句子片段库在科学语料库上构建新的单词片段词汇表(SCIVOCAB)。BASEVOCAB 和 SCIVOCAB 之间有 42%的重叠,表明需要新的词汇来处理科学文本。
SCIBERT 接受了语义学者 114 万篇论文的训练。论文的全文被使用,包括摘要。这些论文的*均长度为 154 个句子,句子使用 ScispaCy 拆分。
实验装置
下游的 NLP 任务是什么?
- 命名实体识别(NER)
- 微微萃取
- 文本分类(CLS)
- 关系抽取(REL)
- 依存句法分析(DEP)
PICO 提取是一项序列标记任务,它在描述临床试验论文中的参与者、干预、比较和结果的文本中提取跨度。
模型比较
- 两个基于 BERT 的模型。带 BASEVOCAB 有壳和无壳版本的普通 BERT
- 四个赛伯特模型。有外壳和无外壳,有 BASEVOCAB 和 SCIVOCAB 两种版本
有套管模型用于 NER,无套管模型用于所有其他任务。
微调伯特
我们遵循相同的方法为各种下游任务微调 BERT。对于 CLS 和 REL,我们将[CLS]令牌的最终 BERT 矢量馈入线性层。对于序列标记(NER 和皮科),我们将每个令牌的最终 BERT 向量送入线性层。对于依赖性分析,我们使用具有依赖性标签和弧嵌入的模型以及 BERT 向量上的双分配矩阵注意力。
冻结 BERT 嵌入
我们探索在简单的特定任务模型上使用 BERT 作为预训练的上下文化单词嵌入,以观察它在这些 NLP 任务上的表现。对于文本分类,它是一个具有多层感知器的 2 层 BiLSTM。对于序列标记,它是一个 2 层 BiLSTM 和一个条件随机场(CRF)。对于依赖关系解析,它与上面的两层 BiLSTM 模型相同。
结果
结果分为三个部分:生物医学领域,计算机科学领域和多个领域。高水*的结果展示了 SCIBERT 在科学文本上优于 BERT-Base,并在许多下游任务上实现了新 SOTA。
对于生物医学领域,SCIBERT 在所有七个生物医学数据集上都超过了 BERT,在四个数据集上取得了 SOTA 结果,在其他三个数据集上低于 SOTA。在下图中,我们对 SCIBERT 和 BIOBERT(一个更大的模型)进行了直接比较,发现 SCIBERT 在两个数据集上的表现优于 BIOBERT,在另外两个数据集上的表现也有竞争力,如下所示:

SCIBERT 与 BIOBERT 的结果[1]
对于计算机科学和多个领域,SCIBERT 胜过 BERT,并在所有五个数据集上都取得了 SOTA 结果。上面讨论的所有结果如下所示:

基于 BERT 的模型在不同 NLP 任务上的测试性能[1]
结果还展示了在冻结嵌入之上微调 BERT 而非特定任务架构的强大效果。微调的 BERT 始终优于冻结嵌入模型,并且优于大多数具有冻结嵌入的 SCIBERT,除了两个数据集。我们还评估了领域内词汇的重要性,并观察到使用 SCIVOCAB 时 F1 增加了 0.60。改进的幅度表明,尽管领域内词汇是有用的,但它不是关键驱动因素。关键驱动因素是对科学文本的预处理过程。
结论和未来工作
除了在一些下游任务上取得 SOTA 成果外,SCIBERT 在生物医学任务上的得分也与 BIOBERT 不相上下。在未来的工作中,我们将发布更大版本的 SCIBERT(匹配 BERT-Large ),并对来自不同领域的论文进行实验,目标是训练一个跨多个领域工作的单一总结模型。
来源:
[1] Beltagy,I .,Lo,k .和 Cohan,a .,2019 年。SciBERT:科学文本的预训练语言模型。 arXiv 预印本 arXiv:1903.10676 。
原载于 2020 年 4 月 24 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towards data science . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towardsdatascience . com/day-114-of-NLP 365-NLP-papers-summary-a-summary-system-for-scientific-documents-aeb dc6 e 081 f 8
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
#NLP365 的第 116 天:NLP 论文摘要——科学论文的数据驱动摘要

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 257 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 数据驱动的科学文章摘要 。以下是研究论文的要点。
目标和贡献
从科学文章中创建了两个多句子摘要数据集:标题-摘要对(title-gen)和摘要-正文对(abstract-gen ),并对其应用了广泛的提取和抽象模型。title-gen 数据集包含 500 万篇生物医学论文,而 abstract-gen 数据集包含 90 万篇论文。分析表明,科学论文适合数据驱动的总结。
什么是数据驱动汇总?
这是一种说法,即总结模型的*期 SOTA 结果在很大程度上依赖于大量训练数据。
数据集
两个评估数据集是 title-gen 和 abstract-gen。Title-gen 使用 MEDLINE 构建,abstract-gen 使用 PubMed 进行。title-gen 将摘要与论文标题配对,而 abstract-gen 数据集将全文(没有表格和图表)与摘要摘要配对。文本处理管道如下:
- 符号化和小写
- 移除 URL
- 数字被替换为# token
- 仅包括摘要长度为 150–370 个标记、标题长度为 6–25 个标记和正文长度为 700–10000 个标记的对
我们还计算了每个数据对的重叠分数和重复分数。重叠分数测量摘要(标题或摘要)和输入文本(摘要或全文)之间的重叠标记。重复分数测量文本中每个句子与文本其余部分的*均重叠。这是为了测量存在于论文正文中的重复内容,其中相同的概念被一遍又一遍地重复。下面是两个数据集的统计摘要。

数据集[1]的统计数据
实验设置和结果
模型比较
- 提取总结方法。这里有两个无监督基线:TFIDF-emb 和 rwmd-rank。TFIDF-emb 通过计算其组成单词嵌入的加权和来创建句子表示。Rwmd-rank 根据句子与文档中所有其他句子的相似程度对句子进行排序。Rwmd 代表宽松单词移动器的距离,它是用于计算相似性的公式,随后使用 LexRank 对句子进行排序。
- 抽象总结方法。这里有三条基线:lstm、fconv 和 c2c。Lstm 是常见的 LSTM 编码器-解码器模型,但是具有单词级的注意机制。Fconv 是一个子字级的 CNN 编码器-解码器,使用字节对编码(BPE)将字分成更小的单元。字符级模型擅长处理罕见/不在词汇表中(OOV)的单词。C2c 是一个字符级的编码器-解码器模型。它使用 CNN 从输入中构建字符表示,并将其送入 LSTM 编码器-解码器模型。
结果
评价指标为胭脂评分、流星评分、重叠评分和重复评分。尽管 ROUGE scores 有弱点,但它们在 summarisaiton 中很常见。METEOR 评分用于机器翻译,Overlap 评分可以衡量模型在多大程度上直接从输入文本复制文本作为摘要。重复分数可以衡量摘要中包含重复短语的频率,这是抽象摘要中的一个常见问题。

标题生成和抽象生成数据集的结果[1]
对于 title-gen 结果(表 2),rwmd-rank 是最好的提取模型,然而,c2c(抽象模型)远远超过所有提取模型,包括 oracle。c2c 和 fconv 都取得了相似的结果,具有相似的高重叠分数。对于抽象基因结果(表 3),铅-10 是一个强大的基线,只有提取模型设法超过它。所有提取模型获得相似的胭脂分数和相似的重复分数。抽象模型在 ROUGE 评分上表现不佳,但在 METEOR 评分上优于所有模型,因此很难得出结论。
定性评估是常见的,并且在生成的摘要上进行。见下面标题-性别定性评估的例子。观察结果如下:
- 标题提取模型选择的句子位置变化很大,摘要中的第一句最重要
- 许多抽象生成的标题往往是高质量的,显示了它们选择重要信息的能力
- Lstm 倾向于生成更多的新单词,而 c2c 和 fconv 倾向于从输入文本中复制更多的单词
- 生成的标题偶尔会出现用词不当的错误,过于笼统,无法抓住论文的要点。这可能会导致事实上的不一致
- 对于 abstract-gen,看来引言和结论部分与生成摘要最相关。然而,重要的内容分散在各个部分,有时读者更关注方法和结果
- fconv 抽象模型的输出质量很差,缺少一致性和内容流。摘要中还存在句子或短语重复的常见问题

句子选择分析[1]

不同模型的定性总结结果[1]
结论和未来工作
结果喜忧参半,模型在标题生成方面表现良好,但在抽象生成方面表现不佳。这可以用理解长输入和输出序列的高难度来解释。未来的工作是混合提取-抽象的端到端方法。
来源:
[1]n . I . niko lov,m . Pfeiffer 和 r . h . Hahn loser,2018 年。科学论文的数据驱动摘要。 arXiv 预印本 arXiv:1804.08875 。
原载于 2020 年 4 月 25 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35 B7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
#NLP365 的第 117 天:NLP 论文摘要-摘要文本摘要:低资源挑战

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 257 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 摘要文本摘要:低资源挑战 。以下是研究论文的要点。
目标和贡献
提出了一种迭代数据扩充技术,使用真实的德语汇总数据生成合成数据。随后,他们使用 Transformer 为德语建立了一个抽象概括模型。本文解决了其他非英语语言的 NLP 任务中存在的低资源挑战。当与没有数据扩充而训练的模型相比时,数据扩充提高了抽象概括模型的性能。
方法学

数据集的统计数据[1]
转换器模型是使用 OpenNMT-py 实现的。上图展示了我们数据集汇总统计数据。我们使用了两个德国维基数据集,即 SwissText 2019 和 Common Crawl。SwissText 2019 用作真实数据,而 Common Crawl 用作合成数据。真实数据 SwissText 2019 (100K 数据)分为 train、val、test 比例为 90:5:5。对于通用爬网,以下是生成合成数据的以下步骤:
- 使用 SwissText 数据集构建最常用德语词汇
- 基于词汇和阈值的通用爬行数据集中的句子选择。例如,一个句子有 20 个单词,阈值是 10%,只有当它在我们的词汇表中至少有 20 个单词时,才会被选择
- 从步骤 2 中随机选择句子
- 100K 个选择的句子被用作摘要,我们需要建立一个模型来生成相应的输入文本。因此,我们使用摘要作为输入,目标是文本。这是反向训练的模型,如下所示。最终的总数据集为 190K

使用逆向系统生成合成数据[1]
最后,为了提高合成数据的质量,我们使用了如下所示的迭代方法。我们将首先使用真实的和合成的数据来训练我们的变压器模型。然后,我们将使用经过训练的变压器模型来重新生成我们的合成数据,以训练我们的最终变压器模型。

合成数据再生的最终过程[1]
实验设置和结果
有如下三种实验设置:
- S1 。仅使用真实数据(90K)来训练我们的变压器模型。这是基线
- S2 。使用真实和合成数据(190K)训练我们的变压器模型
- S3 。使用真实的和再生的合成数据来训练我们的变压器模型
结果

开发和测试集的结果[1]
尽管努力提高 S3 合成数据的质量,S2 模型表现最好。如下图所示,ROUGE score 的开发在早期迭代中达到了顶峰,展示了通过更快的训练过程可以达到良好的结果。与 S1 相比,S2 模型在单词和短语生成以及摘要长度方面往往有更多的差异。S2 的*均摘要长度是 41.42,而 S1 是 39.81。

ROUGE-1 学习曲线[1]
结论和未来工作
潜在的未来工作可能涉及对合成摘要数据的进一步调查,并利用迁移学习对具有低资源数据的非英语语言进行文本摘要。
来源:
[1]帕里达,s .和莫特利切克,p . 2019,11 月。低资源挑战。在2019 自然语言处理经验方法会议暨第九届国际自然语言处理联合会议(EMNLP-IJCNLP) (第 5996–6000 页)。
原载于 2020 年 4 月 26 日 https://ryanong.co.uk**的 。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sensation-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towardsdatascience . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
#NLP365 的第 118 天:NLP 论文摘要——通过结合全球和本地上下文对长文档进行摘要

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 262 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 结合全局和局部上下文 对长文档的抽取摘要。以下是研究论文的要点。
目标和贡献
提出了一种新颖的摘要模型,它结合了全球和本地上下文来总结一个长文档。在给定的长文档中,它通常包含各种主题。我们相信使用这些主题来指导总结会有所改进。我们利用全局上下文(整个文档)和局部上下文(部分)来确定一个句子的信息是否足以包含在摘要中。这些贡献如下:
- 首次使用 LSTM 减号进行文本摘要
- 该模型在 ArXiv 和 PubMed 数据集上取得了 SOTA 结果,并显示出随着文档长度的增加,性能有所提高
- 发现模型的性能可以主要归因于局部情境的建模
方法学

整体模型架构[1]
该架构由三个组件组成:
- 句子编码器
- 文件编码器
- 句子分类器
句子编码器
要计算句子嵌入,我们只需使用*均单词嵌入的简单方法。在计算句子嵌入时,这已经被证明和 RNN 和 CNN 一样有效。BERT 句子嵌入表现不佳。
文件编码器
文档编码器是一个 biGRU,这意味着每个句子有两个隐藏状态,一个向前的(黄色)和一个向后的隐藏状态(蓝色)。该文档编码器创建三个输出:
- 句子表征
- 文档表示
- 主题片段表示
对于每个句子,句子表示将简单地是向前和向后隐藏状态的连接。对于文档表示,它将是向前和向后隐藏状态的最终状态的串联(红色)。对于主题片段表示,我们使用 LSTM-负。LSTM 减用于学习文本跨度嵌入。它最初是为依存句法分析而提出的,在依存句法分析中,一个句子被分成三个部分(前缀、中缀和后缀), LSTM-负号用于为每个部分创建嵌入。它的工作原理如下:
- 对整个句子应用 LSTM,以获得句子中每个单词的隐藏状态
- 要为每个段(从单词 I 到单词 j)创建嵌入,请计算隐藏状态 I 和隐藏状态 j 之间的差异。这背后的想法是,给定自然 LSTM,每个隐藏状态包含来自先前隐藏状态加上当前单词的信息,这允许模型使用段外部和内部的信息来创建段嵌入
- 最终的主题表示是向前和向后片段嵌入的连接(上图中 C 的细节)
句子分类器
有了句子和文档编码器,我们现在有了句子表示、文档表示和主题段表示。这三种表示被输入到多层感知器(MLP)中,以预测该句子是否应该包括在摘要中。已经探索了结合这三种表示的两种方法:
- 串联。简单地将所有三个表示连接在一起,形成最终的表示
- 细心语境。这是我们计算每个句子的加权上下文向量的地方,允许模型学习在文档和主题段表示上关注多少权重。这个加权的上下文向量与相应的句子表示连接,并被馈送到具有 sigmoid 激活函数的 MLP 中,以确定该句子是否应该被包括在摘要中
实验设置和结果
有两个评估数据集:arXiv 和 PubMed。我们将使用 ROUGE 和 METEOR 作为自动评估指标,将我们的模型与之前的抽象和抽取模型进行比较。
模型比较
用于比较的模型分为不同的类别:
- 传统提取模式。SumBasic、LSA 和 LexRank
- 神经抽象模型。注意序列、指针生成器网络和话语意识
- 神经提取模型。程&拉帕塔和 SummaRuNNer
- 基线、销售线索和预测。基线仅是 MLP 的 feed 句子表示(没有本地或全局上下文),lead 是前 k 个单词,oracle 使用地面实况提取标签来测量模型性能的上限
结果


arXiv 和 Pubmed 数据集上模型的总体结果[1]
ROUGE-1 和 ROUGE-2 用于测量摘要的信息量,而 ROUGE-1 用于测量摘要的流畅性。表 2 展示了 ArXiv 数据集上的结果,表 3 展示了 PubMed 数据集上的结果。正如预期的那样,在 ROUGE-1 和 ROUGE-2 中,神经提取模型远远超过了传统提取模型和神经提取模型。ROUGE-L 上的结果是混合的,这可能是因为我们的模型是在 ROUGE-1 地面真实提取标签上训练的。话语感知抽象模型优于 ROUGE-L 中的所有提取模型,这可能是因为它们是直接在抽象摘要上训练的。低铅结果表明,科学论文中不存在像新闻文章中那样的句子位置偏差,尽管科学论文中可能存在其他位置偏差,这可能是未来的潜在工作。
我们的模型在所有评估指标上都优于所有其他提取模型。我们的模型相对于基线模型的性能提升证明了包含本地和全球背景的好处。我们方法的目标是有效地处理长文档的摘要。下图显示了随着文档长度的增加,我们的模型与当前的 SOTA 模型相比有了很好的性能提升。

Pubmed 和 arXiv 数据集上增加文档长度的模型结果[1]
消融研究
消融研究旨在研究将全球和本地背景纳入我们的总结方法的效果,并评估哪一个对整体绩效贡献更大。从下面的结果来看,似乎本地主题上下文极大地提高了模型的整体性能。相比之下,纳入全球背景似乎没有太大好处。这样做的原因留待今后的工作。

消融研究的结果[1]
结论和未来工作
未来潜在的工作将是研究处理冗余的方法。我们还可以将特征工程(例如句子位置、显著性)等传统方法集成到我们的神经模型中。此外,我们可以研究一种更好的表示文档的结构,如话语树。对总结的评价一直是总结中的一个大问题。ROUGE scores 并不像评估指标那样可靠,因此在未来引入人工评估将是一件好事。最后,提取和抽象总结方法的整合值得在未来探索。
[1]肖,w .和卡雷尼尼,g . 2019 .结合全局和局部上下文的长文档文摘。 arXiv 预印本 arXiv:1909.08089 。
原载于 2020 年 4 月 27 日 https://ryanong.co.uk。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61 AE 6 CDF 32 f
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
#NLP365 的第 119 天:NLP 论文摘要——科学出版物的论据注释文集

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 262 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 一个带论据注释的科学出版物语料库 。以下是研究论文的要点。
目标和贡献
使用论证组件和关系注释扩展了 Dr. Inventor 语料库,并进行了注释研究。这里的目标是理解科学文本中的不同论点,以及它们是如何联系在一起的。我们对带注释的论证进行了分析,并探索了存在于科学写作中的论证之间的关系。这些贡献如下:
- 为涵盖不同研究领域的科技文本提出了一个通用的议论文注释方案
- 具有论证组件和关系注释的扩展的 Dr. Inventor 语料库
- 对语料库进行了信息论分析
注释方案
有许多论证的理论框架,我们最初使用图尔敏模型,因为它简单并且与人工智能和论证挖掘相关。图尔敏模式有 6 种论证成分:主张、数据、保证、支持、限定和反驳。然而,在最初的注释之后,我们意识到并不是所有的组件都存在。因此,我们将注释方案简化为以下三个论证部分:
- 自己的主张。与作者作品相关的论证性陈述
- 背景权利要求。与作者作品相关的论述性陈述
- 数据组件。支持或反对某一主张的事实。这包括参考资料和带有例子的事实
有了这些论证成分集,我们引入了以下三种关系类型:
- 支撑。如果一个组件的实际准确性随着另一个组件的增加而增加,则这种关系在两个组件之间成立
- 与相矛盾。如果一个组件的实际准确性随着另一个组件而降低,则这种关系在两个组件之间成立
- 语义相同。这种关系捕获语义相同的声明或数据组件。这类似于自变量共指和/或事件共指
注释研究
我们对 Dr. Inventor 语料库进行了注释研究,并扩展了数据集。Dr. Inventor 语料库有四层带有子标签的修辞注释,如下所示:
- 话语角色
- 引用目的
- 主观方面
- 总结相关性

4 个不同的注释层[1]
注释过程由一名专家和三名非专家注释者组成。注释者在校准阶段接受培训,所有注释者一起注释一个出版物。我们为每次迭代计算注释者间的一致(IAA ),并讨论任何分歧。下图展示了跨 5 次迭代的 IAA 分数进展。有严格和软弱两个版本。严格版本要求实体在跨度和类型上完全匹配,关系在组件、方向和关系类型上完全匹配。弱版本要求类型匹配,范围重叠。协议(IAA)如预期的那样随着迭代而增加。此外,关系上的一致程度较低,因为这通常更加主观,更不用说关系上的一致会受到组件上的一致的影响。

注释者间协议(IAA) [1]
语料库分析
辩论注释分析
表 2 展示了在 Dr. Inventor 语料库中每个论证成分和关系的汇总统计。大约有。自有主张的数量是背景主张的 2 倍,这是意料之中的,因为语料库由原创研究论文组成。此外,数据组件只有索赔的一半多。这可能是因为并非所有索赔都得到支持,或者索赔可以得到其他索赔的支持。自然,有许多支持关系,因为作者倾向于通过用数据组件或其他声明来支持它来加强他们的声明。表 3 展示了论证部分的长度。自有和背景索赔的长度相似,而数据部分的长度是一半。这可以归因于这样一个事实,即在计算机科学中,解释往往是简短的,而且大多数情况下,作者只会参考表格和数字来支持。

发明家博士语料库统计[1]
科学论文的论证结构遵循有向无环图(DAG ),其中论证部分是节点,边是关系。下面的表 4 展示了科学论文论证结构的 DAG 的图形分析。有 27 件独立索赔和 39 件无证据的索赔。最大入度显示了节点之间的最大连接数。*均 6 个告诉我们,有许多索赔提供了强有力的支持证据。我们还运行了 PageRank 算法来识别最重要的声明,并在表 5 中列出了一些示例。结果显示,大多数排名最高的索赔来自背景索赔,告诉我们,在计算机图形学论文中,他们倾向于把更多的重点放在他们的工作动机的研究差距,而不是实证结果。


左图:基于图表的论证结构分析|右图:主张类型的示例以及与这些主张相关的句子[1]
与其他修辞方面的联系
我们的新论证组件与 Inventor 博士语料库中的现有注释有多好的联系?在下面的表 6 中,我们展示了归一化互信息(NMI ),它测量五个标注层之间的共享信息量。我们展示了所有注释对的 NMI 分数:
- 变元组件(AC)
- 话语角色
- 主观方面
- 相关概述
- 引用上下文(CC)

标准化互信息(NMI) [1]
AC 和 DR 之间有一个很强的 NMI 分数,这是有意义的,因为背景声明可能会在话语角色背景部分找到。另一个高 NMI 得分介于 AC 和 CC 之间。这是有意义的,因为在背景技术权利要求中经常引用引文。
结论和未来工作
我们创建了第一个带论证注释的科学论文语料库,并提供了语料库和论证分析的关键摘要统计数据。潜在的未来工作可能涉及扩展其他领域论文的语料库,并进一步开发分析科学写作的模型。
来源:
[1]劳舍尔,a .,格拉瓦什,g .和庞泽托,S.P .,2018 年 11 月。附有论证注释的科学出版物文集。在关于论点挖掘的第五次研讨会的会议录(第 40-46 页)。
原载于 2020 年 4 月 28 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sensation-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towardsdatascience . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61a E6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
#NLP365 的第 120 天:NLP 论文摘要——摘要重要性的简单理论模型

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 262 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 对于总结 重要性的简单理论模型。以下是研究论文的要点。
目标和贡献
提出了一个简单的理论模型来捕捉总结中的信息重要性。该模型捕捉冗余、相关性和信息量,这三者都有助于信息在总结中的重要性。我们展示了如何有人可以使用这个框架来指导和改善总结系统。这些贡献如下:
- 定义总结中的三个关键概念:冗余、相关性和信息量
- 使用总结中的三个关键概念来阐述重要性概念,以及如何解释结果
- 表明我们的理论模型对总结的重要性与人类总结有很好的相关性,使其对指导未来的实证工作有用
总体框架
语义单位被认为是一小段信息。(\omega)表示所有可能的语义单位。文本输入 X 被认为是由许多语义单元组成的,因此可以用概率分布(\mathbb{P}_X) over (\Omega)来表示。(\mathbb{P}_X)可以简单地指语义单位在整个文本中的频率分布。(\mathbb{P}_X(w_i))可以解释为语义单位(w_i)出现在文本 X 中的概率,也可以解释为(w_i)对文本 X 的整体意义的贡献。
裁员
摘要中呈现的信息量由熵来度量,如下所示:
(H(S)=-\ sum _ { w _ I } \ mathbb { P } _ S(w _ I)x log(\ mathbb { P } _ S(w _ I)))
熵测量覆盖水*,并且当摘要中的每个语义单元仅出现一次时,H(S)最大化,因此冗余公式如下:
(Red(S) = H_{max} — H(S))
关联
相关摘要应该与原文非常接*。换句话说,相关摘要应该具有最小的信息损失。为了测量相关性,我们需要使用交叉熵比较源文档(\mathbb{P}_D)和摘要(\mathbb{P}_S)的概率分布,如下所示:
(Rel(S,D) = — CE(S,D)= \ sum _ { w _ I } \ mathbb { P } _ S(w _ I)x log(\ mathbb { P } _ D(w _ I)))
该公式被视为在期望 D 源文档时产生 S 摘要的*均意外。具有低交叉熵(以及如此低的惊奇)的摘要 S 暗示关于原始文档是什么的低不确定性。只有当(\mathbb{P}_S)类似于(\mathbb{P}_D)时,才可能出现这种情况。
当使用源文档 D 生成摘要 s 时,KL 散度测量信息的损失。最小化 KL 散度的摘要最小化冗余并最大化相关性,因为它是最少偏差(最少冗余)的匹配 D 的摘要。KL 散度如下连接冗余和相关性:
(KL(S||D) = CE(S,D)-H(S))
(-KL(S | | D)= Rel(S,D)-Red(S))
信息量
信息含量介绍背景知识 K,以获取以前的知识用于总结。K 在所有语义单位上都用(\mathbb{P}_K)表示。概要 S 中的新信息量由概要和背景知识之间的交叉熵来度量,如下所示:
(Inf(S,K) = CE(S,K))
(Inf(S,K)=-\ sum _ { w _ I } \ mathbb { P } _ S(w _ I)x log(\ mathbb { P } _ K(w _ I)))
相关性的交叉熵应该较低,因为我们希望摘要与源文档尽可能相似和相关,而信息量的交叉熵应该较高,因为我们正在测量用于生成摘要的背景知识量。这种背景知识的引入允许我们根据我们想要包括的知识种类来定制模型,无论是特定领域的知识还是特定用户的知识还是一般知识。它还引入了更新汇总的概念。更新摘要包括对已经看过文档/摘要 U 的源文档 D 进行摘要。文档/摘要 U 可以由背景知识 K 建模,这使得 U 成为先前的知识。
重要
重要性是指导摘要中应包含哪些信息的指标。给定一个具有知识 K 的用户,生成摘要的目的应该是给用户带来最新的信息。因此,对于每个语义单元,我们需要一个函数(f(d_i,k_i))取源文档 D 中语义单元的概率((d_i = \mathbb{P}_D(w_i)))和背景知识((k_i = \mathbb{P}_K(w_i)),来确定其重要性。函数(f(d_i,k_i))有四个要求:
- 信息量。如果两个语义单元在源文档中同等重要,我们会选择信息量更大的一个,这是由背景知识决定的
- 关联。如果两个语义单元的信息量相同,那么我们更喜欢源文档中更重要的语义单元
- 可加性。这是一个一致性约束,允许添加信息度量
- 正常化。为了确保函数是有效的分布
汇总评分功能
(\mathbb{P}{(\frac{D}{K})})编码语义单位的相对重要性,即相关性和信息量之间的权衡。这种分布将捕获的一个例子是,如果语义单元在源文档中是重要的,但是在背景知识中是未知的,那么对于该语义单元来说(\mathbb{P})})非常高,因为它非常希望被包括在摘要中,因为它增加了知识差距。下图对此进行了说明。该摘要应该是无冗余的和最佳的*似(\mathbb{P}_{(\frac{D}{K})}),如下所示:
(S * = arg max \ theta _ I = arg min KL(S | | \ math bb { P } _ {(\ frac { D } { K })})(\ theta _ I(S,D,K)=-KL(\ math bb { S } | | \ math bb { P } _ {(\ frac { D } { K })}))

来源、背景知识和目标分布之间的分布细分[1]
可总结性
我们可以使用(\mathbb{P}_{(\frac{D}{K})})来衡量可以从分布中提取多少好的摘要,如下所示:
(H _ { \ frac { D } { K } } = H(\ mathbb { P } _ {(\ frac { D } { K })}))
如果(H_{\frac{D}{K}})很高,那么可以从分布中生成许多类似的好摘要。反之,如果低了,好的总结就少了。就汇总评分函数而言,另一种表达方式如下:
(\theta_I(S,D,K) = -Red(S) + \alpha Rel(S,D) + \beta Inf(S,K))
最大化(\theta_I)相当于最大化相关性和信息量,同时最小化冗余,这正是我们在高质量摘要中想要的。(\alpha)表示相关性分量的强度,而(\beta)表示信息性分量的强度。这意味着 H(S),CE(S,D)和 CE(S,K)是影响重要性概念的三个独立因素。
潜在信息
到目前为止,我们已经使用相关性将摘要 S 与源文档 D 连接起来,使用信息性将摘要 S 与背景知识 K 连接起来。但是,我们也可以将源文档 D 与背景知识 k 联系起来。如果源文档 D 与背景知识 k 有很大不同,我们可以从源文档 D 中提取大量新信息。除了在源文档 D 和背景知识 k 之间,其计算与信息量相同。这个新的交叉熵表示在给定背景知识 k 的情况下从源文档 D 中可能获得的最大信息增益。
实验
我们使用了两个评估数据集:TAC-2008 和 TAC-2009。数据集集中在两个不同的摘要任务上:多文档的普通摘要和更新摘要。背景知识 K、(\alpha)和(\beta)是我们用于总结的理论模型的参数。我们将(\alpha = \beta = 1)和背景知识 K 设置为背景文档中单词的频率分布或来自源文档的所有单词的概率分布。
与人类判断的相关性
我们评估我们的数量与人类判断的相关性。我们的框架中的每一个量都可以用来对句子进行总结评分,因此我们可以评估它们与人类判断的相关性。结果展示如下。在这三个量中,相关性似乎与人类的判断有最高的相关性。背景知识的包含与预期的更新总结一起工作得更好。最后,(\theta_I)在两种类型的汇总中都给出了最好的性能。单个数量本身并没有很强的表现,但一旦将它们放在一起,就给了我们一个可靠的很强的汇总得分功能。

肯德尔的陶对一般和更新总结[1]的相关性进行了衡量
与参考摘要的比较
理想情况下,我们希望生成的摘要(使用(\mathbb{P}_{(\frac{D}{K})}))与人类参考摘要((\mathbb{P}_R))相似。我们使用(\theta_I)对这两个摘要进行了评分,发现人类参考摘要的评分明显高于我们生成的摘要,证明了我们评分函数的可靠性。
结论和未来工作
当进行总结时,重要性统一了冗余、相关性和信息量这三个常见的度量标准,并告诉我们在最终的总结中应该丢弃或包含哪些信息。背景知识和语义单位的选择是理论模型的开放参数,这意味着它们对实验/探索是开放的。n-gram 是语义单元的很好的*似,但是我们在这里可以考虑什么其他粒度呢?
背景知识的潜在未来工作可能是使用该框架从数据中学习知识。具体来说,您可以训练一个模型来学习背景知识,以便该模型与人类的判断具有最高的相关性。如果您汇总所有用户和主题的所有信息,您可以找到通用的背景知识。如果您聚合所有用户,但在一个特定的主题中,您可以找到特定主题的背景知识,并且可以为单个用户完成类似的工作。
来源:
[1] Peyrard,m .,2018。一个简单的理论模型对总结的重要性。 arXiv 预印本 arXiv:1801.08991 。
原载于 2020 年 4 月 29 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61 AE 6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
#NLP365 的第 121 天:NLP 论文摘要——抽象摘要的概念指针网络

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 262 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 概念指针网络,用于抽象概括 n .以下是研究论文的要点。
目标和贡献
提出了用于抽象概括的概念指针网络,它使用基于知识和上下文感知的概念化来导出一组候选概念。然后,当生成抽象摘要时,模型将在概念集和原始源文本之间进行选择。对生成的摘要进行自动和人工评估。
提出的概念指针网络不只是简单地从源文档中复制文本,它还会从人类知识中生成新的抽象概念,如下所示:

指针网络框架概念[1]
在我们新颖的模型架构之上,我们还提出了一种远程监督学习技术,以允许我们的模型适应不同的数据集。自动和人工评估都显示出相对于 SOTA 基线的显著改进。
提议的模式
我们的模型架构由两个模块组成:
- 编码器-解码器
- 概念指针生成器

概念指针生成器的体系结构[1]
编码器-解码器
编解码框架由两层双向 LSTM-RNN 编码器和一层带注意机制的 LSTM-RNN 解码器组成。输入序列中的每个单词都由向前和向后隐藏状态的串联来表示。通过对隐藏状态表示应用注意机制来计算上下文向量。这个上下文向量被馈送到我们的解码器,在那里它将使用上下文向量来确定从我们的词汇分布生成新单词(p_gen)的概率。
概念指针生成器
首先,我们使用微软概念图将一个单词映射到它的相关概念。这个知识库覆盖了一个巨大的概念空间,概念和实体之间的关系是概率性的,这取决于它们的相关程度。本质上,概念图将接受这个单词,并估计这个单词属于一个特定概念 p(c|x)的概率。对于概率,这意味着给定每个单词,概念图将有一组它认为该单词所属的候选概念(具有不同的置信度)。为了让我们的模型选择正确的候选概念,例如,区分单词“apple”的水果和公司概念,我们将使用编码器-解码器框架中的上下文向量。
我们将使用上下文向量来更新概念分布。我们通过将当前隐藏状态、上下文向量和当前候选概念馈送到 softmax 分类器中来计算更新的权重。然后,这个更新的权重被添加到现有的概念概率中,以考虑输入序列的上下文,从而允许我们导出上下文感知的概念概率。
我们的概念指针网络由指向源文档的普通指针和指向给定源文档的相关概念的概念指针组成。概念指针通过注意力分布按元素进行缩放,并被添加到普通指针(注意力分布)。这将是模型复制的复制分布,它包括在原始源文档上的普通文本分布之上的概念分布。
模型适应的远程监控
如果我们的训练集的摘要-文档对不同于测试集,我们的模型将表现不佳。为了应对这种情况,我们需要重新训练我们的模型,以降低最终损失中的这种差异。为此,我们需要标签来表明我们的训练集与测试集有多接*。为了创建这些标签,我们使用每个训练参考概要和来自测试集的一组文档之间的 KL 散度。换句话说,训练对是远距离标记的。参考文献摘要和文档的表示都是通过对组成单词嵌入求和来计算的。这个 KL 散度损失函数包含在训练过程中,并且它测量测试集和我们的每个参考摘要-文档对之间的总距离。这允许我们确定我们的训练集对于模型适应是相关还是不相关。
实验设置和结果
有两个评估数据集:千兆字和 DUC-2004。评估指标是 ROUGE 分数。
模型比较
有 8 种基线模型:
- ABS+ 。抽象概括模型
- 卢昂-NMT 。LSTM 编码器-解码器
- 拉斯-埃尔曼。CNN 关注编码器,RNN 关注解码器
- Seq2seq+att 。BiLSTM 编码器和带注意力解码器的 LSTM
- Lvt5k-lsent 。利用对解码器的时间关注来减少摘要中的重复
- 季节。使用选择门来控制从编码器到解码器的信息流
- 指针生成器。正常 PG
- CGU 。使用卷积门控单元和自我关注进行编码
结果

表 Concept Pointer 和其他基准模型之间的 ROUGE 结果和比较。表 2——词汇外问题分析。表 3 —抽象性的度量[1]
在表 1 中,我们的概念指针在所有指标上都优于所有基线模型,除了在 Gigaword 上的 RG-2(CGU 得分最高)。在表 2 中,我们显示由概念指针生成的摘要具有最低的 UNK 词百分比,缓解了 OOV 问题。在表 3 中,我们展示了我们生成的摘要的抽象性。我们证明了由我们的概念指针生成的摘要具有相对较高的抽象级别,并且接*于引用摘要级别。
我们试验了两种不同的培训策略:强化学习(RL)和远程监督(DS)。应用于概念指针的两种训练策略都优于普通概念指针。此外,在 DUC-2004 数据集,概念指针+ DS 持续优于概念指针+ RL,展示了远程监督对更好的模型适应的影响。
上下文感知概念化
我们想衡量概念更新策略的影响,所以我们对不同数量的候选概念进行了实验。结果如下所示。在不同数量概念候选者之间,ROUGE 分数只有很小的变化。

ROUGE 在 Gigaword 和 DUC 2004 数据集上的结果[1]
人工评估
我们进行了人体评估,每位志愿者都必须回答以下问题:
- 抽象 —摘要中的抽象概念有多贴切?
- 总体质量 —摘要的可读性、相关性和信息量如何?
我们随机选择了 20 个例子,每个例子都有三个不同的摘要(来自三个模型),并对每种类型的摘要被选中的频率进行评分。结果如下所示,显示了指针网络的概念优于 seq2seq 模型和指针生成器。生成的摘要看起来流畅且信息丰富,然而,它仍然不像人类参考摘要那样抽象。

人对抽象和整体质量的评价[1]
结论和未来工作
在我们新颖的模型架构之上,我们还提出了一种远程监督学习技术,以允许我们的模型适应不同的数据集。自动和人工评估都显示出相对于 SOTA 基线的显著改进。
来源:
[1]王,王伟,高,黄海燕,周,2019,11 月.用于抽象摘要的概念指针网络。在2019 自然语言处理经验方法会议暨第九届国际自然语言处理联合会议(EMNLP-IJCNLP) 论文集(第 3067–3076 页)。
原载于 2020 年 4 月 30 日 https://ryanong.co.uk**。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35 B7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61a E6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
#NLP365 的第 122 天:NLP 论文摘要——将 BERT 应用于 Birch 的文献检索

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 262 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 用 Birch 将 BERT 应用于文档检索。以下是研究论文的要点。
目标和贡献
Birch,一个使用 BERT 进行文档检索的建议系统。它与 Anserini 信息检索工具包集成,为大型文档集带来完整的端到端文档检索。
文档检索是给定一个大的文档集合,系统应该根据用户的查询返回一组排序的文档。Lucene(以及 Solr 和 Elasticsearch)是业界构建搜索引擎的主要*台。然而,当涉及到连接 NLP 和 IR 时,存在一个技术挑战,Lucene 是用 Java 实现的,然而,大多数深度学习技术是用 Python 和 C++后端实现的。
桦树

桦树的建筑[1]
Birch 的建筑由两个阶段组成:
- 使用 Anserini 进行检索
- 使用基于 BERT 的模型进行重新排序
Python 是代码入口点,它使用 Pyjnuis 库访问 Java 类与 Anserini 集成。总的来说,Python 是主要的开发语言,连接到 Java 虚拟机(JVM)后端进行检索。
我们针对文本的相关性分类对 BERT 进行了微调。给定文档 D 和查询 Q,我们将它们连接成以下文本序列:[CLS] + Q + [SEP] + D + [SEP]。对于每个小批量,我们将序列填充到 N 个令牌,其中 N 是批量中的最大长度令牌。像往常一样,[CLS]令牌被输入到一个单层神经网络中。一个问题是,BERT 不是为长文档推理而设计的,所以我们决定在每个文档的句子级别进行推理,并聚合句子级别的推理来对文档进行排序。先前的工作发现,文档中的最佳得分句子提供了文档相关性的良好代理。
检索结果
有两个评估数据集:TREC 2011-2014 微博轨迹和 TREC 2004 健壮轨迹。对于微博轨迹,Birch 应用于一组推文。使用查询可能性和 RM3 相关反馈来检索初始候选集(大约 100 个),使用 BERT 来推断整个候选文档(因为它很短,BERT 可以覆盖整个文档,而不是句子级的聚合)。结果如下所示。检索的两个常见评估指标是*均精度(AP)和排名 30 的精度(P@30)。如图所示,Birch 在基线和高级神经模型的基础上每年都有很大的进步。

结果在 TREC 微博上追踪报道[1]
健壮跟踪器由用于文档检索任务的新闻专线文章组成。这个数据集的另一个挑战是没有足够的数据来微调我们的 BERT 模型,因为相关性标签是在文档级别。先前工作的令人惊讶的发现是,尽管两个数据集在不同的领域,但用微博轨迹微调的 BERT 模型在新闻专线文章排名方面工作得很好。BERT 能够学习在不同领域的句子级别上建立相关性模型,这已被证明对新闻专线文章的排名是有用的。对于稳健的跟踪,我们用 MARCO 女士和微博数据对 BERT 进行了微调,结果如下所示。我们将 BERT 的分数与文档分数(BM25 + RM3)结合起来。1-3 指的是将前 1-3 个句子的得分相加。总的来说,结果表明我们可以通过预测句子级别的相关性来准确地对文档进行排序。

Robust04 的结果[1]
结论和未来工作
通过句子级推理和分数聚合,该系统架构使用 BERT 对文档进行排序。我们已经成功地将 PyTorch 与 Java 虚拟机后端集成在一起,允许研究人员在他们熟悉的环境中进行代码开发。
来源:
[1],张志安,王,杨,张,林,2019 年 11 月.BERT 在 birch 文献检索中的应用。在2019 自然语言处理经验方法会议暨第九届国际自然语言处理联合会议(EMNLP-IJCNLP)论文集:系统演示(第 19–24 页)。
原载于 2020 年 5 月 1 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towards data science . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61a E6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
#NLP365 的第 123 天:NLP 论文摘要——用于基于方面的目标情感分析的上下文感知嵌入

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 262 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 针对有针对性的基于方面的情感分析的上下文感知嵌入 。以下是研究论文的要点。
目标和贡献
提出了上下文感知嵌入,使用高度相关的词来改进目标和方面的嵌入。大量先前的工作使用上下文无关向量来构造目标和方面嵌入,这导致语义信息的丢失,并且未能捕捉特定目标、其方面和其上下文之间的相互联系。这种方法导致了基于方面的目标情感分析(TABSA)的 SOTA 结果。TABSA 的目标是给定一个输入句子,我们想要提取属于目标的方面的情感。下图展示了 TABSA 任务:

这些贡献如下:
- 通过使用稀疏系数向量来识别与目标高度相关的单词并相应地改进目标嵌入,来为目标构建上下文感知嵌入
- 微调方面嵌入以尽可能接*高度相关的目标嵌入
- 在 SentiHood 和 SemEval 2015 上取得 SOTA 成果
方法学

上下文感知嵌入的架构[1]
模型框架具有以下步骤:
- 句子嵌入矩阵 X 被馈入全连接层和阶跃函数以创建稀疏系数向量 u’。
- u '的隐藏输出用于细化目标和方面嵌入
- 计算*方欧几里德函数并训练模型以最小化距离,从而获得目标和方面的最终精确嵌入
目标表示
可以通过将句子单词嵌入 X 乘以稀疏系数向量 u’来计算精确的目标嵌入。稀疏系数向量使用阶跃函数展示了上下文中不同单词的重要性。对于每个目标,我们通过迭代最小化目标和句子中高度相关单词之间的*方欧几里德距离来计算上下文感知目标嵌入。
方面表示
我们通过使用高度相关词的稀疏系数向量来细化方面嵌入。这背后的论点是,方面词通常包含重要的信息,上下文信息通常与方面有很高的联系。同样,对于每个方面,我们通过最小化方面嵌入、上下文感知目标嵌入和不相关嵌入之间的*方欧几里德距离来计算上下文感知方面嵌入。这将微调我们的方面嵌入,使其更接*高度相关的目标嵌入,并远离不相关的嵌入。
实验和结果
有两个评估数据集:SentiHood 和 SemEval 2015 Task 12。
模型比较
- LSTM-决赛。只使用最终隐藏状态的 BiLSTM
- LSTM-洛克。使用位置目标所在的隐藏状态的 BiLSTM
- SenticLSTM 。使用外部知识的 BiLSTM
- 延迟记忆。延迟记忆机制
- RE+SenticLSTM 。我们的精致嵌入+ SenticLSTM
- RE+延时记忆。我们的精细嵌入+延迟记忆
结果

关于 SentiHood 和 Semeval 2015 的结果[1]
对于情感,我们提出的方法在 SenticLSTM 和延迟记忆的基础上,在方面检测和情感分类方面都取得了比原始模型更好的性能。我们的上下文感知嵌入允许模型更好地捕捉方面和情感信息,因为我们能够更好地对目标、其方面和上下文之间的互连进行建模。对于 SemEval 2015,我们展示了类似的结果,我们提出的方法优于原始模型。下图显示了我们提出的上下文感知嵌入与使用 TSNE 的原始方面嵌入的对比。如图所示,使用我们的上下文感知嵌入,不同方面之间有更多的分离,展示了它在上下文中区分不同方面的能力以及捕捉特定方面的共同特征的能力。

通过不同的基于嵌入的模型学习的中间嵌入[1]
结论和未来工作
通过选择和使用高度相关的词来提炼目标和方面嵌入,我们能够提取特定目标、其方面和其上下文之间的联系,以生成更好的有意义的嵌入。未来的工作包括为其他类似的 NLP 任务探索这种方法。
来源:
[1]梁,b,杜,j,徐,r,李,b,黄,h,2019 .面向基于方面的情感分析的上下文感知嵌入。 arXiv 预印本 arXiv:1906.06945 。
原载于 2020 年 5 月 2 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towards data science . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61 AE 6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
第 124 天:NLP 论文摘要——TLDR:科学文献的极端摘要

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 270 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 TLDR:科学文献的极端摘要 。以下是研究论文的要点。
目标和贡献
介绍了 TLDR 生成任务和 SCITLDR,这是一个新的极端摘要数据集,研究人员可以使用它来训练模型,为科学论文生成 TLDR。引入注释协议,使用同行评审意见创建不同的基本事实摘要,允许我们扩展数据集,并且第一次有多个摘要链接到单个源文档。最后,我们提出了一个基于 TLDR 和标题生成的多任务训练策略来适应我们的预训练语言模型 BART。这已经显示出优于提取和抽象基线。
TLDR 生成任务介绍
TLDR 生成任务旨在生成忽略背景或方法细节的 tldr,并更加关注关键方面,如论文的贡献。这要求模型具有背景知识以及理解特定领域语言的能力。下图展示了 TLDR 任务的一个示例,以及出现在 TLDR 的信息类别列表。


TLDR 极限汇总任务简介[1]
SCITLDR 数据集
SCITLDR 在计算机科学科学文献中有 3935 个 TLDR。SCITLDR 包括论文原作者和同行评议撰写的 TLDR。然而,这里的关键区别在于,作者和同行评审是基于评审者的评论而不是原始研究论文来撰写 TLDR 的。这种方法假设读者有很好的背景知识来了解一般的研究领域,所以我们的 TLDRs 可以省略常见的概念。此外,审稿人的评论是由该领域的专家撰写的,因此它们是高质量的摘要。下图展示了注释过程的一个例子。

SCITLDR 数据集的注释过程[1]
SCITLDR 的独特性之一是,测试集中的每篇论文都映射到多个基础事实 TLDR,一个由原作者编写,其余由同行评审。这将 a)允许我们更好地评估我们生成的摘要,因为现在有多个基本事实摘要来计算 ROUGE 分数,b)拥有作者和读者的 TLDR 允许我们基于读者的视角捕捉摘要中的变化。
数据集分析
首先,SCITLDR 是一个小得多的数据集,由于手动数据收集和注释,只有 3.2K 的论文。其次,与其他数据集相比,SCITLDR 具有极高的压缩比。*均文档长度是 5009,它被压缩成 19 的*均摘要长度。这使得总结非常具有挑战性。表 3 展示了这些汇总统计数据。SCITLDR 对于测试集中的每篇论文至少有两个基础事实 TLDR,因此我们研究不同基础事实 tldr 之间的 ROUGE 分数差异。作者生成的 tldr 和 PR 生成的 tldr 之间存在较低的 ROUGEE-1 重叠(27.40)。作者生成的 TLDRs 的 ROUGE-1 为 34.1,标题为论文。PR 生成的 TLDRs 只有 24.7 的 ROUGE-1。这展示了多个基础事实 TLDRs 在总结中的重要性,因为一个源文件可能有多个相关的总结。


左:数据集比较|右:摘要的新颖程度[1]
实验设置和结果
模特培训
我们微调了巴特模型来生成 TLDR。但是,限制很少。首先,我们训练数据的大小。我们有一个小数据集来训练神经网络。这使我们从 arXiv 收集了额外的 20K 论文标题对,并对我们的 SCITLDR 进行了采样,以匹配新的卷。我们收集标题的原因是因为它通常包含关于论文的重要信息,我们相信如果我们训练模型也执行标题生成,它将学习如何从论文中选择重要信息。有了新的信息,我们就可以训练我们的模型了。首先,我们在 XSUM 数据集上训练 BART-large 模型,这是一个通用新闻领域的极端概括数据集。然后,我们将在 SCITLDR 和 title 数据集上微调我们的 BART 模型。
我们面临的第二个限制是,BART 对输入长度有限制,因此我们将 BART 放在两个设置下:BART_abstract (SCITLDR_Abst)和 BART _ abstract _ intro _ 结论(SCITLDR_AIC)。这些是用于生成标题/TLDR 的不同输入。现有的研究表明,研究论文中最重要的信息是摘要、引言和结论。
模型比较
- 提取模型。PACSUM(text rank 的非监督扩展)和 BERTSUMEXT(监督扩展)
- 抽象模型。BART 的不同变体
我们使用 ROUGE 指标进行评估。我们将计算每个地面实况 TLDRs 的胭脂分数,并选择最大值。
结果

SCITLDR 的总体结果,包括 AIC 和 Abst 版本[1]

提取摘要的上限[1]
提取预言提供了一个上限性能。在表 6 中,我们可以看到随着输入空间的增加,ROUGE 得分不断增加。具体来说,当包括介绍和结论作为输入时,有 5 个 ROUGE 分数的提高,展示了它们在生成有用的摘要中的重要性。虽然从《AIC》到《全文》的胭脂评分有所提高,但提高幅度并不大,说明论文其他部分的附加值没有《AIC》高。
在表 5 中,我们可以看到 BART 在原始 SCITLDR 上的微调足以胜过其他提取和抽象基线。在 XSUM 上预训练 BART 时显示了进一步的改进,但是,这种改进只适用于 SCITLDR_AIC。我们的多任务学习策略已经超越了所有基线模型,并在 BART + XSUM 的基础上实现了进一步的改进。这展示了为标题和 TLDR 一代培训模型的附加值。下图展示了由不同模型生成的摘要的定性示例。

BART tldr 的定性示例[1]
结论和未来工作
潜在的未来工作可以利用整篇论文的信息,捕捉更多的背景。此外,我们可以明确地对读者的背景知识建模,根据读者是谁来创建 TLDRs。最后,我们可以将我们的注释过程应用于其他数据集,并将任何同行评审意见转换为 TLDRs 摘要。
来源:
[1]卡舒拉,I .,罗,k .,科汉,a .和韦尔德,D.S .,2020 年。TLDR:科学文献的极端摘要。 arXiv 预印本 arXiv:2004.15011 。
原载于 2020 年 5 月 3 日 https://ryanong.co.uk**。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
- https://towards data science . com/day-123-of-NLP 365-NLP-papers-summary-context-aware-embedding-for-targeted-aspect-based-be9f 998d 1131
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61 AE 6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
#NLP365 的第 125 天:NLP 论文摘要— A2N:关注知识图推理的邻居

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 270 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 A2N:参加邻居进行知识图推理 。以下是研究论文的要点。
目标和贡献
提出了一种新的基于注意力的方法 A2N 来处理知识图(KG)完成任务,该方法结合实体的相关图邻域来计算依赖于查询的实体嵌入。所提出的方法在两个评估数据集上表现出竞争性或优于当前的 SOTA 模型,并且通过定性探测,我们能够探索模型如何围绕知识图跳跃以导出其最终推理。
KG 完成任务
KG 完成的任务包括从 KG 中填充和推断缺失的实体关系。这通常被公式化为目标实体预测任务,由此给定源实体和关系,目标实体是什么?因此,给定一个 KG,它由(s,r,t)的许多元组组成,其中 s 是源实体,r 是关系,t 是目标实体,我们的目标是在给定 s 和 r 的情况下预测目标实体,使得预测的元组在图中不存在。
大多数基于嵌入的 KG 完成方法涉及为 KG 中的每个元组定义一个评分函数。评分函数可以不同,但它接受源实体、关系和目标实体的嵌入。在本文中,我们使用 DistMult 评分函数。
A2N 模型
我们提出的 A2N 接受查询,并使用对实体的图邻域的双线性关注来生成依赖于查询的实体嵌入。这种特殊的嵌入随后被用于为查询的目标实体评分。下图展示了在给定两个不同查询的情况下,模型如何对同一节点的相邻节点进行不同评分的示例。

A2N 模型如何生成答案[1]
以下是 A2N 中每个步骤的分解:
- 每个图形实体有一个初始嵌入(\tilde{e}⁰\,每个关系 r 有一个嵌入
- 给定实体和关系的嵌入,我们现在可以将相邻的实体和关系编码到嵌入中。实体 s 的邻居((\tilde{n}_i))的嵌入通过 a)连接初始实体嵌入和关系嵌入以及 b)对其应用线性变换来计算
- 该模型使用评分函数计算每个相邻嵌入的关注度得分(a_i ),并将其归一化以获得概率(p_i)
- 步骤 3 给出了每个相邻嵌入在回答查询时的相关程度的概率。我们聚集这些加权的相邻嵌入来生成实体 s 的查询相关嵌入,(\hat{s})
- 最后,我们将依赖于查询的嵌入与初始的源嵌入连接起来,以创建最终的源嵌入(\tilde{s})
现在我们已经获得了最终的源嵌入,我们可以使用最终的源嵌入、关系嵌入和评分函数来对 KG 中所有可能的目标实体进行评分。这将为我们提供特定查询的潜在实体的排序列表。
实验设置和结果
有两个 KG 完井评价数据集:FB15k-237 和 WN18RR。评估度量是正确实体的*均倒数排名(MRR)和 Hits@N,Hits @ N 衡量前 N 个预测的准确性。
结果

FB15k-237 和 WN18RR 数据集的总体结果[1]
对于仅针对目标的预测(表 1),我们的 A2N 模型在两个数据集的所有评估指标上都显著优于之前的 SOTA 性能。对于源和目标预测(表 2),我们得到了混合的结果。除了 Hits@10,A2N 模型在所有指标上都优于 WN18RR 数据集中的所有模型。然而,在 FB15k-237 数据集上,我们的模型表现不如 ConvE,然而,它仍然实现了接* SOTA 的竞争性能。
如上图所示,该模型能够根据查询加入同一实体的不同相邻节点,并执行多跳推理。例如,使用相邻的“places _ lived”,实体被映射到相关的嵌入子空间中,并且使用评分函数和关系“nationality”,我们能够为目标实体 US 获得高分,这是我们的模型的最终预测。给定这个例子,我们有一个两跳推理,首先是关于居住的地方,然后是关于这些地方的国家。更多示例见下图。

查询和顶级预测的示例[1]
结论和未来工作
所提出的 A2N 模型是可解释的,并且其大小不依赖于实体邻域的数量。潜在的未来工作可能涉及应用这些方法来关注除了图之外的实体的文本提及,以联合推理文本和知识图。
来源:
[1]班萨尔,t .,胡安,D.C .,拉维,s .和麦卡勒姆,a .,2019 年 7 月。A2N:关注邻居进行知识图推理。在计算语言学协会第 57 届年会的会议录(第 4387–4392 页)。
原载于 2020 年 5 月 4 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
- https://towardsdatascience . com/day-123-of-NLP 365-NLP-papers-summary-context-aware-embedding-for-targeted-aspect-based-be9f 998d 1131
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61a E6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-CD 55 e 577 f 6 de
- https://towards data science . com/day-124-NLP-papers-summary-tldr-extreme-summary-of-scientific-documents-106 CD 915 F9 a 3
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
#NLP365 的第 126 天:NLP 论文摘要-具有话题感知新闻表示的神经新闻推荐

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 273 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 带话题感知新闻表示的神经新闻推荐 。以下是研究论文的要点。
目标和贡献
提出了 TANR,一个具有话题感知新闻嵌入的神经新闻推荐系统。这包括一个主题感知新闻编码器和一个用户编码器。新闻编码器使用 CNN 网络和注意力机制来选择使用新闻标题的重要单词。我们联合训练新闻编码器和辅助主题分类任务。对于用户编码器,我们通过用户阅读过的历史新闻来学习表征,并使用注意机制为用户选择信息丰富的新闻。实验结果表明,该方法提高了新闻推荐的性能。
方法学
模型架构

整体模型架构[1]
模型架构由三个主要模块组成:
- 新闻编码器
- 用户编码器
- 点击预测器
新闻编码器的目标是从标题中学习新闻表示。有三层。第一层是单词嵌入层,它将标题的单词转换成单词嵌入。第二层是 CNN 层,它接收单词嵌入,并通过捕获本地上下文信息输出上下文单词嵌入。最后一层是关注层,让模型关注标题中更重要的词。这一层生成最终的新闻表示,它是所有上下文单词嵌入的加权和。
用户编码器的目标是从历史浏览新闻中学习用户的表现。这个想法是,历史浏览新闻允许我们捕捉关于特定用户的不同信息/偏好。我们使用新闻编码器对所有浏览过的历史新闻进行编码,获得新闻表示。用户编码器接收这些新闻表示,并对其应用关注机制,以选择给我们提供关于用户的更好信息的关键新闻。最终的用户表征是所有用户历史浏览新闻表征的加权和。
点击预测器的目标是预测用户点击候选新闻的概率。点击预测器采用候选新闻表示和用户表示,并通过采用两个表示之间的内积来计算点击概率分数。
话题感知新闻编码器
新闻文章的主题对于新闻推荐很重要,因此包含主题信息将改善新闻和用户的表现。然而,我们有有限的主题信息,所以我们决定联合训练我们的新闻编码器与新闻主题分类模型,如下所示。这给了我们一个话题感知新闻编码器。新闻主题分类模型由新闻编码器和主题预测器模块组成。新闻编码器与新闻推荐模型共享,主题预测器模块用于根据新闻表示预测主题分布(使用 softmax)。使用共享的新闻编码器,新闻编码器将对主题信息进行编码,并由新闻推荐模型使用。联合训练新闻推荐和主题分类任务意味着我们有两个损失要优化。总损失是这两个损失的总和。

话题感知新闻编码器的总体框架[1]
实验设置和结果
真实世界的数据集是一个月的 MSN 新闻。数据集和主题分布的统计如下所示。评估指标为 AUC、MRR、nDCG@5 和 nDCG@10。

我们数据集的描述性统计[1]
模型比较
- LibFM 。用于推荐的矩阵分解技术
- DSSM 。使用历史浏览新闻作为查询来检索候选新闻
- 宽&深。宽线性通道+深度神经网络
- DeepFM 。使用不同的分解机器和神经网络
- DFM 。组合不同等级密集层并使用注意机制
- DKN 。使用知识图中的实体信息
- TANR-基本。没有话题感知新闻编码器的 TANR
结果

使用不同评估指标的总体结果[1]
神经网络模型比传统的矩阵分解技术更好,因为神经网络可以学习更好的新闻和用户表示。TANR 基础和 TANR 都超过了所有的基线模型。TANR 的表现一直优于 TANR-basic,展示了整合新闻主题进行新闻推荐的好处,以及我们联合训练模型的策略的有效性。
就我们的主题分类器的性能而言,F1 结果如下所示。不同主题的分类都很好,除了“孩子”类。这可能是因为“孩子”类的训练数据有限。总的来说,结果表明我们的新闻编码器已经编码了主题信息,这改进了我们的新闻推荐模型的结果。

话题分析和不同注意网络的有效性[1]
在图 6 中,我们展示了使用不同注意力网络的结果。结果表明,新闻级和单词级注意都是有用的,因为它们都优于无注意网络的基线。这又回到了一个假设,即不同的新闻包含关于用户的不同信息,不同的词在表示新闻时具有不同的重要性,我们的注意力网络允许我们挑选最有信息量的新闻和重要的词。结合这两种注意力网络会产生更高的结果。
最后,我们研究了超参数λ的影响。该超参数控制主题分类任务的相对重要性,因为它决定了模型在多大程度上关注主题分类损失函数的优化。下面显示的结果告诉我们,如果 lambda 太低,我们的模型的性能不是最佳的,因为新闻编码器没有学习到足够的主题信息。如果 lambda 太高,模型会过于关注主题分类任务,而忽略了新闻推荐任务。最佳λ似乎是 0.2。

λ超参数的影响[1]
来源:
[1]吴,c,吴,f,安,m,黄,y,谢,x,2019,7 月。具有话题感知新闻表示的神经新闻推荐。在计算语言学协会第 57 届年会的会议录(第 1154-1159 页)。
原载于 2020 年 5 月 5 日【https://ryanong.co.uk】。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sensation-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towardsdatascience . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
- https://towards data science . com/day-123-of-NLP 365-NLP-papers-summary-context-aware-embedding-for-targeted-aspect-based-be9f 998d 1131
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61 AE 6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
- https://towards data science . com/day-124-NLP-papers-summary-tldr-extreme-summary-of-scientific-documents-106 CD 915 F9 a 3
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
- https://towards data science . com/day-125-of-NLP 365-NLP-papers-summary-a2n-attending-to-neighbors-for-knowledge-graph-inference-87305 C3 aebe 2
#NLP365 的第 140 天:NLP 论文摘要——自动 ICD 编码的多模态机器学习

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 273 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 自动 ICD 编码的多模态机器学习 。以下是研究论文的要点。
目标和贡献
提出了一种新的预测 ICD-10 编码的多模态机器学习模型。这个模型是一个集合模型,它结合了三种不同的 ML 模型,这三种模型是为处理三种不同的数据类型而开发的:非结构化、半结构化和结构化数据。我们的模型优于所有的基线模型,并且具有离医生不远的高解释水*。
临床 ICD 景观
ICD 是诊断和程序代码的医学分类列表。这些代码广泛用于诊断信息的报销、存储和检索。分配 ICD 代码的过程非常耗时,因为临床编码员需要从电子病历(EMR)中提取关键信息并分配正确的代码。编码错误很常见,而且代价高昂。EMR 通常以三种不同的形式存储数据:
- 非结构化文本。护理记录、实验室报告、测试报告和出院总结
- 半结构化文本。描述医生所写诊断的结构化短语列表
- 结构化表格数据。包含处方和临床测量,如数值测试结果
资料组
评估数据集是重症监护 III (MIMIC-III)的医疗信息集市。总共有 44,659 人被录取。诊断代码从原来的 ICD-9 映射到 ICD-10(一对一)。该数据集涵盖了 32 个 ICD 代码,它们是 MIMIC-III 和美国一家国立医院中的前 50 个频率。共有 6 张桌子:
- 录取。病人入院的所有信息
- 标签。所有实验室测量
- 药方。与订单条目相关的药物
- 微生物学。微生物信息
- 图表事件患者常规体征和其他相关健康信息的所有图表数据
- 注意事件。所有记录,包括护理和医生记录、出院总结和超声心动图报告
方法学

整体架构的集成模型的三个不同类型的模型,涵盖不同类型的数据集[1]
上图是我们基于集成的模型,它结合了以下三种不同的 ML 模型:
- Text-CNN 。用于非结构化文本的多标签分类
- Char-CNN + BiLSTM 。用于分析诊断描述和 ICD 代码描述之间的语义相似性
- 决策树。将结构化数字特征转换为二进制特征以分类 ICD 码
在推理过程中,我们的模型结合了三个最大似然模型进行预测,并从原始数据中提取关键证据进行检验,以提高可解释性。
文本-CNN
对于非结构化数据,我们有 Noteevents。这包括两个步骤:
- 数据预处理
- 正文-CNN 分类
对于数据预处理,对步骤 2 的输入进行简单的清理和标准化。对于步骤 2,我们使用 Text-CNN 进行多标签分类。我们还修改了 Text-CNN 来开发 TEXT-TF-IDF-CNN,如下所示。该模型包括从非结构化指南中提取的关键字和短语的 TFIDF 向量,以模拟临床指南经常用于指导诊断的真实世界情况。额外的 TFIDF 输入馈入 Text-CNN 的全连接层。

非结构化数据的模型架构[1]
数据集中存在类别不*衡,这可能会降低我们的 ML 模型的性能,因此我们决定使用标签*滑正则化(LSR),这可以防止我们的分类器在训练期间对标签过于确定。
Char-CNN + BiLSTM
临床编码人员经常试图提取临床记录中的关键短语和句子,并将其分配给适当的 ICD 编码。最常见的是,编码描述和诊断描述之间存在紧密的语义相似性。我们将此过程公式化为基于诊断的排序(DR)问题,其中所有代码描述都在低维密集向量空间中表示。在推理过程中,诊断描述被映射到相同的向量空间,并且基于诊断向量和每个编码向量之间的距离对 ICD 码进行排序。因此,我们决定采用如下所示的架构。

半结构化数据的模型架构[1]
我们使用字符级 CNN 和预训练的单词嵌入将诊断和 ICD 编码描述编码到同一个空间。单词嵌入是在 PubMed 上预先训练的,PubMed 包含超过 550,000 篇生物医学论文。然后,编码的嵌入被馈送到 biLSTM 和 max-pooling 层,以生成最终的特征向量。
损失函数通过最小化诊断实例和阳性实例(阳性对)之间的距离以及最大化诊断实例和阴性实例(阴性对)之间的距离来捕捉实例之间的相对相似性。距离是用欧几里得度量的。MIMIC-III 数据集没有 ICD 代码和诊断的一对一映射,因此我们在网上爬行以提取 ICD-10 代码的同义词。每个 ICD 电码的所有同义词都是正面例子。使用类似于代码描述的 n-grams 来创建反例。
决策图表
表 2-5 都是表格数据。我们的方法是对表中的二进制特征应用决策树,并利用一对多策略进行多标签分类。为了消除班级不*衡,来自少数民族班级的样本被赋予更高的权重。
模型集成
在推理期间,我们的集合模型采用从三个单独模型预测的概率的加权和来计算每个类别的最终预测概率。
可解释性方法
为了识别导致预测的 ICD 码的关键短语,我们试图捕捉单词 w 和 ICD 码 y 之间的关联强度。我们通过从我们的神经网络中提取连接 w 和 y 的所有路径并计算影响分数来实现这一点。然后将所有路径的分数相加,以测量关联强度。为了捕捉关键短语,我们组合了具有非零分数的连续单词,并按照最高分数对它们进行排序。排名靠前的短语被认为是确定特定 ICD 码预测的重要信号。
对于每个表格特征,我们使用局部可解释的模型不可知解释(LIME)来计算该特征对模型最终预测的重要性。
实验设置和结果
我们使用两个评估指标来衡量模型的分类性能和可解释性:
- 分类。F1 和 AUC 来测量精度和召回率,并总结不同阈值下的性能
- 可解释性。Jaccard 相似性系数(JSC)来衡量提取的证据和医生的注释之间的重叠
结果

模拟数据集的总体结果[1]
我们使用 TFIDF 的不同变体作为基线。大多数模型都是基于 CNN 的。vanilla Text-CNN 和 DenseNet 在 F1 得分方面与基线模型表现相似,在 AUC 得分方面优于基线模型。如 F1 和 AUC 分数的显著改善所示,标签*滑在缓解类别不*衡问题方面是有效的。基于诊断的分级显示了类似的改善。
随着我们转向不同的系综模型,我们的 F1 和 AUC 得分表现持续增长。Text-CNN + LS + DR + TD 显示,与普通 Text-CNN 相比,macro-F1 得分提高了 7%,其他指标也有类似的提高。这展示了我们的集成方法的有效性。
在最后一节中,我们展示了通过以 TFIDF 特征向量的形式合并临床指南,在性能方面的进一步强大改进。这表明在没有外部临床指南的情况下,宏观 F1 评分比表现最好的集合模型增加了 7%。我们的 Text-TFIDF-CNN + LS + DR + TD 优于所有基线和集合模型,这告诉我们,将外部知识结合到分类任务中会显著提高模型的性能。

AUC、F1 和 Jaccard 相似性得分[1]
在可解释性评估方面,我们从 5 个 ICD-10 编码中收集了 25 个样本的测试集,并由 3 名有经验的医生对它们进行了注释。我们将从我们的模型中提取的 top-k 短语与人类注释进行比较,并测量它们之间的重叠分数。结果如上表 2 所示。*均而言,我们的模型对于文本数据获得了 0.1806 的 JSC。我们的模型能够捕捉与特定疾病直接相关的短语,或者为最终预测提供间接关系。
在表格数据方面,我们选择了 LIME 发现的 k 个最重要的特征作为模型预测的证据。同样,我们计算了这些特征和人工注释之间的重叠分数,结果显示在表 2 中。人类注释者之间的*均 JSC 是 0.5,高于我们的模型和人类注释者之间的*均 JSC 0.31。总的来说,我们的模型能够捕获比人类注释者更多的特征,其中一些特征对于诊断是有用的,而人类注释者没有发现。
结论和未来工作
总的来说,我们的集成模型优于所有的基线方法,我们看到通过将人类知识融入模型中,性能得到了进一步的提高。此外,我们的模型的预测更容易解释。潜在的未来工作包括扩大编码列表,减少表格数据的特征维数,以及进一步研究添加人类知识的不同方法可以产生更好的结果。
来源:
[1] Xu,k .,Lam,m .,Pang,j .,Gao,x .,Band,c .,Mathur,p .,Papay,f .,Khanna,A.K .,Cywinski,J.B .,Maheshwari,k .和 Xie,p .,2019 年 10 月。自动 ICD 编码的多模态机器学习。在医疗保健机器学习会议(第 197-215 页)。PMLR。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towards data science . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
- https://towards data science . com/day-123-of-NLP 365-NLP-papers-summary-context-aware-embedding-for-targeted-aspect-based-be9f 998d 1131
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61a E6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
- https://towards data science . com/day-124-NLP-papers-summary-tldr-extreme-summary-of-scientific-documents-106 CD 915 F9 a 3
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
- https://towards data science . com/day-125-of-NLP 365-NLP-papers-summary-a2n-attending-to-neighbors-for-knowledge-graph-inference-87305 C3 aebe 2
- https://towards data science . com/day-126-of-NLP 365-NLP-papers-summary-neural-news-recommendation-with-topic-aware-news-4eb 9604330 bb
#NLP365 第 141 天:NLP 论文摘要—文本攻击:自然语言处理中对抗性攻击的框架

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 273 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 TextAttack:自然语言处理中对抗性攻击的框架 。以下是研究论文的要点。
目标和贡献
介绍了 TextAttack,这是一个 python 库,可以对自然语言处理(NLP)模型进行对抗性攻击。TextAttack 可以使用它的四个组件创建不同的攻击变体:搜索方法、目标函数、转换和约束集。TextAttack 目前支持对文本分类和蕴涵的攻击,由于其模块化设计,它可以很容易地扩展到其他 NLP 任务和模型。Github 回购在 https://github.com/QData/TextAttack这里。
NLP 攻击的组成是什么?
NLP 攻击的目标是给定一个输入序列 x,我们想要扰乱它并向它添加噪声以创建 x_adversarial,使得 x_adversarial 满足特定的目标函数和语言约束。总的来说,每个攻击都可以使用四个不同的组件来构建:
- 目标函数
- 约束集
- 转换
- 搜索方法
目标函数
该组件根据模型输出来定义攻击的成功程度,它因任务而异。它接受一个输入 x,并确定攻击是否完成。
限制
该组件设置控制扰动是否有效的约束。一个扰动只有在满足每个攻击的约束条件时才被认为是有效的。TextAttack 中目前有三种类型的约束:
- 编辑距离。这度量了原始 x 和敌对 x 之间的相似性。TextAttack 具有不同的编辑距离度量,包括最大 BLEU 分数差、流星分数差、Levenshtein 编辑距离等等
- 语法性。这是为了防止在制造敌对攻击时出现任何语法错误。这是由词性一致性和文本攻击中语法错误的最大数量决定的
- 语义。这试图在创建对抗性攻击 x 时保留 x 的原始含义。这由最小余弦相似性、不同的句子编码器和语言模型来控制
转换
该组件负责接收输入并返回所有可能的候选扰动。我们将转换分为两类:
- 白盒。可以访问模型,并可以检查其参数以帮助转换。例如,基于当前输入单词向量寻找候选替换单词
- 黑匣子。确定候选扰动时无权访问模型
TextAttack 中目前有四种转换:嵌入空间中的单词交换、使用 WordNet 的单词交换、带有字符转换的单词交换,以及返回多个转换结果的复合转换。
搜索方法
该组件从变换组件获取候选扰动集,并搜索满足目标函数并满足所有约束的扰动。TextAttack 目前支持以下搜索算法:
- 贪婪于单词重要性排名
- 波束搜索
- 遗传算法
TextAttack 的模块化允许我们将现有作品的许多不同攻击实现到一个共享库中。下表和下图展示了我们使用 TextAttack 实施的一些现有 NLP 攻击:

TextAttack 工作原理概述[1]

现有的前期工作[1]
使用 TextAttack 进行研究
您可以使用 TextAttack 库来衡量现有 NLP 模型的健壮性。该库可以在任何深度学习框架中实现,使用实现每个组件所需功能的基础抽象类可以很容易地形成新的攻击。这使得研究人员可以简单地在核心组件之上添加新的组件,以形成新的攻击。最后,有许多方法可以可视化连接结果,包括命令行、csv 文件、HTML 表格、演示 web 应用程序等等。
结论和未来工作
潜在的未来工作是向我们的 TextAttack 添加新的组件和攻击,以支持将来更容易的 NLP 攻击的开发和比较。
来源:
[1] Morris,J.X .,Lifland,e .,Yoo,J.Y .和 Qi,y .,2020 .文本攻击:自然语言处理中对抗性攻击的框架。 arXiv 预印本 arXiv:2005.05909 。
原载于 2020 年 5 月 20 日 https://ryanong.co.uk。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
- https://towards data science . com/day-123-of-NLP 365-NLP-papers-summary-context-aware-embedding-for-targeted-aspect-based-be9f 998d 1131
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61a E6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
- https://towards data science . com/day-124-NLP-papers-summary-tldr-extreme-summary-of-scientific-documents-106 CD 915 F9 a 3
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
- https://towards data science . com/day-125-of-NLP 365-NLP-papers-summary-a2n-attending-to-neighbors-for-knowledge-graph-inference-87305 C3 aebe 2
- https://towards data science . com/day-126-of-NLP 365-NLP-papers-summary-neural-news-recommendation-with-topic-aware-news-4eb 9604330 bb
- https://towards data science . com/day-140-of-NLP 365-NLP-papers-summary-multimodal-machine-learning-for-automated-ICD-coding-b32e 02997 ea 2
#NLP365 的第 142 天:NLP 论文摘要——测量新冠肺炎真实世界忧虑数据集中的情绪

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 280 天里学到了什么。在本文的最后,你可以找到以前的论文摘要,按自然语言处理领域分类:)
今天的 NLP 论文是 测量新冠肺炎真实世界担忧数据集 中的情绪。以下是研究论文的要点。
目标和贡献
创建了真实世界焦虑数据集(RWWD),这是新冠肺炎第一个情绪反应的真实数据集,由 2500 个短文本和 2500 个长文本组成。数据集上的主题模型显示,英国人主要关心家庭和经济。了解新冠肺炎疫情期间公众的情绪反应非常重要,该数据集是开发一种自动分析情绪反应和担忧的方法的垫脚石。
新冠肺炎真实世界担忧数据集
RWWD 数据集捕捉了英国居民对新冠肺炎的情感反应。数据是在 4 月 6 日和 7 日收集的,我们认为这两天是情况的“高峰期”。英国处于封锁状态,死亡人数不断增加,首相鲍里斯·约翰逊进入新冠肺炎的重症监护病房。我们使用直接调查法,而不是依赖第三方注释,我们调查了 2500 名参与者,询问他们写作时的感受。RWWD 有两个版本:
- 长 RWWD 。参与者可以自由地写下他们的感受,想写多久就写多久
- 短 RWWD 。参与者被要求用推特大小的文字表达他们的感受
每位参与者都被要求从 1 到 9 给自己的情绪打分,9 表示“非常”。他们必须评估八种情绪:愤怒、焦虑、欲望、厌恶、恐惧、快乐、放松和悲伤。他们还被要求选择一种最能描述他们当前感受的情绪。下表展示了 RWWD 数据集的描述性统计数据。总体而言,焦虑、悲伤和恐惧的情绪主导了数据集。

数据和情感评分的描述性统计[1]
实验和主要发现
情绪与 LIWC 范畴的相关性
自我报告的情绪和 LIWC 类别有很高的匹配率。所有的情感 LIWC 变量与其相应的自我报告的情绪都有很高的正相关性,这表明语言变量可以解释情绪得分的差异。LIWC 还深入到与每种情绪相关的子类别中。例如,情绪焦虑与生活的不同领域相关联。正相关表明,参与者的分数越高,他们在各自的 LIWC 子类别中的分数越高。焦虑与金钱、工作和死亡之间没有相关性,而焦虑情绪与家庭方面有显著的正相关,表明人们越焦虑,他们越谈论他们的家庭。

LIWC 变量和情绪之间的相关系数[1]
总之,心理语言学单词列表和情绪之间存在微弱的正相关,这种方法最擅长测量愤怒、焦虑和担心。对于较长的文本,它比 tweet 大小的文本表现得更好,这可能是因为人们在书面文本中表达情感的能力不足。我们还探索了情绪的重叠,其中担心、恐惧和焦虑之间有很高的相关性,这与我们数据集中明显分离的结构相反。另一种看待这个问题的方式是,不同情绪的分离允许模型理清情绪,并评估常见的聚类方法来聚类不同的情绪。
人们忧虑的主题模型
我们对长文和短文本进行主题建模,并将结果展示在下面的表 3 中。对于长文本,似乎前 5 个最流行的话题与封锁规则和对就业和经济的担忧有关。对于短文,我们在五个最流行的话题中看到类似的模式,它们与政府口号和社会距离规则有关。

五大热门话题[1]
根据我们的发现,人们似乎担心他们的工作和经济,以及他们的家人和朋友。例如,在长文本中,人们分享他们对家人和孩子缺课的担忧。在短文中,人们倾向于鼓励他人遵守社交距离规则,而不是表达他们的担忧。这意味着人们倾向于使用长文本来表达他们的担忧,而使用短文本来鼓励他人遵守规则。
预测对新冠肺炎的情绪
我们工作不同于现有的自动情绪检测工作,因为先前的工作将问题视为分类任务,而我们的工作允许在连续的尺度上估计情绪。由于我们的数据集对于神经方法来说不够大,所以我们使用了具有 TFIDF 和 POS 特征的正则化岭回归模型。TFIDF 特征基于每个语料库的 1000 个最常见的词,而 POS 特征是使用 spaCy 提取的。我们的回归模型的结果展示如下。我们的 MAE 范围是长文本从 1.26 到 1.88,短文本从 1.37 到 1.91。我们的模型在预测长文本和短文本的焦虑情绪方面表现最佳,并解释了长文本中情绪反应变量的高达 16%的方差。

长短文本回归建模的结果[1]
总的来说,具有词汇特征的岭回归已被证明在预测新冠肺炎的情绪反应方面是有效的。与其他结果类似,与短文本相比,我们的方法在长文本上表现得更好。我们的模型在预测焦虑方面表现最佳,我们认为这是因为在我们的数据集中,这是报道最多的情绪,因此使我们的模型有偏差。
结论和未来工作
有一些潜在的未来研究想法:
- 探索不同的预测方法,以减轻使用词典方法的一些限制。尽管 tweet 大小的文本包含的信息少得多,但这种简短的文本仍然占据了今天网络上文本数据的很大一部分,因此能够有效地使用它来预测情绪将是非常有益的,值得未来的研究
- 另一方面,许多研究关注的是可用的 Twitter 数据,我们需要开始扩展到其他非 Twitter 数据,以捕捉那些在社交媒体上代表性不足的人的情绪反应
- 手动注释新冠肺炎主要关注的主题的数据方法
- 扩展数据集以覆盖更长的时间段,以捕捉情绪反应如何随着时间的推移而发展
- 除了 LIWC 之外,利用其他方法和字典来测量文本中的心理结构
来源:
[1] Kleinberg,b .,van der Vegt,I .和 Mozes,m .,2020 年。在新冠肺炎真实世界忧虑数据集中测量情绪。arXiv 预印本 arXiv:2004.04225 。
原载于 2020 年 5 月 21 日 https://ryanong.co.uk。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
- https://towards data science . com/day-123-of-NLP 365-NLP-papers-summary-context-aware-embedding-for-targeted-aspect-based-be9f 998d 1131
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61a E6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
- https://towards data science . com/day-124-NLP-papers-summary-tldr-extreme-summary-of-scientific-documents-106 CD 915 F9 a 3
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
- https://towards data science . com/day-125-of-NLP 365-NLP-papers-summary-a2n-attending-to-neighbors-for-knowledge-graph-inference-87305 C3 aebe 2
- https://towards data science . com/day-126-of-NLP 365-NLP-papers-summary-neural-news-recommendation-with-topic-aware-news-4eb 9604330 bb
- https://towards data science . com/day-140-of-NLP 365-NLP-papers-summary-multimodal-machine-learning-for-automated-ICD-coding-b32e 02997 ea 2
- https://towards data science . com/day-141-of-NLP 365-NLP-papers-summary-text attack-a-framework-for-adversarial-attack-in-aac2a 282d 72 c
#NLP365 的第 143 天:NLP 论文摘要—电子健康记录摘要的无监督伪标记

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 280 天里学到了什么。在这篇文章的最后,你可以找到以前按自然语言处理领域分类的论文摘要,你也可以订阅# NLP 365 @http://eepurl.com/gW7bBP😃
今天的 NLP 论文是 无监督伪标注用于电子健康记录上的抽取摘要 。以下是研究论文的要点。
目标和贡献
提出了一种有效的无监督生成电子健康记录伪标签的方法,该方法利用了多个电子健康记录之间的内在相关性。然后,我们使用这个伪标签来训练一个提取摘要器,以帮助医生更好地消化 EHR。具体来说,本文回答了以下三个研究问题:
- 如何衡量同一患者特定疾病总结的质量?
- 如何利用研究问题 1 生成有效精准的伪标签?
- 给定生成的伪标签,在医疗环境中应该使用什么模型架构进行总结?
方法学
问题定义

我们的无监督总结方法的整体架构[1]
对于大多数患者来说,随着时间的推移,存在许多记录的电子病历。我们的目标是找到这些电子病历的子集,最好地总结特定疾病的患者信息。上图展示了我们整体架构。对于第一个研究问题,我们观察到医生在阅读和总结临床笔记时倾向于关注医疗实体,因此我们建议总结临床笔记以涵盖更多相关实体。
每个 EHR 都有一个包含所有医疗实体的实体集。可以想象,每个 EHR 可能包含数百个实体,捕获所有这些实体是一个非常具有挑战性的问题。为了捕捉这些实体,我们观察到早期健康记录中的信息通常持续到后来的记录,提醒医生注意未来的治疗。受此启发,我们使用覆盖率分数来评估基于后来记录的 EHR 的质量。我们使用逆文档频率来衡量实体在整个语料库中的重要性,并通过使用 PubMed 上训练的单词嵌入对实体和 EHR 中的句子进行编码来衡量实体和句子之间的语义相似性。
整数线性规划的伪标记
我们使用具有长度约束的整数线性规划来使用后来的记录为 EHR 生成二进制伪标签。下面是最后一个优化问题:

优化问题[1]
总结模型
在这里,我们使用生成的伪标签来训练一个有监督的提取总结模型来总结病历。该模型由两层 biGRU 组成,其中第一层集中在单词层并生成句子嵌入,第二层集中在句子层,使用第一层的输出并计算每个句子的最终表示。对于输出层,我们有逻辑函数,它有几个特征,包括内容、显著性、新颖性和位置。突出特征将帮助我们识别当前句子对整个笔记有多重要,新颖特征帮助我们减少冗余。
实验和结果
我们的评估数据集是重症监护医疗信息集市 III (MIMIC-III)。我们总共提取了 5875 例包含至少一个与心脏病相关的 ICD 诊断代码的住院病例。我们还利用了记录事件表中的临床记录。我们聘请了一位经验丰富的医生来手动注释 25 个临床笔记,并在推断时间内比较我们的模型的结果。我们的评估指标是 ROUGE 分数的标准汇总指标。
模型比较
我们的方法是无监督的,因为我们不需要任何外部注释,所以我们所有的基线模型比较都是无监督的:
- 最-实体(ME) 。挑选大多数医学实体的句子
- TF-IDF + MMR (TM) 。TFIDF 的扩展旨在减少作为 MMR 度量的信息重复,减少与已经选择的句子具有高相似性的句子的权重
- 我们自己模型的消融变异。我们有没有新颖性特征的模型,没有位置特征的模型,以及完整的模型
结果

总体总结结果[1]
如上面的结果表所示,我们的模型相对于所有基线模型获得了最高的 ROUGE 分数。我们还观察到冗余严重影响我们的总结模型。MMR 和新颖性特征显著提高了 TF-IDF 和我们的模型的性能。位置功能也被证明可以提高性能,这是可以预料的,因为临床记录通常是用结构化模板编写的。
下表展示了我们的模型提取的句子的一些示例,并将其与医生的注释进行了比较。从表中我们可以看出,ME 和 TM 倾向于选择实体较多的长句,这是意料之中的。这意味着他们都没有选择像句子 1 和 2 这样重要的短句。我们的模型也有这个问题,但没那么严重。TM 的缺点是,通过使用 TFIDF,当句子包含不常用的术语时,它会误导模型将其分类为重要的,但在医学领域,术语通常非常具体,因此尽管不常用,但它们可能与特定疾病无关。我们的模型被显示选择与我们的医生的注释非常相似的句子。

不同总结方法的定性分析[1]
结论和未来工作
总的来说,我们探讨了总结 EHR 的三个研究问题:
- 使用医疗实体来涵盖一名患者的多个电子病历之间的内在关联
- 开发了一个优化目标,并使用 ILP 生成伪标签
- 使用生成的伪标签来训练我们的监督提取摘要模型
潜在的未来工作可能涉及添加新的功能,如覆盖或注意机制,以避免重复和特别注意句子中重要的部分。
来源:
[1]刘,x,徐,k,谢,p,邢,e,2018 .用于电子健康记录摘要的无监督伪标记。 arXiv 预印本 arXiv:1811.08040 。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sensation-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towardsdatascience . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
- https://towards data science . com/day-123-of-NLP 365-NLP-papers-summary-context-aware-embedding-for-targeted-aspect-based-be9f 998d 1131
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61 AE 6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
- https://towards data science . com/day-124-NLP-papers-summary-tldr-extreme-summary-of-scientific-documents-106 CD 915 F9 a 3
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
- https://towards data science . com/day-125-of-NLP 365-NLP-papers-summary-a2n-attending-to-neighbors-for-knowledge-graph-inference-87305 C3 aebe 2
- https://towards data science . com/day-126-of-NLP 365-NLP-papers-summary-neural-news-recommendation-with-topic-aware-news-4eb 9604330 bb
- https://towardsdatascience . com/day-140-of-NLP 365-NLP-papers-summary-multimodal-machine-learning-for-automated-ICD-coding-b32e 02997 ea 2
- https://towards data science . com/day-141-of-NLP 365-NLP-papers-summary-text attack-a-framework-for-adversarial-attack-in-aac2a 282d 72 c
- https://towards data science . com/day-142-of-NLP 365-NLP-papers-summary-measuring-emotions-in-the-the-新冠肺炎-现实世界-忧虑-d565098a0937
#NLP365 的第 144 天:NLP 论文摘要-关注医学本体论:临床抽象摘要的内容选择

阅读和理解研究论文就像拼凑一个未解之谜。汉斯-彼得·高斯特在 Unsplash 上拍摄的照片。
内线艾 NLP365
NLP 论文摘要是我总结 NLP 研究论文要点的系列文章
项目#NLP365 (+1)是我在 2020 年每天记录我的 NLP 学习旅程的地方。在这里,你可以随意查看我在过去的 280 天里学到了什么。在这篇文章的最后,你可以找到以前按自然语言处理领域分类的论文摘要,你也可以订阅# NLP 365 @http://eepurl.com/gW7bBP😃
今天的 NLP 论文是 关注医学本体:临床抽象概括的内容选择 。以下是研究论文的要点。
目标和贡献
传统的抽象文本摘要的主要问题是从源文档中选择关键信息。提出了一种通过在摘要器中加入显著的本体术语来选择临床摘要内容的方法。内容选择被视为单词级序列标记问题。这已被证明改善了基于 MIMIC-CXR 和 OpenI 数据集的 SOTA 结果。我们还获得了专家的评价,并表明我们的方法产生了一个良好的质量摘要相比,地面真相。
放射学报告总结
放射学报告包含两个重要部分:发现和印象。发现包括成像研究的详细观察和解释,而印象总结了最关键的发现。在该行业中,大多数临床医生只阅读印象部分,因为他们有有限的时间来回顾冗长的发现部分。印象生成的自动化和改进可以显著改进放射科医生的工作流程。
方法学
我们提出的模型有两个主要部分:
- 内容选择器
- 总结模型
内容选择器
这一部分旨在选择报告中最重要的本体概念,特别是调查结果部分。这可以被视为单词级提取任务,其中我们想要提取可能包含在印象部分中的单词。实际上,如果满足两个标准,每个单词都被标记为 1:
- 这个词是一个本体论术语
- 这个词被直接复制到印象中
这使我们能够捕捉每个单词的复制可能性,我们用它来衡量单词的重要性。整体架构是一个位于 BERT 嵌入层之上的 biLSTM(利用上下文嵌入的优势),在推理期间,我们的内容选择器将输出源序列中每个标记的选择概率。
总结模型
我们的汇总模型有两个编码器和一个解码器(见下图):
- 发现编码器。这是一个 biLSTM,它在发现部分中包含单词 embeddings,并生成一个编码的隐藏表示
- 本体编码器。这是一个 LSTM,它接收已识别的本体术语(通过我们的内容选择器)并生成一个固定的上下文向量,即我们的本体向量
- 印象解码器。这是一个给人留下印象的 LSTM

总结模型概述[1]
接下来,我们有一个过滤门,使用本体向量来提炼发现词表示,以产生本体感知的词表示。过滤门在每一步连接单词 x 的当前隐藏状态和固定本体向量,并通过具有 sigmoid 激活函数的线性来处理这些。为了计算本体感知的单词表示,我们然后取过滤门的输出,并与单词 x 的当前隐藏状态执行逐元素乘法。
我们的解码器是一个产生印象的 LSTM。解码器将使用先前的隐藏状态和先前生成的标记来计算当前的解码状态。解码器还将使用当前解码状态来计算本体感知单词表示上的注意力分布。注意力分布然后被用于计算上下文向量。最后,上下文向量和当前解码状态被馈入前馈神经网络,以生成下一个令牌或从发现中复制。
实验和结果
我们有两个评估数据集:MIMIC-CXR 和 OpenI。MIMIC-CXR 有 107372 份放射学报告,OpenI 有 3366 份报告。对于放射学词汇,我们使用 RadLex,它由 68534 个放射学术语组成。
模型比较
我们有两个抽象概括模型(LSA 和 NEUSUM)和三个抽象概括模型(指针生成器(PG)、本体感知 PG 和 BOTTOMSUM)。BOTTOMSUM 与我们的架构最相关,因为它使用了一个单独的内容选择器来进行抽象文本摘要。
结果

胭脂结果在模仿——CXR[1]
如上表 1 所示,我们的模型明显优于所有提取和抽象基线模型。抽象模型明显优于提取模型,表明人类书写的摘要是抽象形成的,而不仅仅是从源中选择句子。PG 和本体感知 PG 之间在 ROUGE 性能上的差异展示了在摘要模型中结合显著的本体术语的有效性和有用性。正如预期的那样,BOTTOMSUM 在基线模型中取得了最好的结果,因为它与我们的模型具有最相似的架构。我们相信我们的模型优于 BOTTOMSUM 的原因是因为我们有一个基于本体单词的精炼单词表示的中间阶段。下面的表 3 展示了将内容选择纳入汇总模型的好处。

包含和不包含内容选择的胭脂结果[1]
为了评估我们模型的通用性,我们还在 OpenI 上对比 BOTTOMSUM 评估了我们的模型,结果显示在下面的表 2 中。如图所示,我们的模型也能够胜过 OpenI 中的 BOTTOMSUM,说明了我们的模型的一般化。

总结胭脂结果[1]
专家评估
在这里,我们随机抽样了 100 个生成的印象及其相关的金牌摘要。我们请了三位专家对这些印象的可读性、准确性和完整性进行评分,评分标准为 1-3(3 为最佳)。结果显示在下图中。我们观察到,有超过 80%的生成印象被评分为与相关联的人类书写印象一样好。73%和 71%的我们的印象在可读性和准确性以及与人类书写印象的联系方面得分为 3,然而只有 62%的我们的印象在完整性方面得分为 3。我们认为这是由于发现中被认为重要的东西的主观性。总的来说,我们生成的印象似乎是高质量的,然而,在生成的印象和人类书写的印象之间仍然有差距。

100 份人工评分放射学报告之间印象差异的直方图和箭头图[1]
来源:
[1]s . sotu DEH,n . Goharian 和 r . w . Filice,2020 年。关注医学本体论:临床摘要的内容选择。arXiv 预印本 arXiv:2005.00163 。
原载于 2020 年 5 月 23 日 https://ryanong.co.uk**的 。
特征提取/基于特征的情感分析
- https://towards data science . com/day-102-of-NLP 365-NLP-papers-summary-implicit-and-explicit-aspect-extraction-in-financial-BDF 00 a 66 db 41
- https://towards data science . com/day-103-NLP-research-papers-utilizing-Bert-for-aspect-based-sense-analysis-via-construction-38ab 3e 1630 a3
- https://towards data science . com/day-104-of-NLP 365-NLP-papers-summary-senthious-targeted-aspect-based-sensitive-analysis-f 24 a2 EC 1 ca 32
- https://towards data science . com/day-105-of-NLP 365-NLP-papers-summary-aspect-level-sensation-class ification-with-3a 3539 be 6 AE 8
- https://towards data science . com/day-106-of-NLP 365-NLP-papers-summary-an-unsupervised-neural-attention-model-for-aspect-b 874d 007 b 6d 0
- https://towardsdatascience . com/day-110-of-NLP 365-NLP-papers-summary-double-embedding-and-CNN-based-sequence-labeling-for-b8a 958 F3 bddd
- https://towards data science . com/day-112-of-NLP 365-NLP-papers-summary-a-challenge-dataset-and-effective-models-for-aspect-based-35b 7 a5 e 245 b5
- https://towards data science . com/day-123-of-NLP 365-NLP-papers-summary-context-aware-embedding-for-targeted-aspect-based-be9f 998d 1131
总结
- https://towards data science . com/day-107-of-NLP 365-NLP-papers-summary-make-lead-bias-in-your-favor-a-simple-effective-4c 52 B1 a 569 b 8
- https://towards data science . com/day-109-of-NLP 365-NLP-papers-summary-studing-summary-evaluation-metrics-in-the-619 F5 acb1 b 27
- https://towards data science . com/day-113-of-NLP 365-NLP-papers-summary-on-extractive-and-abstract-neural-document-87168 b 7 e 90 BC
- https://towards data science . com/day-116-of-NLP 365-NLP-papers-summary-data-driven-summary-of-scientific-articles-3 FBA 016 c 733 b
- https://towards data science . com/day-117-of-NLP 365-NLP-papers-summary-abstract-text-summary-a-low-resource-challenge-61 AE 6 CDF 32 f
- https://towards data science . com/day-118-of-NLP 365-NLP-papers-summary-extractive-summary-of-long-documents-by-combining-AEA 118 a5 eb3f
- https://towards data science . com/day-120-of-NLP 365-NLP-papers-summary-a-simple-theory-model-of-importance-for-summary-843 ddbcb 9b
- https://towards data science . com/day-121-of-NLP 365-NLP-papers-summary-concept-pointer-network-for-abstract-summary-cd55e 577 F6 de
- https://towards data science . com/day-124-NLP-papers-summary-tldr-extreme-summary-of-scientific-documents-106 CD 915 F9 a 3
- https://towards data science . com/day-143-of-NLP 365-NLP-papers-summary-unsupervised-pseudo-labeling-for-extract-summary-3b 94920 e04c 6
其他人
- https://towards data science . com/day-108-of-NLP 365-NLP-papers-summary-simple-Bert-models-for-relation-extraction-and-semantic-98f 7698184 D7
- https://towards data science . com/day-111-of-NLP 365-NLP-papers-summary-the-risk-of-race-of-bias-in-hate-speech-detection-BFF 7 F5 f 20 ce 5
- https://towards data science . com/day-115-of-NLP 365-NLP-papers-summary-scibert-a-pre trained-language-model-for-scientific-text-185785598 e33
- https://towards data science . com/day-119-NLP-papers-summary-an-argument-annoted-corpus-of-scientific-publications-d 7 b 9 e 2e ea 1097
- https://towards data science . com/day-122-of-NLP 365-NLP-papers-summary-applying-Bert-to-document-retrieval-with-birch-766 EAC 17 ab
- https://towards data science . com/day-125-of-NLP 365-NLP-papers-summary-a2n-attending-to-neighbors-for-knowledge-graph-inference-87305 C3 aebe 2
- https://towards data science . com/day-126-of-NLP 365-NLP-papers-summary-neural-news-recommendation-with-topic-aware-news-4eb 9604330 bb
- https://towards data science . com/day-140-of-NLP 365-NLP-papers-summary-multimodal-machine-learning-for-automated-ICD-coding-b32e 02997 ea 2
- https://towards data science . com/day-141-of-NLP 365-NLP-papers-summary-text attack-a-framework-for-adversarial-attack-in-aac2a 282d 72 c
- https://towards data science . com/day-142-of-NLP 365-NLP-papers-summary-measuring-emotions-in-the-the-新冠肺炎-现实世界-忧虑-d565098a0937



浙公网安备 33010602011771号