Дополнительные записи появляются в таблице pytable при создании/добавлении из numpy zero recarray

(этот вопрос был изменен первоначальным автором, а пример кода изменен, чтобы вы могли запустить его на своем компьютере)

Я загружаю данные временных рядов в pytables (~ 2 миллиона строк, 23 столбца в основном с плавающей запятой в этом тестовом примере). Я также хотел бы создать соответствующую таблицу в том же файле pytable с тем же количеством строк, столбцов и имен столбцов, но с типами данных int8, которые будут использоваться в качестве «маски» контроля качества. Для этого я извлекаю имена столбцов и информацию о количестве строк из таблицы данных и использую это для создания массивов нулевых записей, которые используются для создания/добавления к таблице pytable контроля качества.

Проблема возникает, когда я добавляю массивы нулевых записей numpy к новой «маске» pytable. Несмотря на то, что массивы нулевых записей numpy, которые используются для создания/добавления к pytable, имеют правильный размер, результирующая pytable значительно больше, чем ожидалось, с большим количеством строк в pytable, которые были добавлены из numpy recarray.

Следующий исполняемый пример кода демонстрирует проблему. Он создает pytable и добавляет нулевые повторные записи в таблицу с ожиданием создания таблицы с «nrows» записей с нулевыми значениями. Полученная таблица pytable содержит больше строк, чем ожидалось, при просмотре с помощью Vitables.

Я не уверен, откуда берутся эти дополнительные строки данных? Мы ценим любые предложения.

Использование python 2.7.2, pytables 2.3.1, numpy 1.6.1.1

import tables 
import numpy as np
import string as str

Storename   = 'Test.h5'
Storetitle  = 'Test'
PathList    = ['Lvl0','Lvl1']
Tablename   = 'Data'

storeq = tables.openFile(Storename, mode='a', title= Storetitle)

for ix, agroup in enumerate(PathList):
   mypath0 =  '/'+str.strip('/'.join(PathList[0:ix]))
   mypath1 =  '/'+str.strip('/'.join(PathList[0:ix+1]))      
   try:  
      storeq.getNode(mypath1)
   except(tables.exceptions.NoSuchNodeError):        
      storeq.createGroup(mypath0,PathList[ix]) 

pathq = mypath1
qtable = None  

tfields = ['DateTime','f0','f1','f2','f3','f4','f5','f6','f7','f8','f9']
nfields = 11

tformats = ['int64', 'int8', 'int8', 'int8', 'int8', 'int8', 
            'int8', 'int8', 'int8', 'int8', 'int8']

nrows = 2122387
rowchunk = 100000
rowsteps, rowrem = divmod(nrows, rowchunk)

for ix in range(rowsteps):        
  fillarray = np.zeros((rowchunk,nfields), {'names': tfields, 'formats': tformats})
  if qtable==None:
      print('create')      
      qtable    = storeq.createTable(pathq, Tablename, fillarray)       
      qtable.flush()
  else:
      print('append :', ix, fillarray.shape)  
      qtable.append(fillarray)
      qtable.flush()

if rowrem > 0:
  fillarray = np.zeros((rowrem,nfields), {'names': tfields, 'formats': tformats})
  if ix == 0:
     print('create')      
     qtable  = storeq.createTable(pathq,Tablename, fillarray)       
     qtable.flush()
  else:
     print('append :', rowrem, fillarray.shape)  
     qtable.append(fillarray)
     qtable.flush()


qtable.close()
storeq.close()

Ниже приведен вывод оператора печати, созданный, когда нулевые повторные записи записываются в таблицу контроля качества pytable.

create
('append :', 1, (100000, 26))
('append :', 2, (100000, 26))
('append :', 3, (100000, 26))
('append :', 4, (100000, 26))
('append :', 5, (100000, 26))
('append :', 6, (100000, 26))
('append :', 7, (100000, 26))
('append :', 8, (100000, 26))
('append :', 9, (100000, 26))
('append :', 10, (100000, 26))
('append :', 11, (100000, 26))
('append :', 12, (100000, 26))
('append :', 13, (100000, 26))
('append :', 14, (100000, 26))
('append :', 15, (100000, 26))
('append :', 16, (100000, 26))
('append :', 17, (100000, 26))
('append :', 18, (100000, 26))
('append :', 19, (100000, 26))
('append :', 20, (100000, 26))
('append :', 22387, (22387, 26))

person RJCL    schedule 18.09.2012    source источник


Ответы (1)


Учитывая возраст вопроса, думаю, у автора уже есть ответ... Но на всякий случай вот мой (не проверенный):

В строке 45 вашего примера кода вы создаете структурированный массив формы (rowchunk, nfields): это неправильно, потому что структурированный массив должен быть 1D (количество строк), количество, имена и форматы полей задаются аргументом dtype.

Следовательно, вы должны использовать что-то вроде

fillarray = np.zeros(rowchunk, dtype={'names': tfields, 'formats': tformats})
person mhavel    schedule 22.08.2013