JMP Live 是一个强大的平台,用于分析和可视化不断增长的数据集,尤其擅长从互联数据仓库中刷新表格。然而,在新产品开发过程中,这些流程往往不完善,跨多个用户或站点收集数据会成为一项后勤挑战。
大家好!欢迎观看我的演讲。我叫 Timothy Whetstone,和我的共同演讲者 Sage Darling 一起。我们都在 IDEXX 实验室工作,本次演讲的主题是如何使用 JMP Live 作为数据仓库。
过去一年,我们一直在频繁使用 JMP Live。我们认为,只要我们拥有从数据收集源到仓库再到 JMP Live 的强大流程,就能为现有的各种数据仓库设置自动刷新表,这真的很棒。对于这个用例来说,它真的很棒。
随着使用次数的增加,我们发现了一些希望 JMP Live 能够实现的潜在用例,但它本身的功能不足以轻松实现这些用例。这种情况主要发生在某些数据源或数据生成源不会进入任何云服务或大型数据仓库的情况下,您基本上只是获取文件和数据,而且这些数据基本上只能在本地访问。尤其是在您拥有这些资源的情况下,您会不断获取到实际上属于同一最终数据集的数据,而这些数据只是暂时存在于本地。在进行这项工作时,我们正在考虑开展许多纵向研究。
我们有一些手动文件。我们希望它们基本上都集中在一个地方进行跟踪。JMP Live 通常是一个不错的选择,但我们需要一种更自动化的方式来获取这些信息,而不是不断地手动下载、连接,然后重新上传表格。
在与 JMP 员工沟通时,他们给了我一些代码。这段代码对于我们目前的工作至关重要。它演示了如何使用脚本从 JMP Live 下载并打开表格。拿到这段代码后,我们才对如何利用它产生了很多想法。这基本上就是一个 HTTP 请求。它已经存在,可以用来从其他网站获取数据,但让它发挥作用的真正关键在于如何组合和构建 JMP Live 表格的 URL,我们稍后会详细讨论。Sage,我先把时间交给你。
我找到了 Timothy 刚才描述的 JMP 文件下载示例,我的用例也准备好了,可以直接运行。我决定先构建一种方法,从 JMP Live 的各自文件夹中获取表格,然后在本地连接它们,然后将它们推送回特定位置。为了做到这一点,你需要解决一些问题,例如如何连接到 JMP Live 以及如何从 JMP Live 获取信息。为此,我用我的代码创建了一个关联数组,用于初始化。
这是我们在插件中找到的用于提取这些信息的代码示例。我的脚本也做了类似的事情。它会查看用户在 JMP Live 中拥有的访问权限,并提取其有权访问的文件夹位置,然后我们将继续查找文件夹内的文件夹,以便继续将 JMP 所称的子文件夹添加到该文件夹位置。
在这种情况下,我们用这段代码动态构建了关联数组。这样,当我查看您有权访问的文件夹并进行上传时,这段代码最终会在脚本开始时查找这些信息。这样,您就可以看到您有权访问的所有内容,从而可以从任何文件夹中提取文件进行连接,然后将它们放在您喜欢的任何位置。
这只是一小部分。关联数组就是按照这种方式构建的。最终,通过这个插件,你可以根据我构建的内容,获得三个基本选项。
第一个选项是您必须能够选择一个 JMP Live 文件夹进行连接。在启动关联数组时,我会提取您有权访问的所有文件夹,并为您提供所有可访问文件夹的列表。这样,您可以选择要连接的文件夹,然后选择一个要保存到的文件夹,该文件夹来自同一个关联数组列表。接下来,您可以选择要更新的表。
根据此处输入的信息,最终会将 Live 文件夹中所有需要连接的文件连接起来,然后保存到此文件夹(即“保存到文件夹”),并将其保存为该文件夹内的选定表。所有这些都映射到我刚才在上一屏中展示的关联数组,该代码会根据您独有的 JMP Live 连接从 JMP Live 中提取信息。
为了完成所有这些工作,这只是核心工作的一部分。关联数组会提取您有权访问的内容,但您必须能够提取信息,然后再将其放回。JMP Live 的一个非常棒的功能是,它提供了一个 URL,您可以根据 HTTP 请求构建 URL 来提取数据。这是我们用来创建该 URL 的示例,它实际上是将这些文件下载到本地。
举个例子,我们最终会使用一个用于 JMP Live 的基本 URL。这里有一个 HTTPS JMP Live 公司名称的示例。在我们的例子中,它是 IDEXX。我们可以使用它链接到我们的 JMP Live。然后,从那里开始,有一些位置需要处理,这些位置是静态的。就像 API 包一样,这是与 JMP Live 相关的 URL 的静态部分。
然后我们知道我们有一个 Live ID。我刚才提到过,从关联数组中提取的内容之一是链接到文件夹和数据表的 Live ID。这样,在构建 URL 时,可以根据关联数组动态构建 URL。然后,您将得到另一个静态部分,即数据,后面是 JMP Live 数据表名称,您可以从这个 URL 中提取数据,然后下载内容,也就是“.JMPLive/contents”。
再次强调,这只是魔法的一部分。接下来要做的就是替换 JMP Live 表。将所有文件放在文件夹中,并在本地 JMP 实例中将它们连接起来后,您需要将其放置在某个位置。这是我们用来替换 JMP Live 表的代码示例。
具体做法是,我们会创建一个新的连接,然后基于该关联数组(其中包含您选择要上传到的表的信息),将其作为新的 JMP Live 内容交付,然后再将其推送回 JMP Live 以更新数据。这样,您就可以根据文件夹中的连接表进行动态更新。
我的用例是什么?因为这是我们在测试的时候发现的,觉得用在本地数据里会很酷。我们能够用它做的事情之一就是稳定性趋势分析。在这个例子中,这里有一个我编写的代码示例及其功能。您可以从一开始看到,这是代码的起始窗口,它显示了我之前几张幻灯片中展示过的三个输入。也就是说,您必须选择文件夹。然后,下一步是选择要从中提取数据的文件夹。在这个例子中,我有稳定性原始数据。每当我的技术人员运行更多数据时,数据都会被放到这个原始数据文件夹的特定位置。这就是我选择的用于连接数据的起始文件夹。
接下来,我知道我需要将其添加到我的趋势数据中,因为我想继续连接到该文件。这是我的下一个选择,我选择了一个 JMP Live 文件夹来保存。在这种情况下,它就成了我的稳定性趋势。
然后,因为我的稳定性趋势数据表只有一个,所以我的下一个选择是稳定性趋势数据表。不过,这是我开始创建的表。您可以随意命名它。关联数组会将其拖放到该位置。在本例中,我先创建了表格。目前为止,我一直使用的是 JMP Live 中已经存在的表格,但这在未来会是一个很棒的功能……这很难说,未来的功能。如果能继续添加为动态部分,那就太好了,因为数据可能会发生变化,所以您可以创建并连接新的数据表,并将它们保存到不同的位置。
从 JMP Live 端看,这是什么样的?在 JMP Live 端,您看到的是起始文件夹。您可以看到其他人上传的我的独立时间点。在本例中,上传的是我的时间点。如果技术人员有权限上传信息,他们也可以从这个位置上传。这些是将被串联起来的表格。您可以在下面看到,我的文件夹中有一个稳定性趋势示例,它与我的原始数据文件夹是分开的,您可以看到我正在修改数据的数据表。
一旦真正发生这种情况,后端会是什么样子?当你能够看到连接过程时,奇迹就发生了。当你实际运行这段代码时,你实际上可以看到 JMP Live 显示数据表已完成更新,因为它的作用是实时更新。在左侧的例子中,你可以看到我的起始数据表只有时间点 0 和 1。正如你在上一个表格中看到的,还有一些时间点上升到了 3。现在,运行代码后,你可以看到现在有第三个时间点连接到了这些表。
完成这项工作并继续使用这些数据后,我与 Timothy 合作,说:“嘿,我有这个代码。考虑到你在这次演讲中所做的事情,你可能会发现它很有用。” 就在那时,Timothy 拿起代码,把它调到了 11。
谢谢你,Sage。我当时接手了 Sage 的很多工作,然后就觉得,能够把 JMP Live 上的一堆文件合并成一个新表,再放回 JMP Live 真是太棒了。在我的用例中,我有一些实际上只存在于本地的数据,我需要一种好的方法,既能把这些数据提取出来,然后导入 JMP Live,又能把它们与一堆已经存在的数据合并。我希望能够与其他人共享这些信息,并与其他人协作,不必在同一地点,这样我们就可以各自独立地将数据添加到同一个数据集。我真的不希望人们进行大量的手动操作。
我想,如果我有一个工具,基本上可以用它连接到特定的表,那会怎么样?不仅如此,我还希望能够运行任何数据 ETL。如果我想添加新列,如果我想创建汇总表并上传,我真的很想找到一种方法,可以构建一个 JMP 工作流脚本,然后将其附加到特定的表和特定的项目,然后能够与其他人共享,这样我们就可以运行相同的程序,更新相同的表,并实时查看结果。
这只是工具窗口的启动部分。几秒钟后我们将进行现场演示。我先简单介绍一下代码。此外,就脚本而言,Sage 所做的就是将所有内容打包在一起。使用 Sage 时,我还使用了大量关联数组。这就是我存储和保存大量项目特定信息和特殊脚本的方式。
您可能在上一个窗口中看到过,我们有一个脚本编辑窗口。让它工作的秘诀其实就是使用 Eval Parse 函数,我把它封装在一个空函数中。这样,用户就可以直接将脚本粘贴到这个窗口中。然后,当他们运行它时,一切都会完美地运行,可以解析表格,然后将它们连接起来,并将它们与 JMP Live 上的内容连接起来。我们暂时停止演示,只展示一些简单的例子。
首先,这里有一个 JMP Live 空间,然后这里是我正在运行的工具。这是工具首次打开时的样子。在最顶部的窗格中,我们有一个设置部分。您可以保存这些设置,然后每次运行插件时,您在此处的所有设置都会被填充。它包括您的 JMP Live 连接的名称、JMP Live 的基本 URL,以及您是否希望将表格列表预填充到工具中。表格列表就在下面的部分。
我们就是这样决定哪些表是我想要跟踪的,并与脚本关联起来的。在这个例子中,我实际上借鉴了 Sage 的一些功能,比如能够添加新表,我们稍后会讲解。这里对于协作来说很重要的一点是能够加载项目列表。如果你与其他人共享项目列表,他们就可以加载这些列表。
如果我继续,加载一个我预先创建的项目列表,我们会看到这个项目列表,它包含两个表。一个是“不是我的猫”表,另一个是“每周天气数据”。您会注意到,在脚本部分,它们的大小略有不同。“不是我的猫”表,我这里只是编写了一个基本脚本,运行时,它会提示用户选择要打开的文件,然后在打开后返回该文件。那么,就其含义而言,最好的情况是,一旦返回该文件,该文件将与此处列出的表格连接起来。
在另一个例子中,我不仅打开了文件,还添加了一列,用于计算其他两列的平均值。运行这个示例,我可以继续,找到我这里的“每周天气数据”表。这个表已经很大了。有 124 行,跨越了不同的周。我想这是第 1 周到第 10 周的数据。我可以滚动浏览这个表。
当我运行这个工具时,它会提示我选择一个表。我这里正好有一个文件夹,里面有很多这样的表,我可以选中这个新表,点击“打开”按钮,然后等一会儿,你会看到一些表弹出来,然后又消失了,然后你会在我的 JMP Live 中注意到这些数据已经更新了,我可以重新加载表格,现在数据有 393 行了。
稍微回顾一下,如果我想在这里添加另一个表格,你会注意到在 JMP Live 中,我这里有一个名为“类别测量”的表格,并且我有一个与之配套的报告。我要点击该报告。我可以在报告中看到我正在跟踪一些测量数据,它涵盖了一组不同人员的三个时间点。我的列表中还没有这个数据,但我可以添加它。使用 Sage 开发的相同脚本在 JMP Live 或您有权访问的资源中进行搜索,我们会在这里弹出一个非常相似的窗口。我可以进入这里,找到我的示例文件夹,然后选择我的“类别测量”表并将其添加到此项目列表中。
当我将其添加到项目列表时,您会看到我仍然可以在其他项目之间切换,并且它还会在窗口中预先填充一个非常基本的脚本,让我只需运行该脚本并选择要连接的文件即可。我现在就去做。我看到我转到此表中的时间点 3,而我恰好拥有时间点 4 的文件。当我点击“打开”按钮时,该文件会弹出,然后消失,我们可以在 JMP Live 中看到此报告正在重新生成,并且时间点 4 已添加到其中。任何有权访问此表的人都可以使用此工具,使用他们拥有的此项目数据来更新这些 JMP Live 表,只要我在 JMP Live 中授予他们访问权限。
我们可以回溯一下。我们可以看到,“班级测量”表也更新了,因为它与该报告关联,并且我们可以看到时间点 4 的数据。我还有第五个时间点的数据。我也可以再次运行这个程序,把这些数据也添加到其中。再次出现一个尾部,然后消失,然后这个表的更新版本就准备好了。我可以点击“重新加载”,然后可以看到额外的数据已经添加到表中。我可以再次回溯一下,然后可以看到我的图表也更新了。
就某些项目的合作而言,这对我们来说非常令人兴奋,它让人们拥有更标准化的工作流程,能够共享脚本,尤其是对于那些仍在学习工作流程构建器以及如何自动化某些流程的人来说。为他们提供一些这样的工具真的很好,可以真正避免我们有时遇到的一些多站点项目中出现的某些问题。