我们如何为非开发人员创建 Python 开发框架
Python 是 Bluevine 核心的编程语言,为我们的后端、数据工程、数据科学、质量保证自动化,乃至最近的数据分析提供支持。
在数据分析中,我们使用 SQL 查询来获取和转换数据,特别是使用 PostgreSQL 数据库。
Bluevine 的整体银行解决方案专为小型企业设计,旨在帮助它们在快节奏的环境中蓬勃发展。我们实现这一目标的一种方式是让企业主尽快了解他们是否已获批准使用 Bluevine 服务。为此,我们需要及时对他们的数据进行风险评估。当我们的多数查询运行时间过长并在我们仅有的几个副本之间争夺资源时,这被证明是一个巨大的挑战。
我们使用的查询很长(最长的超过 3,000 行!)并且对数据库功能的利用效率低下,更不用说难以阅读、难以更新和构建。面对这些查询和我们对快速响应的需求,解决方案显而易见。我们可以使用 Python 来执行繁重的工作和数据转换。
不幸的是,分析团队对 Python 的经验很少。如果没有适当的关注,迁移我们的一些最重要操作可能会导致糟糕的代码。这些糟糕的代码将难以管理,甚至可能遭受与 SQL 脚本相同的问题,让我们回到起点。
我们设计了以下解决方案
- 首先,根据角色为所有工程师提供 Python 培训,特别是数据导向的第三方库,例如 pandas 和 NumPy。
- 其次,设计并构建一个 Python 框架,使团队能够专注于工作,同时抽象出软件工程原则。这将使他们能够执行和测试代码、更新或创建新流程。
设计框架需要我们识别 SQL 脚本中重复出现的模式,并将其建立为模块化且易于重用或扩展的构建块。
我们确定了 SQL 查询中可以应用于脚本的常见结构
- 根据特定条件获取客户
- 从不同的表中丰富数据
- 执行逻辑以做出决策
许多脚本使用相似的查询来获取客户,因此我们能够提供参数化函数,这些函数运行 ORM 查询,提供相同的功能并避免代码重复。
对于第二步,我们不是在数据库中进行繁重的查询和数据转换,而是仅拉取客户的原始数据并提供通用函数,这些函数大量使用 pandas 来丰富数据。我们能够使用向量化操作来对数据及其丰富的数据结构执行复杂的聚合和转换,例如转置和透视。
这种方法带来了多重好处,既提高了性能,又通过避免低效操作释放了数据库资源。
逻辑执行更加棘手,因为每个过程都会检查不同的内容。为了提供灵活性,我们提供了一个松散的预定义模块结构供他们遵循。例如,每个过程都需要遵循特定结构的一些模块,例如:- preprocessing.py - calculations.py - conditions.py - decisions.py
框架加载这些模块并以特定顺序执行其中的入口点函数。这会返回一个 Decision 类的实例。Decision 对象包含我们需要将其发送回客户端的所有信息和功能。
该框架设计易于使用,即使是最缺乏经验的用户也能掌握,但又足够灵活,允许开发人员构建新的功能以供重用和改进。
我们很高兴地宣布,我们已将所有流程迁移到此新框架上运行,并且所有新流程都使用它创建。自转换以来,我们已经看到了改进
- Python 的用户友好性使我们的分析师能够快速学习并及时创建新规则。
- 我们总体上大幅提高了流程运行时间。
- 我们的数据库正在运行更简单、更精细的查询,总体上降低了负载。
- 通过日志和监控库实现可追溯性和改进的可观察性。
我们很自豪地分享我们的项目取得了成功,但重要的是要记住,利用 Python 可能不适合所有人。在考虑类似工作时,请考虑以下几点
- 您的客户(在此案例中是分析师)是否具备所需的技术能力来交付更高质量的代码?
- 您是否能够根据公司时间表兼顾旧系统的支持和新框架的开发?
- 此框架将满足未来的需求还是仅改进现有流程?
