扬声器 | 成绩单 |
| 布赖恩·科科伦 | 欢迎来到早间更新。 这是我在 2021 年 JMP Discovery Europe 上的演讲。 |
| 我叫 Brian Corcoran,是 JMP 开发经理。 |
| 那么我们今天希望做什么呢? |
| 我想向您展示如何使用 REST 协议在基于 Internet 的数据提供程序的 JMP 中创建报表。 |
| 完成此操作后,我将向您介绍如何使用我们已放入 JMP 16 中的更新的 JMP 脚本引擎将此报告发布到 JMP Live。 |
| 最后,我将向您展示如何自动化此测试,以便每天当您上班时,报告已经为您更新,您只需在早晨喝咖啡或茶时即可查看它。 |
| 好的,首先我们来谈谈互联网数据提供商。 |
| 其中大多数都基于 REST 协议。 |
| 这是一个无状态调用,本质上它看起来像一个 URL,末尾标记了一些参数,越来越多的组织正在使用它向最终用户公开其公共数据。 一些例子包括世界银行、美国人口普查局、谷歌。 |
| 因此,JMP 有一个工具可以帮助您处理此问题,称为 HTTP 请求。 它将允许您访问这些服务。 通常他们使用 GET 或 POST 动词来获取这些内容。 HTTP 请求将允许您使用它们。 |
| 对于这份特别的报告,我将使用约翰霍普金斯大学的新冠病毒报告 |
| 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 的表中。 |
| 稍后我将生成一份报告,并确保它始终具有此名称。 在这种情况下,这是一个标准化的名称,这一点非常重要,稍后我将向您展示原因。 |
| 最后,我只是将我的名字和文件中的文档路径转换为要使用的完整路径。 |
| 好吧,我们不会在这里担心这个日期格式化函数,我们将深入讨论如何获取数据。 |
| 是的,所以我们要在这里使用一个模式,那就是, |
| 我们假设我们以前从未运行过该脚本。 现在, |
| 如果我们找不到之前积累数据的文件,那么我们将创建一个数据表并用值填充它。 但是,如果我们已经找到一个数据表,那么我们将只用最近几天的数据更新该表,只是一个值,好吧。 |
| 这样我们就不必担心我们以前是否运行过这个。 我们可以盲目地运行这个脚本,您可以将其交给其他人。 这对他们有用。 |
| 好吧,那么这里 |
| 我们会说,如果我们的文件存在,我们的数据表位于文档文件夹中,只需继续打开它,顺便说一句,继续并设置此标志以表明我们已经有数据。 |
| 否则,我将创建一个数据表,并使用日期、列、案例和每日更改来创建它。 |
| 正确的。 |
| 现在,下一部分是我们将格式化字符串以调用约翰霍普金斯大学。 请记住,我们需要有一个从和到范围。 好的,这是我们已经看过的字符串。 这是今天的价值。 |
| 好吧,所以在我只需要来自...的值的情况下 |
| 当天的价值,我只是更新我的数据。 |
| 我基本上将从昨天走到今天。 好吧,所以我要通过今天减去两天来创建昨天,然后我将转到今天。 |
| 我做了两天,因为根据约翰霍普金斯大学更新数据的时间和时间,有时你会得到一个值,有时你会得到两个值。 |
| 当我...如果我得到两个时,我将只取最新的值,但我想确保我得到一些东西。 |
| 好吧,接下来的事情是,如果我从未获得过数据,我想要一个开始日期。 现在我任意要从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 您想要删除报表,然后报表可以...您可以使用该报表对象上的“获取 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 报告,向其中添加我的控制图生成器输出,然后发布它。 我想通过公开(1)来确保每个人都可以使用它。 |
| 如果我确实找到了一个,我将获取该报告,引用返回的第一个项目,并且我将使用我们之前生成的更新表来更新此处的数据。 |
| 其余的只是我在日志中显示的调试信息,只是为了查看一切是否正常,但这并不是真正必要的。 |
| 最后,在最后,我有一个退出声明。 |
| 当我们稍后真正实现自动化时, |
| 这很重要,因为我们希望 JMP 关闭并关闭所有窗口。 否则,下次我们去运行它时,它可能会查看并看到 JMP 已经在运行,并认为事情因之前的操作而挂起。 |
| 不过,为了交互操作,我现在就把它注释掉。 |
| 好的。 |
| 所以我 |
| 我想我们已经准备好去这里了。 我们可以尝试一下,希望一切顺利。 有时约翰霍普金斯大学会变得非常忙碌,并且实际上会拒绝获取数据的请求,这将是不幸的,但是 |
| 让我们试试这个。 |
| 只是为了向您展示,此时在文档文件夹中,我没有具有我指定名称的 JMP 表,如果我转到 |
| 我希望发布到的 JMP Live 网站,但我们没有看到任何内容 |
| 控制图生成器的输出。 |
| 好吧,让我们尝试一下。 |
| 对了,这是我们的控制图。 |
| 我要刷新 JMP Live。 |
| 好的,这是我们的控制图生成器的输出。 这确实有警告。 |
| 如果我们在 JMP Live 中查看这一点, |
| 我们可以将鼠标悬停在点上并查看最新的数据是什么。 这是 2 月 10 日;我是 11 号,所以我们有最新数据。 根据 1 月和 12 月底的移动平均线,这些数据被认为是失控的。 |
| 是的,到目前为止,一切都很好。 |
| 如果我 |
| 打开我的文档文件夹并刷新它, |
| 我们可以看到我们的 JMP 表已创建。 |
| 好的。 |
| 所以,我们现在看到这已经在一分钟前发布了。 |
| 好吧,让我们继续关闭它。 |
| 我们要……实际上,我不想那样做……等一下。 |
| 我们要在这里作一点小作弊。 |
| 让我们继续,我们将删除我们获得的最后一个值,对吧。 然后我们要保存它 |
| 然后关闭它,好吧。 因此,我们将模拟今天尚未运行它的事实,然后我们将再次运行它。 |
| 好的,只需获取最后一个值即可。 |
| 我们访问我们的网站。 |
| 我们看到它在几秒钟前又重新生成了。 所以在这种情况下,我们只是更新了数据并且得到了最后一个值。 |
| 如果我要 |
| 培养 |
| 我的邮件,我碰巧订阅了警告,希望, |
| 可能也会在这里看到一些更新。 我们收到通知 |
| 该控制图生成器中有一份出版物,其中有警告,如果我愿意,我可以去看看那些失败的地方以及哪些点超出范围。 |
| 好的。 |
| 好吧,我认为我们已经准备好尝试自动化任务了。 所以我要继续删除这篇文章。 |
| 正确的。 |
| 让我们关闭它。 |
| 关闭这个。 |
| 我将把我们的退出放回那里,因为现在我们需要它,以一种自动化的方式运行。 |
| 我会关闭这个。 |
| 转到文档文件夹,我要删除 |
| 我们的数据并假装我们正在从头开始运行它。 |
| 正确的。 |
| 让我们确保 JMP 已关闭。 |
| 好的。 |
| 现在。 |
| 如果您看过我之前的一些 Discovery 演讲,您可能以前见过我使用任务计划程序。 这是我的一个热门话题。 |
| 在 Windows 上,您只需在此处输入任务计划程序即可;我希望你看到了。 |
| 在 Mac 上,您必须使用 automator 或 chron job。 我建议自动化。 |
| 好吧,但是任务计划程序允许您定期运行任何事情。 |
| 那么让我们继续吧 |
| 创建一个新任务。 我们将在这里创建任务并命名它 |
| 德国的新冠肺炎数据。 |
| 我想以高特权运行。 |
| 我只会在用户登录时运行,因为我不想输入凭据数据,但我建议 |
| 选择在用户登录或未登录时运行(如果您这样做是出于生产目的), |
| 因为如果您的计算机由于 Windows 更新或其他原因重新启动,您希望它仍然运行,如果您指定该选项,这将允许您执行此操作。 当您最终保存此任务时,它将要求您输入凭据。 |
| 好吧。 |
| 那么对于触发器来说,那是什么? 那是我希望它运行的时候,所以让我们继续这样做。 |
| 假设我们希望从明天开始每天运行它。 |
| 也许我只是想在早上六点钟上班之前运行它, |
| 无论进入意味着什么。 |
| 在我起床去上班之前。 好的。 |
| 因此,如果该任务运行时间超过 30 分钟,我将停止该任务,因为这可能意味着它已挂起。 |
| 除此之外,我认为我们很高兴去那里。 |
| 那么我们要执行什么操作呢? 好吧,我们想要运行 JMP,因此您必须导航 jmp.exe 的安装位置,即程序文件、SAS 以及 JMP 或 JMP Pro 16 中。 继续并选择它。 |
| 然后,我们的参数是我们的 JSL 脚本,不幸的是,您必须在这里手动输入, |
| 我会做的。 |
| 但请确保您对此非常小心。 |
| 好的。 |
| 现在,在设置下我将确保我们始终允许。 它必须按需运行,因为这样我们就可以立即尝试并确保它正常工作。 |
| 如果已经有一个正在运行,请确保停止它。 这可能意味着它已挂起,如果再次运行超过一个小时,则停止任务,以防万一它挂起。 |
| 好的,这就是我们每天要运行的任务。 因此,我们可以通过立即尝试来对其进行本质上的调试,因为我们允许它随时运行。 让我们继续,右键单击鼠标按钮并说运行。 |
| 希望我们能看到任务栏。 JMP 将短暂出现、运行,然后消失。 |
| 往下看,希望事情正在发生。 |
| 好吧,然后就没了。 |
| 让我们看看我们的网站;它将刷新这一点。 |
| 这是我们几秒钟前生成的报告。 |
| 如果我们查看文件夹,我们可以看到 JMP 表已生成,希望明天早上 6 点生成, |
| 我们的任务将运行并为我们提供一批新的数据和更新的报告。 当我们端着咖啡或茶进来时,我们可以看看并做出当天的决定。 |
| 我的演讲到此结束。 我希望我们今天讨论的三个方面之一, |
| 基于互联网的数据采集, |
| JMP Live 脚本或自动任务生成可以帮助您完成工作。 |
| 感谢您参加,希望您能享受本次会议的其余部分。 再见。 |