13.4.3 收集有關地區的統計信息

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章