Pytables有效地读取和处理数千个组

时间:2015-11-17 04:54:34

标签: python-3.x pandas hdf5 pytables

这应该很容易,但是我需要永远计算这个,我想不出任何其他方法来处理我的文件。我很欣赏任何想法。

  

TL; DR:我正在寻找一种方法来快捷for key in store.keys()并对其中包含的所有数据运行相同的分析   HDF文件中的每个节点都有261k个节点(也就是密钥,组......),这样每个节点都可以独立于其他节点进行处理。

我在磁盘上有一个H5文件,重量只有几百GB。该文件包含数十万个节点(确切地说是261k),我想使用相同的方法处理所有节点,但需要单独处理。每个节点(或组)包含一个表,具有日期时间索引和三个浮点数据列。我想计算每个表中每列的分位数。基本上,这里是H5文件的样子($ ptdump -av的部分输出):

/ (RootGroup) ''
    /._v_attrs (AttributeSet), 4 attributes:
     [CLASS := 'GROUP',
      PYTABLES_FORMAT_VERSION := '2.1',
      TITLE := '',
      VERSION := '1.0']
/101P09999 (Group) '101P09999'
   /101P09999._v_attrs (AttributeSet), 15 attributes:
    [CLASS := 'GROUP',
     TITLE := '101P09999',
     VERSION := '1.0',
     data_columns := [],
     encoding := 'UTF-8',
     index_cols := [(0, 'index')],
     info := {1: {'type': 'Index', 'names': [None]}, 'index': {'index_name': 'DATETIME'}},
     levels := 1,
     metadata := {'STATE': 'Georgia', 'LENGTH': 4.86258, 'COUNTRY': 'USA', 'ROAD_NUMBER': 'US-27/GA-1', 'LATITUDE': 34.88279, 'COUNTY': 'Walker', 'LONGITUDE': -85.27023, 'ROAD_NAME': 'Lafayette Rd/Martha Berry Hwy', 'DIRECTION': 'Northbound'},
     nan_rep := 'nan',
     non_index_axes := [(1, ['TTAV', 'TTPC', 'TTFT'])],
     pandas_type := 'frame_table',
     pandas_version := '0.15.2',
     table_type := 'appendable_frame',
     values_cols := ['values_block_0']]
/101P09999/table (Table(2345,), shuffle, blosc(5)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float32Col(shape=(3,), dflt=0.0, pos=1)}
  byteorder := 'little'
  chunkshape := (3276,)
  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False}
  /101P09999/table._v_attrs (AttributeSet), 12 attributes:
   [CLASS := 'TABLE',
    FIELD_0_FILL := 0,
    FIELD_0_NAME := 'index',
    FIELD_1_FILL := 0.0,
    FIELD_1_NAME := 'values_block_0',
    NROWS := 2345,
    TITLE := '',
    VERSION := '2.7',
    index_kind := 'datetime64',
    values_block_0_dtype := 'float32',
    values_block_0_kind := ['TTAV', 'TTPC', 'TTFT'],
    values_block_0_meta := None]
  

注意:请勿注意上述输出中的NROWS值。此输出仅适用于2014年2月,我有来自的数据   主表中的所有12个月。

是的,我想要做的是获取列['TTAV', 'TTPC', 'TTFT']中的数据并将其除以组属性metadata['LENGTH'](在本例中为4.86258)。接下来,我想根据数据的时间戳将其分为6组。在这6组中的每一组中,我想要计算分位数。

我现在拥有的是一种新手方法:

with pd.HDFStore(store_path, 'r') as store:
    for key in store.keys()
        sens_data = store[key]
        # split_data = split the data into the required groups based on time stamp...
        for data in split_data:
            data /= store.get_storer(key).attrs.metadata['LENGTH']
            perc = split_data.quantile(q=np.arange(0.05, 1, 0.05)).transpose()
            # Create a column to contain sensor name:
            perc[0] = key[1:]
            perc.set_index(0, append=True, inplace=True)
            perc.index.rename(['DATA COL', 'SENS NAME'], inplace=True)
            # Merge perc into a dictionary of dataframes with keys the groups
            # the data was split into, and value a dataframe of appended percs

因此,最终,数据帧字典将如下所示:

In [1]: percentiles['night']
Out[1]:                      0.05   0.10  ...  0.90  0.95
        DATA COL  SENS NAME
                  101P09999  115    118   ...  133   135
        TTAV      101P10000  95     100   ...  120   125
                  101P10001  108    109   ...  111   113
                     ...
                  101P09999  110    112   ...  133   135
        TTPC      101P10000  115    118   ...  133   135
                  101P10001  115    118   ...  133   135
                     ...
                  101P09999  115    118   ...  133   135
        TTFT      101P10000  115    118   ...  133   135
                  101P10001  115    118   ...  133   135
                     ...                  ...

(请原谅我没有为其余行输入随机数据。另外,虽然我在示例DataFrame中输入了int个值,但实际值为float32,如ptdump输出。)但这就是上面代码末尾所有组(夜晚,早晨,下午......)的样子。基本上,每个['TTAV', 'TTPC', 'TTFT'],都会有261k行,每行都对应一个传感器。

现在显然,for key in store.keys()不是可行的方法。 (检索所有密钥大约需要15分钟!)我找到了无限的例子,其中只检索和处理了一个组和表的数据,但没有任何东西可以帮助处理所有组。有什么想法吗?并行读取是可以的,虽然我还没有工作(当我使用密钥访问单独进程中的节点内的数据时,它会抛出一个UnImplimented错误。也许我需要将存储传递给函数)。但是,最大的问题是for key in store.keys()需要15分钟才能返回所有键的列表。 (请注意,在处理过程中,我不需要所有键的列表,在解析文件时,我很高兴收集数据。)

1 个答案:

答案 0 :(得分:0)

生活仍然很好。我想出了如何从HDF文件同时读取。所以现在15分钟等待生成所有键的列表似乎并不太糟糕。基本上,这就是现在发生的事情:

def reader(key)
    with pd.HDFStore(store_path, 'r') as store:
        sens_data = store[key]
        # And other awesome stuff here to manipulate the data

    # Closing with returning the analyzed data, in my case, percentile computation:
    return dict_of_dfs

if __name__ == '__main__':
    with Pool(processes=4) as pool:
        res_pool = pool.map(reader, sens_names) # I populate sens_names by store.keys() up above.

for key in dict_of_dfs:
    dict_of_dfs[key] = dict_of_dfs[key].append(d[key] for d in res_pool)

瞧!比单线程快得多!

聚苯乙烯。我仍然想知道完全避免store.keys()的事情。

相关问题