def test_clinical_event_with_category(): session = make_session() session.add_all( [ Patient(), Patient( CodedEvents=[ CodedEvent(CTV3Code="foo1", ConsultationDate="2018-01-01"), CodedEvent(CTV3Code="foo2", ConsultationDate="2020-01-01"), ] ), Patient( CodedEvents=[CodedEvent(CTV3Code="foo3", ConsultationDate="2019-01-01")] ), ] ) session.commit() codes = codelist([("foo1", "A"), ("foo2", "B"), ("foo3", "C")], "ctv3") study = StudyDefinition( population=patients.all(), code_category=patients.with_these_clinical_events( codes, returning="category", find_last_match_in_period=True, include_date_of_match=True, ), ) results = study.to_dicts() assert [x["code_category"] for x in results] == ["", "B", "C"] assert [x["code_category_date"] for x in results] == ["", "2020", "2019"]
def test_patients_died_from_any_cause(): session = make_session() session.add_all( [ # Not dead Patient(), # Died after date cutoff Patient(ONSDeath=[ONSDeaths(dod="2021-01-01")]), # Died Patient(ONSDeath=[ONSDeaths(dod="2020-02-01")]), ] ) session.commit() study = StudyDefinition( population=patients.all(), died=patients.died_from_any_cause(on_or_before="2020-06-01"), date_died=patients.died_from_any_cause( on_or_before="2020-06-01", returning="date_of_death", include_month=True, include_day=True, ), ) results = study.to_dicts() assert [i["died"] for i in results] == ["0", "0", "1"] assert [i["date_died"] for i in results] == ["", "", "2020-02-01"]
def test_vaccination_events_sql(): session = make_session() session.add_all( [ # This patient is too old and should be ignored Patient( DateOfBirth="2002-05-04", Vaccinations=[ Vaccination( VaccinationName="Infanrix Hexa", VaccinationDate="2002-06-01", ) ], ), # This patient is too young and should be ignored Patient( DateOfBirth="2019-10-04", Vaccinations=[ Vaccination( VaccinationName="Infanrix Hexa", VaccinationDate="2019-11-04", ) ], ), Patient( DateOfBirth="2018-10-28", Vaccinations=[ Vaccination( VaccinationName="Infanrix Hexa", VaccinationDate="2018-11-01", ) ], MedicationIssues=[ MedicationIssue( MedicationDictionary=MedicationDictionary( DMD_ID="123", MultilexDrug_ID="123" ), ConsultationDate="2019-01-01", ), ], CodedEvents=[CodedEvent(CTV3Code="abc", ConsultationDate="2019-06-01")], ), ] ) session.commit() sql = vaccination_events_sql( date_of_birth_range=("2012-01-01", "2019-06-01"), tpp_vaccination_codelist=codelist( [("Infanrix Hexa", "dtap_hex")], system="tpp_vaccines", ), ctv3_codelist=codelist([("abc", "menb")], system="ctv3"), snomed_codelist=codelist([("123", "rotavirus")], system="snomed"), ) results = sql_to_dicts(sql) result_tuples = [(x["date_given"], x["vaccine_name"]) for x in results] # Results are ordered by patient ID but within each patient's results the # order is arbitrary. To make testing easier we sort them here. result_tuples = sorted(result_tuples) assert result_tuples == [ ("2018-11-01", "dtap_hex"), ("2019-01-01", "rotavirus"), ("2019-06-01", "menb"), ]
def test_patient_characteristics_for_covid_status(): session = make_session() old_patient_with_covid = Patient( DateOfBirth="1900-01-01", CovidStatus=CovidStatus(Result="COVID19", AdmittedToITU=True), Sex="M", ) young_patient_1_with_covid = Patient( DateOfBirth="2000-01-01", CovidStatus=CovidStatus(Result="COVID19", Died=True), Sex="F", ) young_patient_2_without_covid = Patient(DateOfBirth="2001-01-01", Sex="F") session.add(old_patient_with_covid) session.add(young_patient_1_with_covid) session.add(young_patient_2_without_covid) session.commit() study = StudyDefinition( population=patients.with_positive_covid_test(), age=patients.age_as_of("2020-01-01"), sex=patients.sex(), died=patients.have_died_of_covid(), ) results = study.to_dicts() assert [x["sex"] for x in results] == ["M", "F"] assert [x["died"] for x in results] == ["0", "1"] assert [x["age"] for x in results] == ["120", "20"]
def test_patients_with_death_recorded_in_cpns(): session = make_session() session.add_all( [ # Not dead Patient(), # Died after date cutoff Patient(CPNS=[CPNS(DateOfDeath="2021-01-01")]), # Patient should be included Patient(CPNS=[CPNS(DateOfDeath="2020-02-01")]), # Patient has multple entries but with the same date of death so # should be handled correctly Patient( CPNS=[CPNS(DateOfDeath="2020-03-01"), CPNS(DateOfDeath="2020-03-01")] ), ] ) session.commit() study = StudyDefinition( population=patients.all(), cpns_death=patients.with_death_recorded_in_cpns(on_or_before="2020-06-01"), cpns_death_date=patients.with_death_recorded_in_cpns( on_or_before="2020-06-01", returning="date_of_death", date_format="YYYY-MM-DD", ), ) results = study.to_dicts() assert [i["cpns_death"] for i in results] == ["0", "0", "1", "1"] assert [i["cpns_death_date"] for i in results] == [ "", "", "2020-02-01", "2020-03-01", ]
def test_patients_categorised_as(): session = make_session() session.add_all( [ Patient( Sex="M", CodedEvents=[ CodedEvent(CTV3Code="foo1", ConsultationDate="2000-01-01") ], ), Patient( Sex="F", CodedEvents=[ CodedEvent(CTV3Code="foo2", ConsultationDate="2000-01-01"), CodedEvent(CTV3Code="bar1", ConsultationDate="2000-01-01"), ], ), Patient( Sex="M", CodedEvents=[ CodedEvent(CTV3Code="foo2", ConsultationDate="2000-01-01") ], ), Patient( Sex="F", CodedEvents=[ CodedEvent(CTV3Code="foo3", ConsultationDate="2000-01-01") ], ), ] ) session.commit() foo_codes = codelist([("foo1", "A"), ("foo2", "B"), ("foo3", "C")], "ctv3") bar_codes = codelist(["bar1"], "ctv3") study = StudyDefinition( population=patients.all(), category=patients.categorised_as( { "W": "foo_category = 'B' AND female_with_bar", "X": "sex = 'F' AND (foo_category = 'B' OR foo_category = 'C')", "Y": "sex = 'M' AND foo_category = 'A'", "Z": "DEFAULT", }, sex=patients.sex(), foo_category=patients.with_these_clinical_events( foo_codes, returning="category", find_last_match_in_period=True ), female_with_bar=patients.satisfying( "has_bar AND sex = 'F'", has_bar=patients.with_these_clinical_events(bar_codes), ), ), ) results = study.to_dicts() assert [x["category"] for x in results] == ["Y", "W", "Z", "X"] # Assert that internal columns do not appear assert "foo_category" not in results[0].keys() assert "female_with_bar" not in results[0].keys() assert "has_bar" not in results[0].keys()
def test_number_of_episodes(): session = make_session() session.add_all( [ Patient( CodedEvents=[ CodedEvent(CTV3Code="foo1", ConsultationDate="2010-01-01"), # Throw in some irrelevant events CodedEvent(CTV3Code="mto1", ConsultationDate="2010-01-02"), CodedEvent(CTV3Code="mto2", ConsultationDate="2010-01-03"), # These two should be merged in to the previous event # because there's not more than 14 days between them CodedEvent(CTV3Code="foo2", ConsultationDate="2010-01-14"), CodedEvent(CTV3Code="foo3", ConsultationDate="2010-01-20"), # This is just outside the limit so should count as another event CodedEvent(CTV3Code="foo1", ConsultationDate="2010-02-04"), # This shouldn't count because there's an "ignore" event on # the same day (though at a different time) CodedEvent(CTV3Code="foo1", ConsultationDate="2012-01-01T10:45:00"), CodedEvent(CTV3Code="bar2", ConsultationDate="2012-01-01T16:10:00"), # This should be another episode CodedEvent(CTV3Code="foo1", ConsultationDate="2015-03-05"), # This "ignore" event should have no effect because it occurs # on a different day CodedEvent(CTV3Code="bar1", ConsultationDate="2015-03-06"), # This is after the time limit and so shouldn't count CodedEvent(CTV3Code="foo1", ConsultationDate="2020-02-05"), ] ), # This patient doesn't have any relevant events Patient( CodedEvents=[ CodedEvent(CTV3Code="mto1", ConsultationDate="2010-01-01"), CodedEvent(CTV3Code="mto2", ConsultationDate="2010-01-14"), CodedEvent(CTV3Code="mto3", ConsultationDate="2010-01-20"), CodedEvent(CTV3Code="mto1", ConsultationDate="2010-02-04"), CodedEvent(CTV3Code="mto1", ConsultationDate="2012-01-01T10:45:00"), CodedEvent(CTV3Code="mtr2", ConsultationDate="2012-01-01T16:10:00"), CodedEvent(CTV3Code="mto1", ConsultationDate="2015-03-05"), CodedEvent(CTV3Code="mto1", ConsultationDate="2020-02-05"), ] ), ] ) session.commit() foo_codes = codelist(["foo1", "foo2", "foo3"], "ctv3") bar_codes = codelist(["bar1", "bar2"], "ctv3") study = StudyDefinition( population=patients.all(), episode_count=patients.with_these_clinical_events( foo_codes, on_or_before="2020-01-01", ignore_days_where_these_codes_occur=bar_codes, returning="number_of_episodes", episode_defined_as="series of events each <= 14 days apart", ), ) results = study.to_dicts() assert [i["episode_count"] for i in results] == ["3", "0"]
def test_patients_registered_with_one_practice_between(): session = make_session() patient_registered_in_2001 = Patient() patient_registered_in_2002 = Patient() patient_unregistered_in_2002 = Patient() patient_registered_in_2001.RegistrationHistory = [ RegistrationHistory(StartDate="2001-01-01", EndDate="9999-01-01") ] patient_registered_in_2002.RegistrationHistory = [ RegistrationHistory(StartDate="2002-01-01", EndDate="9999-01-01") ] patient_unregistered_in_2002.RegistrationHistory = [ RegistrationHistory(StartDate="2001-01-01", EndDate="2002-01-01") ] session.add(patient_registered_in_2001) session.add(patient_registered_in_2002) session.add(patient_unregistered_in_2002) session.commit() study = StudyDefinition( population=patients.registered_with_one_practice_between( "2001-12-01", "2003-01-01" ) ) results = study.to_dicts() assert [x["patient_id"] for x in results] == [ str(patient_registered_in_2001.Patient_ID) ]
def test_patient_registered_as_of(): session = make_session() patient_registered_in_2001 = Patient() patient_registered_in_2002 = Patient() patient_unregistered_in_2002 = Patient() patient_registered_in_2001.RegistrationHistory = [ RegistrationHistory(StartDate="2001-01-01", EndDate="9999-01-01") ] patient_registered_in_2002.RegistrationHistory = [ RegistrationHistory(StartDate="2002-01-01", EndDate="9999-01-01") ] patient_unregistered_in_2002.RegistrationHistory = [ RegistrationHistory(StartDate="2001-01-01", EndDate="2002-01-01") ] session.add(patient_registered_in_2001) session.add(patient_registered_in_2002) session.add(patient_unregistered_in_2002) session.commit() # No date criteria study = StudyDefinition(population=patients.registered_as_of("2002-03-02")) results = study.to_dicts() assert [x["patient_id"] for x in results] == [ str(patient_registered_in_2001.Patient_ID), str(patient_registered_in_2002.Patient_ID), ]
def test_minimal_study_to_csv(): session = make_session() patient_1 = Patient(DateOfBirth="1900-01-01", Sex="M") patient_2 = Patient(DateOfBirth="1900-01-01", Sex="F") session.add_all([patient_1, patient_2]) session.commit() study = StudyDefinition(population=patients.all(), sex=patients.sex()) with tempfile.NamedTemporaryFile(mode="w+") as f: study.to_csv(f.name) results = list(csv.DictReader(f)) assert results == [ {"patient_id": str(patient_1.Patient_ID), "sex": "M"}, {"patient_id": str(patient_2.Patient_ID), "sex": "F"}, ]
def test_bmi_rounded(): session = make_session() weight_code = "X76C7" height_code = "XM01E" patient = Patient(DateOfBirth="1950-01-01") patient.CodedEvents.append( CodedEvent( CTV3Code=weight_code, NumericValue=10.12345, ConsultationDate="2001-06-01" ) ) patient.CodedEvents.append( CodedEvent(CTV3Code=height_code, NumericValue=10, ConsultationDate="2000-02-01") ) session.add(patient) session.commit() study = StudyDefinition( population=patients.all(), BMI=patients.most_recent_bmi( "2005-01-01", include_measurement_date=True, include_month=True, include_day=True, ), ) results = study.to_dicts() assert [x["BMI"] for x in results] == ["0.1"] assert [x["BMI_date_measured"] for x in results] == ["2001-06-01"]
def test_to_sql_passes(): session = make_session() patient = Patient(DateOfBirth="1950-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code="XYZ", NumericValue=50, ConsultationDate="2002-06-01") ) session.add(patient) session.commit() study = StudyDefinition( population=patients.with_these_clinical_events(codelist(["XYZ"], "ctv3")) ) sql = "SET NOCOUNT ON; " # don't output count after table output sql += study.to_sql() db_dict = study.get_db_dict() cmd = [ "sqlcmd", "-S", db_dict["hostname"] + "," + str(db_dict["port"]), "-d", db_dict["database"], "-U", db_dict["username"], "-P", db_dict["password"], "-Q", sql, "-W", # strip whitespace ] result = subprocess.run( cmd, capture_output=True, check=True, encoding="utf8" ).stdout patient_id = result.splitlines()[-1] assert patient_id == str(patient.Patient_ID)
def test_no_bmi_when_measurement_after_reference_date(): session = make_session() bmi_code = "22K.." patient = Patient(DateOfBirth="1900-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code=bmi_code, NumericValue=99, ConsultationDate="2001-01-01") ) session.add(patient) session.commit() study = StudyDefinition( population=patients.all(), BMI=patients.most_recent_bmi( on_or_after="1990-01-01", on_or_before="2000-01-01", include_measurement_date=True, include_month=True, include_day=True, ), ) results = study.to_dicts() assert [x["BMI"] for x in results] == ["0.0"] assert [x["BMI_date_measured"] for x in results] == [""]
def test_bmi_when_only_some_measurements_of_child(): session = make_session() bmi_code = "22K.." weight_code = "X76C7" height_code = "XM01E" patient = Patient(DateOfBirth="1990-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code=bmi_code, NumericValue=99, ConsultationDate="1995-01-01") ) patient.CodedEvents.append( CodedEvent(CTV3Code=weight_code, NumericValue=50, ConsultationDate="2010-01-01") ) patient.CodedEvents.append( CodedEvent(CTV3Code=height_code, NumericValue=10, ConsultationDate="2010-01-01") ) session.add(patient) session.commit() study = StudyDefinition( population=patients.all(), BMI=patients.most_recent_bmi( on_or_after="2005-01-01", on_or_before="2015-01-01", include_measurement_date=True, include_month=True, include_day=True, ), ) results = study.to_dicts() assert [x["BMI"] for x in results] == ["0.5"] assert [x["BMI_date_measured"] for x in results] == ["2010-01-01"]
def test_bmi_with_zero_values(): session = make_session() weight_code = "X76C7" height_code = "XM01E" patient = Patient(DateOfBirth="1950-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code=weight_code, NumericValue=0, ConsultationDate="2001-06-01") ) patient.CodedEvents.append( CodedEvent(CTV3Code=height_code, NumericValue=0, ConsultationDate="2001-06-01") ) session.add(patient) session.commit() study = StudyDefinition( population=patients.all(), BMI=patients.most_recent_bmi( on_or_after="1995-01-01", on_or_before="2005-01-01", ), BMI_date_measured=patients.date_of("BMI", date_format="YYYY-MM-DD"), ) results = study.to_dicts() assert [x["BMI"] for x in results] == ["0.0"] assert [x["BMI_date_measured"] for x in results] == ["2001-06-01"]
def test_explicit_bmi_fallback(): session = make_session() weight_code = "X76C7" bmi_code = "22K.." patient = Patient(DateOfBirth="1950-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code=weight_code, NumericValue=50, ConsultationDate="2001-06-01") ) patient.CodedEvents.append( CodedEvent(CTV3Code=bmi_code, NumericValue=99, ConsultationDate="2001-10-01") ) session.add(patient) session.commit() study = StudyDefinition( population=patients.all(), BMI=patients.most_recent_bmi( on_or_after="1995-01-01", on_or_before="2005-01-01", include_measurement_date=True, include_month=True, include_day=True, ), ) results = study.to_dicts() assert [x["BMI"] for x in results] == ["99.0"] assert [x["BMI_date_measured"] for x in results] == ["2001-10-01"]
def test_patients_with_ages_and_practices_sql(): session = make_session() session.add_all([ # This patient is too old and should be ignored Patient(DateOfBirth="2002-05-04"), # This patient is too young and should be ignored Patient(DateOfBirth="2019-10-04"), Patient( DateOfBirth="2018-10-28", RegistrationHistory=[ RegistrationHistory( StartDate="2015-01-01", EndDate="2021-10-01", Organisation=Organisation(Organisation_ID=456), ), ], ), Patient( DateOfBirth="2014-09-14", RegistrationHistory=[ RegistrationHistory( StartDate="2010-01-01", EndDate="2015-10-01", Organisation=Organisation(Organisation_ID=123), ), # Deliberately overlapping registration histories RegistrationHistory( StartDate="2015-04-01", EndDate="9999-12-31", Organisation=Organisation(Organisation_ID=345), ), ], ), ]) session.commit() sql = patients_with_ages_and_practices_sql( date_of_birth_range=("2012-01-01", "2019-06-01"), age_thresholds=[12, 24, 60], ) results = sql_to_dicts(sql) # Note this is rounded to start of month assert [x["date_of_birth"] for x in results] == ["2018-10-01", "2014-09-01"] assert [x["practice_id_at_month_12"] for x in results] == ["456", "345"] assert [x["practice_id_at_month_24"] for x in results] == ["456", "345"] assert [x["practice_id_at_month_60"] for x in results] == ["0", "345"]
def test_patients_satisfying_with_hidden_columns(): condition_code = "ASTHMA" condition_code2 = "COPD" session = make_session() patient_1 = Patient(DateOfBirth="1940-01-01", Sex="M") patient_2 = Patient(DateOfBirth="1940-01-01", Sex="F") patient_3 = Patient(DateOfBirth="1990-01-01", Sex="M") patient_4 = Patient(DateOfBirth="1940-01-01", Sex="F") patient_4.CodedEvents.append( CodedEvent(CTV3Code=condition_code, ConsultationDate="2010-01-01") ) patient_5 = Patient(DateOfBirth="1940-01-01", Sex="F") patient_5.CodedEvents.append( CodedEvent(CTV3Code=condition_code, ConsultationDate="2010-01-01") ) patient_5.CodedEvents.append( CodedEvent(CTV3Code=condition_code2, ConsultationDate="2010-01-01") ) session.add_all([patient_1, patient_2, patient_3, patient_4, patient_5]) session.commit() study = StudyDefinition( population=patients.all(), sex=patients.sex(), age=patients.age_as_of("2020-01-01"), at_risk=patients.satisfying( """ (age > 70 AND sex = "M") OR (has_asthma AND NOT copd) """, has_asthma=patients.with_these_clinical_events( codelist([condition_code], "ctv3") ), copd=patients.with_these_clinical_events( codelist([condition_code2], "ctv3") ), ), ) results = study.to_dicts() assert [i["at_risk"] for i in results] == ["1", "0", "0", "1", "0"] assert "has_asthma" not in results[0].keys()
def test_patient_random_sample(): session = make_session() sample_size = 1000 for _ in range(sample_size): patient = Patient() session.add(patient) session.commit() study = StudyDefinition(population=patients.random_sample(percent=20)) results = study.to_dicts() # The method is approximate! assert len(results) < (sample_size / 2)
def test_patients_with_these_codes_on_death_certificate(): code = "COVID" session = make_session() session.add_all( [ # Not dead Patient(), # Died after date cutoff Patient(ONSDeath=[ONSDeaths(dod="2021-01-01", icd10u=code)]), # Died of something else Patient(ONSDeath=[ONSDeaths(dod="2020-02-01", icd10u="MI")]), # Covid underlying cause Patient(ONSDeath=[ONSDeaths(dod="2020-02-01", icd10u=code)]), # Covid not underlying cause Patient(ONSDeath=[ONSDeaths(dod="2020-03-01", ICD10014=code)]), ] ) session.commit() covid_codelist = codelist([code], system="icd10") study = StudyDefinition( population=patients.all(), died_of_covid=patients.with_these_codes_on_death_certificate( covid_codelist, on_or_before="2020-06-01", match_only_underlying_cause=True ), died_with_covid=patients.with_these_codes_on_death_certificate( covid_codelist, on_or_before="2020-06-01", match_only_underlying_cause=False ), date_died=patients.with_these_codes_on_death_certificate( covid_codelist, on_or_before="2020-06-01", match_only_underlying_cause=False, returning="date_of_death", include_month=True, include_day=True, ), ) results = study.to_dicts() assert [i["died_of_covid"] for i in results] == ["0", "0", "0", "1", "0"] assert [i["died_with_covid"] for i in results] == ["0", "0", "0", "1", "1"] assert [i["date_died"] for i in results] == ["", "", "", "2020-02-01", "2020-03-01"]
def test_patients_with_death_recorded_in_cpns_raises_error_on_bad_data(): session = make_session() session.add_all( # Create a patient with duplicate CPNS entries recording an # inconsistent date of death [Patient(CPNS=[CPNS(DateOfDeath="2020-03-01"), CPNS(DateOfDeath="2020-02-01")])] ) session.commit() study = StudyDefinition( population=patients.all(), cpns_death=patients.with_death_recorded_in_cpns() ) with pytest.raises(Exception): study.to_dicts()
def test_meds(): session = make_session() asthma_medication = MedicationDictionary( FullName="Asthma Drug", DMD_ID="0", MultilexDrug_ID="0" ) patient_with_med = Patient() patient_with_med.MedicationIssues = [ MedicationIssue(MedicationDictionary=asthma_medication) ] patient_without_med = Patient() session.add(patient_with_med) session.add(patient_without_med) session.commit() study = StudyDefinition( population=patients.all(), asthma_meds=patients.with_these_medications( codelist(asthma_medication.DMD_ID, "snomed") ), ) results = study.to_dicts() assert [x["asthma_meds"] for x in results] == ["1", "0"]
def test_patients_satisfying(): condition_code = "ASTHMA" session = make_session() patient_1 = Patient(DateOfBirth="1940-01-01", Sex="M") patient_2 = Patient(DateOfBirth="1940-01-01", Sex="F") patient_3 = Patient(DateOfBirth="1990-01-01", Sex="M") patient_4 = Patient(DateOfBirth="1940-01-01", Sex="F") patient_4.CodedEvents.append( CodedEvent(CTV3Code=condition_code, ConsultationDate="2010-01-01") ) session.add_all([patient_1, patient_2, patient_3, patient_4]) session.commit() study = StudyDefinition( population=patients.all(), sex=patients.sex(), age=patients.age_as_of("2020-01-01"), has_asthma=patients.with_these_clinical_events( codelist([condition_code], "ctv3") ), at_risk=patients.satisfying("(age > 70 AND sex = 'M') OR has_asthma"), ) results = study.to_dicts() assert [i["at_risk"] for i in results] == ["1", "0", "0", "1"]
def test_mean_recorded_value(): code = "2469." session = make_session() patient = Patient() values = [ ("2020-02-10", 90), ("2020-02-10", 100), ("2020-02-10", 98), # This day is outside period and should be ignored ("2020-04-01", 110), ] for date, value in values: patient.CodedEvents.append( CodedEvent(CTV3Code=code, NumericValue=value, ConsultationDate=date) ) patient_with_old_reading = Patient() patient_with_old_reading.CodedEvents.append( CodedEvent(CTV3Code=code, NumericValue=100, ConsultationDate="2010-01-01") ) patient_with_no_reading = Patient() session.add_all([patient, patient_with_old_reading, patient_with_no_reading]) session.commit() study = StudyDefinition( population=patients.all(), bp_systolic=patients.mean_recorded_value( codelist([code], system="ctv3"), on_most_recent_day_of_measurement=True, between=["2018-01-01", "2020-03-01"], include_measurement_date=True, include_month=True, include_day=True, ), ) results = study.to_dicts() results = [(i["bp_systolic"], i["bp_systolic_date_measured"]) for i in results] assert results == [("96.0", "2020-02-10"), ("0.0", ""), ("0.0", "")]
def test_using_expression_in_population_definition(): session = make_session() session.add_all( [ Patient( Sex="M", DateOfBirth="1970-01-01", CodedEvents=[ CodedEvent(CTV3Code="foo1", ConsultationDate="2000-01-01") ], ), Patient(Sex="M", DateOfBirth="1975-01-01"), Patient( Sex="F", DateOfBirth="1980-01-01", CodedEvents=[ CodedEvent(CTV3Code="foo1", ConsultationDate="2000-01-01") ], ), Patient(Sex="F", DateOfBirth="1985-01-01"), ] ) session.commit() study = StudyDefinition( population=patients.satisfying( "has_foo_code AND sex = 'M'", has_foo_code=patients.with_these_clinical_events( codelist(["foo1"], "ctv3") ), sex=patients.sex(), ), age=patients.age_as_of("2020-01-01"), ) results = study.to_dicts() assert results[0].keys() == {"patient_id", "age"} assert [i["age"] for i in results] == ["50"]
def test_meds_with_count(): session = make_session() asthma_medication = MedicationDictionary( FullName="Asthma Drug", DMD_ID="0", MultilexDrug_ID="0" ) patient_with_med = Patient() patient_with_med.MedicationIssues = [ MedicationIssue( MedicationDictionary=asthma_medication, ConsultationDate="2010-01-01" ), MedicationIssue( MedicationDictionary=asthma_medication, ConsultationDate="2015-01-01" ), MedicationIssue( MedicationDictionary=asthma_medication, ConsultationDate="2018-01-01" ), MedicationIssue( MedicationDictionary=asthma_medication, ConsultationDate="2020-01-01" ), ] patient_without_med = Patient() session.add(patient_with_med) session.add(patient_without_med) session.commit() study = StudyDefinition( population=patients.all(), asthma_meds=patients.with_these_medications( codelist(asthma_medication.DMD_ID, "snomed"), on_or_after="2012-01-01", return_number_of_matches_in_period=True, ), ) results = study.to_dicts() assert [x["asthma_meds"] for x in results] == ["3", "0"]
def test_sqlcmd_and_odbc_outputs_match(): session = make_session() patient = Patient(DateOfBirth="1950-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code="XYZ", NumericValue=50, ConsultationDate="2002-06-01") ) session.add(patient) session.commit() study = StudyDefinition( population=patients.with_these_clinical_events(codelist(["XYZ"], "ctv3")) ) with tempfile.NamedTemporaryFile() as input_csv_odbc, tempfile.NamedTemporaryFile() as input_csv_sqlcmd: # windows line endings study.to_csv(input_csv_odbc.name, with_sqlcmd=False) # unix line endings study.to_csv(input_csv_sqlcmd.name, with_sqlcmd=True) assert filecmp.cmp(input_csv_odbc.name, input_csv_sqlcmd.name, shallow=False)
def test_no_bmi_when_measurements_of_child(): session = make_session() bmi_code = "22K.." patient = Patient(DateOfBirth="2000-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code=bmi_code, NumericValue=99, ConsultationDate="2001-01-01") ) session.add(patient) session.commit() study = StudyDefinition( population=patients.all(), BMI=patients.most_recent_bmi( on_or_after="1995-01-01", on_or_before="2005-01-01", ), BMI_date_measured=patients.date_of("BMI", date_format="YYYY-MM-DD"), ) results = study.to_dicts() assert [x["BMI"] for x in results] == ["0.0"] assert [x["BMI_date_measured"] for x in results] == [""]
def test_simple_bmi(include_dates): session = make_session() weight_code = "X76C7" height_code = "XM01E" patient = Patient(DateOfBirth="1950-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code=weight_code, NumericValue=50, ConsultationDate="2002-06-01") ) patient.CodedEvents.append( CodedEvent(CTV3Code=height_code, NumericValue=10, ConsultationDate="2001-06-01") ) session.add(patient) session.commit() if include_dates == "none": bmi_date = None bmi_kwargs = {} elif include_dates == "year": bmi_date = "2002" bmi_kwargs = dict(include_measurement_date=True) elif include_dates == "month": bmi_date = "2002-06" bmi_kwargs = dict(include_measurement_date=True, include_month=True) elif include_dates == "day": bmi_date = "2002-06-01" bmi_kwargs = dict( include_measurement_date=True, include_month=True, include_day=True ) study = StudyDefinition( population=patients.all(), BMI=patients.most_recent_bmi( on_or_after="1995-01-01", on_or_before="2005-01-01", **bmi_kwargs ), ) results = study.to_dicts() assert [x["BMI"] for x in results] == ["0.5"] assert [x.get("BMI_date_measured") for x in results] == [bmi_date]
def test_simple_bmi(include_dates): session = make_session() weight_code = "X76C7" height_code = "XM01E" patient = Patient(DateOfBirth="1950-01-01") patient.CodedEvents.append( CodedEvent(CTV3Code=weight_code, NumericValue=50, ConsultationDate="2002-06-01") ) patient.CodedEvents.append( CodedEvent(CTV3Code=height_code, NumericValue=10, ConsultationDate="2001-06-01") ) session.add(patient) session.commit() if include_dates == "none": bmi_date = None date_query = None elif include_dates == "year": bmi_date = "2002" date_query = patients.date_of("BMI") elif include_dates == "month": bmi_date = "2002-06" date_query = patients.date_of("BMI", date_format="YYYY-MM") elif include_dates == "day": bmi_date = "2002-06-01" date_query = patients.date_of("BMI", date_format="YYYY-MM-DD") study = StudyDefinition( population=patients.all(), BMI=patients.most_recent_bmi( on_or_after="1995-01-01", on_or_before="2005-01-01" ), **dict(BMI_date_measured=date_query) if date_query else {} ) results = study.to_dicts() assert [x["BMI"] for x in results] == ["0.5"] assert [x.get("BMI_date_measured") for x in results] == [bmi_date]