本演示文稿概述了 JMP 18 对 Python 的支持的最新重大更新,该更新与 Python 的集成更加紧密,并显著改善了以 Python 为中心的用户体验。在 JMP 18 中,您将能够:
这些暴露给 Python 的 JMP 功能将随着时间的推移而扩展,但目前的重点是关键功能和内存数据支持。在本次演示中,您可以亲自了解这些变化及其背后的原因,并见证为 JMP 用户提供的新功能。讨论了通过使用外部 Python 包实现的可扩展性和数据导入功能,并演示了使用外部包通过 Python 接口访问 GPU。
大家好,我是 Paul Nelson。我来这里是为了谈谈 JMP、Python 和我们的下一步计划。在去年的一次演讲之后,我们决定提高我们的水平。JMP、Python 还有改进的空间,这就是我在这里要谈论的。
客户面临的最大挑战是 JMP 14 到 17 的 Python 支持是否能够正常工作。如果可以正常工作,那就很好了。但通常情况并非如此。由于 Python 发行版众多,环境各异,测试起来很困难。
有时,Anaconda 可以在 Windows 上运行,有时,Python 虚拟环境也可以运行。由于每个人的 Python 都不同,因此脚本甚至不能依赖于用户环境中的通用 Python 版本。
在 JSON 编辑器中编辑 Python 代码既困难又不愉快。这是一种代码块由空格分隔的语言。当您不得不将其作为字符串粘贴到 JSL 中时,这会变得很困难。旧版本的 Python JMP 中的错误报告不足,这让调试 Python 脚本变得很困难。
最后,数据表和矩阵传输是通过文件系统完成的,数据表则以 CSV 文件的形式完成,如果数据量很大,则传输速度会很慢。大类数据可以正常工作,但数据量大时速度会很慢。
我们的愿景是确保 Python 集成能够正常工作。无需配置。为此,我们隐藏了 Python 版本 3.115 和 JMP 18.0,并将其作为 JMP 的一部分进行安装。这是一个通用环境,所有用户都将拥有相同版本的 Python 和相同版本的 JMP。
我们更进一步,确保 JSL 和 Python 之间的数据传输是内存传输,并且对内存进行零拷贝访问。我们为 Python 程序员打造了一个引人入胜且高效的环境。我们现在还有一个 Python 脚本编辑器,其中有代码着色和语法突出显示。
您可以直接从脚本编辑器运行纯 Python 脚本,并且在 Python 环境中,您可以直接访问 JMP 数据和日志,可以调用 JSL 并从 Python 访问数据。我们大大增强了对 JMP 日志和嵌入式日志的错误报告。
由于它是一个通用环境,因此我们现在可以对其进行测试和验证。我们的环境与您应该看到的相同。我们在脚本索引中添加了一个完整的 Python 类别以匹配……解释并展示导入 JMP 包和其他几个实用程序包现在可用的示例。
另一部分是,这使我们能够通过 Python 庞大的软件包库扩展 JMP 的功能。我们并不是想制作一对一的替代 JSL。相反,我们试图在 JMP 中为 Python 编程提供一个熟悉且高效的环境。
这是一次现代化、一次改造和一次大修。JMP Python 集成的一些原始设计决策存在局限性。我们已尽一切努力将变更造成的破坏降到最低,同时为未来奠定坚实稳定的基础。
完全可以预料,这种破坏仅限于向 JMP 的过渡。关键方面是,我们现在仅支持随 JMP 一起提供的 Python 版本。可以将其视为私有的 JMP 虚拟环境。
脚本中将发生的另一件事是,我们改变了 Python 发送数据表的工作方式。它现在创建一个 JMP 数据表对象。这是对 JMP 数据表的实时访问。内存中的副本,您可以编辑和修改现有表。它不再是副本。
JMP 14 到 17,通过文件系统中的临时 CSV 文件复制数据来创建 pandas DataFrame 对象。对于大数据。导出到 CSV 会变得非常大而且很慢。您还存在潜在的精度损失问题,因为您要从二进制格式转换为文本格式,然后再从文本格式转换为二进制格式。
如果您确实需要相同的功能,我们在示例文件中为 pandas Python 提供了一个 DT,它提供了两个 pandas 函数。它的工作方式与以前内部的工作方式相同。它会创建一个临时的 CSV 文件并告诉 pandas 导入该 CSV 文件。
还有一个 JMP 到 pandas 示例,展示了如何从 JMP 数据表对象在内存中创建 pandas DataFrame,该对象一次使用来自 JMP 列的一列在 pandas 中构建一列。
Python Send Matrix 是另一个过去通过文件系统写入的矩阵。它会写入一个双精度文件,让 NumPy 读取该文件。现在,这通过内部内存进行,并且它是对矩阵的实时引用,而不是副本。
JSL Python API 的大部分内容保持不变。所涉及的更改主要是删除用于配置原始 Python 支持以选择 Python 版本的弃用参数和函数。
唯一删除的 API 是 Python 获取图形函数,该函数从 Matplotlib 检索图像,在我们的脚本索引中,我们有一个示例,它精确地展示了如何仅使用 JSL 和 Python 代码在内部执行与 JMP 相同的操作。已经演示过了。让我们看看。让我们退出演示。
这里我们有 JMP。我想展示的一件事是,您会在工具栏中看到 Python 图标,在文件新菜单中我们有 JSON 脚本,但现在我们有了新的 Python 脚本。我们将打开 Python 脚本编辑器。
我们可以使用显示嵌入日志。我们有一个 JMP 导入包。导入 JMP。我们已尽力确保已放入 Python 文档字符串,以便您可以运行 help JMP Python。我们可以运行该脚本。您会看到我们已经记录了这个顶级 JMP 导入包中的对象和函数。
有一堆常量。所有大多数特殊目录都已表示出来。所以我们可以这样做。现在我从 Python 中执行。JMP 打开。JMP,好吧,我今天不能打字,JMP。样本数据。另外。Big Boss。就像在 JSL 中一样,我们可以选择代码行并在脚本中运行它。我们有大类。
现在,这不是副本。我们可以获取该对象。我们可以将 TT 等于 JMP 打开,这样我们就有了一个引用。但我们也可以将 TT 等于 JMP.current。这将为我们提供对当前数据表的引用。
好吧,我们可以做一些事情,比如打印 TT。这告诉我们这是一个大类。它有 5 列乘 40 列。但更有趣的是,你可以做更多。TT。名称。我们可以使用 Python 切片运算符。我告诉它从零开始为名称列中的所有其他名称提供给我们。
我们在 Python 中建立索引,就像 Python 一样,我们应该从零开始建立索引。我们的数据表索引是逐行的。由于我们采用的是列主格式,如果我们打印。其他。名称,我们会得到 Katie。Jane。Lilly。James、Barbara、Susan、Joe 和 David。
这是一个实时访问,所以我们可以做类似的事情……我们可以做类似 TT 的事情,我们可以使用名称或列索引。列我们打印出来。这给了我们选择。这是你的……我选了一个,对,刘易斯。对不起。零零。是凯蒂。因为数据表是实时的。你可以做凯蒂
稍等。小写。混合大小写。现在我们在嵌入日志中看到输出。您会注意到。我们在数据表中对其进行了更改。这使您能够修改数据表、以 Python 方式访问数据表,并且能够从 Python 创建数据表。我们付出了努力。
我们现在有了脚本索引。我将展示……这里,就像我说的,获取图形已被弃用。它实际上不再是 JMP 中的有效函数,但脚本索引中的示例向您展示了如何从您以前所拥有的功能转变为我们在 JMP 内部实际执行的操作,以保存图形并打开图像并创建一个包含图像的新窗口。
Python 中心环境的一个不错的新功能是它们属于 Python 类别,这是一个独立的类别。JMP 导入包有数据表对象。每个对象都有示例,我们可以创建新列,可以添加行,并保存表。其上的属性,例如获取表名。所有这些。
这将创建一个由 Python 提供支持的新数据表。我们还有一个 JMP 实用程序。您可以在哪里,或者我们可以使用它来运行 pip JMP,因为它有自己的独立环境。当我们安装软件包时,它们需要进入 JMP 的独立环境
希望您不会遇到 JMP 中的软件包与其他东西或其他 Python 安装冲突的问题。我们将其隔离。因此在这种情况下,如果您必须……我们有 create jpip 将创建一个脚本,该脚本将包装 Python pip 脚本以允许您安装,或者您实际上可以从 gem 中的 JMP utils 类运行它。
这里我们将显示 pip 命令列表,这将输出。调用 pip 并返回我在 Python 环境中安装的软件包列表。另一个示例是,您实际上可以安装软件包。这将直接从 JMP 内部运行。
有几个注意事项,这就是为什么 create jpip 存在的原因。如果包像 NumPy 一样加载到内存中,因为它有一个共享库。Windows 可能会阻止您更新该包。有些包需要编译。这些可能必须从命令行完成。
其中一些可能有效,但可能需要从命令行运行。这就是为什么您需要创建一个 jpip 包装器脚本。运行时,它会弹出并为您提供一个用于写入文件的目录,然后选择文件夹,它将写出一个可从命令行运行的 jpip 包装器脚本。
在那里运行它时,您需要在安装后使用减号减号用户标志。当从这里调用它时,我们会自动为您执行此操作。还有一个 JSL 函数也可以运行安装。Python 安装包甚至更简单。您只需运行 JSL 脚本,它将在后台调用 pip,正确设置将包放入 JMP 隔离环境所需的所有环境变量。
开始吧。然后我们可以继续向您展示更多演示。这是简单的基本内容。但我们也……整个过程的一部分是使 JMP 对 Python 更友好,并且更容易通过其他 Python 包扩展 JMP 功能。
人们经常希望我们的支持轨道之一是能够导入 parquet 文件。此演示从我的驱动器中获取并拉取一个表。我从互联网上下载的。正确。然后打印出 parquet 文件的形状,并根据 parquet 文件中的数据逐列构建 JMP 数据表。我们将清除日志。实际上看我怎么做。
我没有运行脚本。我肯定是突出显示了某些内容。就是这样。这是一个 parquet 文件。我们在 PQ 导入时对其进行了 pyrrow parquet。Parquet 文件属性。它有一千行。形状为 13 列乘以一千行。Schema 显示了列名中的模式。
在最底部,我们可以展示另一件事,那就是我们还没有完成我们想要在 Python 方面改进的事情,但在此之前,您可以从 Python 运行 JSL。
尽管 Python 代码尚不支持设置、显示宽度甚至更改列类型等操作。您可以创建新列,但无法通过 Python 更改其类型。这些都是我们想要实现的功能,但现在您有一个解决方法,即能够从 Python 中运行 JSL 脚本,就像您能够从 JSL 中运行 Python 一样。
现在,有了这个增强的环境,您可以在两者之间来回调用。Python 可以运行 JSL 脚本。Python 中的调用随后可以在 JSL 环境中运行,因此您可以嵌套调用来实现原本不可能实现的事情。这就是将 JMP 本身无法处理的数据类型的 parquet 文件带入 JMP。但我们通过导入 Python 包来支持这一点。
另一件让我很感兴趣的事是,我不太擅长统计学,但我擅长图形和其他数学。这里使用的是开放计算语言或 OpenCL。我们导入了 OpenCL 包。要创建曼德布洛特分形,我们先向你展示一下 CPU。使用 CPU 执行此操作。这实际上需要大约 16 秒才能运行。
这很痛苦,你会注意到 JMP 本身很慢。没有响应,因为此时 Python 拥有控制权。如果你让正在运行的单元在紧密循环的深处等待,你将能够重新获得控制权。这是使用 CPU 来生成这个分形。
现在让我们改变它,让它运行 GPU,然后运行脚本。轰。这只需要几分之一秒就能生成图像,保存它并将其打开到脚本中,看看我们说什么。使用 GPU 需要 16 秒,而……但只要我们回溯得足够远。当我在这里演示时,在 CPU 上执行它实际上需要 32 秒。
如果您想将 GPU 与 JMP 结合使用,现在您可以通过 Python 来实现。我们尝试了 PyOpenCL 和 PyCuda,因此如果您有 Nvidia 卡,并且正在使用 Cuda。您可以引入 PyCuda 或更通用的 OpenCL。进一步增强 JMP 的计算能力,不会浪费您的桌面功能。
我们还可以通过 Python 连接到 SaaS。SaaS 有一个 SaaS y。包,我们已将其安装到…这是我的一位同事整理的一些工作。让我们清除日志。我们实际上可以看到我得到的内容,然后我们可以运行脚本。
它正在按要求收集这些信息。我们开始吧。这个实际上使用 JSL 来尝试确保已安装运行脚本可能需要的所有 Python 包,您可以进行设置。这就是您在日志中看到的内容的一部分,表示这些已经满足要求。以下是运行连接到 SaaS 的脚本后返回的所有结果。使用 SaaS Py 包,我们将回顾日志。
脚本会回显到日志中。就像我在这里说的。我们有连接到 SaaS 的连接信息,运行产品。我们的物流。然后返回输出值和 SaaS 会话的结束。
我们听说 TensorFlow 可能是人们感兴趣的东西。这是一个非常简单的例子。错了,我又安装了 TensorFlow,并且这是从 JSL 运行的,但我们可以轻松地从 Python 运行此代码。
它运行张量流并创建总和。我相信你会想出比我演示的更复杂的用法。Py digest 是另一个。它是屏幕。这是我创建的一个示例,用于展示其中的几个内容,包括运行 JSL,它允许我使用 JMP 选择目录来选择目录,JSL 选择目录并在 Python 脚本中使用它。这都是纯 Python 脚本。它允许我选择一个目录。
创建目录中每个文件的校验和。将其放入 SQLite 数据库,然后从数据库创建 JMP 数据表。它为您提供了一些数据库编程知识,为您提供了一些 JMP 知识,包括从 Python 创建 JMP 数据表和从 Python 运行 JSL。
要选择的目录。我这里有很多数据,所以我们就选择演示文稿 parquet 文件夹或选择文件夹。现在我们有了一个校验和表。他们创建了……它检查目录中的每个文件,给我它们的路径名和文件内容的 MD5 校验和。构建数据库。从 Python 构建 JMP 数据表,并使用 JSL 设置列宽。
再次强调,这是我们尚未实现的,但已列入考虑范围。但您可以用……如果您愿意,可以用 Python 执行 JSL 操作。
有些人可能想使用 R。好吧,在这种情况下,我已经在我的机器上和我们的环境中使用我们的服务创建了一个连接。对于 Linux WSL 环境来说,在 Windows 系统内运行我们的服务更容易。
我这里有一个 R 服务精灵在运行。使用保留的客户端。我只做了一点小事,在服务器上创建一个 R 向量,对结果求和,然后运行此脚本。我们已经连接到我们的服务器。我们得到了向量,并将所有元素求和得到六个。我们的 py2。我们还有一些示例。如果您想要一些可以从命令行运行的非常简单的东西,这里有一个关于如何使用某些进程从命令行运行 R 的示例。
最后,Jon Saul 帮助他完成了统计工作。创建一个使用 HDB 扫描 Python 包的示例。Matplotlib 有一点需要注意。Windows 上的 Matplotlib 没有图形后端,因此如果您想查看任何输出,我们发现 PyQt5 效果最好。
作为后端和。在 Mac 上,如果您使用 Matplotlib,我们将强制将其设置为 AGG,即非图形后端(如果您尚未安装)。PyQt5 或 PySide 之一。因为 Mac 上的 Matplotlib 会自动选择 cocoa 后端,并且存在一个错误,即当您在 Mac 上关闭 Matplotlib 中的最后一个窗口时,它会导致 JMP 退出。
为了防止这种情况发生,我们强制执行,如果我们在您的系统上发现 Matplotlib,如果有后端,我们将加载 Matplotlib 并强制它使用 Qt 后端。否则,我们确保它是一个非图形后端。我们已将其设为后端。我的机器上有 PyQt5。使用此示例,我们在 HDB 扫描上运行一些集群。
现在让我们显示嵌入的日志。我们将运行脚本。我们得到的是 Matplotlib 数据表中生成的一个图表。在这里您可以看到我们进行了 JMP 打开并获取了 DT 引用。这些是我拥有的样本。相信吧。
我要重新开始演示。我们近期的重点是继续改进和完善。提高 JMP 和 Python 之间的数据互操作性。目前,列修改编辑的限制是您可以创建任何类型的列,但只能修改和获取数字和字符列、表达式列或状态列的值。链接表的创建都将在未来完成。
虽然 Python 脚本编辑器支持代码着色和语法高亮,但它还不支持自动缩进。我们也会研究这一点。
现代化的目标是让 JMP Python 集成开箱即用。您应该能够使用 JMP 和 Python 高效工作,无需任何配置。也就是说,如果它不起作用,那将非常具有挑战性。为什么不减少 Python 程序员在 JMP 中高效工作的时间,并使 JMP 成为分析中心?提高 JMP 的能力。由于使用外部 Python 包可以轻松扩展 JMP,因此成为分析中心。
提高我们加载其他人编写的不同数据格式的能力,例如我们花时间编写的 parquet 格式,hdf5 我们也对其进行了测试。目前有很多格式,比任何一个开发团队都有时间在内部编写的格式还要多,但通过这种方式,您可以引入 Python 包,然后将其从这些数据中制作成 JMP 数据表,并在 JMP 中使用该功能。
感谢您的时间。希望您喜欢我们所做的一切,并非常希望得到反馈。谢谢。