存储带有pytables的不规则(可变长度)数组对象

时间:2015-01-02 05:38:01

标签: python data-analysis pytables

我在前面提到这个问题,并指出我很乐意考虑pytables的替代方案,但我更倾向于使用pytables来获益于numexpr功能。

我正在寻找存储/探索/分析我的数据的解决方案,例如以下形式:假设我有很多Event个对象,代表某个时刻的某些实验测量。每个Event包含一些标量字段,以及Particle个对象的变量数,每个对象都包含一些自己的标量字段。看我的"绘图"下方。

我的第一个想法是将每个Event作为表中的一行。我知道pytables中有VLArray类型,但似乎这些只能存储原始数据类型。有没有办法用pytables存储这些数据?

我还考虑让每个Event成为自己的组,其中Particle表包含可变数量的行。但是,我预计有数百万Events,我希望能够例如选择事件并绘制某些字段,就像对表中的行一样。

如果用pytables无法实现这一目标,那么有哪些替代解决方案?

    +-------------------------+
  +-------------------------+ |
+--------- Event ---------+ | |
|  timestamp    (int)     | | |
|  temperature  (float)   | | |
|  latitude     (float)   | | |
|  longitude    (float)   | | |
|  ... [etc]...           | | |
|                         | | |
|  +-- Particle<1> --+    | | |
|  |  idx    (int)   |    | | |
|  |  energy (float) |    | | |
|  |  x      (float) |    | | |
|  |  y      (float) |    | | |
|  |  z      (float) |    | | |
|  |  ... [etc] ...  |    | | |
|  +-----------------+    | | |
|          ...            | | |
|  +-- Particle<N> --+    | | |
|  |  idx    (int)   |    | | |
|  |  energy (float) |    | | |
|  |  x      (float) |    | | |
|  |  y      (float) |    | | |
|  |  z      (float) |    | | |
|  |  ... [etc] ...  |    | | +
|  +-----------------+    | +
+-------------------------+

1 个答案:

答案 0 :(得分:0)

您可以使用两个表来实现数据库样式。一个事件:

    +-------------------------+
  +-------------------------+ |
+--------- Event ---------+ | |
|  timestamp    (int)     | | |
|  temperature  (float)   | | |
|  latitude     (float)   | | +
|  longitude    (float)   | +
+-------------------------+

其中一个是Particles,带有“外键”:

    +-------------------------+
  +-------------------------+ |
+-------- Particle -------+ | |
|  event        (?)       | | |
|  idx          (int)     | | |
|  energy       (float)   | | |
|  x            (float)   | | |
|  z            (float)   | | +
|  ... [etc] ...          | +
+-------------------------+

Particle.event的类型可以是int表中的Events索引,也可以与添加到id的{​​{1}}列匹配,或者它甚至可以是Events类型,它实际上是指向object的指针。他们都有不同的权衡。

您还可以通过将Event数据复制到每个Event记录中来“去规范化”。这可以为某些用例提供更好的性能,但代价是存储数据中存在一些冗余。