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:

  1. W powyższym kodzie kiedy dane są faktycznie zapisywane na dysk ?

  2. 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?

  3. 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 ?

Author: Amelio Vazquez-Reina, 2013-05-19

2 answers

  1. 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)

  2. 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 i store/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)

  3. 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 .

 15
Author: Jeff,
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 .

 4
Author: Pablo,
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