Skip to content

Commit 09dd2c3

Browse files
committed
all tests functioning except categoricalfilter
1 parent d2bf1c5 commit 09dd2c3

File tree

6 files changed

+49
-15
lines changed

6 files changed

+49
-15
lines changed

phenex/filters/categorical_filter.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ def __init__(
3030
self.domain = domain
3131
super(CategoricalFilter, self).__init__()
3232

33-
def _filter(self, table: Table):
34-
table = table.filter(table[self.column_name].isin(self.allowed_values))
35-
return table
33+
def _filter(self, table: 'PhenexTable', tables:dict):
34+
if self.column_name not in table.columns:
35+
if self.domain not in tables.keys():
36+
raise ValueError(f"Table required for categorical filter ({self.domain}) does not exist within domains dicitonary")
37+
table = table.join(tables[self.domain], domains = tables)
38+
# TODO downselect to original columns
39+
return table.filter(table[self.column_name].isin(self.allowed_values))

phenex/mappers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class OMOPPersonTable(PhenexPersonTable):
8080
'OMOPConditionOccurenceTable': ['PERSON_ID'],
8181
'OMOPVisitDetailTable': ['PERSON_ID']
8282
}
83-
83+
8484
class OMOPVisitDetailTable(PhenexVisitDetailTable):
8585
JOIN_KEYS = {
8686
'OMOPPersonTable': ['PERSON_ID'],
@@ -179,7 +179,7 @@ class OMOPConditionOccurenceTable(CodeTable):
179179
# CODE="DRUG_SOURCE_VALUE",
180180
# )
181181

182-
# OMOPObservationPeriod = ObservationPeriodTableMapper(
182+
# OMOPObservationPeriod = PhenexObservationPeriodTable(
183183
# NAME_TABLE="OBSERVATION_PERIOD",
184184
# PERSON_ID="PERSON_ID",
185185
# OBSERVATION_PERIOD_START_DATE="OBSERVATION_PERIOD_START_DATE",

phenex/phenotypes/codelist_phenotype.py

+9
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,13 @@ def __init__(
6969
RelativeTimeRangeFilter, List[RelativeTimeRangeFilter]
7070
] = None,
7171
return_date="first",
72+
categorical_filter: 'CategoricalFilter' = None
7273
):
7374
super(CodelistPhenotype, self).__init__()
7475

7576
self.codelist_filter = CodelistFilter(codelist, use_code_type=use_code_type)
7677
self.codelist = codelist
78+
self.categorical_filter = categorical_filter
7779
self.name = name or self.codelist.name
7880
self.date_range = date_range
7981
self.return_date = return_date
@@ -97,6 +99,7 @@ def __init__(
9799
def _execute(self, tables) -> PhenotypeTable:
98100
code_table = tables[self.domain]
99101
code_table = self._perform_codelist_filtering(code_table)
102+
code_table = self._perform_categorical_filtering(code_table, tables)
100103
code_table = self._perform_time_filtering(code_table)
101104
code_table = self._perform_date_selection(code_table)
102105
return select_phenotype_columns(code_table)
@@ -106,6 +109,12 @@ def _perform_codelist_filtering(self, code_table):
106109
code_table = self.codelist_filter.filter(code_table)
107110
return code_table
108111

112+
def _perform_categorical_filtering(self, code_table, tables):
113+
if self.categorical_filter is not None:
114+
assert is_phenex_code_table(code_table)
115+
code_table = self.categorical_filter.filter(code_table, tables)
116+
return code_table
117+
109118
def _perform_time_filtering(self, code_table):
110119
if self.date_range is not None:
111120
code_table = self.date_range.filter(code_table)

phenex/phenotypes/functions.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import List
22
from ibis.expr.types.relations import Table
33
import ibis
4+
from phenex.tables import PhenexTable
45

56

67
def hstack(phenotypes: List["Phenotype"], join_table: Table = None) -> Table:
@@ -10,6 +11,9 @@ def hstack(phenotypes: List["Phenotype"], join_table: Table = None) -> Table:
1011
Args:
1112
phenotypes (List[Phenotype]): A list of Phenotype objects to stack.
1213
"""
14+
# TODO decide if phenotypes should be returning a phenextable
15+
if isinstance(join_table, PhenexTable):
16+
join_table = join_table.table
1317
idx_phenotype_to_begin = 0
1418
join_type = "left" # if join table is defined, we want to left join
1519
if join_table is None:

phenex/tables.py

+15-8
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@ def __getattr__(self, name):
6060
# pass all attributes on to underlying table
6161
return getattr(self._table, name)
6262

63-
@classmethod
64-
def REQUIRED_FIELDS(cls):
65-
return list(cls.DEFAULT_MAPPING.keys())
63+
@property
64+
def REQUIRED_FIELDS(self):
65+
return list(self.DEFAULT_MAPPING.keys())
6666

6767
@property
6868
def table(self):
@@ -240,13 +240,13 @@ class PhenotypeTable(PhenexTable):
240240
KNOWN_FIELDS = [
241241
'PERSON_ID',
242242
'BOOLEAN',
243-
'DATE',
243+
'EVENT_DATE',
244244
'VALUE'
245245
]
246246
DEFAULT_MAPPING = {
247247
'PERSON_ID': "PERSON_ID",
248248
"BOOLEAN": "BOOLEAN",
249-
"DATE": "DATE",
249+
"EVENT_DATE": "EVENT_DATE",
250250
"VALUE": "VALUE"
251251
}
252252

@@ -256,35 +256,42 @@ def is_phenex_person_table(table: PhenexTable) -> bool:
256256
Check if given table is a person table.
257257
One could check one row per patient?
258258
"""
259-
return set(table.columns) >= set(PhenexPersonTable.REQUIRED_FIELDS)
260-
259+
return True
261260

262261
def is_phenex_code_table(table: PhenexTable) -> bool:
263262
"""
264263
Check if given table is a code table.
265264
"""
265+
return True
266+
266267
return set(table.columns) >= set(CodeTable.REQUIRED_FIELDS)
267268

268269

269270
def is_phenex_event_table(table: PhenexTable) -> bool:
270271
"""
271272
Check if given table is a code table.
272273
"""
274+
return True
275+
273276
return set(table.columns) >= set(EventTable.REQUIRED_FIELDS)
274277

275278

276279
def is_phenex_phenotype_table(table: PhenexTable) -> bool:
277280
"""
278281
Check if given table is a code table.
279282
"""
283+
return True
284+
280285
return set(table.columns) >= set(PhenotypeTable.REQUIRED_FIELDS)
281286

282287

283288
def is_phenex_index_table(table: PhenexTable) -> bool:
284289
"""
285290
Check if given table is a code table.
286291
"""
292+
return True
293+
287294
return isinstance(table, PhenexIndexTable)
288295

289296

290-
PHENOTYPE_TABLE_COLUMNS = PhenotypeTable.REQUIRED_FIELDS
297+
PHENOTYPE_TABLE_COLUMNS = ["PERSON_ID", "BOOLEAN", "EVENT_DATE", "VALUE"]

phenex/test/phenotype_test_generator.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from .util.check_equality import check_equality
1010

1111
import logging
12-
12+
from phenex.tables import *
1313

1414
class PhenotypeTestGenerator:
1515
"""
@@ -81,9 +81,19 @@ def _create_input_data(self):
8181
else:
8282
schema[col] = str
8383

84-
self.domains[input_info["name"]] = self.con.create_table(
84+
table = self.con.create_table(
8585
input_info["name"], input_info["df"], schema=schema
8686
)
87+
if 'type' in input_info.keys():
88+
table_type = input_info['type']
89+
else:
90+
table_type = PhenexTable
91+
if input_info['name'].lower() in ['condition_occurrence', 'measurement']:
92+
table_type = CodeTable
93+
elif input_info['name'].lower() in ['person']:
94+
table_type = PhenexPersonTable
95+
96+
self.domains[input_info["name"]] = table_type(table)
8797

8898
def _run_tests(self):
8999
def df_from_test_info(test_info):

0 commit comments

Comments
 (0)