路线图#

本页概述了大Pandas发育的主要主题。这些项目中的每一项都需要相对较大的努力才能实施。有了专门的资金或捐赠者的兴趣,这些目标可能会更快实现。

一个项目在路线图上并不意味着它将 必然 发生了,即使有无限的资金。在实施期间,我们可能会发现阻碍采用该功能的问题。

此外,还有一项 not 在路线图上并不排除将其纳入大Pandas。路线图旨在对项目进行更大的根本性更改,这些更改可能需要数月或数年的开发人员时间。较小范围的项目将继续在我们的 issue tracker

看见 路线图演变 对本文档提出修改建议。

可扩展性#

Pandas 扩展类型 允许使用自定义数据类型和数组存储来扩展NumPy类型。Pandas在内部使用扩展类型,并为第三方库定义自己的自定义数据类型提供了一个接口。

Pandas的许多部分仍然会无意中将数据转换为NumPy数组。这些问题对于嵌套数据尤为明显。

我们希望改进整个库中扩展数组的处理,使它们的行为与NumPy数组的处理更加一致。我们将通过清理Pandas的内部结构并向扩展数组接口添加新方法来实现这一点。

字符串数据类型#

目前,Pandas将文本数据存储在 object -dtype NumPy数组。当前的实现有两个主要缺陷:第一, object -dtype不是特定于字符串的:任何Python对象都可以存储在 object -dtype数组,而不仅仅是字符串。第二:这效率不高。NumPy内存模型并不特别适合可变宽度的文本数据。

为了解决第一个问题,我们提出了一种新的字符串数据扩展类型。这将是最初的选择加入,用户明确要求 dtype="string" 。支持此字符串数据类型的数组最初可能是当前实现: object -Python字符串的dtype NumPy数组。

为了解决第二个问题(性能),我们将探索替代的内存中数组库(例如,Apache Arrow)。作为工作的一部分,我们可能需要实现Pandas用户预期的某些操作(例如, Series.str.upper )。这项工作可能会在大Pandas之外完成。

一致的缺失值处理#

目前,Pandas针对不同的数据类型处理缺失数据的方式有所不同。我们使用不同的类型来指示缺少值 (np.nan 对于浮点数据, np.nanNone 对于对象数据类型数据--通常是字符串或布尔值--缺少值,以及 pd.NaT 用于类似日期时间的数据)。整型数据不能存储丢失的数据或强制转换为浮点型。此外,Pandas1.0还引入了一个新的缺失值哨兵, pd.NA ,它用于实验性的可空整型、布尔型和字符串数据类型。

这些不同的缺失值在面向用户的操作中有不同的行为。具体地说,我们为某些操作的可空数据类型引入了不同的语义(例如,在比较操作中传播,而不是作为False进行比较)。

从长远来看,我们希望为所有数据类型引入一致的缺失数据处理。这包括所有操作(索引、算术操作、比较等)中的一致行为。人们一直在讨论最终使新语义成为默认语义的问题。

这一点已在 GH28095 (和相关问题),并在本文中更详细地描述 design doc

阿帕奇箭头互操作性#

Apache Arrow 是一个用于内存数据的跨语言开发平台。Arrow逻辑类型与典型的Pandas用例密切相关。

我们希望为Pandas内部的Arrow Memory和数据类型提供更好的集成支持。这将使我们能够利用它的I/O功能,并使用Arrow提供与其他语言和库更好的互操作性。

块管理器重写#

我们希望将PANDA当前的内部数据结构(1或2维数组的集合)替换为更简单的1维数组集合。

Pandas内部数据模型相当复杂。DataFrame由一个或多个二维“块”组成,每个数据类型有一个或多个块。此2维数组集合由BlockManager管理。

BlockManager的主要好处是提高了某些操作(从2D数组构造、二进制操作、跨列减少)的性能,尤其是对于宽DataFrame。然而,BlockManager大大增加了Pandas的复杂性和维护负担。

通过替换BlockManager,我们希望实现

  • 代码要简单得多

  • 通过新的逻辑类型更轻松地进行扩展

  • 用户可以更好地控制内存使用和布局

  • 改进的微性能

  • 为Pandas的内部提供C/CythonAPI的选项

看见 these design documents 想要更多。

索引和内部结构的脱钩#

获取和设置Pandas数据结构中的值的代码需要重构。特别是,我们必须清楚地分隔转换键的代码(例如,参数为 DataFrame.loc )到使用这些位置获取或设置值的代码的位置。这与拟议的BlockManager重写相关。目前,BlockManager有时使用基于标签的索引,而不是基于位置的索引。我们建议,它应该只与位置索引一起工作,关键字到位置的转换应该完全在更高的级别上完成。

索引是一种复杂的API,有许多微妙之处。这一重组将需要谨慎和关注。有关更多细节,请访问 wiki (Tentative)-rules-for-restructuring-indexing-code

Numba-加速运营#

Numba 是一个针对Python代码的JIT编译器。我们希望为用户提供方法来应用他们自己的Numba-jited函数,其中Pandas接受用户定义的函数(例如, Series.apply()DataFrame.apply()DataFrame.applymap() 以及在分组和窗口上下文中)。这将通过停留在编译代码中来提高用户定义函数在这些操作中的性能。

性能监控#

Pandas使用 airspeed velocity 以监视性能回归。ASV本身是一个很棒的工具,但需要一些额外的工作才能集成到开放源码项目的工作流程中。

这个 asv-runner 该组织目前由Pandas饲养员组成,提供建立在ASV之上的工具。我们有一台用于运行多个项目基准的物理机器,以及管理基准运行和报告结果的工具。

我们愿意为这些工具的改进和维护提供资金

  • 更加稳扎稳打。目前,它们是在维护人员有空闲时间的晚上和周末维护的。

  • 遵循https://pyperf.readthedocs.io/en/latest/system.html,针对基准调优系统以提高稳定性

  • 构建GitHub机器人以请求ASV运行 在此之前 公关被合并。目前,基准测试仅在夜间运行。

路线图演变#

Pandas还在继续进化。方向主要是由社区利益决定的。欢迎大家审查路线图上的现有项目,并提出新的项目。

路线图上的每一项都应该是对更大的设计方案的简短总结。该提案应包括

  1. 更改的简短摘要,如果被接受,则适合纳入路线图。

  2. 变革的动力。

  3. 解释为什么这一变化是在Pandas的范围内。

  4. 详细设计:最好带有示例用法(即使尚未实现)和API文档

  5. API更改:提案可能导致的任何API更改。

然后,该提案可能会作为GitHub的问题提交,大Pandas维护人员可以在那里对设计进行审查和评论。这个 pandas mailing list 应该被告知这项提议。

当各方同意欢迎实施时,应更新路线图以包括摘要和指向讨论问题的链接。

已完成的项目#

这一部分现在记录了Pandas路线图中已完成的项目。

文档改进#

我们改进了大Pandas的文献