考拉:熊猫在阿帕奇火花NA

下载幻灯片

在本教程中,我们将介绍Koalas,一个新的开源项目。bob下载地址Koalas是一个开源的Pbob下载地址ython包,它在Apache Spark上实现了pandas API,使pandas API可扩展到大数据。使用Koalas,数据科学家可以从一台机器过渡到分布式环境,而不需要学习新的框架。

我们将展示Koalas自首次发布以来的新功能,包括Apache Spark 3.0,讨论它的路线图,以及我们如何认为Koalas可以成为大规模数据科学的标准API。

你将学到:

  • 如何开始与考拉
  • 在Apache Spark上显示从熊猫到考拉的轻松过渡
  • 演示Pandas和Koalas api在数据框架转换和特征工程方面的相似性
  • 用于单机Pandas vs分布式环境Koalas

点击这里观看更多Spark + AI课程

免费试用Databricks

视频记录

-大家好。欢迎并感谢您参加这次讲座,我们将在这里探讨Koalas,这是一个开源的Python包,它在Apache Spark上实现了pandas API。bob下载地址在我们开始之前,先简单介绍一下我自己,我叫Niall Turbit,我是Databricks专业服务和培训团队的数据科学家。因此,我的时间平均分配在与客户一起构建和部署可扩展的机器学习解决方案,以及提供专注于Spark数据科学和机器学习的培训课程。在加入Databricks之前,我曾在多个领域构建可扩展的数据驱动和机器学习解决方案,如供应链和预测、物流、优化以及推荐系统。这只是为我们今天要讲的内容做个铺垫。因此,我们将从熊猫和Spark的简单比较开始,讨论它们的起源,简要地查看一些代码,然后我们将探索Koalas项目的一些理由。那么为什么会有这个项目呢?该项目试图解决的问题是什么?我们还将讨论高考拉的实现。 And in terms of how we can recreate the pandas API on top of Spark, and for the meat of the talk, we’re gonna dig into an in depth walkthrough of using Koalas to do some end-to-end data analysis and modeling. To finish things off then, we’re also going to set out the roadmap for future, what’s gonna come from Koalas going forth?

典型的数据科学家之旅

让我们退一步,想想数据科学家的典型旅程。如果你看看数据科学家什么时候会通过在线课程、书籍、大学来接受教育,我们看到的是,当涉及到使用较小的数据集时,pandas是标准工具,因为它对初学者来说易于使用,并且它通过这些媒介得到了大力推广。只有在处理更大的数据集时,Spark才会真正发挥作用。

l熊猫

就熊猫的起源而言,它几乎和Spark一样古老。它非常成功,因为它的功能范围和易用性,我们看到它是如何深入地集成到Python数据科学生态系统中,构建在numpy之上,我们有matplotlib, scikit-learn,所有这些都很好地结合在一起。我们看到它如何处理从基本统计分析一直到实际建模的许多情况,以及如何在拟合机器学习模型之前准备数据集。因此,就Spark而言,Spark几乎是大规模进行数据科学和数据工程的事实上的标准工具。特别是,当涉及到大规模数据处理时,我们看到Spark是一个集成的工具箱,可以用于广泛的用例,所有这些都在同一个屋檐下。它如此受欢迎的一个重要因素可以归结为这样一个事实:自从它由UC Berkeley的Databricks创始人创建以来,它就通过一系列API迎合了不同的社区。

许多额外的微妙之处和差异来自Spark与pandas的底层实现。

一个简短的例子

为了说明这些,我们可以看一个简短的例子。因此,当查看pandas语法和PySpark语法之间的这些差异时,很明显,来自panda上下文并希望在PySpark中实现相同的操作对于pandas用户来说并不直观。对于那些来自pandas生态系统的用户来说,PySpark并不是那么直观,在许多情况下,与pandas相比,它可能更加繁琐或冗长。例如,如果我们读取一个CSV文件,我们想要重命名列并创建一个新列,该列x乘以它自己,我们在pandas中看到简单的pd。在我们进口熊猫之后,Readcsv;然而,使用PySpark,我们必须执行一些更详细的语法。正如我所说,这并不像来自熊猫的人想象的那么直观。

对于那些有熊猫背景但想要利用Spark分布式特性的人来说,这通常可以被视为买家。

考拉

这就是考拉发挥作用的地方。也许这是考拉项目的关键动力,这是去年4月的第九个项目。Koalas是一个纯Python库,所以它可以像任何其他Python库一样通过PIP、Conda或从源代码安装。这个项目的核心目标是在Spark的基础上提供所有的pandas API,从而为用户提供Spark固有的可伸缩性,同时又熟悉pandas。

在增长方面,pandas自去年发布以来获得了巨大的吸引力,最近的日下载量超过3万次,我们看到GitHub项目目前实际上有超过2000个GitHub明星。

简短的例子

因此,这种流行的原因是,该子句允许您使用现有的pandas代码,只需进行很小的更改,就可以将其转换为运行在Apache Spark之上的代码。为了证明这一点,我们将使用和之前一样的代码示例,我们将读入CSV,我们将重命名列,然后创建这个新列,它乘以X。如果我们想在考拉身上做同样的事情,我们只需要导入数据就可以了。koalas as ks,使用ks作为koalas库的别名。然后我们用ks。read。csv代替pd。因此,只需进行很小的代码更改,我们就可以实现与pandas完全相同的功能,尽管在底层使用Spark。

关于Koalas项目的当前状态,有一个非常活跃的社区支持Koalas,每两周发布一次。在最新发布的Koalas 0.33中,绝大多数的熊猫API实际上已经在Koalas中实现了。我们看到70%的系列API在那里,近四分之三的数据来自API在那里,超过50%的索引,多索引API在那里,我们看到近70%的DataFrameGroupBy和SeriesGroupBy API在那里,有很大一部分的绘制能力,你会有熊猫,也有考拉。

火花vs熊猫-关键区别

因此,虽然Koalas的目标是在Spark上复制pandas的API,但在Koalas的底层设计中有一些重要的差异,用户应该理解。当从熊猫变成Spark时,这些差异是如何转化的?首先,Spark和pandas都有这个DataFrame的概念,而pandas的DataFrame是一个可变对象,你可以就地更新DataFrame的行或列。在Spark的例子中,我们将针对不可变的DataFrame的操作链接在一起。Spark DataFrame语法受到SQL语法的严重影响,因此,它有助于我们在PySpark的语法之间看到这些巨大的差异,例如,针对pandas。您所看到的pandas和Spark之间的大部分差异来自于Spark中的大多数操作都不会立即得到评估。因此,它本质上是懒惰的。因此,只有在调用操作时才执行操作,并且在调用操作或将其写入外部数据存储时计算某些值。另一个巨大的差异来自Spark是由自然分布的事实。所以Spark不维护行顺序,而pandas给我们一个行数组,其中pandas有一个固有的关联索引,Spark可以被认为是一个没有任何固有顺序的行包。 Lastly, the differences that we see between Spark and pandas come from disability of Spark to scale horizontally by adding additional nodes to a given Spark cluster. This gives us huge advantages in being able to scale performance. With pandas, however, by design were restricted to the memory capacity of a single machine because pandas inherently is going to be the single node library.

就考拉架构而言,在我们了解考拉之前,我们必须简要介绍考拉与Spark和熊猫的关系。您可以将Koalas视为Spark和pandas之上的一个轻量级API层,我们可以通过Spark的核心引擎、数据源连接器、通过catalyst和tungsten获得的优化、以及Spark SQL引擎和Koalas随后插入的底层DataFrames API获得Spark的可扩展优势。我们还得到了一个无缝的过渡,我们能够从考拉到熊猫,利用引擎盖下的Spark和PyArrow来促进这种转换。为了理解Koalas如何将类似熊猫的API转换为Spark,我们必须首先理解正在使用的一些内部结构。InternalFrame是内部的不可变结构,它包含当前Spark DataFrame以及Koalas所需的不可变元数据。InternalFrame管理从Koalas列名到Spark列名的映射。此外,为了复制pandas的索引或多索引,Koalas要求我们将表示索引的Spark DataFrame的列映射到适当的Spark列名。在考拉的引擎帽下的InternalFrame可以被认为是Spark和考拉之间的桥梁,并且不能选择性地启用Spark DataFrame与熊猫的DataFrame之间的转换。然后从底层Spark DataFrame与InternalFrame的组合允许我们用考拉模仿熊猫API。

因此,让我们演示Koalas API调用工作的几种方式。如果一个用户我们通过Koalas, Koalas DataFrame进行API调用,Koalas DataFrame更新Spark DataFrame和InternalFrame中的元数据,然后创建或复制当前具有新状态的InternalFrame,然后返回一个新的Koalas DataFrame。

InternalFrame -仅更新元数据

有时候,Spark DataFrame的更新实际上是不必要的,我们只需要更新InternalFrame的元数据。例如重命名一个列或通过在Koalas DataFrame本身调用.setindex来设置索引。另一方面,有时候API调用会要求Koalas更新内部状态,而不是返回一个新的DataFrame。例如,如果我们提供参数inplace=true,使用InternalFrame的底层操作序列将如下所示。需要注意的一点是,Koalas DataFrame永远不会改变InternalFrame,而是创建InternalFrame本身的副本以保持其不可变。

因此,考拉和熊猫之间的一个显著区别是考拉试图复制熊猫的索引功能。为了做到这一点,Koalas通过底层的InternalFrame(刚刚讨论过)管理一组列作为索引。使用Spark DataFrame中的这些列作为索引,考拉可以像熊猫一样行事。如果我们在创建我们的Koalas DataFrame时没有指定一个特定的列,那么Koalas将会自动附加一个默认索引。现在,考拉通常可以配置几种不同类型的默认索引。然而,每种索引类型都有其优点和缺点。因此,选择合适的默认索引类型非常重要,因为如果用户选择的默认索引类型不适合手头的用例,则通常会遇到性能低下的情况。

默认索引类型

我们来研究一下三种不同类型的默认指数。第一个是序列索引。在Koalas中默认使用Sequence,使用PySpark窗口函数实现一个逐个增加的序列,而不指定分区。由于这在内部使用了无分区Spark窗口函数,这意味着所有数据都需要收集在单个节点上。如果该节点随后没有足够的内存,用户可能会遇到内存不足错误。因此,当数据集很大时,建议避免使用序列索引。当使用较大的数据集时,我们可以通过将默认索引配置为分布式序列或分布式索引来使索引分布式。为了运行这些,分布式序列实现了一个序列,它以分布式的方式使用组-by和组-map方法逐个增加。随后,当附加这个索引时,将运行Spark作业来计算DataFrame的索引,结果行顺序实际上可能与加载数据时的原始顺序不同。这仍然会导致全局顺序索引,但不会导致所有数据都被放到单个节点上。 Once this index is attached, there’s actually not a significant penalty against using this index type over sequence. As such, if you necessarily do require a continuously increasing index globally on a large dataset, distributed sequence is the recommended index type. One thing to note here is that if more data are added to the data source after creating this index, a continuously increasing sequential index is not guaranteed. Lastly, we have the option of distributed distributed index type. Distributed index implements a monotonically increasing index type using PySparks monotonically increasing ID function in a fully distributed manner. The values of this index are actually non-deterministic in that the underlying function will always create different numbers and the numbers will have an unexpected gap. What this means is that this index type can never be used as indices for operations on different DataFrames such as joins. However, if we do not require a strictly continuous increasing sequence, this index should be used. Performancewise the index has little bounty compared to other index types. With all these considerations in mind then, one can configure their option by using compute.defaultindextype in Koalas. So with this knowledge in hand, let’s switch over to a demo where we will see Koalas in action and we’ll conduct an end-to-end analysis using Koalas and exploring how we can reap the benefits of the distributed nature of Koalas and compare against pandas. Actually, can I just rerecord that? It was a bit wordy.

——是的。——谢谢。有了这些知识,让我们切换到一个演示,在那里我们将看到考拉的行动。在这个演示中,我们希望建立在使用Koalas时所发生的知识的基础上,并对Koalas API本身进行更深入的研究。下面是一个Databricks笔记本,可以从下面的链接下载,下载后,你就可以将这个笔记本导入到任何Databricks环境中,无论是免费的社区版还是付费的当前环境。特别是在这个演示中,我们将使用一个包含澳大利亚植物和动物物种的数据集,每一次观察都记录了该国5 * 5平方公里区域内给定植物或动物的数量。

特别是,我们从全球生物多样性信息设施中获得了这个数据集,这是一个由世界各地志愿者收集的生物多样性数据的绝佳资源。如果您想跟随本笔记本,特别是使用我们在这里使用的相同的数据集。如果您遵循我们的数据引用,特别是我们提供的事件数据集链接,您将得到与我们在这里使用的数据集完全相同的数据集。请注意,我们已经过滤了从2010年初到2020年5月在澳大利亚出现的物种。

在我们的演示大纲中,我们将从加载数据开始。因此,首先,检查我们是否可以使用pandas加载数据集,但然后继续探索我们如何使用Koalas这样做,然后我们将开始一些探索性数据分析,查看空值,分类列的值类型,并利用Koalas的绘图功能来更深入地了解我们的完整数据集。然后,我们将继续使用考拉分析澳大利亚的考拉数量,特别是,我们想做的是调查我们的数据是否反映了近年来澳大利亚考拉数量下降的新闻。然后,我们将以如何使用考拉来并行化模型训练的演示结束。特别地,我们将使用流行的开源时间序列预测库Prophet来展示我们如何利用Spbob下载地址ark的底层分布式特性,Koalas使用Spark并行训练独立模型并预测澳大利亚动物的种群数量。除此之外,我们还将这些图表和预测记录到MLflow,这是一个用于管理端到端机器学习生命周期的开源平台。bob下载地址bob体育客户端下载在我们深入讨论之前,这里有两件事需要说明,那就是Databricks运行时版本和我们在这里拥有的库依赖关系。所以我们在Databricks运行时最新版本上进行了测试,特别是ML运行时版本,它是7.0 ML Beta。

除此之外,我们还安装了Koalas,这是FbProphet上最新的包,也是我们集群最新的包版本。

通过这本笔记本,我们寻求实现的总体目标是展示考拉成功处理大数据的能力,而熊猫有时会做不到这一点。因此,我们想要展示Koalas API与熊猫API的相似之处,以及它如何实现无缝过渡,特别是对于那些来自熊猫背景但想要利用Spark分布式特性的人。有了这些,让我们深入研究加载数据。

如前所述,我们将使用2010年1月1日至2020年5月1日期间澳大利亚动植物的详细数据。让我们首先看一下我们想要读取的底层CSV文件。注意,我们已经将CSV文件存储在Databricks文件系统中。Databricks文件系统是一个分布式文件系统,它被挂载到Databricks工作空间中,可以在Databricks集群上使用。我们可以在Databricks中使用%fs magic命令,并调用ls查看我们创建的sais2020csv目录。我们看到这包含了我们想要加载的gbif csv文件。特别要注意的一点是这个文件的大小,我们看到它的大小接近18g,如果我们想要加载pandas,这可能会带来一些问题。

由于它的大小,我们天生就会受到单个机器上用来加载数据集的内存量的限制。因为pandas是一个固有的单机库,当我们把这个数据集加载到我们这里设置的集群上时,我们会把它加载到驱动程序本身上,所以驱动程序从集群上。如果我们确实想使用pandas加载这个数据集,我们可以按照标准协议将pandas作为pd导入,调用pd。readcvs,传入CSV文件路径,然后还有分隔符注意,这是一个标签分隔的CSV文件。

如果我们尝试这样做,我们会遇到内存不足的错误,因此驱动程序内存小于18g,但我们试图将所有数据加载到驱动程序上。你会在你自己的机器上遇到这种情况,如果你有一台,如果你没有至少18g的内存。

如何加载CSV文件呢?一种方法是使用考拉。如果我们想要使用Koalas,有一件事要注意,再次,正如我们讨论过的,Koalas是在Spark之上重新创建pandas API,有了它,我们能够做的是从上面加载CSV文件,使用Koalas等效的readcsv函数。在此之前,让我们导入我们的Koalas包,但还要设置我们刚才讨论过的默认索引类型。

要导入考拉,我们需要调用importdatabase。koalas as ks,使用ks,这是koalas的标准化别名。我们要做的是设置我们的默认索引类型为分布式。选择这个的基本原理是,我们的数据集相对较大,我们也不显式地要求索引一个接一个地单调增加。为了进一步讨论这个问题,我提供了关于这些索引类型的更多信息的链接。但是现在,让我们通过调用ks来设置这个默认的索引类型。设置选项。

在我继续调用readcsv之前,我想指出的是,我们可以这样做,但我们可以用一种更高效的方式,通过使用Delta作为底层数据源。考拉和熊猫的另一个优势是我们可以从Delta表中加载数据。

特别是Delta Lake是一种高性能的数据存储方式。因此,它是一种提供ACbob下载地址ID事务的开源存储,它提供可扩展的元数据处理,以及一种统一流和批处理数据的方法。使用Koalas,我们可以从给定的Delta表中读取数据,并以并行的方式进行读取。

要做到这一点,我们可以调用ks。readdelta,并提供我们拥有的sais 2020 Delta表。

我们可以通过调用.shape来检查Koalas DataFrame的大小。请注意,实际的DataFrame本身通过Koalas DataFrame,我们刚刚加载为kdf,重要大小,所以它是3500万行,50列。

我们从Koalas得到的另一件事是,我们可以对DataFrame使用SQL查询。因此,由于子句实际上是Spark之上的包装器,我们可以有效地运行SQL查询,利用底层的Spark SQL引擎。首先,让我们发出一个SQL查询,我们要查询这个属Phascolarctos。对于那些以前没有接触过它的人来说,这似乎尤其不合适。Phascolarctos是考拉的属名。

提供我们的SQL查询,我们能做的就是调用SELECT COUNT,把它作为ks传入。sql,我们看到的是,我们有44000,或者,刚刚超过44000个对考拉的观察实例。

此外,我们可以通过简单地执行kdf来获取列名。列,就像你用熊猫的数据框架一样。有了这些,让我们开始一些探索性数据分析。让我们开始挖掘使用考拉的实际数据本身。

我们已经加载了数据集我们想要进行一些基本的分析。类似于pandas,我们从Koalas得到的是完全相同的功能,即在Koalas DataFrame上调用.describe。这里需要注意的是,我们在非缺失值的数量、平均值、标准差、最小最大值以及中位数、上下四分位数方面得到了完全相同的输出。

要获得空值,我们可以类似地使用类似熊猫的语法调用kdf.isna.sum。对于那些来自PySpark背景的人来说,这显然不像使用PySpark那样啰嗦。

我们想要指出的一件事是我们接下来要做的很多分析都是基于给定的植物和动物物种的数量。对于这个,我们要做的是保存单个计数,其中它不是空的,同时我们也有月份和年的记录。我们传入这些条件,过滤kdf DataFrame, Koalas DataFrame。

pandas中一个流行的功能是PySpark中没有的值计数功能。

因此,虽然你可以在PySpark中这样做,但它要冗长得多。

因此,我们可以从Koalas DataFrame中获取王国列,并调用.value counts来获取给定类别列的实例计数。特别地,我们要将其归一化以得到百分比的真实指示。我们看到动物占了很大的比例,其次是植物。

考拉给了我们一些超级强大的东西,就是我们可以用类似熊猫的语法创建数据可视化,但能够在整个数据集上这样做,在这个例子中,它的大小是18g。我们来计算我们王国的价值,然后得到条形图。我们在这里可以看到的是,它再次证实了我们上面所看到的关于动物王国的观点,这些观点来自我们数据集中相当大一部分的观察。

让我们深入分析一下我们的专栏。特别地,我们要做的是查看我们的类列。所以说,类,是一种生物分类。所以class是分类学上的等级,属于门。在生物学中,我们有不同类型的分类。

我们看到我们有131个独特的类。

如果我们想要得到总的计数,不同记录的数量,以及这些类的每个记录的平均计数。

对于那些有熊猫背景的人,我们可以用Koalas语法快速做到这一点,因为它和熊猫是完全一样的,尽管我们能够在整个18g的数据集上做这些聚合。

特别地,我们在这里做的是按类列分组,我们将把每个组的单独行加起来,然后得到每个组中实例的计数。注意,这里我们提供index=false来重置索引。我们可以使用经典的pandas功能重命名列,就像.columns那样,并传入一个新列名列表。

然后,我们创建一个列,计算每个类的每个不同记录的动物或植物数量的平均数量。所以这给我们的是,再一次,对整个数据集进行聚合,我们可以得到不同录音的数量,每个录音的平均计数。我们在这里看到的是,我们有,嗯,特别是鸟类,因此,鸟类改头改面,嗯,我们有近1500万个不同的记录。平均来说,我们看到每个记录或观察大约有九只鸟。我们发现,在我们的数据集中,开花植物是下一个最常出现的。如果我们想要得到每个记录的平均计数的分布呢?我们能做的就是利用考拉的绘图功能。这里我们要做的是使用。hist函数,在上面的列上调用这个。

我们看到的是绝大多数班级的平均人数都远低于1000。所以我们看到了这个峰值,但我们也看到了这些巨大的异常值,因此你有大量的计数。

所以每次记录的实际植物或动物的数量。所以有些东西严重扭曲了我们的记录。让我们更深入地研究一下。

我们能做的是,再一次,按每个记录的平均计数排序我们的值,我们可以使用这种风格的背景梯度,再一次,突出显示我们有特别高的计数,或者特别高和独特的记录。有一件事需要注意,我们有蓝藻科,这是一组光合细菌。我们看到每条记录有将近七百万个实例。我想这是可以理解的,因为在一个特定的地区,你可以有大量的微观藻类。

让我们继续分析一下澳大利亚考拉的数量。这背后的基本原理是,在澳大利亚,考拉的数量近年来一直在下降,这是由于栖息地的破坏,森林大火的影响,尤其是在去年年底,家养狗袭击,道路事故。所以我们要做的是分析我们的数据本身,看看我们的数据集是否证实了这样的报告。

所以我们首先要做的是筛选到我们从上面探索过的天才,Phascolarctos,再一次提到这个。我们有了考拉的数据框架,包括王国、门、纲、目、科、属、种。我们看到我们有单独的计数。那么在这段录音中,有多少只考拉在场?这个区域有一个,三个,我们还提供了经纬度,它在哪里,所以精确的位置,事件发生的日期,日期,月份,年份。

当我们这样做的时候,我们看到的是我们有21,919个考拉个体的记录。

值得注意的是,这是在我们删除了任何空值之后,所以个人计数。具体来说,我们想要的是我们至少有一个单独计数的输入,还有我们的月和日,所以自然地记录日期。

让我们检查一下日期范围,我们可以用考拉做的是,再次抓取事件日期上的事件日期时间,得到最小值和最大值,这确认了我们从2010年1月1日到2020年5月1日。

那么每个省有多少观测值呢?所以我们能做的就是对州省的记录进行数值统计,我们看到新南威尔士州的考拉观察最多,昆士兰州和南维多利亚州分列第二和第三。我们看到首都领地和北领地有非常少的考拉记录。

那么每次观察通常有多少只考拉呢?一个快速的方法是,再次使用直方图功能。让我们看一下单个计数并调用.hist。再一次,我们看到的是有一个巨大的峰值,表明总的来说,我们的观察,我们每次观察的考拉数量相当低,但事实上,我们有超过5万只的观察,这表明这里有一些不寻常的东西。我们能在一个特定的地区养5万只或5万只以上的考拉吗?

有人会对此表示怀疑。

因此,有记录的考拉数量巨大的例子很少。我们将把这些作为异常值,删除任何超过100只考拉的记录。为此,我们将过滤我们的个人计数,使其小于100,并再次调用.hist来查看是否正确。再一次,我们仍然有一个相当倾斜的分布,但在大多数情况下,我们看到在大多数记录中,我们每次观察不到20只考拉。

为了了解自2010年以来澳大利亚考拉的总体数量,让我们计算记录到的考拉出现的次数,以及统计到的考拉总数。我们要做的是得到每次记录到的考拉的平均数量。每次观察,每个月有多少只考拉?要做到这一点,我们将遵循与上面所做的相同的聚合模式,因此按年和月获得一个组,我们将把单个计数加起来。

求总和和观测值。然后,我们将使用.merge合并函数将这两个Koalas dataframe连接在一起。我们每年每月都要加入。我们将重命名我们的列,以拥有总的记录计数和记录数量,然后我们要做的是创建一个额外的列,它是平均记录计数。因此,对于每个月,我们想要看到的是总计数除以录音的数量,从而得出每个给定月的平均类型。

注意,我们在这里调用的是排序值。需要指出的一点是,因为我们在这里使用的是Spark,排序值将触发一个Spark作业,你将在集群中移动你的数据。因此,一定要注意调用.sort值。

对最近12个月的升序错误进行排序,我们看到从今年5月到去年6月,我们有每个月的记录数量,考拉的总数,然后是每个月的平均数量。但让我们实际地想象一下,看看考拉的数量是否真的随着时间的推移而下降。

我们要做的是画出考拉数量随时间的变化。为此,我们要做的是,首先,使用SQL创建一个聚合,将年和月列连接起来创建一个年-月列。

然后我们要做的是将年-月列转换为日期-时间格式。所以我们可以使用Koalas to date time功能来抓取我们的年-月列并将其转换为日期时间。

实际上我们需要这样做,所以我们可以把它画出来,所以它对应于时间。

按年月对值排序,同样,我们在原地做这个。

我们现在做的绘图是我们想要把这些传递到matplotlib中。

为此,我们要做的是调用。To numpy。因此,我们希望从实际列本身创建numpy数组。这里需要指出的是,只有当我们知道得到的numpy数组很小时,才应该使用它。在本例中,我们将把所有数据收集到集群的驱动程序内存中。所以一定要注意这些数据的大小。所以我们要获取我们的x轴值,我们的y值,因此我们有总种类和录音数量,我们要做的是绘制从2010年到2020年5月考拉的每月总计数和每月录音数量。

我们使用matplotlib和seaborn, seaborn是matplotlib之上的包装器,用于在这里插入一些样式首选项。所以我们画了两个坐标轴,一个是考拉的总数量,另一个是记录的数量。所以我们可以看到,一些特别突出的东西,是我们在2014年底,2015年底和2016年底有这些巨大的峰值。特别是,我们看到这些的总数非常大,录音的数量也非常大。还有一件事要注意的是,我们确实有一些东西看起来像是考拉的数量随着时间的推移,从2019年年底到2020年的倾斜。这可以指向几个因素,特别是去年年底发生的可怕的森林大火。

为了更真实地了解考拉的数量,我们可以做的一件事是,从2010年到2020年5月,每个月的平均记录考拉的数量。

所以我们要做的是画出一段时间内考拉的月平均数量。所以我们在这里所做的是绘制每次出现考拉的平均数量,看到我们在2015年底有一个巨大的峰值,当时有大量的记录,但总数量较小。

至于我们在这里看到的下降曲线,我们看到,实际上有一点上升,所以看起来数字并没有严重下降。这里要指出的关键是,我们能够利用完整的数据集来探索底层数据,但使用类似熊猫的语法来这样做。因此,如果你有熊猫的背景,能够无缝过渡到处理更大的数据,尽管使用的语法是你非常舒服和熟悉的。在我们的最后一部分中,让我们看看Koalas的并行化和模型训练。特别地,我们要用到的是Facebook的开源时间序列预测库,叫做Prophet。bob下载地址这是一个超级强大和流行的软件包,使用起来非常直观。这里需要指出的一件事是,我们的目标不一定是拟合一个高度准确的预测模型,但更多的是展示我们如何利用考拉并行训练许多模型的功能和灵活性。如果我们想用熊猫来做这件事,我们天生就会被限制在一个连续的性质中。

所以我们首先要做的是筛选我们想要预测的类别。所以我们要选一些在澳大利亚很常见的知名动物。所以我们要拿考拉,也就是Phascolarctos,袋鼠,Macropus,凤头鹦鹉,都是鸟类,Cacatua,还有鸸鹋,也是一种更大的鸟,叫做Dromaius。这就是他们的天才名字。然后,我们将对原始的Koalas DataFrame应用过滤器。我们将应用一些聚合来获得这些类的计数和观察总数,像以前一样重命名列,然后像以前一样连接年列和月列,这样就能够使用SQL功能发布、查询和创建它们。然后我们将我们的年月列转换为日期时间,这样我们就可以绘制,然后也传递给先知,以便能够预测。

在我们真正讲这个之前,我想讨论的是它是如何工作的。我们要用到的是groupby。应用考拉带来的方法。这就是熊猫的典型分组应用。然而,我们要做的是把这个用在考拉身上。我们想要演示的是,我们可以对一组数据应用一个仲裁Python函数。

在这个例子中,我们将使用我们的预测函数,我们将在下面定义它。这将适合先知模型,日志参数和MLflow的绘图。然后我们要做的是,我们传入一个Koalas DataFrame,我们有一个Koalas DataFrame返回。但是,请注意,我们所能做的是返回一个DataFrame,与输入相比,它可以有不同的行数和列数。实际上,我们在实现groupby-apply方法时使用了Sparks pandas UDF功能。这样,我们就可以并行化这个函数的实际使用。因此,每当我们在内部使用熊猫的UDF时,每个组都在处理熊猫的数据框架。我们可以在给定的函数中使用pandas API。

需要调用的一件事是,当调用groupby-apply时,Koalas对一个小样本执行一次函数,以推断类型。这可能会很昂贵。例如,在聚合或排序之后创建数据集。为了避免这种情况,我们要做的是指定我们的返回类型。所以我们能做的是在应用的函数中提供返回类型提示,我们将在下面看到。

当我们预测每一个单独的属,每一个单独的动物时,我们想要制作一些不同的图。所以我们希望能够看到每种不同动物的预测。为此,我们将利用MLflow并将实际的图记录为工件。

如果我们浏览Mlflow文档,就会发现Mlflow是一个用于管理端到端机器学习生命周期的开源平台。bob下载地址bob体育客户端下载我们可以跟踪实验,在Databricks中,它基本上被烘焙到我们的工作区中,因此我们可以记录到给定的实验位置,设置一个实验位置并记录不同的运行。

首先,我们将导入Mlflow,然后导入跟踪Mlflow客户端。我们将指定MLflow实验。

这是在dbfs中给定的路径下。

我提供了我的实验名,koalassais20exp,实验。我要把这个设置为我的MLflow实验位置,然后我要获取实验ID,然后跟踪。

现在我定义了一个函数,我想把它应用到给定的Koalas DataFrame组中。实际上,这个函数同时作用于一个给定的基团。导入先知,导入NumPy,我们也会用到,然后导入matplotlib。

注意,我们提供了这个类型int,一个返回类型int,我应该说,在这里我们已经指定了作为结果的Koalas DataFrame的类型。请注意,我们在这里内部处理的是熊猫的数据帧。这是基于这样一个事实这是一个熊猫UDF我们应用于每个单独的组。在这个里面,你可以想象在一个给定的熊猫的DataFrame上工作,从中我们抓取我们的属名。我们将获取年-月作为日期列,我们将获取总计数作为y计数。所以我们想要预测的东西。那么,每个月这些动物的总数是多少?然后我们要做的就是打开这个MLflow代码块。因此,您希望记录每次运行,因此,每个天才类型的运行拟合一个模型,然后将其提供给Mlflow。我们能做的就是从上面传入实验ID,我们给它一个运行名。 So we’re gonna pass in our genus name, call this Prophet forecast, and we’re going to define some parameters that we want to, number one, record to MLflow, but then also what we’re putting in as arguments to our Prophet function. So what we’re going to do, track our daily seasonality and Boolean, our weekly seasonality and our yearly seasonality, pass these in as parameters that we would like to log to MLflow. So we’re going to log genus, we’re going to log, like I mentioned, daily seasonality, weekly seasonality, yearly seasonality, we’re going to define our Prophet model, we’re gonna fit our Prophet model to our DataFrame. So our panda’s DataFrame that we have above.

然后我们会对未来进行预测。所以我们想预测未来三年以月为单位的频率。我们会有这个预测,它会包含我们的预测以及上下限。我们想要得到的另一件事是我们的预测和分量的图表。所以基本上,看看我们可能有的季节性或任何趋势?要做到这一点并使用MLflow捕获这些图,我们可以做的是将这些数字保存到指定的路径,然后根据预测路径记录工件。我们用类似的方式记录了预测路径和成分路径。然后我们有一个我们想要的返回数据框架。本质上,我们处理这个就好像它是熊猫的数据帧。返回这个熊猫的DataFrame,当它在我们所有的数据中聚合时,整个groupby-apply功能的返回将是一个Koalas DataFrame。 To actually then employ this, what we can do is call our grouped Koalas DataFrame from above. So what we have from here, we have our genus, our year, month, number of recordings, total count, year month. We’re gonna group by genus.

然后应用预测函数。

当我们运行它时,请注意我们不会在引擎盖下启动任何Spark作业。这只会在我们对完整数据集调用操作时发生。要做到这一点,我们能做的就是计算结果DataFrame的长度。

一旦我们运行这个,我们将得到一个结果考拉数据框架,它将是这个预测df。

有了这个,我们就有了记录到MLflow的运行。我们可以通过调用搜索运行以编程方式查询这些运行。MLflow。search运行。让我们看一下鹦鹉,我们看到的是我们有一个给定的运行ID。我们已经传入了。我们可以使用搜索功能来查询它传入了test genius,我们会根据开始时间排序来得到最近的运行。

如果我们想要回调之前记录的内容,我们可以传入这个给定的artifact url。因此,每个单独的运行都将有一个特定的工件url。

我们可以调用这个来获取给定运行的预测图。这就是呼叫和阅读我们对凤头鹦鹉的预测,我们可以看到,我的意思是,这不是一个很好的表现预测。我们还没有从度量的角度进行度量,但是我们在这里想要演示的是并行创建这些模型的能力。如前所述,要在pandas中做到这一点,它将以顺序的方式实现。有了这个,我们能够做的是通过我们的分组应用功能并行化每个单独模型的实际模型训练,并在Spark分布式本质的底层功能上使用Koalas。

考拉——在路线图上

因此,就考拉即将发布的路线图而言,就即将发布的版本而言,2020年6月/ 7月将看到考拉1.0版本,它将支持新的Spark 3.0。从Databricks的角度来看,在2020年7月/ 8月,我们将看到预装的考拉1。在Databricks Runtime和ML Runtime 7.0版本。那么你如何开始和考拉相处呢?

考拉——刚开始

所以无论是PIP安装考拉还是conda安装都非常简单。文档中有一些非常有用的资源。有一些非常好的10分钟考拉的例子,它将带你了解考拉的所有基础知识以及一些陷阱,以及GitHub,在那里你可以在github.com/databricks/koalas上看到。

非常感谢。希望您能看到Koalas可以带来的好处,特别是在引入现有的pandas代码方面,并能够获得您可以获得的好处。

点击这里观看更多Spark + AI课程

免费试用Databricks
«回来
关于Niall Turbitt

Niall Turbitt是Databricks机器学习实践团队的高级数据科学家。他与Databricks客户合作,构建和部署机器学习解决方案,并提供专注于Spark机器学习的培训课程。他拥有都柏林大学学院的统计学硕士学位,之前在从电子商务到供应链和物流等一系列领域构建可扩展的数据科学解决方案方面有经验。