注意: 虽然 JavaScript 对于本网站并非必不可少,但您与内容的互动将受到限制。请启用 JavaScript 以获得完整体验。

Python 助力气象学家

简介

ForecastWatch.com,是 Intellovations 的一项服务,其业务是对来自 AccuweatherMyForecast.comThe Weather Channel 等公司的天气预报的准确性进行评级。每天收集超过 36,000 个美国 800 多个城市的天气预报,并随后与实际气候数据进行比较。气象学家利用这些比较来改进他们的天气预报,并将他们的预报与其他人的预报进行比较。消费者也使用这些比较来更好地了解预报的可能准确性。

架构

ForecastWatch.com 由四个主要的架构组件构建:用于获取预报的输入进程、用于获取测量的气候数据的输入进程、数据聚合引擎和 Web 应用程序框架。

系统中有两个主要的输入进程:预报解析器和实况解析器。预报解析器负责从 Web 请求 ForecastWatch.com 跟踪的每个预报提供商的预报。它从页面解析预报并将预报数据插入数据库,直到可以与实际数据进行比较。实况解析器从 国家气象局的国家气候数据中心获取实际数据,该中心提供美国 800 多个城市的高温、低温、降水和重大天气事件,并将数据插入数据库。此过程还会使用实际天气数据对预报进行评分,并将该信息放入数据库中。

一旦数据被收集和评分,它就会被聚合引擎处理,该引擎将分数组合成按提供商、位置和预报未来天数切分的年度和月度块。在其第一年,即 2003 年,该系统仅收集了美国 20 个城市的预报,约 250,000 个单独的预报,因此大多数数据输出都基于原始评分数据。一旦系统扩展到 800 个城市,数据流增加了近 4000%,就添加了聚合引擎。在 2004 年上半年,该系统已经对超过 400 万个预报进行了评分,所有这些预报都在 Web 上收集、解析和显示。

Screenshot of ForecastWatch.com

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 数据库,其中输入模块已将他们收集的预报和气候数据放入其中。然后生成彩色地图,显示按地理区域划分的预报准确性,以供在网站和印刷报告中使用。

Example Forecast Accuracy Map

此预报准确性地图使用蓝色和红色的强度来指示按地理区域预测温度的误差程度

ForecastWatch.com 的 Web 界面最初是用 PHP 编写的,但后来改为 Python,以简化工具集并改进与系统其他组件的集成。Quixote,一个 Python Web 应用程序框架,被选为完全基于 Python 的 Web 前端的基础。基于 Quixote 的 Web 应用程序在 Linux 上使用 Apachemod_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