Numexpr/PyTables: как передать выполнение нескольких условных запросов из списка/массива?

Я делаю запрос (т. е. выбираю несколько строк на основе некоторого условия), используя PyTables, с функциями tables.Table.read() и tables.Table.read_where(). По сути, это основано на numpy и pandas с NumExpr:

http://www.pytables.org/usersguide/tutorials.html http://www.pytables.org/cookbook/hints_for_sql_users.html https://github.com/pytables/pytables/blob/6782048204.plob9f9f9 /а>

В «подсказках для пользователей sql» пример выбора сразу нескольких строк таков:

rows = tbl.read_where('(sqrt(x**2 + y**2) <= 1) & (temperature < 100)')

Допустим, я бы предпочел сделать запрос следующим образом: все строки, равные температуре 100 или равной температуре 90.

rows = tbl.read_where('(temperature == 100) | (temperature == 90)')

Это работает отлично. Но я хотел бы пройти через список/массив «значений температуры» для выполнения этой задачи.

temperatures = [80, 90, 100]
# reads in temperatures
# performs this query: 
rows = tbl.read_where('(temperature == 80) | (temperature == 90) | (temperature == 100)')

Это возможно? Идея заключалась бы в том, чтобы я написал функцию, с помощью которой пользователи вводят список значений для запроса, и она выполняет запрос ИЛИ для каждого.


person ShanZhengYang    schedule 03.11.2016    source источник


Ответы (1)


Одним из возможных решений является создание expression с помощью list comprehension:

temperatures = [80, 90, 100]

cond = '|'.join(['(temperature == ' + str(x) + ')' for x in temperatures])
print (cond)
(temperature == 80)|(temperature == 90)|(temperature == 100)
person jezrael    schedule 03.11.2016
comment
Возможно работает это, я не могу это проверить. - person jezrael; 03.11.2016