Skip to content

Commit

Permalink
[pre-commit.ci] auto fixes from pre-commit.com hooks
Browse files Browse the repository at this point in the history
for more information, see https://pre-commit.ci
  • Loading branch information
pre-commit-ci[bot] committed Apr 16, 2024
1 parent 5755121 commit 4ca4b1b
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 37 deletions.
5 changes: 1 addition & 4 deletions src/femr/labelers/ehrshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,7 @@ def get_inpatient_admission_measurements(
measurements: List[Tuple[datetime.datetime, meds.Measurement]] = []
for e in patient["events"]:
for m in e["measurements"]:
if (
m["metadata"]["table"] == "visit"
and m["code"] in admission_codes
):
if m["metadata"]["table"] == "visit" and m["code"] in admission_codes:
if isinstance(m["metadata"]["end"], str):
m["metadata"]["end"] = datetime.datetime.fromisoformat(m["metadata"]["end"])
# Error checking
Expand Down
9 changes: 5 additions & 4 deletions src/femr/post_etl_pipelines/stanford.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def _get_stanford_transformations() -> Callable[[meds.Patient], meds.Patient]:
),
join_consecutive_day_visits,
]

return lambda patient: functools.reduce(lambda r, f: f(r), transforms, patient)


Expand Down Expand Up @@ -80,7 +80,7 @@ def femr_stanford_omop_fixer_program() -> None:
os.mkdir(args.target_dataset)

dataset = datasets.Dataset.from_parquet(os.path.join(args.source_dataset, "data", "*"))

fixed_patient = dataset.map(_get_stanford_transformations(), num_proc=args.num_proc, load_from_cache_file=False)

os.mkdir(os.path.join(args.target_dataset, "data"))
Expand All @@ -96,5 +96,6 @@ def femr_stanford_omop_fixer_program() -> None:
with open(os.path.join(args.target_dataset, "metadata.json"), "w") as f:
json.dump(metadata, f)

if __name__ == '__main__':
femr_stanford_omop_fixer_program()

if __name__ == "__main__":
femr_stanford_omop_fixer_program()
62 changes: 33 additions & 29 deletions src/femr/transforms/stanford.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ def move_pre_birth(patient: meds.Patient) -> meds.Patient:

return patient


def select_code(current_code: str, new_code: str) -> str:
# Prefer "Visit/ERIP" > "Visit/IP" > "Visit/OP" > "Visit/" > everything else
if current_code == "Visit/ERIP" or new_code == "Visit/ERIP":
Expand All @@ -171,15 +172,16 @@ def select_code(current_code: str, new_code: str) -> str:
else:
return current_code


def join_consecutive_day_visits(patient: meds.Patient) -> meds.Patient:
"""If two visits are on consecutive days, merge them into one visit"""
current_visit_id: int = None
current_visit_end: datetime.datetime = None
current_visit_code: str = None
current_visit_code: str = None
old_visit_id_2_new_visit_id: Dict[int, int] = {}
for e_idx, event in enumerate(patient["events"]):
for m_idx, m in enumerate(event['measurements']):
if m['metadata']['visit_id'] is not None and m['metadata']['table'] in ['visit', 'visit_detail']:
for m_idx, m in enumerate(event["measurements"]):
if m["metadata"]["visit_id"] is not None and m["metadata"]["table"] in ["visit", "visit_detail"]:
# Found visit measurement
m_end = (
datetime.datetime.fromisoformat(m["metadata"]["end"])
Expand All @@ -190,56 +192,58 @@ def join_consecutive_day_visits(patient: meds.Patient) -> meds.Patient:
# Start a new visit
current_visit_id = m["metadata"]["visit_id"]
current_visit_end = m_end
current_visit_code = m['code']
elif m['metadata']['visit_id'] == current_visit_id:
current_visit_code = m["code"]
elif m["metadata"]["visit_id"] == current_visit_id:
# Same visit, so update its end time
current_visit_end = max(m_end, current_visit_end)
current_visit_code = select_code(current_visit_code, m['code'])
elif m['metadata']['visit_id'] in old_visit_id_2_new_visit_id:
current_visit_code = select_code(current_visit_code, m["code"])
elif m["metadata"]["visit_id"] in old_visit_id_2_new_visit_id:
# We have already merged this visit, so update its end time
current_visit_end = max(m_end, current_visit_end)
current_visit_code = select_code(current_visit_code, m['code'])
current_visit_code = select_code(current_visit_code, m["code"])
else:
if (event["time"] - current_visit_end).days <= 1:
# Merge the two visits
current_visit_end = max(m_end, current_visit_end)
current_visit_code = select_code(current_visit_code, m['code'])
current_visit_code = select_code(current_visit_code, m["code"])
else:
# Start a new visit
current_visit_id = m["metadata"]["visit_id"]
current_visit_end = m_end
current_visit_code = m['code']
current_visit_code = m["code"]
# NOTE: Need to update both this visit_id and the current_visit_id
old_visit_id_2_new_visit_id[m['metadata']['visit_id']] = {
'visit_id' : current_visit_id,
'end' : current_visit_end,
'code' : current_visit_code,
old_visit_id_2_new_visit_id[m["metadata"]["visit_id"]] = {
"visit_id": current_visit_id,
"end": current_visit_end,
"code": current_visit_code,
}
old_visit_id_2_new_visit_id[current_visit_id] = {
'visit_id' : current_visit_id,
'end' : current_visit_end,
'code' : current_visit_code,
"visit_id": current_visit_id,
"end": current_visit_end,
"code": current_visit_code,
}
events = []
for e_idx, event in enumerate(patient["events"]):
measurements = []
for m_idx, m in enumerate(event['measurements']):
if m['metadata']['visit_id']:
if m['metadata']['table'] == 'visit':
for m_idx, m in enumerate(event["measurements"]):
if m["metadata"]["visit_id"]:
if m["metadata"]["table"] == "visit":
# If this is a visit event, update its end time and delete (if not original visit_id)
m['metadata']['end'] = old_visit_id_2_new_visit_id[m['metadata']['visit_id']]['end']
m['code'] = old_visit_id_2_new_visit_id[m['metadata']['visit_id']]['code']
if old_visit_id_2_new_visit_id[m['metadata']['visit_id']]['visit_id'] == m['metadata']['visit_id']:
m["metadata"]["end"] = old_visit_id_2_new_visit_id[m["metadata"]["visit_id"]]["end"]
m["code"] = old_visit_id_2_new_visit_id[m["metadata"]["visit_id"]]["code"]
if old_visit_id_2_new_visit_id[m["metadata"]["visit_id"]]["visit_id"] == m["metadata"]["visit_id"]:
measurements.append(m)
else:
# Update the visit_id
m['metadata']['visit_id'] = old_visit_id_2_new_visit_id[m['metadata']['visit_id']]['visit_id']
m["metadata"]["visit_id"] = old_visit_id_2_new_visit_id[m["metadata"]["visit_id"]]["visit_id"]
measurements.append(m)
events.append({
'time' : event['time'],
'measurements' : measurements,
})
patient['events'] = events
events.append(
{
"time": event["time"],
"measurements": measurements,
}
)
patient["events"] = events
return patient


Expand Down

0 comments on commit 4ca4b1b

Please sign in to comment.