在上一期( 第 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>