Skip to content

Commit

Permalink
black
Browse files Browse the repository at this point in the history
  • Loading branch information
sprivite committed Mar 5, 2025
1 parent 9740133 commit 18ed1c7
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 22 deletions.
37 changes: 21 additions & 16 deletions phenex/phenotypes/measurement_change_phenotype.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,31 +65,38 @@ def _execute(self, tables) -> PhenotypeTable:

# Create a self-join to compare each measurement with every other measurement
import ibis
ibis.options.interactive = True

ibis.options.interactive = True
joined_table = phenotype_table_1.join(
phenotype_table_2,
phenotype_table_2,
[
phenotype_table_1.PERSON_ID == phenotype_table_2.PERSON_ID,
(phenotype_table_1.EVENT_DATE != phenotype_table_2.EVENT_DATE) | (phenotype_table_1.VALUE != phenotype_table_2.VALUE),
(phenotype_table_1.EVENT_DATE != phenotype_table_2.EVENT_DATE)
| (phenotype_table_1.VALUE != phenotype_table_2.VALUE),
],
lname='{name}_1',
rname='{name}_2'
lname="{name}_1",
rname="{name}_2",
).filter(_.EVENT_DATE_1 <= _.EVENT_DATE_2)

# Calculate the change in value and the days apart
days_between = joined_table.EVENT_DATE_2.delta(joined_table.EVENT_DATE_1, "day")
value_change = joined_table.VALUE_2 - joined_table.VALUE_1
joined_table = joined_table.mutate(
VALUE_CHANGE=value_change,
DAYS_BETWEEN=days_between
VALUE_CHANGE=value_change, DAYS_BETWEEN=days_between
)

# Filter to keep only those with at least min_change and within max_days_apart
value_filter = ValueFilter(min=self.min_change, max=self.max_change, column_name='VALUE_CHANGE')
value_filter = ValueFilter(
min=self.min_change, max=self.max_change, column_name="VALUE_CHANGE"
)
filtered_table = value_filter.filter(joined_table)

time_filter = ValueFilter(min=self.min_days_between, max=self.max_days_between, column_name='DAYS_BETWEEN')
filtered_table = time_filter.filter(filtered_table)
time_filter = ValueFilter(
min=self.min_days_between,
max=self.max_days_between,
column_name="DAYS_BETWEEN",
)
filtered_table = time_filter.filter(filtered_table)

# Determine the return date based on the return_date attribute
if self.return_date == "first":
Expand All @@ -103,13 +110,11 @@ def _execute(self, tables) -> PhenotypeTable:

# Select the required columns
filtered_table = filtered_table.mutate(
PERSON_ID='PERSON_ID_1',
VALUE='VALUE_CHANGE',
BOOLEAN=True
)
PERSON_ID="PERSON_ID_1", VALUE="VALUE_CHANGE", BOOLEAN=True
)
result_table = filtered_table.select(PHENOTYPE_TABLE_COLUMNS).distinct()

if self.relative_time_range is not None:
result_table = self.relative_time_range.filter(result_table)

return result_table
return result_table
12 changes: 6 additions & 6 deletions phenex/test/phenotypes/test_measurement_change_phenotype.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ class MeasurementChangePhenotypeTestGenerator(PhenotypeTestGenerator):
def define_input_tables(self):
df = pd.DataFrame()
N = 10
df["VALUE"] = \
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + \
[2, 4, 6, 8, 10, 6, 6, 6, 6, 6]
df["VALUE"] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + [2, 4, 6, 8, 10, 6, 6, 6, 6, 6]
df["PERSON_ID"] = [f"P{x}" for x in range(N)] * 2
# change of 1, 2, 3, 4, 5, 0, -1, -2, -3, -4
# change of 1, 2, 3, 4, 5, 0, -1, -2, -3, -4
df["CODE"] = "c1"
df["CODE_TYPE"] = "ICD10CM"
df["EVENT_DATE"] = [datetime.date(2022, 1, 1)] * 10 + [datetime.date(2022, 1, 1 + i) for i in range(10)]
df["EVENT_DATE"] = [datetime.date(2022, 1, 1)] * 10 + [
datetime.date(2022, 1, 1 + i) for i in range(10)
]
# days_between = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
df.iloc[-1, 0] = None # make a null lab value for last patient
return [{"name": "MEASUREMENT", "df": df}]
Expand Down Expand Up @@ -68,7 +68,7 @@ def define_phenotype_tests(self):

c3 = {
"name": "change_leq0",
"persons": ["P0","P5", "P6", "P7"],
"persons": ["P0", "P5", "P6", "P7"],
"phenotype": MeasurementChangePhenotype(
name="change_leq0",
phenotype=measurement_phenotype,
Expand Down

0 comments on commit 18ed1c7

Please sign in to comment.