Iteracyjnie pisanie do sklepów HDF5 w pandach
Pandas ma następujące przykłady jak przechowywać Series
, DataFrames
i Panels
w plikach HDF5:
Przygotuj kilka danych:
In [1142]: store = HDFStore('store.h5')
In [1143]: index = date_range('1/1/2000', periods=8)
In [1144]: s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e'])
In [1145]: df = DataFrame(randn(8, 3), index=index,
......: columns=['A', 'B', 'C'])
......:
In [1146]: wp = Panel(randn(2, 5, 4), items=['Item1', 'Item2'],
......: major_axis=date_range('1/1/2000', periods=5),
......: minor_axis=['A', 'B', 'C', 'D'])
......:
Zapisz w sklepie:
In [1147]: store['s'] = s
In [1148]: store['df'] = df
In [1149]: store['wp'] = wp
Sprawdź co jest w sklepie:
In [1150]: store
Out[1150]:
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df frame (shape->[8,3])
/s series (shape->[5])
/wp wide (shape->[2,5,4])
Zamknij sklep:
In [1151]: store.close()
Pytania:
W powyższym kodzie kiedy dane są faktycznie zapisywane na dysk ?
Powiedzmy, że chcę dodać tysiące dużych ramek danych żyjących w
.csv
pliki do jednego.h5
pliku. Muszę je załadować i dodać do pliku.h5
jeden po drugim, ponieważ nie mogę sobie pozwolić na to, aby mieć je wszystkie w pamięci na raz, ponieważ zajęłyby za dużo pamięci. Czy jest to możliwe z HDF5? Jaki byłby właściwy sposób?-
Dokumentacja pand mówi co następuje:
" te sklepy nie są przydatne raz napisane (choć po prostu usunąć je i przepisać). Ani nie są queryable ; muszą być odzyskane w całości."
Co to oznacza przez nie przydatny ani nie nadający się do zapytania ? Czy nie powinno być napisane raz zamknięte zamiast napisane ?
2 answers
-
Zaraz po wykonaniu polecenia, np.
store['df'] = df
.close
po prostu zamyka rzeczywisty plik (który zostanie zamknięty dla Ciebie, jeśli proces istnieje, ale wyświetli komunikat ostrzegawczy) -
Przeczytaj sekcję http://pandas.pydata.org/pandas-docs/dev/io.html#storing-in-table-format
Generalnie nie jest dobrym pomysłem umieszczanie wielu węzłów w pliku
.h5
. Prawdopodobnie chcesz dołączyć i utworzyć mniejszą liczbę węzłów.You can just iterate przez twoje
.csv
istore/append
jeden po drugim. Coś w stylu:for f in files: df = pd.read_csv(f) df.to_hdf('file.h5',f,df)
Byłaby jednokierunkowa (tworzenie osobnego węzła dla każdego pliku)
-
Not appendable-po jej napisaniu można pobrać tylko wszystko na raz, np. nie można wybrać podsekcji
Jeśli masz tabelę, możesz robić takie rzeczy jak:
pd.read_hdf('my_store.h5','a_table_node',['index>100'])
Który jest jak zapytanie bazy danych, tylko uzyskanie części danych
Tak więc, sklep nie jest przydatny, ani queryable, podczas gdy tabela jest obie .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-19 19:16:49
Odpowiadając na pytanie 2, z pandas 0.18.0 możesz zrobić:
store = pd.HDFStore('compiled_measurements.h5')
for filepath in file_iterator:
raw = pd.read_csv(filepath)
store.append('measurements', raw, index=False)
store.create_table_index('measurements', columns=['a', 'b', 'c'], optlevel=9, kind='full')
store.close()
Na podstawie tej części docs.
W zależności od ilości danych, tworzenie indeksu może pochłonąć ogromne ilości pamięci. PyTables docs opisuje wartości optlevel .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 13:42:42