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

我们如何为非开发人员创建 Python 开发框架

Python 是 Bluevine 使用的核心编程语言,为我们的后端、数据工程、数据科学、质量保证自动化,以及最近的数据分析提供支持。

在数据分析中,我们使用 SQL 查询来获取和转换数据,特别是使用 PostgreSQL 数据库。

Bluevine 的整体银行解决方案专为小型企业设计,旨在帮助他们在快节奏的环境中蓬勃发展。我们实现这一目标的一种方式是让企业主尽快知道他们是否获得 Bluevine 服务的批准。为此,我们需要对他们的数据进行风险评估,并及时完成。当我们的许多查询运行时间过长,并在我们拥有的少数副本之间竞争资源时,这被证明是一个巨大的挑战。

我们使用的查询很长(最长的达到 3,000 多行!),并且在数据库功能的利用方面效率低下,更不用说难以阅读,并且很难更新和构建。有了这些查询和我们对快速响应的需求,解决方案很明确。我们可以使用 Python 来执行繁重的工作和数据转换。

不幸的是,分析团队几乎没有 Python 的经验。并且在没有适当注意的情况下迁移我们一些最重要的操作可能会导致不良代码。不良代码将难以管理,甚至可能遭受与 SQL 脚本相同的问题,使我们回到原点。

我们设计了以下解决方案

  1. 首先,为所有工程师提供基于角色的 Python 培训,特别是面向数据的第三方库,如 pandas 和 NumPy。
  2. 其次,设计并构建一个 Python 框架,使团队能够专注于他们的工作,同时抽象出软件工程原则。这将允许他们执行和测试他们的代码,更新或创建新的流程。

设计框架需要我们识别 SQL 脚本中重复出现的模式,并将它们建立为模块化且易于重用或扩展的构建块。

我们确定了 SQL 查询中可以应用于脚本的常见结构

  1. 根据特定条件获取客户
  2. 从不同的表中丰富数据
  3. 执行逻辑以做出决定

许多脚本使用类似的查询来获取客户,因此我们能够提供参数化的函数,这些函数运行 ORM 查询,提供相同的功能并避免代码重复。

对于第二步,我们不是在数据库中进行繁重的查询和数据转换,而是仅提取客户的原始数据并提供通用函数,这些函数大量使用 pandas 来丰富数据。我们能够使用矢量化操作对数据及其丰富的数据结构执行复杂的聚合和转换,例如转置和透视。

这种方法产生多重好处,既提高了性能,又通过避免低效操作释放了数据库资源。

逻辑执行更棘手,因为每个进程都会检查不同的内容。为了允许灵活性,我们提供了一个需要遵循的预定义模块的松散结构。例如,每个进程都需要遵循特定结构的模块,例如:- preprocessing.py - calculations.py - conditions.py - decisions.py

框架加载这些模块并按特定顺序执行其中的入口点函数。这返回一个 Decision 的类实例。Decision 对象包含我们需要将其发送回客户端的所有信息和功能。

该框架的设计易于使用,即使对于最没有经验的用户也是如此,同时又足够灵活,允许开发人员构建新的功能以进行重用和改进。

我们很高兴地宣布,我们已将所有流程迁移到在此新框架上运行,并且所有新流程都是使用它创建的。自过渡以来,我们已经看到了改进

  1. Python 的用户友好特性使我们的分析师能够快速学习并及时创建新规则。
  2. 我们总体上实现了流程运行时间的大幅改进。
  3. 我们的数据库运行更简单、更精炼的查询,从而总体上减少了负载。
  4. 通过日志和监控库提高可追溯性和可观察性。

我们很自豪地分享我们的项目取得了成功,但重要的是要记住,利用 Python 可能不适合所有人。在考虑类似的努力时,请考虑以下事项

  • 您的客户(在本例中为分析师)是否具备交付更高质量代码所需的技术能力?
  • 您是否能够在公司时间表方面兼顾旧系统的支持和新框架的开发?
  • 此框架是否将满足未来的需求,还是仅改进现有流程?