揚聲器 | 成績單 |
| 布萊恩·科科倫 | 歡迎來到早上的更新。 這是我在 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 添加報告或文件夾……我們返回的結果包含允許我們進一步操作該項目的信息。 |
| 我們可以將此稱為 As Scriptable 以使用該信息在腳本中創建一個對象,如報告,然後我們可以訪問該對象。 例如,完成此操作後,我可以使用報表並設置報表標題。 它將轉到 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 腳本或自動任務生成可以幫助您完成工作。 |
| 感謝您的出席,我希望您能享受接下來的會議。 再見。 |