13.3.3 获取指标
13.3.3 获取指标 获取有关国家或地区的数据,需要使用世界银行服务的不同函数,函数的路径是 /countries/indicators,可以在 Data Calls 选项卡的 Query Generator(查询生成器)中找到,它能够请求指定国家在特定时间段的有关指标数据。我们不必单独下载每个感兴趣的地区数据,可以一次性地获得所有国家的信息,在内存中进行处理。以这种方式可以下载更多的数据,而请求的数量较少,因为我们不必为每个地区创建请求。 清单 13.11 获得地区的森林覆盖率 (交互式 F#) > let ind = "AG.LND.FRST.ZS" | 指定 1990 年地区
let date = "1990:1990" | 森林数据的第一页
let page = 1 |
let props =
[ "countries","indicators"; ind ]
[ "date",date; "page",string(page) ];;
(...)
> let doc = Async.RunSynchronously(worldBankRequest(props)) | [1] 获得数据,
printfn "%s..." (doc.ToString().Substring(0,301));; | 输出
val doc : XDocument
<wb:data xmlns:wb="http://www.worldbank.org"
page="1" pages="3" per_page="100" total="231">
<wb:data>
<wb:indicator id="AG.LND.FRST.ZS">Forest area (% ...</wb:indicator>
<wb:country id="AW">Aruba</wb:country>
<wb:value></wb:value>
<wb:date>1990</wb:date>
</wb:data>...
> doc |> xnested [ "data" ] | 读页数
|> xattr "pages" |> int;; |
val it : int = 3
> doc |> xnested [ "data"; "data"; "country" ] | 读第一个国家的 ID
|> xvalue;; |
val it : string = "Aruba"
清单 13.11 首先定义了一组属性,这是为了创建请求所需要的;然后,用这些属性创建一个列表,这是 worldBankRequest 函数的参数。文档下载之后,我们要浏览一下结构,因此,要转换成字符串,输出前面几行[1]。输出的结果表明,整个数据集有三页;每个国家的信息嵌套在 data 元素中,包含国家的名字和 ID,以及日期(原文 data 有误,应该是 date)信息和实际值。第一个国家没有这个值,所以,在解析数据时,必须要仔细处理这种情况。 清单13.12 异步下载所有指标 (F#) let rec getIndicatorData(date,indicator,page) = async {
let args = [ "countries"; "indicators"; ind ],[ "date",date; "page",string(page)]
let! doc = worldBankRequest args
let pages =
doc |> xnested [ "data" ] | [1] 得到页数
|> xattr "pages" |> int |
if (pages = page) then
return [doc] <-- [2] 返回最后的页面
else
let page = page + 1
let! rest = getIndicatorData(date,page) <-- [3] 下载其余的页面
return doc::rest }
函数(getIndicatorData)有三个参数,日期、指标以及所需的页数,用它们来生成参列表, 作为 worldBankRequest 函数的参数。得到 XML 以后,我们读出数据集总页数的特性[1];如果当前处理的是最后一页,就返回包含当前页的列表,其中只有一个元素 [2];否则,继续下载其余页面。注意,函数是用 let rec 声明的,所以,可以递归地调用这个函数,获得剩余页面[3]。因为是在异步工作流的内部,所以使用了 let!。得到了其余页面的列表以后,就可以把下载的页面合并起来,结果就返回所有的页面。 清单13.13 并行下载多年的多指标 (F#) let downloadAll = seq {
for ind in [ "AG.SRF.TOTL.K2"; "AG.LND.FRST.ZS" ] do | [1]
for year in [ "1990:1990"; "2000:2000"; "2005:2005" ] do |
yield getIndicatorData(year,ind,1) }
let data = Async.RunSynchronously(Async.Parallel(downloadAll)) [2]
脚本首先为我们感兴趣的指标和年度的组合生成工作流[1],然后,再把所有的工作流组合成并行运行的一个工作流,再同步运行,下载所有数据[2]。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 如何确定Rails对象是否为marked_for_dest
- 在C#中利用Keep-Alive处理Socket网络异常断开的方法
- [Swift]LeetCode818. 赛车 | Race Car
- c# – 如何在Windows中强制显示检测?
- C#中时间的几种格式转换方法
- 在flex下,切换模块时出现RemoteClass注册失败
- 转换jsonArray异常——由hibernate引起的转换jsonArray异常
- Oracle Primavera Solutions Practice.Primavera 解决方案
- ruby-on-rails – 针对现有rails项目的i18n本地化的最佳在线
- 设计模式六大原则(3):依赖倒置原则