ModuleNotFoundError:使用 Metaflow 时No module named 'pandas.core.indexes.numeric'

回答 2 浏览 3451 2023-04-06

我使用Metaflow来加载一个数据框架。它被成功地从工件库中解压,但是当我试图使用df.index查看它的索引时,我得到一个错误,说ModuleNotFoundError: No module named 'pandas.core.indexes.numeric'。为什么?

我看了其他有类似错误信息的答案这里这里,它们说这是由于试图用旧版本的Pandas解开数据帧而造成的。然而,我的错误稍有不同,而且升级Pandas也不能解决这个问题(pip install pandas -U)。

crypdick 提问于2023-04-06
"然而,我的错误略有不同"--你的错误完全不相关,因为你根本没有尝试使用pickle(如果Metaflow在这么做,你会在堆栈跟踪中看到它)。这个问题是一个与pickling有关的一般问题,而这个问题与Pandas无关。Karl Knechtel 2023-04-06
@KarlKnechtel 不正确--Metaflow工件追踪使用pickle数据帧从metaflow工件存储中解锁,成功地工作,然后我试图运行一个简单的df.index操作。crypdick 2023-04-07
SO有一个问题,即基于不正确的假设,在澄清会更合适的情况下,打了就跑的Close投票。crypdick 2023-04-07
我没有基于一些不正确的假设而进行VTC。特别是,我不是因为认为这个问题与Pickle无关而进行VTC的(尽管我确实这么认为)。我做VTC是因为我个人觉得Stack Overflow不应该主持bug报告。然而,共识坚决反对我,所以我已经撤销了这个想法,并试图尽可能地改进这个问题。Karl Knechtel 2023-04-07
2 个回答
#1楼 已采纳
得票数 9

这个问题是由新的Pandas 2.0.0版本打破了与Pandas 1.x的向后兼容性造成的,尽管我在发布说明中没有看到这个记录。解决办法是将pandas降级到1.x系列:pip install "pandas<2.0.0"

crypdick 提问于2023-04-06
"尽管我在发行说明中没有看到这个记录。"那是因为它本来就不应该被使用。请看顶层的API reference文档:"pandas.core、pandas.compat和pandas.util顶层模块是PRIVATE。不保证这些模块的稳定功能。"你应该将此作为一个针对metaflow的bug报告。Karl Knechtel 2023-04-06
(当然,一个腌制的Dataframe很可能包含对这种私有/内部Pandas模块的引用,因为它们很可能被用于创建Dataframe)。Karl Knechtel 2023-04-06
@KarlKnechtel 我从未声称这是一个针对Pandas的错误。我只是报告了我在做一个基本的df操作时遇到的一个神秘的错误的解决方案。这甚至不是针对Metaflow的错误,除非Pandas碰巧推出了一个重要的版本(本周发生了3年来的第一次)。crypdick 2023-04-07
我最初推断这是一个针对Metaflow的错误,因为他们根本就不应该使用那个包来编写代码,不管是什么原因。然而,由于他们正在包装腌制过程,他们大概没有真正的选择。更重要的是:腌制的Dataframes应该被视为默认不兼容跨越任何两个不同版本的Pandas。这是Pickle的本质:它必然会触及未记录的私有API,而库的维护者可以随时打破这些API(这在semver下是完全可以预见的)。Karl Knechtel 2023-04-07
可能正确的方法是将DataFrame扩展为各种类,如HDF5SafeDataFrame、JSONSafeDataFrame等,但如果你想让这些派生类与期望使用vanilla DataFrame的第三方代码正确互通,这可能需要相当多的额外工作?所以,是的。我认为有一个相当有力的论据,在某些情况下,Pickle 正确的设计选择。它有缺点,但有时替代方案会更糟。MRule 2023-05-10
#2楼
得票数 4

尝试使用pandas.read_pickle("file.pkl")来加载文件,而不是使用pickle模块。

这个pandas函数应该能提供读取旧文件的兼容性,而且"只能保证向后兼容到pandas 0.20.3,前提是对象是用to_pickle序列化的。"我用pandas-1.x的测试表明,它也能读取一些从pickle模块写出的文件。

Mike T 提问于2023-05-19
Mike T 修改于2023-05-19