Python 幫助氣象學家
引言
ForecastWatch.com 是 Intellovations 的一項服務,其業務是評估 Accuweather、MyForecast.com 和 The Weather Channel 等公司天氣預報的準確性。每天都會收集超過 800 個美國城市的 36,000 多個天氣預報,然後將其與實際氣象資料進行比較。氣象學家利用這些比較來改進他們的天氣預報,並將其預報與他人的預報進行比較。消費者也利用它們來更好地瞭解預報的可能準確性。
架構
ForecastWatch.com 由四個主要的架構元件構建:用於獲取預報的輸入過程、用於獲取測量氣象資料的輸入過程、資料聚合引擎和 Web 應用程式框架。
系統中有兩個主要的輸入過程:預報解析器和實際資料解析器。預報解析器負責為 ForecastWatch.com 跟蹤的每個預報提供商從網路請求預報。它解析頁面中的預報並將其插入資料庫,直到可以與實際資料進行比較。實際資料解析器從 國家氣象局 的國家氣候資料中心獲取實際資料,該中心提供美國 800 多個城市的高溫、低溫、降水和重大天氣事件資料,並將資料插入資料庫。此過程還使用實際天氣資料對預報進行評分,並將該資訊放入資料庫中。
一旦資料收集並評分,它將由聚合引擎處理,該引擎將分數合併為按提供商、位置和預報未來天數劃分的年度和月度區塊。在 2003 年的第一年,系統只收集了 20 個美國城市的預報,大約 250,000 個單獨的預報,因此大部分資料輸出都基於原始評分資料。一旦系統擴充套件到 800 個城市,資料流增加了近 4000%,就添加了聚合引擎。在 2004 年上半年,系統已經對超過 400 萬個預報進行了評分,所有這些預報都在網路上收集、解析和顯示。
ForecastWatch.com 可用於確定天氣預報的準確性,例如透過檢視預報低溫和高溫誤差幅度的地圖 放大
ForecastWatch.com 架構中的最後一個元件是網站本身。這是客戶訪問收集和聚合的預報準確性資訊的介面。
用 Python 實現
ForecastWatch.com 是一個 100% 純 Python 解決方案。Python 用於其所有元件,從後端到前端,也包括系統中對效能更關鍵的部分。
最初選擇 Python 是因為它附帶了許多標準庫,這些庫在從網路收集、解析和儲存資料方面非常有用。其中特別適用於此應用程式的包括正則表示式庫、執行緒庫、物件序列化庫和 gzip 資料壓縮庫。其他庫,例如能夠接受 cookie 的 HTTP 客戶端 (ClientCookie) 和 HTML 表格解析器 (ClientTable) 作為第三方模組提供。這些被證明是無價的且易於使用。
執行緒庫在將 ForecastWatch.com 的覆蓋範圍擴充套件到 800 多個城市方面非常重要。抓取網頁是一個非常受 I/O 限制的過程,每天一次請求大約 5000 個網頁將耗費大量時間。使用 Python 的執行緒庫,網頁檢索迴圈只需為每個請求呼叫 thread.start_new(),傳入檢索和處理網頁所需的類例項方法,以及描述所需預報城市所需的引數。請求類使用 Python 內建的 Event 類例項在處理完成後與主控制執行緒通訊。Python 使執行緒的這種應用變得非常容易。
Python 也用於聚合引擎,它作為一個單獨的程序執行,將預報準確性分數組合成月度和年度切片。聚合過程透過 MySQLdb 查詢到 MySQL 資料庫,輸入模組已將他們收集的預報和氣候資料放入其中。然後生成彩色地圖,按地理區域顯示預報準確性,用於網站和列印報告。
這張預報準確性地圖使用藍色和紅色的強度來表示按地理區域預測溫度的誤差程度
ForecastWatch.com 的網路介面最初是用 PHP 編寫的,但後來改為 Python,以簡化工具集並改善與系統其他元件的整合。Quixote,一個 Python Web 應用程式框架,被選為完全基於 Python 的 Web 前端的基礎。基於 Quixote 的 Web 應用程式在 Linux 上使用 Apache 和 mod_scgi 執行,並且能夠像基於 PHP 的實現一樣快速地提供頁面。Python 使更改和新增功能比 PHP 實現更容易。Quixote 還提供了更靈活的 URL 製作,取代了像這樣的 PHP URL
http://www.forecastwatch.com/drilldown.php?s=2&m=2&d=1&p=1&st=33
使用更容易管理的 URL,例如
http://www.forecastwatch.com/drilldown/awx/2004/02/1/AL
這對於客戶來說更容易收藏或與客戶或潛在客戶分享。最後,Quixote 易於使用並與 Apache 很好地整合。例如,Quixote 中的重定向很簡單
request.redirect(path-or-URL)
Python 使其成為可能
Python 在 ForecastWatch.com 的成功中發揮了重要作用。該產品目前包含 5,000 多行 Python 程式碼,其中大部分都與實現應用程式的高階功能有關,而大部分細節都由 Python 強大的標準庫和上面描述的第三方模組處理。如果使用例如 Java 或 PHP,將需要更多的程式碼行。這些語言的整合能力不那麼強,並且它們的執行緒支援更難使用。
Python 作為一種面向物件的快速應用程式開發語言令人印象深刻。Python 的一個關鍵優勢在於它能夠快速產生結果而不會犧牲所得程式碼的可維護性。在 ForecastWatch.com 中,Python 也用於原型製作,並且這些原型能夠順利地演變為生產程式碼,而無需完全重寫或切換工具集。這節省了大量的精力,並使開發過程更加靈活和高效。
由於語言的簡潔設計,重構 Python 程式碼也比其他語言容易得多;移動程式碼所需的工作量更少。
Python 的解釋性也是一個優勢:程式碼想法可以在 Python 互動式 shell 中輕鬆測試,並且沒有編譯階段可以縮短編輯/測試周期。
所有這些因素結合起來,使 Python 成為 C++ 和 Java 作為通用程式語言的絕佳替代品。ForecastWatch.com 之所以能夠實現,是因為 Python 編寫複雜任務的便捷性以及 Python 允許的快速開發。
關於作者
Eric Floehr 專注於大規模資料收集和分析以及消費者網際網路軟體,曾與 MCI、Datalytics 和 Battelle 等公司合作。他擁有俄亥俄州立大學計算機與資訊科學學位。他在技術行業工作超過 13 年,是 Intellovations, LLC 的創始人,這是一家技術諮詢公司,專注於為發現構建軟體——具有挑戰性的專案,為企業帶來新的資訊和知識,以獲得競爭優勢、更高的生產力和更大的利潤。Intellovations 在俄亥俄州馬里斯維爾設有辦事處,可在網上找到 http://www.intellovations.com。
