13.4.3 收集有關地區的統計信息
我們的目標是展示自 1990 年以來,不同地區森林面積的變化。我們需要遍歷所有已有的地區,檢查數據是否可用,找到下載的指標值。這可以通過使用我們創建的映射,非常輕鬆地完成,因爲已經用年份和地區 ID 作爲關鍵字。
需要小心的是有一些數據可能會缺失,因此,我們要過濾掉所有沒有我們需要年份數據的地區。另外,我們還想要顯示森林總面積,而不是百分比,因此,在返回數據之前,要進行簡單的計算。雖然聽起來可能很難,但是,代碼並不非常複雜。在清單 13.17 中,我們只要在交互式 F# 中輸入幾條命令,能得到想要收集的數據。
清單 13.17 計算森林面積(交互式 F#)
> let calculateForests(area:float<km^2>, forest:float<percent>) = <--[1] 計算森林總面積
let forestArea = forest * area
forestArea / 100.0<percent>
;;
val calculateForests : float<km ^ 2> * float<percent> -> float<km ^ 2>
> let years = [ 1990; 2000; 2005 ]
let dataAvailable(key) = <-- [2] 對於給定的給定的鍵,值是否可用?
years |> Seq.forall (fun y –>
(Map.contains (y, key) areas) &&
(Map.contains (y, key) forests));;
val years : int list
val dataAvailable : string –> bool
> let getForestData(key) = <-- [3] 得到每年的值
[| for y in years do
yield calculateForests(areas.[y, key], forests.[y, key]) |];;
val getForestData : string -> float<km ^ 2> array
> let stats = seq { <-- [4] 對所有地區,查找可用數據
for name in regions do
if dataAvailable(name) then
yield name, getForestData(name) };;
val stats : seq<string * float<km ^ 2> array>
清單 13.17 定義了幾個輔助函數,處理下載的數據,並定義名爲 stats(統計數據)的值保存最後的結果。由於有了計量單位,可以很容易看出第一個函數的用途[1],它用該地區的總面積和森林面積佔比,計算森林總面積,以平方公里計。
第二個函數[2]檢查指定的地區是否有三年我們所需要的數據,它使用的函數 Map.contains 測試 F# 映射(第二個參數)是否包含第一個參數的關鍵字。最後一個輔助函數[3]看起來和第二個很相似,假定數據可用,以年和地區作爲關鍵字,對所有監控的年份,從映射中提取數據;然後,使用第一個函數,計算出原始數據的森林面積。
組合最後兩個函數,就可以收集所有地區的統計數字了[4],返回元組的序列,元組的第一個元素爲地區名,第二個元素爲數組,數組有三個元素,對應於所監控的三年的值。
在交互式 F# 中獲取數據以後,雖然可以在互動窗口中進行觀察,但是,很難通過輸出數據找出模型。爲了能夠從收集的數據中獲取更多的信息,必須以更友好的方式對數據進行可視化,例如,使用 Microsoft Excel。