PyTables получить максимальные и минимальные значения? - PullRequest
0 голосов
/ 20 марта 2019

Я создал скрипт Python, который получает данные временных рядов из сокета и записывает их через PyTables в файл HDF5, например:

#Define description object to pass to the table constructor
class DataPoint(tb.IsDescription):
    timestamp = tb.Time64Col() #UNIX timestamp
    value = tb.Float32Col() #Value

Каждый раз, когда скрипт запускает его, будет получить некоторую историю данных, которая ранее была сохранена в файл вместе со свежими несохраненными данными.Я хотел бы убедиться, что строки с метками времени не дублируются в файле, и поэтому необходимо отфильтровать поступления.

Для этого мне нужно проверить размер данных, уже находящихся в файле, то есть максимальные и минимальные значения меток времениприсутствует.

Кто-нибудь может продемонстрировать логику запроса для получения строк с максимальными и минимальными временными метками?

1 Ответ

1 голос
/ 21 марта 2019

Вот вам простой пример с floats, который демонстрирует чтение таблицы / набора данных HDF5 в массив numpy, затем использование операторов .max() и .min() для получения Max / Min, затем .argmax() и .argmin() чтобы получить индексы для каждого.Я не знаком с Time64Col() для отметок времени UNIX и с тем, как будут работать операторы.Я дам тебе понять это.: -)

Первые 2 примера извлекают один столбец с разными методами PyTables.
Третий метод извлекает всю таблицу в массив, а затем индексирует с именем поля / столбца.
ИспользуйтеТехника, наиболее подходящая для вас.

Обратите внимание, что данные генерируются случайным образом, поэтому выходные данные также будут случайными.Однако выходные данные первого и третьего методов всегда должны быть идентичны.

import tables as tb
import numpy as np

# Create h5 file with 1 dataset

h5f = tb.open_file('SO_55266365.h5', 'w')

mydtype = np.dtype([('param1',float),('param2',float),('param3',float)])

arr = np.random.rand(500,3)
recarr = np.core.records.array(arr,dtype=mydtype)

h5f.create_table('/', 'set1', obj=recarr )

# Close, then Reopen file READ ONLY
h5f.close()

h5f = tb.open_file('SO_55266365.h5', 'r')

# Get first column (param1)
p1 = h5f.root.set1.col('param1')
print ('param 1 Max = ' , p1.max(), 'at row =' , p1.argmax() )
print ('param 1 Min = ' , p1.min(), 'at row =' , p1.argmin() )

# Get second column (param2)
p2 = h5f.root.set1.read(field='param2')
print ('param 2 Max = ' , p2.max(), 'at row =' , p2.argmax() )
print ('param 2 Min = ' , p2.min(), 'at row =' , p2.argmin() )

# Get all 3 columns
# (index to get column when referencing the object)
p123 = h5f.root.set1.read()
print ('param 1 Max = ' , p123['param1'].max(), 'at row =' , p123['param1'].argmax() )
print ('param 1 Min = ' , p123['param1'].min(), 'at row =' , p123['param1'].argmin() )

h5f.close()
...