Как устранить неполадки HDFStore Exception: не удается найти правильный тип атома
Я ищу некоторые общие рекомендации о том, какие сценарии данных могут вызвать это исключение. Я пытался массировать свои данные различными способами, но безрезультатно.
Я уже несколько дней гуглял это исключение, прошел несколько обсуждений в группах 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
на кадре данных, импортированном за один снимок, я могу сохранить его успешно, хотя и медленно (я полагаю, это связано с выбором типов объектов, даже если объект является просто строковыми данными).
Существуют ли соображения о значении 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
Джефф'Подсказка о списках, хранящихся в фрейме данных, привела меня к исследованию встроенных запятых.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->,table->True,append->True,k
wargs->{'data_columns': True}]
Я буду продолжать устранять неполадки. Вот'Ссылка на несколько сотен записей:
https://docs.google.com/spreadsheet/ccc?key=0AutqBaUiJLbPdHFvaWNEMk5hZ1NTNlVyUVduYTZTeEE&УСП = обмен
ОБНОВЛЕНИЕ 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 байтами для этого столбца, потому чтоМаксимум первого куска. Когда он встречает более длинное текстовое поле в последующих чанках, он генерирует исключение.
Для этого я бы предложил либо усечь данные в последующих чанках (с предупреждением), либо позволить пользователю указать максимальное хранилище для столбца и обрезать все, что превышает его. Может быть, панды могут сделать это уже, я неу меня было время по-настоящему погрузиться вHDFStore
еще.
ОБНОВЛЕНИЕ 3
Попытка импортировать набор данных CSV, используя pd.read_csv. Я передаю словарь всех объектов параметру dtypes. Затем я перебираю файл и сохраняю каждый кусок в хранилище HDFS, передавая большое значение для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]: с.версия Out [266]: '0.11.0.dev-eb07c5a»