当前位置: 首页 > 面试题库 >

如何解决HDFStore异常:无法找到正确的原子类型

阴元青
2023-03-14
问题内容

我正在寻找有关哪种数据场景可能导致此异常的一般指导。我试图以各种方式按摩我的数据都没有用。

我已经用几天的时间在Google上搜索了此例外情况,经历了几次Google组讨论,并没有提出调试解决方案HDFStore Exception: cannot find the correct atom type。我正在读取一个简单的混合数据类型的csv文件:

Int64Index: 401125 entries, 0 to 401124
Data columns:
SalesID                     401125  non-null values
SalePrice                   401125  non-null values
MachineID                   401125  non-null values
ModelID                     401125  non-null values
datasource                  401125  non-null values
auctioneerID                380989  non-null values
YearMade                    401125  non-null values
MachineHoursCurrentMeter    142765  non-null values
UsageBand                   401125  non-null values
saledate                    401125  non-null values
fiModelDesc                 401125  non-null values
Enclosure_Type              401125  non-null values
...................................................
Stick_Length                401125  non-null values
Thumb                       401125  non-null values
Pattern_Changer             401125  non-null values
Grouser_Type                401125  non-null values
Backhoe_Mounting            401125  non-null values
Blade_Type                  401125  non-null values
Travel_Controls             401125  non-null values
Differential_Type           401125  non-null values
Steering_Controls           401125  non-null values
dtypes: float64(2), int64(6), object(45)

存储数据框的代码:

In [30]: store = pd.HDFStore('test0.h5','w')
In [31]: for chunk in pd.read_csv('Train.csv', chunksize=10000):
   ....:     store.append('df', chunk, index=False)

请注意,如果我用store.put一张镜头导入的数据帧使用,则可以成功地存储它,尽管速度很慢(我相信这是由于对象dtype的酸洗所致,即使对象只是字符串数据也是如此)。

是否存在可能会引发此异常的NaN值注意事项?

例外:

Exception: cannot find the correct atom type -> [dtype->object,items->Index([Usa
geBand, saledate, fiModelDesc, fiBaseModel, fiSecondaryDesc, fiModelSeries, fiMo
delDescriptor, ProductSize, fiProductClassDesc, state, ProductGroup, ProductGrou
pDesc, Drive_System, Enclosure, Forks, Pad_Type, Ride_Control, Stick, Transmissi
on, Turbocharged, Blade_Extension, Blade_Width, Enclosure_Type, Engine_Horsepowe
r, Hydraulics, Pushblock, Ripper, Scarifier, Tip_Control, Tire_Size, Coupler, Co
upler_System, Grouser_Tracks, Hydraulics_Flow, Track_Type, Undercarriage_Pad_Wid
th, Stick_Length, Thumb, Pattern_Changer, Grouser_Type, Backhoe_Mounting, Blade_
Type, Travel_Controls, Differential_Type, Steering_Controls], dtype=object)] lis
t index out of range

更新1

Jeff关于存储在数据框中的列表的提示使我研究了嵌入式逗号。
pandas.read_csv正确地解析了文件,并且双引号中确实包含一些嵌入式逗号。因此,这些字段本身不是python列表,但文本中确实包含逗号。这里有些例子:

3     Hydraulic Excavator, Track - 12.0 to 14.0 Metric Tons
6     Hydraulic Excavator, Track - 21.0 to 24.0 Metric Tons
8       Hydraulic Excavator, Track - 3.0 to 4.0 Metric Tons
11      Track Type Tractor, Dozer - 20.0 to 75.0 Horsepower
12    Hydraulic Excavator, Track - 19.0 to 21.0 Metric Tons

但是,当我从pd.read_csv块中删除此列并追加到我的HDFStore时,我仍然会遇到相同的异常。当我尝试分别追加每个列时,出现以下新异常:

In [6]: for chunk in pd.read_csv('Train.csv', header=0, chunksize=50000):
   ...:     for col in chunk.columns:
   ...:         store.append(col, chunk[col], data_columns=True)

Exception: cannot properly create the storer for: [_TABLE_MAP] [group->/SalesID
(Group) '',value-><class 'pandas.core.series.Series'>,table->True,append->True,k
wargs->{'data_columns': True}]

我将继续进行故障排除。这是几百条记录的链接:

https://docs.google.com/spreadsheet/ccc?key=0AutqBaUiJLbPdHFvaWNEMk5hZ1NTNlVyUVduYTZTeEE&usp=sharing

更新2

好的,我在工作计算机上尝试了以下操作,并得到以下结果:

In [4]: store = pd.HDFStore('test0.h5','w')

In [5]: for chunk in pd.read_csv('Train.csv', chunksize=10000):
   ...:     store.append('df', chunk, index=False, data_columns=True)
   ...:

Exception: cannot find the correct atom type -> [dtype->object,items->Index([fiB
aseModel], dtype=object)] [fiBaseModel] column has a min_itemsize of [13] but it
emsize [9] is required!

我想我知道这是怎么回事。如果我fiBaseModel为第一个块取字段的最大长度,则会得到以下信息:

In [16]: lens = df.fiBaseModel.apply(lambda x: len(x))

In [17]: max(lens[:10000])
Out[17]: 9

第二块:

In [18]: max(lens[10001:20000])
Out[18]: 13

因此,为此表创建了9个字节的store表,因为这是第一个块的最大值。当它在后续块中遇到更长的文本字段时,将引发异常。

我的建议是截断后续块中的数据(带有警告),或者允许用户为该列指定最大存储量,并截断超出该值的任何内容。也许熊猫已经可以做到这一点,但我还没有时间真正深入HDFStore

更新3

尝试使用pd.read_csv导入csv数据集。我将所有对象的字典传递给dtypes参数。然后,我遍历该文件,并将每个块存储到HDFStore中,并为传递较大的值min_itemsize。我得到以下异常:

AttributeError: 'NoneType' object has no attribute 'itemsize'

我的简单代码:

store = pd.HDFStore('test0.h5','w')
objects = dict((col,'object') for col in header)

for chunk in pd.read_csv('Train.csv', header=0, dtype=objects,
    chunksize=10000, na_filter=False):
    store.append('df', chunk, min_itemsize=200)

我尝试调试并检查了堆栈跟踪中的项目。这是例外情况下的表格:

ipdb> self.table
/df/table (Table(10000,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": StringCol(itemsize=200, shape=(53,), dflt='', pos=1)}
  byteorder := 'little'
  chunkshape := (24,)
  autoIndex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_CSI=False}

更新4

现在,我尝试迭代确定数据帧的对象列中最长字符串的长度。这是我的方法

    def f(x):
        if x.dtype != 'object':
            return
        else:
            return len(max(x.fillna(''), key=lambda x: len(str(x))))

lengths = pd.DataFrame([chunk.apply(f) for chunk in pd.read_csv('Train.csv', chunksize=50000)])
lens = lengths.max().dropna().to_dict()

In [255]: lens
Out[255]:
{'Backhoe_Mounting': 19.0,
 'Blade_Extension': 19.0,
 'Blade_Type': 19.0,
 'Blade_Width': 19.0,
 'Coupler': 19.0,
 'Coupler_System': 19.0,
 'Differential_Type': 12.0
 ... etc... }

一旦我有了最大字符串列长度的命令,我尝试append通过min_itemsize参数将其传递给:

In [262]: for chunk in pd.read_csv('Train.csv', chunksize=50000, dtype=types):
   .....:     store.append('df', chunk, min_itemsize=lens)

Exception: cannot find the correct atom type -> [dtype->object,items->Index([Usa
geBand, saledate, fiModelDesc, fiBaseModel, fiSecondaryDesc, fiModelSeries, fiMo
delDescriptor, ProductSize, fiProductClassDesc, state, ProductGroup, ProductGrou
pDesc, Drive_System, Enclosure, Forks, Pad_Type, Ride_Control, Stick, Transmissi
on, Turbocharged, Blade_Extension, Blade_Width, Enclosure_Type, Engine_Horsepowe
r, Hydraulics, Pushblock, Ripper, Scarifier, Tip_Control, Tire_Size, Coupler, Co
upler_System, Grouser_Tracks, Hydraulics_Flow, Track_Type, Undercarriage_Pad_Wid
th, Stick_Length, Thumb, Pattern_Changer, Grouser_Type, Backhoe_Mounting, Blade_
Type, Travel_Controls, Differential_Type, Steering_Controls], dtype=object)] [va
lues_block_2] column has a min_itemsize of [64] but itemsize [58] is required!

冒犯性列的min_itemsize传递了64,但是异常状态要求项大小为58。这可能是错误吗?

在[266]:pd。 版本 Out [266]:“ 0.11.0.dev-eb07c5a”


问题答案:

您提供的链接可以很好地存储框架。逐列表示仅指定data_columns = True。它将单独处理这些列,并提出问题。

诊断

store = pd.HDFStore('test0.h5','w')
In [31]: for chunk in pd.read_csv('Train.csv', chunksize=10000):
   ....:     store.append('df', chunk, index=False, data_columns=True)

在生产中,您可能希望将data_columns限制为要查询的列(也可以为None,在这种情况下,您只能在索引/列上查询)

更新:

您可能会遇到另一个问题。read_csv根据每个块中看到的内容来转换dtypes,因此,如果块大小为10,000,则追加操作将失败,因为块1和2在某些列中具有看似整数的数据,然后在块3中您具有一些NaN,所以它是因为浮点数。预先指定dtype,使用较大的块大小,或运行两次操作以确保块之间的dtype。

我已经更新pytables.py在这种情况下有一个更有用的异常(以及告诉您列是否包含不兼容的数据)

感谢您的举报!



 类似资料:
  • 我在这么多地方发现了这么多与此相关的问题。 当我在命令提示符中输入ant-version时,会打印以下内容: 无法定位tools.jar.预计在C:\Program Files\Java\jre1.8\libtools.jar Apache Ant版本1.9.4于2014年4月29日编译 尽管它说的是“找不到tools.jar……”它也在打印版本号。 除了复制工具,其他所有解决方案都不起作用。ja

  • 问题内容: 我正在尝试使用jena库为语义Web编写Java Web搜寻器。我有使用Netbeans构建项目。我收到两个错误: 无法实例化SLF4J LoggerFactory报告的异常:java.lang.NoClassDefFoundError:org / apache / log4j / Level 无法在org.slf4j.LoggerFactory.bind(LoggerFactory.

  • 本文向大家介绍Java原子变量类常见问题解决,包括了Java原子变量类常见问题解决的使用技巧和注意事项,需要的朋友参考一下 在学习多线程时,遇到了原子变量类,它是基于 CAS 和 volatile 实现的,能够保障对共享变量进行 read-modify-write 更新操作的原子性和可见性。于是我就写了一段代码试试,自认为非常正确。 用五个线程并发获得ID,每个线程获取100个,最后应该输出100

  • 问题内容: 我看了很多类似的问题,但解决方案并没有帮助我:( 这是我的openjfx库 这是JFX文档 我可以通过两种方式导入库: 1.在Java构建路径中,我可以以 这种方式使用所有类,而不会出现任何问题……但是我无法加载Java文档或 源代码,如果这样做,它将无法正常工作。 要么… 2.编辑已安装的JRE定义 这种方式使我像其他问题中所解释的那样在已 安装的jre中添加jfxrt.jar,并为

  • 问题内容: 当你只想执行但不处理异常时,如何在Python中进行呢? 以下是正确的方法吗? 问题答案: 要么 所不同的是,第一个也将赶上KeyboardInterrupt,SystemExit和类似的东西,这是直接来源于,没有