NEP 32 — 从 NumPy 中移除财务函数#

作者:

Warren Weckesser <warren.weckesser@gmail.com>

状态:

最终

类型:

标准跟踪

创建日期:

2019-08-30

决议:

https://mail.python.org/pipermail/numpy-discussion/2019-September/080074.html

摘要#

我们提议弃用并最终移除财务函数 [1] 从 NumPy 中。这些函数将被移至一个独立的仓库,并作为一个名为 numpy_financial 的独立包提供给社区。

动机和范围#

NumPy 财务函数 [1] 是这 10 个函数:fvipmtirrmirrnpernpvpmtppmtpvrate。这些函数提供基本的财务计算,例如未来价值、净现值等。这些函数于 2008 年添加到 NumPy 中 [2]

2009 年 5 月,Joe Harrington 提出将一个名为 xirr 的函数添加到财务函数中,引发了一场关于这些函数的长时间讨论 [3]。该讨论中出现的一个重要观点是,“真实”的财务库必须能够处理实际日期。NumPy 财务函数不适用于实际日期或日历。在该讨论中,多次表达了对一个独立于 NumPy 的、功能更强大的库的偏好。

2009 年 6 月,D. L. Goldsmith 对某些财务函数实现的正确性表示担忧 [4]。当时有人建议将财务函数从 NumPy 移出到一个独立的包中。

在 2013 年的一个 GitHub issue 中 [5],Nathaniel Smith 建议将财务函数从顶级命名空间移至 numpy.financial。他还建议给这些函数起更好的名称。当时的回应包括建议弃用它们并将它们从 NumPy 移到一个单独的包中。该 issue 至今仍未解决。

2013 年晚些时候 [6],在邮件列表中有人建议将这些函数从 NumPy 中移除。

将这些函数从 NumPy 中移除的理由

  • 它们对 NumPy 来说过于专业化。

  • 它们实际上对“真实世界”的财务计算没有用处,因为它们不处理实际日期和日历。

  • 其中一些函数的“正确性”定义似乎是一个约定俗成的问题,而当前的 NumPy 开发者没有判断其正确性的背景知识。

  • 过去和现在的 NumPy 开发者对维护这些函数的兴趣不大。

将这些函数保留在 NumPy 中的主要理由是

  • 移除这些函数将对某些用户造成干扰。现有用户必须将新的 numpy_financial 包添加到他们的依赖项中,然后修改他们的代码以使用新包。

  • 所提供的函数虽然不是“工业级强度”,但显然与电子表格和某些计算器提供的函数相似。在 NumPy 中提供这些函数,使得一些开发者更容易将其软件迁移到 Python 和 NumPy。

从邮件列表讨论和 GitHub issue 中的评论可以清楚地看出,许多当前的 NumPy 开发者认为移除这些函数的好处大于成本。例如,来自 [5]

The financial functions should probably be part of a separate package
-- Charles Harris

If there's a better package we can point people to we could just deprecate
them and then remove them entirely... I'd be fine with that too...
-- Nathaniel Smith

+1 to deprecate them. If no other package exists, it can be created if
someone feels the need for that.
-- Ralf Gommers

I feel pretty strongly that we should deprecate these. If nobody on numpy’s
core team is interested in maintaining them, then it is purely a drag on
development for NumPy.
-- Stephan Hoyer

以及来自 2013 年邮件列表关于从 NumPy 中移除这些函数的讨论

I am +1 as well, I don't think they should have been included in the first
place.
-- David Cournapeau

但并非所有人都赞成移除

The fin routines are tiny and don't require much maintenance once
written.  If we made an effort (putting up pages with examples of common
financial calculations and collecting those under a topical web page,
then linking to that page from various places and talking it up), I
would think they could attract users looking for a free way to play with
financial scenarios.  [...]
So, I would say we keep them.  If ours are not the best, we should bring
them up to snuff.
-- Joe Harrington

为了了解财务函数的维护负担,可以查找所有带有标签 component: numpy.lib.financial 的 GitHub issue [7] 和 pull request [8]

衡量移除这些函数影响的一种方法是找到 GitHub 上所有使用它们的包。可以通过 python-api-inspect 服务执行此类搜索 [9]。对 NumPy 财务函数所有使用情况的搜索仅发现八个仓库。(有关实际的 SQL 查询,请参阅 [5] 中的评论。)

实现#

  • 创建一个新的 Python 包 numpy_financial,并由顶级 NumPy GitHub 组织维护。该仓库将包含财务函数的定义和单元测试。该包将被添加到 PyPI,以便可以使用 pip 进行安装。

  • 从 NumPy 1.18 版本开始,弃用 numpy 命名空间中的财务函数。从 NumPy 1.20 版本开始,移除财务函数。

向后兼容性#

如前所述,移除这些函数会破坏向后兼容性。通过提供 numpy_financial 库来缓解这些影响。

替代方案#

以下替代方案在 [5] 中被提及

  • 按现状维护这些函数(即不作任何改变)。回顾历史可以清楚地看出,这并非许多 NumPy 开发者的偏好。一个反复出现的评论是,这些函数根本不属于 NumPy。当这种情绪与错误报告的历史以及对函数正确性的持续质疑结合起来时,结论是,最简洁的解决方案是弃用和移除。

  • 将函数从 ``numpy`` 命名空间移动到 ``numpy.financial``。这是 [5] 中的最初建议。这样的改变无法解决维护问题,也无法改变许多开发者认为这些函数与 NumPy 不匹配的问题。这会给这些函数的当前用户带来不便,但未能解决许多开发者认为的根本问题。

讨论#

之前已经提供了指向过去的邮件列表讨论以及相关 GitHub issue 和 pull request 的链接。本 NEP 的公告于 2019 年 9 月 3 日在 NumPy-Discussion 邮件列表上发布 [10],并于 2019 年 9 月 8 日在 PyData 邮件列表上发布 [11]。接受该 NEP 的正式提案于 2019 年 9 月 19 日提出 [12];同时向 PyData 发送了通知(与 [11] 相同的主题)。没有实质性的异议。

参考文献和脚注#