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。