Python 助力氣象學家
簡介
ForecastWatch.com,是 Intellovations 的一項服務,其業務是對來自 Accuweather、MyForecast.com 和 The Weather Channel 等公司的天氣預報的準確性進行評級。每天收集超過 36,000 個美國 800 多個城市的天氣預報,並隨後與實際氣候資料進行比較。氣象學家利用這些比較來改進他們的天氣預報,並將他們的預報與其他人的預報進行比較。消費者也使用這些比較來更好地瞭解預報的可能準確性。
架構
ForecastWatch.com 由四個主要的架構元件構建:用於獲取預報的輸入程序、用於獲取測量的氣候資料的輸入程序、資料聚合引擎和 Web 應用程式框架。
系統中有兩個主要的輸入程序:預報解析器和實況解析器。預報解析器負責從 Web 請求 ForecastWatch.com 跟蹤的每個預報提供商的預報。它從頁面解析預報並將預報資料插入資料庫,直到可以與實際資料進行比較。實況解析器從 國家氣象局的國家氣候資料中心獲取實際資料,該中心提供美國 800 多個城市的高溫、低溫、降水和重大天氣事件,並將資料插入資料庫。此過程還會使用實際天氣資料對預報進行評分,並將該資訊放入資料庫中。
一旦資料被收集和評分,它就會被聚合引擎處理,該引擎將分數組合成按提供商、位置和預報未來天數切分的年度和月度塊。在其第一年,即 2003 年,該系統僅收集了美國 20 個城市的預報,約 250,000 個單獨的預報,因此大多數資料輸出都基於原始評分資料。一旦系統擴充套件到 800 個城市,資料流增加了近 4000%,就添加了聚合引擎。在 2004 年上半年,該系統已經對超過 400 萬個預報進行了評分,所有這些預報都在 Web 上收集、解析和顯示。

ForecastWatch.com 可用於確定天氣預報的準確性,例如透過檢視預報低溫和高溫的誤差幅度的地圖 放大
ForecastWatch.com 架構中的最後一個元件是網站本身。這是客戶訪問收集和聚合的預報準確性資訊的介面。
使用 Python 實現
ForecastWatch.com 是一個 100% 純 Python 解決方案。Python 用於其所有元件,從後端到前端,包括系統中對效能要求更高的部分。
最初選擇 Python 是因為它附帶了許多有用的標準庫,可用於從 Web 收集、解析和儲存資料。在此應用程式中特別有用的包括正則表示式庫、執行緒庫、物件序列化庫和 gzip 資料壓縮庫。其他庫,例如能夠接受 cookie 的 HTTP 客戶端 (ClientCookie) 和 HTML 表格解析器 (ClientTable) 可作為第三方模組使用。這些被證明是寶貴的且易於使用。
事實證明,執行緒庫對於將 ForecastWatch.com 的覆蓋範圍擴充套件到 800 多個城市非常重要。抓取網頁是一個非常 I/O 繫結的過程,並且每天為大約 5000 個網頁一次請求單個網頁將非常耗時。使用 Python 的執行緒庫,網頁檢索迴圈只是為每個請求呼叫 thread.start_new(),傳入檢索和處理網頁的必要類例項方法,以及描述所需預報的城市的必要引數。請求類使用 Python 內建的 Event 類例項,以便在處理完成時與主控制執行緒通訊。Python 使執行緒的這種應用變得非常容易。
Python 也用於聚合引擎,該引擎作為單獨的程序執行,將預報準確性分數組合成月度和年度切片。聚合過程透過 MySQLdb 查詢 MySQL 資料庫,其中輸入模組已將他們收集的預報和氣候資料放入其中。然後生成彩色地圖,顯示按地理區域劃分的預報準確性,以供在網站和印刷報告中使用。

此預報準確性地圖使用藍色和紅色的強度來指示按地理區域預測溫度的誤差程度
ForecastWatch.com 的 Web 介面最初是用 PHP 編寫的,但後來改為 Python,以簡化工具集並改進與系統其他元件的整合。Quixote,一個 Python Web 應用程式框架,被選為完全基於 Python 的 Web 前端的基礎。基於 Quixote 的 Web 應用程式在 Linux 上使用 Apache 和 mod_scgi 執行,並且能夠以與基於 PHP 的實現同樣快的速度提供頁面。與 PHP 實現相比,Python 可以更輕鬆地進行更改和新增功能。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 作為一種面向物件的快速應用程式開發語言令人印象深刻。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。