在上一期( 第 2 部分)中,我們介紹了 JMP 的 Python 整合功能如何允許您從 Python 程式碼呼叫 JSL,反之亦然。
現在,讓我們再來看一下導入世界銀行資料的Python程式碼的第一部分,我們之前一直用它作為範例。這段程式碼指定了目標G7國家、年份和指標(共三個),然後匯入了這些資料。
PythonコードPython 程式碼
但是,如果您想縮小目標國家範圍、使用不同的指標或更改目標年份,則需要重寫上述程式碼。
雖然這本身可能不是什麼大麻煩,但當你經常更改條件或當其他 JMP 用戶需要使用它時,就會變得很不方便。
在這種情況下,提供一個對話框,讓使用者可以選擇以下條件,使他們能夠自由地指定用於分析的條件,是非常方便的。
ダイアログ對話
因此,這次我將介紹一種方法,透過在 JSL 中編寫列選擇和參數輸入對話框,使具有固定條件的腳本更加通用和可重複使用。
請注意,本節不會詳細解釋如何建立對話方塊。其目的僅在於示範建立對話方塊所能實現的各種功能。
建立一個對話框
我們將使用 JSL 來建立對話。因此,這種情況「最好採用基於 JSL 的編寫方式 (.jsl) 」。
這是上次介紹的 JSL 程式碼(Example1-2_WorldBank.jsl)的改進版本,現在會在運行時顯示一個對話框,允許您執行以下操作:
- 從七個七國集團 (G7) 國家中選擇目標國家(可以使用 Ctrl 鍵進行多重選擇)。
- 除了前三個指標外,我們還添加了 GDP_growth(GDP 成長率)、Inflation(通貨膨脹率)、Unemployment(失業率)和 Fertility_rate(出生率),您可以從中選擇目標指標(可以使用 Ctrl 鍵進行多項選擇)。
- 指定起始年份和結束年份
完整的程式碼已附在本部落格文章中。在這裡,我將解釋創建對話框的關鍵點。
1. 定義對話方塊中可以選擇的國家和指標。
首先,我們列出可供選擇的國家和指標。在本例中,我們已將世界銀行使用的代碼與顯示名稱進行了匹配。
// 選択できる国(G7)・指標
countryNames = {"Japan", "United States", "Canada", "United Kingdom", "Germany", "France", "Italy"};
countryCodes = {"JP", "US", "CA", "GB", "DE", "FR", "IT"};
/* 選択できる指標: 人口,一人当たりGDP,経済成長率,インフレ率, 失業率,出生率,平均寿命 */
indNames = {"Population", "GDP_per_capita", "GDP_growth", "Inflation",
"Unemployment", "Fertility_rate", "Life_expectancy"};
indCodes = {"SP.POP.TOTL", "NY.GDP.PCAP.CD", "NY.GDP.MKTP.KD.ZG", "FP.CPI.TOTL.ZG",
"SL.UEM.TOTL.ZS", "SP.DYN.TFRT.IN", "SP.DYN.LE00.IN"};
2. 對話部分
我們將使用 New Window() 函數建立一個對話框。 JMP 腳本編寫指南中提供了程式碼範例。
對話方塊採用 V 列錶框(垂直)、H 列錶框(水平)和麵板(標題框)排列,其中放置一個列錶框用於從清單中進行選擇,以及數字編輯框用於輸入數值。
// ダイアログの起動
selCountry = {};
selInd = {};
startY = .;
endY = .;
nw = New Window( "Get World Bank Data",
<
<MODAL></MODAL>
<BR /> <P><FONT size="4" color="#0000FF">3. 建立要傳遞給 Python 的變數</FONT></P> <P><FONT size="4">選定的國家名稱和指標名稱會轉換為世界銀行使用的代碼,並以關聯數組的形式列出。<STRONG>關鍵在於後續的 Python Send() 函數,它會將 JSL 變數作為同名的 Python 變數傳遞。</STRONG>這樣,後續的 Python Submit() 函數中的 Python 程式碼就可以直接使用 `countries` 和其他變數。</FONT></P> <CODE class=" language-jsl">// Python に渡す変数の作成
countries = {};
For( i = 1, i <= N Items( selCountry ), i++,
Insert Into( countries, countryMap[selCountry[i]] )
);
indicators = {};
For( i = 1, i <= N Items( selInd ), i++,
Insert Into( indicators, indCodeMap[selInd[i]] )
);
colnames = selInd;
// Show( countries, indicators, colnames, startY, endY );
Python Send( countries );
Python Send( indicators );
Python Send( colnames );
Python Send( startY );
Python Send( endY ); </CODE></FONT></P> <P><FONT size="4">pandas_datareader 套件會根據傳遞給 Python 的變數值,輸出指定國家、指標和年份的資料表。</FONT></P> <P><FONT size="2">注意:此程式碼優先考慮簡潔性,因此不包含太多用於檢查輸入值或錯誤處理的程式碼。</FONT></P> <BR /> <P><FONT size="5" color="#FF6600">使用 JMP 對透過 Python 整合獲得的資料進行視覺化和分析。</FONT></P> <P><FONT size="4">執行 JSL 腳本時,將出現您建立的對話框,讓您指定國家/地區、指標和年份來建立資料。</FONT></P> <P><FONT size="4">為了比較日本、美國、德國和法國在 COVID-19 疫情前後 GDP 成長率、通貨膨脹率和失業率的趨勢,我們將創建涵蓋 2017 年至 2024 年期間的數據。</FONT></P> <P><FONT size="4">如果能以 JMP 資料表的形式取得數據,則可以透過點擊資料表中的直方圖圖示(表頭圖)在列名下方顯示圖表。選擇圖表中的相關部分即可選取相應的數據,從而在數據表中進行一定程度的數據探索。</FONT></P> <P><FONT size="4"><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ダイアログによる国と指標の選択" style="width: 999px;"><span class="lia-inline-image-display-wrapper" image-alt="ダイアログによる国と指標の選択" style="width: 999px;"><img src="https://us.v-cdn.net/6038925/uploads/images/112217i69CB0159845A07E6/P4.png" role="button" title="P4.png" alt="ダイアログによる国と指標の選択" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">ダイアログによる国と指標の選択</span></span><SPAN class="lia-inline-image-caption" onclick="event.preventDefault();">基於對話的國家和指標選擇</SPAN></SPAN></FONT></P> <P><FONT size="4">這些數據還可以用於分析年度趨勢,例如使用氣泡圖進行動畫演示,如第一部分所述。此外,使用[圖表產生器],您可以建立折線圖和長條圖,顯示各項指標的年度趨勢,如下所示。</FONT></P> <P><FONT size="4"><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="可視化" style="width: 999px;"><span class="lia-inline-image-display-wrapper" image-alt="可視化" style="width: 999px;"><img src="https://us.v-cdn.net/6038925/uploads/images/112018iC6D52C5CF3BFD2FC/fig4.png" role="button" title="fig4.png" alt="可視化" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">可視化</span></span><SPAN class="lia-inline-image-caption" onclick="event.preventDefault();">可視化</SPAN></SPAN></FONT></P> <P><FONT size="4">此外,利用[時間序列預測],您可以擬合平滑模型以獲得未來的預測值和預測區間。</FONT></P> <P><FONT size="4"><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="時系列モデル" style="width: 627px;"><span class="lia-inline-image-display-wrapper" image-alt="時系列モデル" style="width: 627px;"><img src="https://us.v-cdn.net/6038925/uploads/images/112218i3DBB79F853ECEB1B/P6.png" role="button" title="P6.png" alt="時系列モデル" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">時系列モデル</span></span><SPAN class="lia-inline-image-caption" onclick="event.preventDefault();">時間序列模型</SPAN></SPAN></FONT></P> <BR /> <P><FONT size="5" color="#FF6600">綜上所述</FONT></P> <P>在本文中,我介紹了一種透過將 Python 編寫的資料檢索程式碼與用 JSL 建立的對話方塊結合來建立「通用工具」的方法。</P> <P><FONT size="4">重點如下三點:</FONT></P>
<UL>
<LI><FONT size="4"><STRONG>對話方塊是用 JSL 建立的:</STRONG>因此,即使核心處理是用 Python 完成的,如果初始腳本是 .jsl 格式,處理起來也更容易。這是我們在第二部分討論的「使用 .py 還是 .jsl 編寫」這一決策中存在爭議的焦點之一。</FONT></LI>
</UL>
<UL>
<LI><FONT size="4"><STRONG>接收到的值透過 Python 的 Send() 方法傳遞給 Python:</STRONG>由於 JSL 變數名在 Python 中變成了相同的變數名,因此幾乎不需要重寫 Python 程式碼本身。</FONT></LI>
<LI><FONT size="4"><STRONG>匯入資料後,您可以使用通常的 JMP 資料表對其進行探索:</STRONG>您可以直接使用 JMP 的分析功能,例如圖表建構器和時間序列預測。</FONT></LI>
</UL> <P><FONT size="4">透過使用 Python 取得和處理數據,然後使用 JMP 進行視覺化和分析,並將輸入條件的指定委託給對話框,可以在不更改主腳本的情況下從外部提供這些條件。這透過使用對話框提高了腳本的靈活性。</FONT></P> <P><FONT size="4">在下一期( <A href="https://community.jmp.com/t5/Naohiro-Masukawa/%E7%B5%90%E5%B1%80-JMP%E3%81%AE-Python%E9%80%A3%E6%90%BA-%E3%81%A7%E4%BD%95%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC4%E5%9B%9E-JMP%E3%81%AB%E3%81%AA%E3%81%84%E5%88%86%E6%9E%90%E6%89%8B%E6%B3%95%E3%82%92-JMP%E3%81%AE%E6%93%8D%E4%BD%9C%E6%84%9F%E3%81%A7%E4%BD%BF%E3%81%86-%E5%85%A84%E5%9B%9E%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81%E5%8B%95%E7%94%BB%E3%81%82%E3%82%8A/ba-p/963459" target="_blank">第 4 部分</A>)中,為了進一步實現通用化,我們將介紹一個使用 Python 套件來執行 JMP 中未包含的功能的範例,並使用類似於我們這次創建的對話方塊來指定要分析的變數(列)。</FONT></P> <BR /> <P><FONT size="4">作者:Naohiro Masukawa(JMP 日本)</FONT></P> <P><FONT size="4"><U><A href="https://community.jmp.com/t5/Naohiro-Masukawa/bg-p/nmasukawa-blog" target="_blank">Naohiro Masukawa - JMP 使用者社區</A></U></FONT></P>
</LINGO-BODY>
<CODE class=" language-jsl">
<LINGO-TEASER id="lingo-teaser-962736" slang="ja-JP" mode="UPDATE">
<P>本文簡要介紹了對話方塊(使用者選擇和輸入目標國家、指標和時間段等條件的操作介面)的作用。然後,本文闡述瞭如何透過使用 JMP 的 JSL 建立對話框並將其與 Python 集成,來創建一個能夠靈活適應條件變化的通用資料收集工具。使用對話方塊的優點在於,無需重寫腳本即可變更使用條件,從而大大簡化了重複使用和與其他使用者共享的過程。</P>
<BR />
</LINGO-TEASER>