Словарь юнит-тестирования гипотез с условиями - PullRequest
0 голосов
/ 04 августа 2020

У меня есть словарь, который представляет собой таблицу данных. Я хотел бы использовать гипотезу для генерации некоторых данных при соблюдении множества условий. Например, для следующего.

import hypothesis.strategies as st

rows = [f"row_0{i+1}0" for i in range(4)]
columns = [f"col_0{j+1}0" for j in range(4)]

row_dict = st.fixed_dictionaries({col: st.floats(allow_nan=False) for col in columns})
data = st.fixed_dictionaries({row: row_dict for row in rows})

Что выглядит как.

print(data.example())

{'row_010': {
     'col_010': -2.00001,
     'col_020': 1.175494351e-38,
     'col_030': inf,
     'col_040': 9007199254740992.0},
 'row_020': {
     'col_010': -1.7976931348623157e+308,
     'col_020': -3.36705610739319e-252,
     'col_030': 0.3333333333333333,
     'col_040': -1.192092896e-07},
 'row_030': {
     'col_010': -2.312410659618345e+16,
     'col_020': 9007199254740992.0,
     'col_030': 0.99999,
     'col_040': -0.3333333333333333},
 'row_040': {
     'col_010': 1.1,
     'col_020': -2.719870222528507e-237,
     'col_030': -4.935269787996911e+259,
     'col_040': -inf}}

С этой общей структурой я стремлюсь генерировать тесты для различных функций проверки таблиц. Функции проверки будут проверять такие вещи, как, все ли значения в row_010 больше, чем в row_020. Тем не менее, я изо всех сил пытаюсь придумать способ кратко построить эти правила. Я могу добиться того, что мне нужно, делая такие вещи, как (здесь только проверка двух значений).

data.filter(lambda d: d["row_010"]["col_010"] > d["row_020"]["col_010"])

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

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

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