扬声器 | 成绩单 |
| 布莱恩·科科伦 | 欢迎来到早上的更新。 这是我在 JMP Discovery Europe 2021 上的演讲。 |
| 我叫 Brian Corcoran,是一名 JMP 开发经理。 |
| 那么我们今天希望做什么呢? |
| 我想向您展示如何使用 REST 协议基于基于 Internet 的数据提供者在 JMP 中创建报告。 |
| 完成此操作后,我将向您介绍如何使用我们已放入 JMP 16 的更新的 JMP 脚本引擎将此报告发布到 JMP Live。 |
| 最后,我将向您展示如何自动执行此测试,以便每天,当您上班时,报告已经为您更新,您可以在早上喝咖啡或茶时查看它。 |
| 好的,首先让我们谈谈互联网数据提供商。 |
| 它们中的大多数都基于称为 REST 协议的东西。 |
| 这是一个无状态调用,本质上它看起来像一个带有一些参数的 URL,并且越来越多的组织正在使用它来向最终用户公开他们的公共数据。 一些例子是世界银行、美国人口普查局、谷歌。 |
| 因此,JMP 有一个工具可以帮助您处理这个称为 HTTP 请求的工具。 它将允许您访问这些服务。 通常,他们使用称为 GET 或 POST 动词的东西来获取这些内容。 HTTP 请求将允许您使用它们。 |
| 对于这个特定的报告,我将使用约翰霍普金斯大学的 COVID |
| 带有一些大流行数据的 REST API。 |
| 所以约翰霍普金斯大学是美国的大学,它聚合了来自世界各地的这些数据,然后提供这个免费的公共 API 来访问。 |
| 现在还有一个高级版本,它可以让您更好地访问和更精细地处理数据,但我们现在将尝试使用免费版本,希望您可以使用一些脚本我给你的,你自己试试。 |
| 那么 REST API 是什么样的呢? 出色地, |
| 让我们来看看。 |
| 这是约翰霍普金斯大学的一个例子。 |
| 它从这个基本 URL 开始,在本例中是 API,即 COVID19API.com。在这里,您可以查看 URL 并说,嘿,我们正在询问一个国家/地区的确诊病例总数。 |
| 在您看到这个带括号的国家/地区时,您必须实际插入名称。 就我而言,我将使用德国(他们使用英文名称), |
| 但是可能有 100 个国家/地区您可以尝试一下。 |
| 约翰霍普金斯大学要求您提供开始和结束日期 |
| 在此基本 URL 之后,您会看到问号。 这些本质上是您正在进行的此 API 调用的参数,这将使我们能够返回 |
| 我们指定的日期范围内的值。 |
| 这是一种很长的格式。 它是 |
| 月...年、月和日,T 表示时间,然后是 24 小时时间,并附加一个 Z。 |
| 幸运的是,JMP 有设施可以帮助您。 您可以使用格式调用,今天我们将为您提供现在的确切时间以及日期,我们指定要使用的格式字符串,然后我们可以在末尾附加一个 Z得到 |
| 我们需要约翰霍普金斯大学的格式。 |
| 所以,就像我提到的, |
| REST 调用通常使用 GET 或 POST 后置动词。 约翰霍普金斯大学使用 GET;我将跳出 PowerPoint 一分钟来说明这一点。 |
| 如果你访问我在那里的那个网站,在 |
| 幻灯片或在纸上, |
| 您会看到它按类型提供 API,并从本质上向您展示如何传递信息以及您期望返回的内容。 |
| 好的,所以你可以在这里浏览一下,看看每个人需要什么,你可以看到,有一些高级类别,你必须每月支付这么多才能访问它。 |
| 好的。 |
| 所以。 |
| 你拿什么回来? 好吧,你会得到 JSON,它只是名称值对中的一堆字符串(例如大小写、冒号,然后是数字字符串) |
| 这将代表这个特定观察的案例数量,好吧。 JMP 有很好的工具来访问 JSON,我们将在一分钟内向您展示。 |
| 这是我们实际的 HTTP 请求调用。 我们只是要传入我们的 URL,我们想要的方法,即 GET,然后是这个安全零。 我们为什么要这样做? |
| 好吧,约翰霍普金斯大学是一个公共 API,它不想使用安全套接字层或 ssl,所以我们需要关闭它,否则调用将失败。 |
| 然后我们只需使用 send 命令进行调用,我们的 JSON 将在数据中返回。 |
| 因此,让我们深入研究一下脚本。 我将退出 PowerPoint,我们将提出 JMP。 |
| 我正在使用 JMP Pro 16,但这也适用于常规 JMP。 |
| 我会提到,这个脚本包含在会议材料中,以及我们将要查看的论文中。 |
| 可以,然后呢。 |
| 我在这里做什么来设置? 首先,我要说我正在使用我的文档文件夹来存储我的数据,并且我将把它存储在一个名为 covid19_de.jmp 的表中。 |
| 稍后我将生成一个报告,并确保它始终具有此名称。 在这种情况下,它是一个标准化的名称非常重要,稍后我会告诉你为什么。 |
| 最后,我只是将我的名称和文件中的文档路径转换为完整路径以供使用。 |
| 好吧,我们不会在这里担心这个日期格式化功能,我们将深入了解我们如何获取数据。 |
| 对,所以我们将在这里使用一个模式,也就是说, |
| 我们将假设我们以前从未运行过该脚本。 现在, |
| 如果我们没有找到我们之前积累数据的文件,那么我们将创建一个数据表并用值填充它。 但是,如果我们已经找到了一个数据表,那么我们将只用最近几天的数据更新该表,只需一个值,好吧。 |
| 这样我们就不必担心我们之前是否运行过它。 我们可以盲目地运行这个脚本,你可以把它交给其他人。 它会为他们工作。 |
| 好的,这里 |
| 我们要说如果我们的文件存在,我们的数据表在文档文件夹中,继续打开它,顺便说一下,继续设置这个标志来表示我们已经有数据。 |
| 否则,我将创建一个数据表,并使用日期、列、案例和每日变化来创建它。 |
| 正确的。 |
| 现在下一部分是我们将格式化我们的字符串以调用约翰霍普金斯大学。 请记住,我们需要有一个 from 和 to 范围。 好的,这是我们已经看过的字符串。 这是今天的价值。 |
| 好吧,所以在我只需要来自...的值的情况下 |
| 当天的值,我只是在更新我的数据。 |
| 我基本上要从昨天到今天。 好的,所以我要通过说今天减去两天来创建昨天,然后我要去今天。 |
| 我做了两天,因为根据约翰霍普金斯大学更新数据的时间和时间,有时你会得到一个值,有时你会得到两个。 |
| 当我......如果我得到两个,我将只取最近的值,但我想确保我得到一些东西。 |
| 好吧,接下来的事情是,如果我从未获得数据,我想要一个开始日期。 现在我随意的要从2020年9月1日开始;你可以放任何你想要的。 现在你看到我实际上使用的是 8 月 31 日,那是因为约翰霍普金斯大学实际上并没有给我们 |
| 天之间的变化值,因此它们只会为您提供大流行数据的累积病例总数。 所以为了计算变化,我必须减去 |
| 今天的价值来自昨天的价值。 |
| 好吧,如果我想从 9 月 1 日开始,那么我需要 8 月 31 日的数据来计算 9 月 1 日的变化,这就是我们这样做的原因。 |
| 如果您为约翰霍普金斯大学的高级 API 付费,您可以 |
| 获取变化值。 |
| 好的,这是我们之前讨论过的 URL。 |
| 好的,所以这在这里很重要。 如果我们有数据表明我们的 URL 将从昨天开始,但我们没有,并且我们正在使用这个 if 语句,如果我们不这样做,那么我们将从 9 月 1 日开始,我们的开始日期. |
| 然后我们就到今天。 |
| 我仅出于调试目的显示此 URL,但这是我们实际执行请求和发送调用的地方。 |
| 正确的。 |
| 我稍等片刻以确保它有机会运行。 |
| 这里是我们取回 JSON 数据的地方,这也是 JMP 非常方便的地方。 |
| Parse JSON 将获取这一大块字符串并将其分解为名称值对数组。 然后,您可以调用该数组上的项目以找出您获得了多少数据, |
| 您可以将该数据作为具有数组下标的数组引用。 |
| 好的。 |
| 所以现在让我们向下导航一点。 |
| 在这里,我们将填写我们的数据表。 如果我们已经有数据, |
| 然后我们将在最后的表格中添加一行, |
| 我们将填写该数据值以及我们根据今天的值与昨天的值计算的变化,好吧。 |
| 然后我们只是保存它。 |
| 现在。 |
| 如果我们以前从未创建过它,那么我们将添加我们拥有的行数,减去一,因为有一个标题信息,然后我们将循环通过它并计算我们所有的日常变化, |
| 日期值和 |
| 将案例数据放入表中。 我想我将展示,希望现在从头开始运行它,我们大约有 163 天或类似的时间。 |
| 然后我们将该表保存到文档文件夹中。 |
| 好的,现在我们有了数据,我们可以考虑发布到 JMP Live。 |
| 但这可能是我描述...您如何对 JMP Live 进行 JSL 编程以及我们如何在 JMP Live 16 和 JMP 16 中对其进行更改的好机会。 |
| 让我提出与本次演讲相关的论文,您也会在社区中看到它。 |
| 好的,所以在 JMP 16 中,我们重写了脚本,希望它更强大但更易于使用,并且脚本围绕存储连接或托管连接信息的想法展开。 |
| 所以。 |
| 发生的事情是……让我们再次提起 JMP。 |
| 我会告诉你这意味着什么。 你去归档、发布、管理连接。 |
| 好的。 |
| 我们可以添加一个。 |
| 在这里,您将指定您选择的连接名称,然后是 URL,JMP Live 本质上是一个 REST 服务本身,即您的 JMP Live 站点所在的位置。 如果您的管理员需要一个秘密 API 密钥来启用脚本,您需要在此处提供它。 |
| 当您执行此操作并点击下一个按钮时,系统会提示您,这很可能取决于您的凭据身份验证机制。 |
| 当您输入这些时,它实际上会给您一个访问令牌,这意味着它会为您将其存储在磁盘上,而不是您的凭据,而只是允许您访问此站点和脚本的访问令牌。 |
| 这样,您无需在脚本中提供任何此类信息,只需引用您提供的此连接名称即可。 我会给你看一个,例如,这是 JMP Live Daily,我将使用它。 这是我的 URL,我的 API 密钥。 |
| 我可以参考 JMP Live Daily,它会知道如何在我的脚本中连接。 |
| 好的。 |
| 因此,要创建连接,我只需说出新的 JMP Live 和我的连接名称。 现在我在这里说,如果需要,让我们提示。 这意味着什么? 好吧,如果,出于某种原因 |
| 你的凭据,你知道,过期或你的访问令牌是旧的,那么它会提示你输入你的凭据 |
| 一旦脚本启动。 如果您不提供此信息并且您的凭据已过期,则脚本将失败。 |
| 好的。 那么我们如何实际向 JMP Live 发布报告呢? 好的,这是一个简单的二元变量示例,您可能会用完 Big Class,好的。 |
| 因此,要使该报告成为已发布的报告,您只需说,创建一个新的 Web 报告并将其分配给一个变量。 |
| 然后我将采用这个双变量参考,我会说,将该报告添加到网络报告中。 |
| 我将有选择地提供标题和描述。 |
| 然后我将调用发布,发布将返回一个结果。 |
| 好的,我们可能会发布到 JMP Live 并看起来像这样。 |
| 如果我们想要,我们,结果会告诉我们是否成功,因为我们实际上是公共的......发布实际上就像一个 HTTP 调用,如果我们愿意,我们可以查看状态或错误消息. 好的。 |
| 好的。 |
| 另一个有趣的事情是 |
| 如果我们的操作结果是……例如向 JMP Live 添加报告或文件夹……我们返回的结果包含允许我们进一步操作该项目的信息。 |
| 我们可以将此称为可编写脚本,以使用该信息在脚本中创建一个对象,如报告,然后我们可以访问该对象。 例如,完成此操作后,我可以使用报表并设置报表标题。 它将转到 JMP Live 并更改报告标题。 |
| 好的。 |
| 现在,JMP Live 中的整个想法围绕着操作报告和文件夹、搜索文件夹、搜索报告等的想法。 |
| 报告明白 |
| 它有一个标识符。 这个标识符,如果你看的话,是一个很长的字母数字字符串,输入脚本或记住它真的很尴尬。 |
| 但这也是……您需要唯一标识该报告。 以及您可能想要唯一标识它的原因,假设您想要删除它。 |
| 您告诉 JMP Live 您要删除报告,然后报告可以...您可以使用该报告对象上的 Get ID 来提供该唯一 ID,以便 JMP Live 知道要删除哪个。 |
| 我向您展示这些特殊物品,因为我们的 |
| 我们希望制作的最终脚本。 |
| 另一个非常重要的领域是……知道 ID 正在搜索中。 |
| 现在在这里,我可以找到报告。 例如,假设我想查找所有以 Biv 开头的双变量报告,我可以让 JMP Live 查找报告并返回结果列表。 然后我可以...实际上把那个列表变成一个报告列表。 |
| 该报告列表中有一个名为“获取项目数”的函数,它允许我通过下标循环浏览每个项目。 |
| 然后,如果我愿意,我可以删除所有这些,好吧。 因此,搜索功能是新的,我们希望您可以使用相当强大的功能在 JMP Live 网站上进行大型操作。 |
| 对了,在我们真正准备好进一步展示我们的脚本之前,我们还需要解决一个操作。 |
| 那就是更新数据。 |
| 所以在 JMP Live 16 中, |
| 我们添加了仅更新报告数据的功能,而无需将整个报告重新发布到 JMP Live。 |
| 假设您以您想要的方式获得报告,并且您知道,它可能有点定制并且您喜欢外观并且不想弄乱它。 |
| 但是您确实想更新数据并重新计算它。 好吧,现在您可以只将该报告的数据表传递给 JMP Live,并且还可以减少传输时间, |
| 您可以通过调用更新数据、提供报告 ID 以及仅包含更新数据的数据表来完成此操作。 |
| 该报告将在 JMP Live 上重新计算,而不必在您的桌面上进行, |
| 任何碰巧正在查看该报告的人也会看到更新。 |
| 好的,现在我们已经拥有了实际执行脚本所需的所有工具,所以让我们来看看。 |
| 好的。 |
| 所以, |
| 这是我创建 JMP Live 连接的地方。 |
| 现在我要创建一个控制图。 现在控制图确实不是理想的 |
| 这个数据的分析平台,那我为什么要使用它呢? 嗯,有两个原因。 一,很高兴看到每天的变化, |
| 第二,它允许我插入或宣传我们在 JMP Live 16 中有另一个新功能的事实,那就是显示控制图警告。 |
| 如果您发布控制图并且存在超出范围的观察值 |
| 这会在桌面上生成警告,当您将其发布到 JMP Live 或更新数据时, |
| JMP Live 还可以生成警告,以发送给订阅该报告并希望在网站内收到电子邮件或通知的任何人,以表明某些内容超出范围。 这对于过程控制之类的事情非常有用。 |
| 所以我的同事 |
| 正在讨论控制图警告,如果有机会,我鼓励您也检查一下。 |
| 我是如何产生这个的? 好吧,我刚刚去了 JMP,你知道,有一些旧数据,例如,如果你正在做分析,你知道 JMP 中有一个工具,你可以说将脚本保存到脚本窗口。 |
| 我只是把这些信息插入到这个脚本中,所以非常方便。 |
| 好的。 |
| 因此,让我们深入了解我们将如何发布报告,我向你保证,我们会 |
| 稍后运行它。 |
| 可以,然后呢。 |
| 再一次,我将在这里有一个模式。 我将查找该报告以查看它是否已在 JMP Live 上发布。 |
| 如果不是,我将发布它,但如果它已经在上面,那么我将使用我们之前创建的更新数据表 |
| 我将提供它来更新服务器端的数据,并让它在它认为合适的情况下重新计算报告。 |
| 好的,那我该怎么做呢? 首先,我将搜索我们的报告(请记住,我们使用的是我之前指定的标准化报告名称,因此我们总是在寻找相同的名称)。 |
| 而且我还要说仅由我发布,以防万一其他人有同名报告。 我不想得到那个。 |
| 好的,我把它变成我可以查看的列表。 如果数量 |
| 报告为零,这意味着我没有找到以前发布的报告。 |
| 所以我要创建一个新的 Web 报表,将我的控制图生成器输出添加到它,然后发布它。 我想通过说 Public(1) 来确保每个人都可以使用它。 |
| 如果我确实找到了,我将使用该报告,引用返回的第一个项目,我将使用我们之前生成的更新表来更新这里的数据。 |
| 其余的只是调试信息,我在日志中显示只是为了查看是否一切正常,但这并不是真正必要的。 |
| 最后,在这里,我有一个退出声明。 |
| 当我们稍后真正实现自动化时, |
| 这很重要,因为我们希望 JMP 关闭并关闭所有窗口。 否则,下次我们去运行它时,它可能会看一下 JMP 已经在运行,并认为事情是从以前的操作中挂起的。 |
| 但是,对于交互操作,我现在将对此进行注释。 |
| 好的。 |
| 所以我 |
| 认为我们已经准备好去这里了。 我们可以试一试,我们会希望最好的。 有时约翰霍普金斯大学非常忙,实际上会拒绝获取数据的请求,这很不幸,但是 |
| 让我们试试这个。 |
| 只是为了向您展示,此时在文档文件夹中,我没有我指定的名称的 JMP 表,如果我去 |
| 我希望发布到的 JMP Live 站点,我们没有看到任何 |
| 那里的控制图生成器的输出。 |
| 好吧,让我们试一试。 |
| 对,这是我们的控制图。 |
| 我将刷新 JMP Live。 |
| 好的,这是我们的控制图生成器输出。 这个确实有警告。 |
| 如果我们在 JMP Live 中查看这个, |
| 我们可以将鼠标悬停在点上,看看最新的数据是什么。 这是2月10日的;我在 11 号,所以我们有最新的数据。 这是一些被认为是失控的数据,基于 1 月和 12 月下旬的移动平均线。 |
| 对,到目前为止,一切都很好。 |
| 如果我 |
| 打开我的文档文件夹并刷新它, |
| 我们可以看到我们的 JMP 表已经创建好了。 |
| 好的。 |
| 所以,我们现在看到这已经在一分钟前发布了。 |
| 好吧,让我们继续关闭它。 |
| 我们要...实际上,我不想那样做...等一下。 |
| 我们要在这里作弊。 |
| 让我们继续,我们将删除我们得到的最后一个值,对。 然后我们要保存它 |
| 并关闭它,好吧。 所以我们要模拟我们今天还没有运行它的事实,好吧,然后我们将再次运行它。 |
| 好的,只需获取最后一个值。 |
| 然后我们访问我们的网站。 |
| 我们看到它在几秒钟前又重新生成了。 所以在这种情况下,我们只是更新了数据,我们刚刚得到了最后一个值。 |
| 如果我要 |
| 培养 |
| 我的邮件,我碰巧订阅了警告,希望, |
| 也可能在这里看到一些更新。 我们收到通知 |
| 此控制图生成器中有一个出版物,并且有警告,如果我愿意,我可以去看看那些失败的地方以及哪些点超出了界限。 |
| 好的。 |
| 好的,所以我认为我们在尝试自动化任务方面处于良好状态。 所以我要继续,我要删除这篇文章。 |
| 正确的。 |
| 让我们关闭它。 |
| 关闭这个。 |
| 我将把我们的退出放回那里,因为现在我们将需要它,以一种自动化的方式运行。 |
| 我将关闭它。 |
| 转到文档文件夹,我要删除 |
| 我们的数据并假装我们正在从头开始运行它。 |
| 正确的。 |
| 让我们确保 JMP 已关闭。 |
| 好的。 |
| 现在。 |
| 如果您看过我之前的一些 Discovery 演讲,那么您可能已经看过我之前使用过任务调度程序。 这是我的热门话题。 |
| 您只需在 Windows 上输入任务计划程序;我希望你看到了。 |
| 在 Mac 上,您必须使用 automator 或 chron 作业。 我建议自动机。 |
| 好的,但是任务计划程序允许您定期运行几乎任何东西。 |
| 所以让我们继续 |
| 创建一个新任务。 我们将在这里创建任务并为其命名 |
| 德国的 COVID 数据。 |
| 我想以高权限运行。 |
| 我只在用户登录时运行,因为我不想输入凭据数据,但我建议 |
| 在用户登录或未登录时选择运行,如果您这样做是出于生产目的, |
| 因为如果您的机器由于 Windows 更新或其他原因而重新启动,您希望它仍然运行,如果您指定该选项,这将允许您这样做。 它将要求您输入您的凭据,并在您最终保存此任务时。 |
| 好吧。 |
| 那么对于触发器,那是什么? 那是我希望它运行的时候,所以让我们继续这样做。 |
| 假设我们想从明天开始每天运行它。 |
| 也许我只是想在早上六点之前运行它,然后我早上进去, |
| 无论进入意味着什么。 |
| 在我滚下床去上班之前。 好的。 |
| 因此,如果它运行时间超过 30 分钟,我将停止此任务,因为这可能意味着它已挂起。 |
| 否则我认为我们很适合去那里。 |
| 那么我们要执行什么操作呢? 好吧,我们要运行 JMP,因此您必须导航 jmp.exe 的安装位置,它位于程序文件、SAS 以及 JMP 或 JMP Pro 16 中。 继续并选择它。 |
| 然后,我们的参数是我们的 JSL 脚本,不幸的是,您必须在此处手动输入, |
| 我会做的。 |
| 但只要确保你小心。 |
| 好的。 |
| 现在,在设置下,我将确保我们始终允许。 它必须按需运行,因为这样我们就可以立即尝试并确保它正常工作。 |
| 如果已经有一个正在运行,请确保停止它。 这可能意味着如果再次运行超过一个小时,它就会挂起并停止任务,以防它挂起。 |
| 好的,所以我们的任务是每天运行。 所以我们基本上可以通过立即尝试来调试它,因为我们允许它随时运行。 让我们继续,右键单击鼠标按钮并说运行。 |
| 希望我们能看到任务栏。 JMP 将短暂启动、运行然后离开。 |
| 往下看,希望事情正在发生。 |
| 好的,然后就没了。 |
| 让我们看看我们的网站;它会刷新它。 |
| 还有我们几秒钟前生成的报告。 |
| 如果我们查看我们的文件夹,我们可以看到我们的 JMP 表已经生成,希望明天早上 6 点, |
| 我们的任务将运行并为我们获取一批新数据和更新的报告。 当我们端着咖啡或茶进来时,我们可以看一看,然后做出当天的决定。 |
| 我的演讲到此结束。 我希望我们今天讨论的三个方面之一, |
| 基于互联网的数据采集, |
| JMP Live 脚本或自动任务生成可以帮助您完成工作。 |
| 感谢您的出席,我希望您能享受接下来的会议。 再见。 |