HDFStore.append (Zeichenfolge, DataFrame) schlägt fehl, wenn der Inhalt der Zeichenfolgenspalte länger als der bereits vorhandene Inhalt ist
Ich habe einen Pandas DataFrame über einen HDFStore gespeichert, in dem im Wesentlichen Zusammenfassungszeilen zu den von mir ausgeführten Testläufen gespeichert sind.
Mehrere der Felder in jeder Zeile enthalten beschreibende Zeichenfolgen variabler Länge.
Wenn ich einen Testlauf durchführe, erstelle ich einen neuen DataFrame mit einer einzelnen Zeile:
def export_as_df(self):
return pd.DataFrame(data=[self._to_dict()], index=[datetime.datetime.now()])
Und dann anrufenHDFStore.append(string, DataFrame)
um die neue Zeile zum vorhandenen DataFrame hinzuzufügen.
Dies funktioniert einwandfrei, abgesehen davon, dass einer der Inhalte der Zeichenfolgenspalten größer ist als die längste bereits vorhandene Instanz. Daraufhin erhalte ich den folgenden Fehler:
File "<ipython-input-302-a33c7955df4a>", line 516, in save_pytables
store.append('tests', test.export_as_df())
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 532, in append
self._write_to_group(key, value, table=True, append=True, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 788, in _write_to_group
s.write(obj = value, append=append, complib=complib, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 2491, in write
min_itemsize=min_itemsize, **kwargs)
File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/pandas/io/pytables.py", line 2254, in create_axes
raise Exception("cannot find the correct atom type -> [dtype->%s,items->%s] %s" % (b.dtype.name, b.items, str(detail)))
Exception: cannot find the correct atom type -> [dtype->object,items->Index([bp, id, inst, per, sp, st, title], dtype=object)] [values_block_3] column has a min_itemsize of [51] but itemsize [46] is required!
Ich kann keine Dokumentation zum Angeben der Zeichenfolgenlänge beim Erstellen eines DataFrames finden. Was ist die Lösung hier?
Aktualisieren:
Code, der fehlschlägt:
store = pd.HDFStore(pytables_store)
for test in self.backtests:
try:
min_itemsizes = { 'buy_pattern' : 60, 'sell_pattern': 60, 'strategy': 60, 'title': 60 }
store.append('tests', test.export_as_df(), min_itemsize = min_itemsizes)
Hier ist der Fehler unter 0.11rc1:
File "<ipython-input-110-492b7b6603d7>", line 522, in save_pytables
store.append('tests', test.export_as_df(), min_itemsize = min_itemsizes)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 610, in append
self._write_to_group(key, value, table=True, append=True, **kwargs)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 871, in _write_to_group
s.write(obj = value, append=append, complib=complib, **kwargs)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 2707, in write
min_itemsize=min_itemsize, **kwargs)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 2447, in create_axes
self.validate_min_itemsize(min_itemsize)
File "/Users/admin/dev/pandas/pandas-0.11.0rc1/pandas/io/pytables.py", line 2184, in validate_min_itemsize
raise ValueError("min_itemsize has [%s] which is not an axis or data_column" % k)
ValueError: min_itemsize has [buy_pattern] which is not an axis or data_column
Datenprobe:
all_day buy_pattern \
2013-04-14 12:11:44.377695 False Hammer() and LowerLow()
id instrument \
2013-04-14 12:11:44.377695 tafdcc96ba4eb11e2a86d14109fcecd49 EURUSD
open_margin periodicity sell_pattern strategy \
2013-04-14 12:11:44.377695 0.0001 1:00:00 Tsl()
title top_bottom wick_body
2013-04-14 12:11:44.377695 tsl 0.5 2
dtypes:
print prob_test.export_as_df().get_dtype_counts()
bool 1
float64 2
int64 1
object 7
dtype: int64
Ich lösche die h5-Datei jedes Mal, wenn ich saubere Ergebnisse erzielen möchte. Sie fragen sich, ob etwas so albern ist, wie es fehlschlägt, weil das df zum Zeitpunkt des ersten Anhangs im h5 nicht vorhanden ist (und daher auch keine Spalten)?