如何使用分层键从HDF5访问数据?

时间:2014-10-01 18:52:49

标签: python pandas hdf5

我在HDF5中创建了一个具有以下结构的分层键的商店

<class 'pandas.io.pytables.HDFStore'>
File path: path-analysis/data/store.h5
/attribution/attr_000000            frame        (shape->[1,5])
/attribution/attr_000001            frame        (shape->[1,5])
/attribution/attr_000002            frame        (shape->[1,5])
/attribution/attr_000003            frame        (shape->[1,5])
.....
/impression/imp_000000              frame        (shape->[1,5])
/impression/imp_000001              frame        (shape->[1,5])
/impression/imp_000002              frame        (shape->[1,5])
/impression/imp_000003              frame        (shape->[1,5])
.....

根据我在文档中阅读的内容,我应该能够以下列方式访问展示和归档

store.select('impression')
store.select('attribution')

然而,我收到一个错误:     TypeError:如果对象不存在或传递值

,则无法创建存储器

要将数据添加到商店,我已经迭代了我的数据框

store.put('impression/imp_' + name, df)

最初,我使用append api来创建单个表'印象',但是每个数据帧占用80秒,并且假设我有近200个要处理的文件,'append'似乎太慢了。

相比之下,'put'花了不到一秒的时间才能添加到商店,但它不允许我以后选择数据。

根据上述结构,我应该如何访问我的数据?

另外,为什么追加比放得慢得多?可以加速吗?

随后,我希望能够按一定列对展示数据进行分组,并对归因数据进行相同的分组。 所以我也需要能够选择列。

我在这里采取了错误的方法来构建我的数据吗?

这是df信息

<class 'pandas.core.frame.DataFrame'>
Int64Index: 251756 entries, 0 to 257114
Data columns (total 5 columns):
pmessage_type       251756 non-null object
channel             251756 non-null object
source_timestamp    251756 non-null object
winning_price       251756 non-null int64
ipaddress           251756 non-null object
dtypes: int64(1), object(4)None

这是数据样本

,pmessage_type,信道,source_timestamp,WINNING_PRICE,IPADDRESS     0,印象中,网上,1400792099000,1800,99.34.198.9     1,印象中,网上,1401587896000,200,99.60.68.61     2,印象中,网上,1400873220000,735,65.96.72.183     3,印象中,网上,1400768556000,5550,73.182.225.30     4,印象中,网上,1401255378000,2099,65.96.72.183     5,印象中,网上,1400992770000,88,73.182.225.30     6,印象中,网上,1400709948000,290,162.228.58.98     7,印象中,网上,1400634607000,1720,162.228.58.98     8,印象,在线1399201568000,710,108.206.240.138

为简单起见,使用df.to_csv(...)导出此数据。

如何将原始数据加载到数据框中使用以下代码段。

data = pd.read_csv(events_csv_file,
                   delimiter='\x01',
                   header=None,
                   names=my_columns.keys(),
                   dtype=my_columns,
                   usecols=my_subset_columns,
                   iterator=True,
                   chunksize=1e6)
df = pd.concat(data)

其中

我的专栏是一本字典:

{'attribution_strategy': object,
 'channel': object,
'flight_uid': object,
'ipaddress': object,
'pixel_id': object,
'pmessage_type': object,
'source_timestamp': object,
'source_unique_id': object,
'unique_id': object,
'user_id': object,
'winning_price': numpy.int64}

手动指定类型背后的意图是获得速度。 (我已阅读过有助于处理的地方,但我没有观察到这些改进)

另外,我的熊猫版本如果有任何区别

>>> pandas.__version__
'0.14.0'
>>> 

=====================

这是一个可以轻松复制的例子

df = pd.DataFrame({'A': ['foo', 'foo', 'foo', 'foo',
                     'bar', 'bar', 'bar', 'bar',
                     'foo', 'foo', 'foo'],
               'B': ['one', 'one', 'one', 'two',
                     'one', 'one', 'one', 'two',
                     'two', 'two', 'one'],
               'C': ['dull', 'dull', 'shiny', 'dull',
                     'dull', 'shiny', 'shiny', 'dull',
                     'shiny', 'shiny', 'shiny'],
               'D': np.random.randn(11),
               'E': np.random.randn(11),
               'F': np.random.randn(11)})

store = pd.HDFStore('mystore.h5')
store.put('data/01', df)
store.put('data/02', df)

print store

<class 'pandas.io.pytables.HDFStore'>
File path: mystore.h5
/data/01            frame        (shape->[11,6])
/data/02            frame        (shape->[11,6])

这就是我想要的东西

store.select('data')

但是我收到错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-60360d11cde5> in <module>()
----> 1 store.select('data')

/Users/sshegheva/anaconda/envs/numba/lib/python2.7/site-packages/pandas/io/pytables.pyc in select(self, key, where, start, stop, columns, iterator, chunksize, auto_close, **kwargs)
    650         # create the storer and axes
    651         where = _ensure_term(where, scope_level=1)
--> 652         s = self._create_storer(group)
    653         s.infer_axes()
    654 

/Users/sshegheva/anaconda/envs/numba/lib/python2.7/site-packages/pandas/io/pytables.pyc in _create_storer(self, group, format, value, append, **kwargs)
   1157                 else:
   1158                     raise TypeError(
-> 1159                         "cannot create a storer if the object is not existing "
   1160                         "nor a value are passed")
   1161             else:

TypeError: cannot create a storer if the object is not existing nor a value are passed

相反,通过选择层次结构中的顶部键来删除数据确实可以正常工作

store.remove('data')

0 个答案:

没有答案