揚聲器 | 成績單 |
| 布賴恩·科科倫 | 歡迎來到早間更新。 這是我在 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 腳本或自動任務生成可以幫助您完成工作。 |
| 感謝您參加,希望您能享受本次會議的其餘部分。 再見。 |