JMP 的最新版本在 JMP 18 中引入的 Python 集成支持的基础上,重点关注工作流程的一个基本部分:数据访问。通过扩展数据表操作和 Python-JSL 互操作性,数据访问变得简单便捷。
喜欢视频?点击此处观看。
数据表操作
jmp.from_dataframe() 函数提供了一种将外部数据框转换为 JMP 数据表的有效方法。数据框协议提供了在内存中转换数据框的机制。所有支持数据框交换协议的数据框对象都可以在内存中转换数据框。值得注意的例子包括 pandas、polars 和 ibis。
下面的示例展示了将 pandas 数据框转换为 JMP 数据表。

同样,将 JMP 数据表转换为其他受支持的数据框库类型也同样容易。例如,从 JMP 转换为 Pandas:

在 JMP 18 中,jmp.DataTable 仅完全支持数字和字符列。现在,Python 支持所有 JMP 列数据类型。新增了对表达式和行状态的支持。
jmp.DataTable 对象添加了 row_states 属性,允许通过 Python 设置表的行状态。它简化了将行状态集复制到列或从列设置表行状态的功能。

现在可以使用 col.format 和字符串或元组访问表的列格式,具体取决于用例。JMP 19 可以正确地在 JMP 的日期时间表示和 Python 的日期时间表示之间进行编组:数据表中的 JMP 日期,以及来自 Python 代码的 Python 日期时间对象。

类似地,Python Get()/Python Send() 现在支持在 Python 和 JSL 之间无缝传输日期时间值。
除了能够格式化列之外,Columns 还可以使用带有 jmp.Expressions 的 col.formula 添加公式。

JMP 19 还允许将 jmp.Images 设置为表达式列值。
可以使用 Python 类别下的脚本索引找到其他未突出显示的数据表操作。
Python-JSL 互操作性
许多工作流程仍然需要 JSL 支持才能在 JMP 中执行特定任务。为了增强跨语言工作流程,我们添加了从 Python 添加、读取和修改 JSL 变量的支持。目前,此功能仅通过 Global 和 Here 命名空间支持。以下示例展示了 Python 如何从 Python 设置 JSL 变量“e”,然后使用 JSL 设置 here::pi 变量并从 Python 打印全局变量 ::e 变量集,最后从 Python 打印 JSL 设置的 here::pi 变量集。

R 集成
JMP 19 引入了通过 Python 使用 rpy2 对 R 的初始支持。JMP 提供了一个新模块杰姆佩克斯来支持扩展。R 是 jmpex 目前支持的唯一扩展。此支持包含一个类似于 JSL R API 的 Python API。jmpex 包是 JMP 和 rpy2 之间的接口层,而 rpy2 又依赖于 R。用户必须已在系统中安装 R 版本,并且必须将 R_HOME 环境变量设置为 R 的位置。这些必须在安装 jmpex 之前或由于 jmpex 包要求而首次调用 R Init() 之前存在。
通过在内部利用 jmpex 包,JMP 19 恢复了对 R 的 JSL 支持。
下面的示例说明了 jmpex 提供的 R 的新 Python API。

一般变更
JMP 18 中的 Python 3.11 已迁移至 JMP 19 中的 Python 3.13,这将为 JMP 19 的整个生命周期提供安全更新。JMP 19 还提供了通过 jmp.reset() 重置共享 Python 环境的便捷方法。jmputils 也得到了改进:
- jmputils.__version__
- jmputils.is_installed('包')
- jmputils.packages()
- jmputils.package_version('包')
为了更好地支持脚本化安装包,jmputils.jpip() 现在返回 Python subprocess.CompletedProcess 对象。有关 CompletedProcess 对象的信息,请参阅 Python 文档。
弃用
- Python 初始化()
- Python Term()
- Python 控制()已刪除。
- Python 获取图形() 已刪除。
- R 项()
- R 获取图形()已弃用,没有任何效果。
- R 控制(回显(布尔值))参数异步(),和中断( )
下一步是什么?
JMP 18 致力于构建一个全新的基础,以支持 JMP 内部原生的 Python 工作流程。该基础首先解决了 JMP 与 Python 集成中最棘手的问题。
JMP 19 在此基础上继续发展,专注于改进功能,并提供了重要的附加数据表支持。我们希望提供与 JSL 相同的 Python 数据表处理功能。现在 Python 支持所有列类型。列格式和行状态可通过 Python 脚本访问和修改。
完成列类型支持后,可移植数据框协议 (PDF) 的支持也得以实现。PDF(包括 Pandas 和 jmp.DataTable 对象)之间的轻松转换已恢复,从而保留了内存中的工作,而无需借助文件系统中的 CSV 副本。
此外,我们重点提升了生产力,优化了对象的行为,使其行为符合 Python 程序员的预期。最后,新版本解决了 JMP 18 中遗漏的一些问题,以及发布前开发时间不足的问题。
Python 集成的未来前景光明。在 JMP 内部,我们正在基于自身的 Python 功能进行构建:恢复 SAS 连接、恢复 JSL R 支持、为 R 提供新的 Python API,以及基于 Python 集成构建的数据连接器。
展望未来总是充满推测,但我们正在研究一些可能纳入未来版本中的内容:
- 继续改进脚本编辑器支持。
- JMP 支持 Python 虚拟环境。
- 对包裹处理支持的其他改进包括:
- 连接到公司或内部存储库的配置选项。
- 站点管理员构建经过验证和锁定的站点包的简化方法。
- 支持从 Python 提出对话框和窗口,允许从 Python 构建图形和报告。
我们非常感谢您的建议,因为我们希望重点关注最能改善您的工作流程的领域。
博客由@Paul_Nelson共同撰写。
这太棒了,JMP 和 Python 简直是天作之合,我们在 JMP v18 中已经广泛使用了它。从用户的角度来看,它的实现非常简洁,我几乎可以立即上手。JMP v19 的更新看起来非常棒,尤其是行状态、公式和日期/时间处理。
一些评论/建议:
- 暂停。在 JMP(v18+)中运行 Python 脚本时,如果脚本包含类似“while True: pass”的无限循环,则整个 JMP 会话将无响应,必须强制退出。如果 JMP 提供一种无需终止整个应用程序即可中断或暂停正在运行的 Python 脚本的方法(例如停止按钮或超时机制),那将非常有帮助。
- 嵌入。如果 JMP 允许将 Python 脚本嵌入到数据表中,那将会很有帮助(除非这已经可以实现?)。
- 获取用户输入。如果 Python 可以请求 JMP 发出模态对话框来获取用户输入,那将会很有帮助。
显然,基于 Python 的列公式也会令人难以置信,但我认为这是一个艰巨的任务。
向您和您的团队致敬,干得好!!
关于
1. 停止。目前已经有一些中止进程的功能。这取决于在热循环中放置一个jmp.run_jsl('Wait(0);') 。通过定期将控制权交还给 JMP,常规的 ESC 机制可以取消脚本。
2. 我们认为,除了将 JSL 与 Python 调用包装在一起的 JSL 之外,目前还不可能实现。
3. 在我们看来,您可以通过 jmp.run_jsl() 调用 JSL 对话框代码。JMP 18 示例之一,对目录进行 md5 哈希处理并构建 SQLite 数据表,正是这样做的,它从 Python 脚本中调用 jsl 来生成目录选择器对话框,以将目录路径提供给 Python 脚本。