| 扬声器 |
抄本 |
| 布莱恩·科克伦 |
欢迎收听早间更新。这是我在 2021 年 JMP Discovery 欧洲大会上的演讲。 |
| |
我叫 Brian Corcoran,是一名 JMP 开发经理。 |
| |
那么我们今天希望做什么呢? |
| |
我想向您展示如何使用 REST 协议在 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,它只是一堆以名称值对形式呈现的字符串(例如,case、冒号,然后是一个数字字符串)。 |
| |
这就代表了该特定观察的案例数。JMP 拥有访问 JSON 的强大功能,我们稍后会演示。 |
| |
这是我们实际的 HTTP 请求调用。我们只需要传入 URL、所需的方法(即 GET)以及安全零值。为什么要这样做? |
| |
嗯,约翰霍普金斯大学是一个公共 API,它不想使用安全套接字层或 ssl,所以我们需要关闭它,否则调用将失败。 |
| |
然后我们只需使用发送命令进行调用,我们的 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 也为此提供了非常方便的功能。 |
| |
解析 JSON 会将这一大段字符串拆分成一个包含“名称-值”对的数组。然后,您可以调用该数组中的 items 来查看已获取的数据数量。 |
| |
并且您可以使用数组下标将该数据作为数组引用。 |
| |
好的。 |
| |
现在让我们稍微向下导航一下。 |
| |
这里我们要填写数据表。如果我们已经有数据, |
| |
然后我们在表格末尾添加一行, |
| |
我们将填写该数据值以及我们的变化,该变化是我们根据今天的值与昨天的值进行比较计算得出的,好的。 |
| |
然后我们就把它保存起来。 |
| |
现在。 |
| |
如果我们之前从未创建过它,那么我们将添加我们拥有的行数,减一,因为有一个标题信息,然后我们将循环遍历它并计算我们所有的每日变化, |
| |
日期值和 |
| |
把病例数据放到表格里。我想我会演示一下,希望现在从头开始运行,我们现在大概是163天左右。 |
| |
然后我们将该表保存到文档文件夹中。 |
| |
好的,现在我们有了数据,我们可以考虑发布到 JMP Live。 |
| |
但这对我来说可能是一个很好的机会来描述...如何使用 JMP Live 进行 JSL 编程以及我们如何在 JMP Live 16 和 JMP 16 中对其进行更改。 |
| |
让我提出与这次演讲相关的论文,您也可以在社区中看到它。 |
| |
好的,在 JMP 16 中,我们重写了脚本,希望它更强大但更易于使用,并且脚本围绕存储连接或管理连接信息的想法展开。 |
| |
所以。 |
| |
发生的事情是...让我们再次提起 JMP。 |
| |
我来演示一下。你去文件、发布、管理连接。 |
| |
好的。 |
| |
我们可以添加一个。 |
| |
在这里,您可以指定一个连接名称,然后指定您的 JMP Live 站点所在的 URL。JMP Live 本质上是一个 REST 服务。如果您的管理员需要使用 API 密钥来启用脚本,您需要在此处提供。 |
| |
当您执行此操作并点击下一步按钮时,系统将提示您,这很可能取决于您的凭据身份验证机制。 |
| |
当您输入这些内容时,它实际上会为您提供一个访问令牌,这意味着它会将其存储在磁盘上,而不是您的凭据,而只是允许您访问该站点并编写脚本的访问令牌。 |
| |
这样,您无需在脚本中提供任何信息,只需引用您提供的连接名称即可。我给您举个例子,这就是我要使用的 JMP Live Daily。这是我的 URL,也就是我的 API 密钥。 |
| |
我只需参考 JMP Live Daily,它就会知道如何在我的脚本中进行连接。 |
| |
好的。 |
| |
那么,要创建连接,我只需输入“new JMP Live”和连接名称。现在我在这里说,如果需要,请提示。这是什么意思?嗯,如果出于某种原因 |
| |
您的凭证已过期或访问令牌已旧,则系统会提示您输入凭证 |
| |
脚本启动后。如果您不提供此信息,并且您的凭据已过期,则脚本将失败。 |
| |
好的。那么我们实际上如何将报告发布到 JMP Live 呢?好的,这里有一个简单的双变量示例,你可能会用不到 Big Class 了。 |
| |
因此,为了使其成为已发布的报告,您只需创建一个新的网络报告并将其分配给一个变量。 |
| |
然后我将采用这个双变量参考,并将该报告添加到网络报告中。 |
| |
我将选择性地提供标题和描述。 |
| |
然后我只需调用发布,发布就会返回结果。 |
| |
好的,我们可能会发布到 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 了。 |
| |
如果不是,我会发布它,但如果它已经在那里,那么我将只采用我们之前创建的更新数据表 |
| |
我将提供该功能来更新服务器端的数据,并让其在认为合适时重新计算报告。 |
| |
好的,那我该怎么做呢?首先,我要搜索我们的报告(记住,我们使用我之前指定的标准化报告名称,所以我们总是在寻找同一个名称)。 |
| |
我还要说“仅限我发布”,以防其他人也发布同名报告。我可不想收到这样的报告。 |
| |
好的,我会把它变成一个我可以查看的列表。如果 |
| |
报告为零,这意味着我没有找到之前发布的报告。 |
| |
我要创建一个新的网页报告,将我的控制图生成器输出添加到其中,然后发布。为了确保每个人都能看到,我选择了“公开(1)”。 |
| |
如果我确实找到了,我将获取该报告,引用返回的第一个项目,然后使用我们之前生成的更新表来更新此处的数据。 |
| |
其余部分只是我在日志中显示的调试信息,只是为了查看一切是否正常,但这并不是真正必要的。 |
| |
最后,在这里我有一个退出声明。 |
| |
当我们稍后真正实现自动化时, |
| |
这很重要,因为我们希望 JMP 能够关闭所有窗口。否则,下次运行它时,它可能会发现 JMP 已经在运行,并认为之前的操作导致程序挂起了。 |
| |
然而,为了进行交互式操作,我现在要将其注释掉。 |
| |
好的。 |
| |
所以我 |
| |
我觉得我们已经准备好了。我们可以试试,希望一切顺利。有时候约翰·霍普金斯大学会非常忙,甚至会拒绝获取数据的请求,这很不幸,但是 |
| |
让我们尝试一下。 |
| |
只是为了向你展示,此时在文档文件夹中,我没有指定名称的 JMP 表,如果我转到 |
| |
我希望发布到 JMP Live 网站,但我们没有看到任何 |
| |
从那里的控制图生成器输出。 |
| |
好吧,让我们尝试一下。 |
| |
好的,这是我们的控制图。 |
| |
我要刷新 JMP Live。 |
| |
好的,这是我们的控制图生成器的输出。这个确实有警告。 |
| |
如果我们在 JMP Live 中查看这一点, |
| |
我们可以将鼠标悬停在点上,查看最新的数据。这是2月10日的数据;我这里是11日,所以我们有最新的数据。根据1月份和12月底的移动平均值,这些数据被认为失控了。 |
| |
是的,到目前为止一切都很好。 |
| |
如果我 |
| |
打开我的文档文件夹并刷新它, |
| |
我们可以看到我们的JMP表已经创建好了。 |
| |
好的。 |
| |
所以,我们现在看到这是一分钟前发布的。 |
| |
好吧,那我们就继续并将其关闭吧。 |
| |
我们要……实际上,我不想那样做……等一下。 |
| |
这里我们要稍微作弊一下。 |
| |
我们继续,删除我们得到的最后一个值,对吧。然后保存它 |
| |
然后关闭它,好吗?所以我们要模拟一下今天还没有运行它的情况,好吗?然后我们再运行一次。 |
| |
好的,只需获取最后一个值。 |
| |
然后我们就进入我们的网站。 |
| |
我们看到它几秒钟前才重新生成。所以在这种情况下,我们只是更新了数据,并获得了最后一个值。 |
| |
如果我 |
| |
提出 |
| |
我的邮件,我恰好订阅了警告,希望, |
| |
可能也会在这里看到一些更新。我们收到通知 |
| |
这个控制图生成器中有一个出版物,其中有警告,如果我愿意,我可以去查看哪些地方失败了,哪些点超出了界限。 |
| |
好的。 |
| |
好吧,我觉得我们现在已经准备好尝试自动化任务了。所以我要继续,然后删除这篇帖子。 |
| |
正确的。 |
| |
让我们关闭它。 |
| |
把这个关闭。 |
| |
我要把我们的退出放回那里,因为现在我们需要它,以自动化的方式单向运行。 |
| |
我将结束此篇。 |
| |
前往文档文件夹,我要删除 |
| |
我们的数据并假装我们从头开始运行它。 |
| |
正确的。 |
| |
并确保 JMP 已关闭。 |
| |
好的。 |
| |
现在。 |
| |
如果你看过我之前的一些 Discovery 演讲,你可能见过我使用任务调度程序。这是我经常讨论的一个话题。 |
| |
您只需在 Windows 上输入任务计划程序即可;我希望您看到了。 |
| |
在 Mac 上,你得用 Automator 或 chron 任务。我建议用 Automator。 |
| |
好的,但是任务计划程序允许您定期运行任何操作。 |
| |
那么让我们继续 |
| |
创建一个新任务。我们只需在这里创建任务并命名它 |
| |
德国的 COVID 数据。 |
| |
我想以高权限运行。 |
| |
我只会在用户登录时运行,因为我不想输入凭证数据,但我建议 |
| |
如果出于生产目的,则选择在用户登录时运行, |
| |
因为如果您的计算机由于 Windows 更新或其他原因重新启动,您希望它仍然运行,并且如果您指定该选项,这将允许您这样做。它将要求您输入您的凭据,并最终保存此任务。 |
| |
好吧。 |
| |
那么触发器是什么呢?触发器就是我想要它运行的时间,所以我们就开始吧。 |
| |
假设我们想从明天开始每天运行它。 |
| |
也许我只是想在早上六点上班之前运行它, |
| |
无论进去意味着什么。 |
| |
在我起床去上班之前。好的。 |
| |
因此,如果该任务运行时间超过 30 分钟,我将停止该任务,因为这可能意味着它已挂起。 |
| |
除此之外,我认为我们可以去那里。 |
| |
那么我们要执行什么操作呢?我们想要运行 JMP,所以你需要找到 jmp.exe 的安装位置:Program Files、SAS,以及 JMP 或 JMP Pro 16。选择它。 |
| |
然后,我们的参数是我们的 JSL 脚本,不幸的是,你必须在这里手动输入, |
| |
我会这么做的。 |
| |
但一定要确保你对此非常小心。 |
| |
好的。 |
| |
现在,在“设置”下,我要确保我们已启用“始终允许”。它必须按需运行,因为这样我们就可以立即尝试并确保它正常运行。 |
| |
如果已经有一个正在运行的任务,请务必停止它。这可能意味着它挂了。如果该任务再次运行超过一小时,请停止它,以防它再次挂起。 |
| |
好了,这就是我们每天要运行的任务。由于我们允许它随时运行,所以我们现在可以通过尝试来调试它。我们继续,右键单击鼠标按钮,然后选择“运行”。 |
| |
希望我们能看到任务栏。JMP 会短暂地出现、运行,然后消失。 |
| |
往下看,希望事情正在发生。 |
| |
好的,然后它就消失了。 |
| |
让我们看一下我们的网站;它将刷新它。 |
| |
这是我们几秒钟前生成的报告。 |
| |
如果我们查看文件夹,我们可以看到 JMP 表已经生成,希望明天早上 6 点, |
| |
我们的任务将会运行,并获取一批新数据和一份更新的报告。当我们端着咖啡或茶回家时,就可以查看这些数据,并做出当天的决策。 |
| |
我的演讲到此结束。我希望我们今天讨论的三个方面, |
| |
基于互联网的数据采集, |
| |
JMP Live 脚本或自动任务生成可以帮助您完成工作。 |
| |
感谢您的出席,祝您会议愉快!再见! |