既然你正在读这篇文章,你可能知道 Python 是一种被科学家和工程师广泛使用的开源工具——我想补充一下,有些人比其他人更热切地部署它们——来解决各种问题。
到目前为止,我与 JMP® 用户的交流表明,他们中的大多数人开发 Python 工作流是为了解决访问数据源的上游任务,而不是将 Python 用于通常与之相关的机器学习任务。考虑到任何特定行业中来自大量不同仪器的独特文件类型令人眼花缭乱,Python 是访问数据的首选方法,因为——谢天谢地!——某个地方的某个人可能已经构建了一个框架来强制文件泄露其秘密。
我最初对 JMP 的 Python 集成的兴趣也同样针对数据访问。在加入 JMP 之前,我在当地一家医院的心脏病科工作。当 JMP 首次发布功能数据探索器 (FDE) 平台时,心跳的 ECG (又名 EKG) 数据似乎非常适合在新工具中进行分析:由于没有传统的自上而下的形式模型,因此采用自下而上的方法捕捉患者之间的共同形状变化(即 ECG 导联内,即您看到的“心跳”)似乎是 FDE 的完美任务。


一个小问题:我能找到的所有 ECG 数据示例都使用 WFDB(即“波形数据库”)文件标准,涉及 JMP 本身无法打开的二进制格式。值得庆幸的是,经过改进的 JMP 和 Python 集成现在补充了 JMP 菜单,可以访问各种文件类型,为此我再次感谢问题解决者的慷慨,他们创建了适合任务的 Python 包。
在识别ECG 数据和 PhysioNet.org 的wfdb Python 包后,JMP 和 Python 集成中内置的新工具允许我:
- 通过 Python 从 WFDB 文件结构中提取 ECG 数据。
- 创建 JMP 数据表并通过 Python 填充它们。
- 通过运行使用 JMP Workflow Builder 创建的步骤的 JMP 脚本语言 (JSL) 文件(捕获我的 JMP 点击操作的代码)将剩余工作交给 JMP,以进行数据准备、可视化和 FDE 分析。
JMP 的“Python-in-a-box”方法包括一个内置的 Python 编辑器以及预安装的软件包( jmp和jmputils),我可以使用它来:
- 使用jmputils jpip命令(与 Python 的pip类似)安装任务所需的其他 Python 包,
- 然后使用常规的 Python 脚本方法导入这些包。
安装和导入wfdb包有助于清除获取 JMP 中数据的第一个障碍。
################################################################
# let's get this party started - load up some Python packages
################################################################
import jmp
import jmputils
jmputils.jpip('install', 'numpy pandas')
jmputils.jpip('install', 'wfdb')
import numpy as np
import pandas as pd
import wfdb
import os
如果它看起来像 Python,那是因为它就是 Python!全部在 JMP 中。
从那里开始,除了一些 Python 数据准备步骤之外,还通过一些新的 JMP 和 Python 集成项目清除了剩余的障碍:
- 使用 Python jmp.DataTable()函数创建 JMP 数据表。
- 在传递数据列表之前,通过new_column()向 JMP 数据表添加列。
# migrate the signal data to a **JMP table**
# 'ecgall' is the pandas DataFrame containing 12 columns of ECG lead data
ecgdtname = "ECG Data"
ecgdt = jmp.DataTable(ecgdtname, rg*signal.shape[1]) #2nd argument assigns # of rows
for col in ecgall.columns:
#creating new column
ecgdt.new_column( col, jmp.DataType.Numeric )
#adding data
ecgdt[col] = ecgall[col].tolist()
我仅展示了一种使用 Python 创建和填充新 JMP 表的方法,但存在多种方法,包括在填充之前验证数据类型或简单地使用蛮力。
最后, jmp.run_jsl()提供了一种让 Python 为您运行一些 JSL 的便捷方法。为了保持理智,我将 JSL 工作流(源自记录我操作的工作流生成器)完全放在另一个文件中,并使用 JSL include()函数引用和运行其内容,从而保持“热端热,冷端冷”。
jmp.run_jsl('''
include("PTB-XL Post Python Workflow.jsl");
''')
我本可以采用另一种方法,使用Python Submit()或Python Submit File()从 JSL 运行所有内容,但这会使从 Python 方面解释事情变得有点模糊。查看 JMP 中“帮助”下的“脚本索引”以获取更多信息。
有了新的 JMP 和 Python 集成工具,实现我最初目标(仅查看数据)的唯一瓶颈是我缺乏 Python 经验(几年前加入 JMP 之前我只涉猎过 Python);使用 JMP 的 Python 工具是最简单的部分。只用了一个下午的时间,我就能够解决所有 Python 编码错误,访问数据并共享 JMP 可视化(另请参阅下面的视频和附件)。我甚至可能直接联系开发人员(不要告诉我的老板)来表达我的感激之情。

我已经开始研究其他数据访问工具,正如@Bill_Worley 在此处建议的那样,我希望您很快就会在JMP Marketplace中看到其中的一些成果。尝试浏览您自己的跨Python和JMP的数据和分析工作流程?如果您还没有看到, @yasmine_hajar已经汇集了优秀的资源来帮助您熟悉上面概述的一些新工具。如果您有疑问,您可以浏览JMP用户社区,在那里发布您的问题,联系您专门的JMP团队,或在下面留言。
感谢@ChristianStopp为实现这一目标所付出的辛勤努力。那些试图导入 .spc 和 .spa 数据文件的人会发现这些工具非常有用。