| 揚聲器 |
抄本 |
| 布萊恩·科克倫 |
歡迎收聽早晨更新。這是我在 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 腳本或自動任務產生可以幫助您完成工作。 |
| |
感謝您的出席,祝您會議愉快!再見! |