6

どのような種類のデータ シナリオでこの例外が発生する可能性があるかについて、一般的なガイダンスを探しています。さまざまな方法でデータをマッサージしようとしましたが、役に立ちませんでした。

私はこの例外を何日もグーグルで検索しましたが、いくつかのグーグルグループの議論を経て、デバッグの解決策を思いつきませんでした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

OK、職場のコンピューターで次のことを試したところ、次の結果が得られました。

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

そして2番目のチャンク:

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

したがって、最初のチャンクの最大値であるため、ストア テーブルはこの列に対して 9 バイトで作成されます。後続のチャンクでより長いテキスト フィールドが検出されると、例外がスローされます。

これに対する私の提案は、後続のチャンクでデータを切り捨てる (警告付きで) か、ユーザーが列の最大ストレージを指定してそれを超えるものを切り捨てることを許可することです。パンダはすでにこれを行うことができるかもしれませんが、私はまだ深く掘り下げる時間がありませ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!

問題のある列には 64 の min_itemsize が渡されましたが、58 の itemsize が必要であるという例外が示されています。これはバグでしょうか?

[266]: pd. バージョン アウト [266]: '0.11.0.dev-eb07c5a'

4

1 に答える 1

5

あなたが提供したリンクは、フレームを保存するのにうまく機能しました。列ごとに、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 は、各チャンクで確認した内容に基づいて dtype を変換するため、チャンクサイズが 10,000 の場合、チャンク 1 と 2 の一部の列に整数のデータが含まれていたため、追加操作が失敗しました。チャンク 3 では、NaN があったため、フロートが発生しました。事前に dtype を指定するか、より大きなチャンクサイズを使用するか、操作を 2 回実行して、チャンク間の dtype を保証してください。

この場合、より有用な例外を持つように pytables.py を更新しました (列に互換性のないデータがあるかどうかを通知するだけでなく)

ご報告ありがとうございます!

于 2013-03-19T12:17:25.207 に答える