工程信箱
第 4 集:蟒蛇和熊猫,我的天哪!

我们系统工程师偶尔会遇到一些有趣的问题,这些问题往往超出了JMP的典型应用范围。这些应用通常都很巧妙,也常常让我们意识到,数据的使用并不局限于解决业务或技术问题。有时,这些问题则完全出乎意料,极具挑战性。这些“难题”(我喜欢这样称呼它们)形式多样:编码问题、有趣的分析、数据可视化方法……相信你已经明白我的意思了。
我好久没回复读者来信了,但这个问题确实值得一提。我用来回答这个问题的工具似乎并没有得到应有的讨论。所以,我想借此机会帮助一位纽约的同事,并向大家展示一些你可能不知道的JMP的实用功能。
问题
Mike[JMP],
我经常需要进行分组,比如需要获取按某个标签分组的所有元素的最大值,而 Python Pandas 的等效代码可能是这样的:
df.groupby(['Something', 'Something Else']).max()
另一种方法可能是使用熊猫.n最大的结合 groupby,我想从 groupby 中找出前 5 个结果。
在摆弄了几分钟列公式后,我放弃了,只好导出数据,稍后再导入到 JMP 中。Tabulate 函数也能做到这一点,但并非总是能达到我想要的效果。因此,如果能有一份“如何像使用 Pandas 一样使用 JMP”的文档,对我来说将非常有帮助,而且考虑到 Pandas 的普及程度,这份文档对 JMP 本身也可能很有帮助……
谢谢,
缺口
我的回复
嗨,尼克!有一个技巧可以让你的公式更加灵活,它能很好地模拟 Pandas 的功能。这个技巧需要你告诉 JMP 你想按哪些列分组。具体操作方法是:右键单击列名,然后选择“新建公式列”>“分组依据”。

完成上述操作后,您通过右键单击列名称并使用“新建公式列”>…创建的任何公式列都将按您设置的分组列进行分组。


之后,只需使用数据过滤器或本地数据过滤器进行筛选或子集划分即可。希望这能帮到你!
最好的,
M
熊猫:可爱的鼬科动物还是数据分析工具
好了,对于不熟悉 Pandas 的朋友,Pandas 可不是什么毛茸茸的、颜色不太鲜艳的鼬科动物。Pandas(在 Python 脚本中通常缩写为“pd”)是一种“用于数据操作和分析的Python 编程语言。它尤其提供了用于操作数值表和时间序列的数据结构和操作[ 来源]。”它基本上在 Python 编程环境中承担了 JMP 中数据组织和操作部分(数据表、行和列菜单等)的功能。因此,它对 Python 数据分析工作流程至关重要。如果您想在 JMP 中运行 Python,那么这篇文章并不适合您。请阅读这篇白皮书。如果您想摆脱在命令行中进行数据转换的束缚,请继续阅读。
数据框和数据表
还在?太好了。好的,本文接下来将介绍 Pandas 的一些常用功能以及 JMP 中的对应功能。这并非一份详尽的列表;其目的在于帮助你在理解这两个环境时找到正确的方向。
首先我想介绍的是“DataFrame”。在 Pandas 中,所有数据都存储在 DataFrame 中。它类似于 JMP 中的数据表,本质上是一个包含列名等数据集合。你可以对列和行进行操作(例如转换数据、汇总数据等),但你始终操作的是整个 DataFrame 或其某个部分。
在 JMP 中,主要的数据容器是数据表。您可以像在 Pandas DataFrame 中一样操作列和行。两者都支持处理数据表中的缺失值。在 JMP 中,缺失值被标记为带有“.”的单元格(用于数值数据)或空白单元格(用于字符数据)。您可以转换数据、汇总数据等等(稍后会详细介绍)。在这两种情况下,您向软件提供的数据信息越多,需要做的准备工作就越少,这也引出了我的下一个观点。
列属性和数据类型
在列属性和数据类型(Pandas 中的 dtypes)方面,JMP 完胜。Pandas 的大部分数据类型理解都继承自另一个名为 NumPy 的 Python 包,这很棒。NumPy 的代码相当健壮,但在这方面却非常有限。它只能处理大约八种数据类型(见下表[ 来源]),而且对不同格式的支持也比较有限(例如,如果没有辅助工具,它处理货币时会非常混乱)。
JMP 的列属性在《使用 JMP 》一书中占据了大约 43 页的篇幅。它们功能强大得多,并且在导入数据时能够很好地识别数据类型。对于 JMP 新手来说,尤其值得关注的是,列属性支持的数据类型远超 Pandas。它能够处理大量元数据,从而触发软件中的各种操作。当然,你也可以为 Pandas DataFrame 添加属性,但由于 DataFrame 只是一个容器,你必须自己编写代码来支持这些属性,或者寄希望于你使用的包中已经包含了相应的支持。而 JMP 已经为你完成了所有这些工作。
制表、列公式和分组依据
事实上,前两项内容在我试图回答的问题中并不那么重要。就我们的目的而言,数据表/DataFrame 只是一个用来存放数据的容器。列属性/类型虽然有助于分析,但对于我们目前的问题来说并不重要。我们感兴趣的是 Pandas 的 GroupBy 函数。它用于对数据进行切片和切块,以便进行其他分析。一个简单的例子是使用 JMP Big Class 数据表,按年龄段获取男孩和女孩的平均身高和体重,代码如下:
# Import Pandas
import pandas as pd
# Bring in the data
data = pd.read_csv("/Users/mike.anderson@jmp.com/Desktop/Big Class.csv")
# Put the data into a DataFrame
df = pd.DataFrame(data)
# Run the group by, get the means, and show the results
summ_df= df.groupby(['sex','age']).mean()
print(summ_df)
输出结果大致如下:
height weight
sex age
F 12 58.600000 100.200000
13 59.000000 95.333333
14 62.600000 96.600000
15 63.000000 102.000000
16 62.500000 113.500000
17 62.000000 116.000000
M 12 57.333333 97.000000
13 61.250000 94.250000
14 65.285714 103.857143
15 65.200000 110.800000
16 68.000000 128.000000
17 69.000000 153.000000
通常,JMP 用户会使用“汇总”或“制表”作为进行数据转换操作的主要工具。他们甚至可能使用公式编辑器来创建列。但是,数据表(以及平台列列表)中隐藏着一个秘密武器,它几乎可以实现 Pandas 中的所有操作,甚至更多。这个秘密武器就是右键单击列名并选择“新建公式列”。只要存在列列表,此方法就适用!之后,您可以使用许多不同的选项来执行各种转换,例如合并列、计算行的累计总和等等。 这本身虽然方便,但并没有什么特别神奇之处。真正有趣的地方在于,当你在 JMP 中为某一列启用“分组依据”功能时。这样,你创建的任何公式列都会自动识别分组变量中的级别。仔细想想——你可以在软件中的任何位置创建公式列,并根据分组列进行分层。
让我们来看一个我最近收到的另一个问题的例子,以此来理解这句话的含义:
举例:买一送一!!
几乎在收到第一个问题的同时,另一位客户也向我咨询了如何对大量样本进行数值积分(曲线下面积或AUC)。此外,他们还愿意提供之前发表在《环境与分子诱变》期刊上的一篇论文的样本数据集。
原来,他们想要实现的功能其实很容易用分组标志和函数列来实现。以下是具体步骤(你可以使用JMP 公共网站上的数据进行操作 
首先, 我们来绘制数据图表。虽然这项研究本身很有意思,但其细节与本次讨论无关。简而言之,它收集了大量不同浓度(浓度 (μM))的化学物质以及一系列基因反应。在我们的练习中,他们感兴趣的是计算每种基因反应的曲线下面积 (AUC)。以下是在图表生成器中使用列切换器绘制的图表:
计算 AUC 的第一步是设置分组。我们将右键单击“化学成分”列,选择“新建公式列”,然后选择“分组依据”。对“生物标志物”列重复此操作。请注意,分组顺序很重要。我们首先按“化学成分”分组,然后在“化学成分”下按“生物标志物”分组。之后,只需在数据表中使用“新建公式列”构建计算公式即可。

为了清晰起见,接下来我将每个步骤拆分成单独的列。如果您真的感兴趣,这里我使用的是梯形法则黎曼和的数学计算方法。
好了,回到计算部分。首先我们需要的是 x 轴上每个点之间的距离(x 轴上每个点的变化量)。我们将选中“浓度(微米)”列,右键单击标题,然后选择“新建公式列”>“行”>“差值”。现在打开 JMP 创建的新列中的公式。它应该显示类似这样的内容:

请注意,JMP 正在处理行之间的计算,并且已调整公式,以便在检测到新的化学物质或新的生物标志物类型时重置。
接下来,我们需要计算每个数据点与其前一个数据点之间的平均值。右键单击列标题,选择“新建公式”>“列”>“行”>“滞后”。打开公式并稍作修改,使其计算行之间的差值,而不仅仅是给出上一行的值。如下图所示:

这两列(我在数据表中将它们分别重命名为 dx和你 )需要相乘才能得到线段的面积。选中这两列,右键单击其中一列的列名。选择“新建公式列”>“组合”>“乘积”。新生成的列给出了曲线上每个数据点与其相邻数据点之间部分的近似面积。我在数据表中将该列重命名为iAUC (瞬时 AUC)。

最后一步是将每个部分的值相加。这可以通过右键单击 iAUC 列,然后选择“新建公式列”>“行”>“累计求和”来完成。由于我们在练习开始时选择了“分组依据”列,因此数据集中的每个样本的计数都会重置。

接下来,我们可以使用制表或汇总功能创建一个表格,其中包含每个样本的最大值(曲线下的近似总面积)。以下是一个常见化学物质的示例:

最后想说的话
就是这样。你可以用 JMP 中现有的结构轻松地在 Pandas 中复现类似的行为。只需记住使用分组依据变量即可。无需任何帮助,无论对方是否患有色觉障碍。
编者按:你读过吗?本系列“工程信箱”的其他文章看看Mike是如何帮助一位正在使用……的用户JMP决定是否注册除雪服务,并为 STEAM 教育项目开发独特的可视化效果。