原文:https://community.tibco.com/feed-items/using-public-data-rest-api-spotfire
您是否曾在网上浏览数据并以API形式查看数据?一些组织,包括一些城市,正在通过开放数据门户提供公共数据。例如,以下是新加坡,欧盟,纽约市和西雅图的开放数据门户的链接。
浏览这些数据集目录,有一些不同的选项可以获取可以使用的数据副本; 最直接的选择是将数据集的副本下载为csv文件。许多数据集都有另一种选择,即使用REST API来处理数据。API选项非常有吸引力,因为您获得了数据集的最新版本,因此您最终不会得到使用陈旧数据的分析。
作为一个示例,这里是指向描述西雅图周围公共艺术装置数据的页面的链接:
该页面包含一些基本信息,例如通过视图数量和下载量来衡量数据集的流行度,页面底部显示数据前几个记录的预览。在右上角有一些选项,用于以几种不同的格式选择(包括csv)导出数据,以及另一个指向API信息的链接:
此API信息页面附带了一些有关如何使用此选项的良好文档; 主要信息是“API端点”,它是访问数据本身的方式。 以下是西雅图周围公共艺术装置的API端点。如果您在浏览器中转到此链接(例如,单击链接),您将看到JSON格式的数据。JSON是一种流行的 API 格式数据格式,XML是另一种经常使用的格式。
我们将使用Spotfire原生R引擎(TERR)通过此API获取数据。使用TERR访问此JSON格式数据的便捷方法是通过R包“jsonlite”,它提供了易于使用的工具来操作JSON数据。
我们首先打开一个新的Spotfire dxp文件。从这里我们将使用Spotfire的内置TERR来开发R代码。
首先,我们打开“TERR工具”窗口(来自Spotfire,工具 - > TERR工具)。
我们的第一个任务是确保在我们的TERR环境中安装“jsonlite”R软件包,这是一次性操作,在此之后不需要重复。在TERR工具窗口中,单击“包管理”选项卡,然后按右上角的“加载”。显示可用R包的列表。我们在搜索栏中输入“jsonlite”以缩小列表范围,如下所示:
然后,我们单击“安装”按钮在我们的系统上安装jsonlite软件包。这是一次性操作,不需要再次进行。
首先,让我们做一些探索性工作,并使用TERR控制台在交互式TERR会话中加载JSON数据。这是一个方便的环境,我们可以探索数据并尝试以不同的方式交互操作它。一旦我们有一个简短的功能脚本,我们就会把它打包成一个TERR数据函数,在那里可以重复使用它,而不必再看到代码。
要启动我们的TERR控制台,我们将转到TERR工具窗口的“引擎”选项卡:
从这里我们点击标有“Launch TERR Console”的按钮,这会打开一个控制台,我们将在那里完成所有的探索性工作:
对于更多涉及的项目,有更多全功能的交互式开发环境(IDE),例如RStudio,但是这个控制台可以像我们在这里一样开发一个简单的脚本。
在我们的交互式TERR会话中,我们使用library()函数加载jsonlite包,并使用fromJSON()函数检索数据(“json payload”)并将此数据保存为我们命名为“artData”的新本地对象:
> library(jsonlite)
> artData = fromJSON("https://data.seattle.gov/resource/public-art.json",
flatten=TRUE)
这里我们使用了可选参数“flatten = TRUE”来展平任何嵌套表。
任何数据对象(例如artData)都将在会话中保留,直到会话窗口关闭或对象被删除。现在我们已经将JSON有效负载下载到我们的本地artData对象,我们可以在闲暇时检查这个对象。
我们调查一些基本信息:
> class(artData)
[1] "data.frame"
> dim(artData)
[1] 316 22
对象artData是一个包含316行和22列的简单数据框。因此,它可以直接返回Spotfire。
请注意,如果我们为不同的数据源尝试了不同的API端点,则其JSON有效负载可能具有非常不同的结构。我们仍然可以在交互式TERR环境中检查和操作任何这些可能的数据结构; 但是,并非所有可由fromJSON()返回的对象都适合从TERR数据函数直接返回Spotfire。从TERR数据函数,我们可以将矩形对象返回到Spotfire(数据框和矩阵)或矢量对象,或“原子”对象,如字符串和数字或布尔值。
这正是我们在这个交互式TERR环境中进行早期探索的原因 - 如果我们遇到更复杂的数据结构,我们仍然可以在交互式环境中深入检查它,通常可以直接选择单个组件,可以从TERR数据功能返回。如果需要,可以编写TERR数据函数以返回多个数据对象。
在将此数据框返回到Spotfire之前,最好至少检查一下我们拥有的数据类型,因此我们使用R summary()命令:
> summary(artData)
sac_id project artist_first_name artist_last_name title description
Length:316 Length:316 Length:316 Length:316 Length:316 Length:316
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
classification media date location address latitude
Length:316 Length:316 Length:316 Length:316 Length:316 Length:316
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
longitude :@computed_region_q256_3sug :@computed_region_kuhn_3gp2 :@computed_region_ru88_fbhk
Length:316 Length:316 Length:316 Length:316
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
measurements :@computed_region_2day_rhn5 :@computed_region_cyqu_gs94 geolocation.latitude
Length:316 Length:316 Length:316 Length:316
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
geolocation.longitude geolocation.human_address
Length:316 Length:316
Class :character Class :character
Mode :character Mode :character
我们注意到数据表中的所有列都具有类“字符”,这是有意义的,因为它们来自JSON有效负载,它本身就是一个字符串。
我们想将纬度和经度列转换为Spotfire的数值。Spotfire当然也可以做到这一点; 以下是我们在TERR脚本中执行此操作的方法:
artData$latitude = as.numeric(artData$latitude)
artData$longitude = as.numeric(artData$longitude)
由于我们示例中的artData现在已准备好返回Spotfire,因此我们在TERR中的开发工作已经完成,我们已准备好创建Spotfire TERR数据功能。
在Spotfire中,我们在新的dxp文件(工具 - >注册数据函数)中注册一个新的TERR数据函数,并根据我们的探索性工作使用此代码创建数据函数(单击以展开):
我们将TERR数据功能命名为“Get Art Data”。我们还取消选中了“允许缓存”框,确保每次刷新时脚本都会运行。例如,如果我们在几个月后运行此数据函数,我们希望检索新数据而不使用任何缓存结果。
接下来,我们转到“输出参数”选项卡,在此选项卡中指定我们将返回Spotfire的对象。在此选项卡上,我们单击“添加”按钮,弹出一个对话框,我们将artData声明为对象,使用Type“Table”返回Spotfire。请注意,我们需要将此对话框中的名称与我们创建的实际R对象的名称完全匹配。
一旦我们指定了至少一个输出参数返回Spotfire,我们的“注册数据函数”对话框右上角的“运行”按钮将最终启用,绿色三角形可见。如果我们将鼠标悬停在“运行”按钮上,则会出现一个弹出窗口,指示此按钮将“在分析和运行中保存数据功能”:
我们按下“运行”按钮一次,将此数据函数的副本嵌入到我们的Spotfire分析文件中,并询问我们有关Spotfire参数的说明,以用作输入或保存为输出。我们没有在数据函数中写入任何输入,因此我们跳转到“输出”选项卡,然后单击我们的一个输出artData:
我们指定我们将在名为artData的Spotfire分析中创建一个新数据表。
管家提示:我们只按这个“运行”按钮一次(除非有执行错误)。数据函数执行并成功生成输出对象后,数据函数的副本已嵌入到Spotfire分析中。此时我们关闭这个“注册数据功能”对话框。如果我们再次按下“运行”按钮,我们最终会得到数据函数的第二个副本,这是我们不想要的。我们仍然可以编辑这个嵌入式数据函数,例如,我们可以编辑脚本本身,删除或添加输入或输出变量。要调出嵌入数据功能的编辑器,我们使用菜单数据 - >数据功能属性,然后导航到我们的“获取艺术数据”数据功能。
在Spotfire中运行我们的数据函数之后,我们将使用西雅图艺术装置的数据返回我们的表格(点击查看大图):
使用左侧的“数据分析”弹出窗口检查数据,我们突出显示纬度和经度列,Spotfire建议使用地图图表:
我们选择此地图图表建议,并在Spotfire中显示地图。我们可以通过地图的“分类”列对这些标记进行颜色编码,以显示这些安装在西雅图周围的位置:
从这里我们可以对位置进行颜色编码(这里通过分类),应用Spotfire过滤器等。
如果我们将来某个时候打开这个Spotfire分析,我们所要做的就是刷新数据函数以获取更新的数据副本
综上所述,