Skip to content

Commit

Permalink
Add config file and add helper functions
Browse files Browse the repository at this point in the history
  • Loading branch information
viv3ckj committed Dec 9, 2024
1 parent 3e7056e commit 6fe82d2
Show file tree
Hide file tree
Showing 8 changed files with 104 additions and 64 deletions.
15 changes: 15 additions & 0 deletions analysis/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# measures_definition_pf_breakdown.py
start_date_measure1 = "2023-11-01"
monthly_intervals_measure1 = 12

# measures_definition_pf_condition_provider.py
start_date_measure2 = "2023-01-01"
monthly_intervals_measure2 = 22

# measures_definition_pf_descriptive_stats.py
start_date_measure3 = "2024-02-01"
monthly_intervals_measure3 = 9

# measures_definition_pf_medications.py
start_date_measure4 = "2023-11-01"
monthly_intervals_measure4 = 9
30 changes: 19 additions & 11 deletions analysis/measures_definition_pf_breakdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@

from pf_dataset import get_latest_ethnicity
from codelists import pharmacy_first_event_codes, pharmacy_first_consultation_codelist
from config import start_date_measure1, monthly_intervals_measure1
from pf_variables_library import get_events_between, get_events

measures = create_measures()
measures.configure_dummy_data(population_size=1000)

start_date = "2023-11-01"
monthly_intervals = 12
start_date = start_date_measure1
monthly_intervals = monthly_intervals_measure1

registration = practice_registrations.for_patient_on(INTERVAL.end_date)
ethnicity_combined = get_latest_ethnicity(
Expand Down Expand Up @@ -57,16 +59,22 @@
otherwise="Missing",
)

pharmacy_first_ids = clinical_events.where(
clinical_events.snomedct_code.is_in(
pharmacy_first_consultation_codelist
)
).consultation_id
# pharmacy_first_ids = clinical_events.where(
# clinical_events.snomedct_code.is_in(
# pharmacy_first_consultation_codelist
# )
# ).consultation_id

pharmacy_first_ids = get_events(clinical_events, pharmacy_first_consultation_codelist).consultation_id

# Select clinical events in interval date range
selected_events = clinical_events.where(
clinical_events.date.is_on_or_between(INTERVAL.start_date, INTERVAL.end_date)
).where(clinical_events.consultation_id.is_in(pharmacy_first_ids))
# # Select clinical events in interval date range
# selected_events = clinical_events.where(
# clinical_events.date.is_on_or_between(INTERVAL.start_date, INTERVAL.end_date)
# ).where(clinical_events.consultation_id.is_in(pharmacy_first_ids))

selected_events = get_events_between(clinical_events, INTERVAL.start_date, INTERVAL.end_date).where(
clinical_events.consultation_id.is_in(pharmacy_first_ids)
)

# Breakdown metrics to be produced as graphs
breakdown_metrics = {
Expand Down
26 changes: 16 additions & 10 deletions analysis/measures_definition_pf_condition_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,31 @@
imd_quintile,
)
from codelists import pharmacy_first_consultation_codelist
from config import start_date_measure2, monthly_intervals_measure2
from pf_variables_library import get_events_between, get_events

measures = create_measures()
measures.configure_dummy_data(population_size=1000)

start_date = "2023-01-01"
monthly_intervals = 22
start_date = start_date_measure2
monthly_intervals = monthly_intervals_measure2

registration = practice_registrations.for_patient_on(INTERVAL.end_date)

selected_events = clinical_events.where(
clinical_events.date.is_on_or_between(INTERVAL.start_date, INTERVAL. end_date)
)
# selected_events = clinical_events.where(
# clinical_events.date.is_on_or_between(INTERVAL.start_date, INTERVAL. end_date)
# )

selected_events = get_events_between(clinical_events, INTERVAL.start_date, INTERVAL.end_date)

# Create variable which contains boolean values of whether pharmacy first event exists for patient
has_pharmacy_first = selected_events.where(
selected_events.snomedct_code.is_in(
pharmacy_first_consultation_codelist
)
).exists_for_patient()
# has_pharmacy_first = selected_events.where(
# selected_events.snomedct_code.is_in(
# pharmacy_first_consultation_codelist
# )
# ).exists_for_patient()

has_pharmacy_first = get_events(selected_events, pharmacy_first_consultation_codelist).exists_for_patient()

for condition_name, condition_code in pharmacy_first_conditions_codes.items():
condition_events = selected_events.where(
Expand Down
27 changes: 16 additions & 11 deletions analysis/measures_definition_pf_descriptive_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,27 @@
from ehrql.tables.raw.tpp import medications
from ehrql.tables.tpp import practice_registrations, patients, clinical_events

from pf_variables_library import get_consultation_ids, get_consultationid_events
from pf_variables_library import get_events, get_consultationid_events
from codelists import (
pharmacy_first_med_codelist,
pharmacy_first_consultation_codelist,
pharmacy_first_conditions_codelist,
)
from config import start_date_measure3, monthly_intervals_measure3

measures = create_measures()
measures.configure_dummy_data(population_size=1000)
measures.configure_disclosure_control(enabled=True)

start_date = "2024-02-01"
monthly_intervals = 9
start_date = start_date_measure3
monthly_intervals = monthly_intervals_measure3

registration = practice_registrations.for_patient_on(INTERVAL.end_date)

# Function to retrieve consultation ids from clinical events that are PF consultations
pharmacy_first_ids = get_consultation_ids(
pharmacy_first_ids = get_events(
clinical_events, pharmacy_first_consultation_codelist
)
).consultation_id

# Function to retrieve selected events using pharmacy first ids
selected_clinical_events = get_consultationid_events(
Expand All @@ -33,14 +34,18 @@
)

# Create variable which contains boolean values of whether pharmacy first event exists for patient
has_pf_consultation = selected_clinical_events.where(
selected_clinical_events.snomedct_code.is_in(pharmacy_first_consultation_codelist)
).exists_for_patient()
# has_pf_consultation = selected_clinical_events.where(
# selected_clinical_events.snomedct_code.is_in(pharmacy_first_consultation_codelist)
# ).exists_for_patient()

has_pf_consultation = get_events(selected_clinical_events, pharmacy_first_consultation_codelist).exists_for_patient()

# PF consultations with PF clinical condition
has_pf_condition = selected_clinical_events.where(
selected_clinical_events.snomedct_code.is_in(pharmacy_first_conditions_codelist)
).exists_for_patient()
# has_pf_condition = selected_clinical_events.where(
# selected_clinical_events.snomedct_code.is_in(pharmacy_first_conditions_codelist)
# ).exists_for_patient()

has_pf_condition = get_events(selected_clinical_events, pharmacy_first_conditions_codelist).exists_for_patient()

# PF consultations with prescribed PF medication
has_pf_medication = selected_med_events.where(
Expand Down
34 changes: 22 additions & 12 deletions analysis/measures_definition_pf_medications.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,44 @@
practice_registrations,
)
from ehrql.tables.raw.tpp import medications
from codelists import *
from codelists import pharmacy_first_consultation_codelist, pharmacy_first_med_codelist
from config import start_date_measure4, monthly_intervals_measure4
from pf_variables_library import get_events_between

measures = create_measures()
measures.configure_dummy_data(population_size=1000)
# Turn off during code development, but turn on before running against on the server
measures.configure_disclosure_control(enabled=True)

start_date = "2023-11-01"
monthly_intervals = 9
start_date = start_date_measure4
monthly_intervals = monthly_intervals_measure4

registration = practice_registrations.for_patient_on(INTERVAL.end_date)

# Select Pharmacy First consultations during interval date range
pharmacy_first_events = clinical_events.where(
clinical_events.date.is_on_or_between(INTERVAL.start_date, INTERVAL.end_date)
).where(
clinical_events.snomedct_code.is_in(
pharmacy_first_consultation_codelist
)
# pharmacy_first_events = clinical_events.where(
# clinical_events.date.is_on_or_between(INTERVAL.start_date, INTERVAL.end_date)
# ).where(
# clinical_events.snomedct_code.is_in(
# pharmacy_first_consultation_codelist
# )
# )

pharmacy_first_events = get_events_between(clinical_events, INTERVAL.start_date, INTERVAL.end_date).where(
clinical_events.snomedct_code.is_in(pharmacy_first_consultation_codelist)
)

pharmacy_first_ids = pharmacy_first_events.consultation_id
has_pharmacy_first_consultation = pharmacy_first_events.exists_for_patient()

# Select medications prescribed with PF consultation ID
selected_medications = medications.where(
medications.date.is_on_or_between(INTERVAL.start_date, INTERVAL.end_date)
).where(medications.consultation_id.is_in(pharmacy_first_ids))
# selected_medications = medications.where(
# medications.date.is_on_or_between(INTERVAL.start_date, INTERVAL.end_date)
# ).where(medications.consultation_id.is_in(pharmacy_first_ids))

selected_medications = get_events_between(medications, INTERVAL.start_date, INTERVAL.end_date).where(
medications.consultation_id.is_in(pharmacy_first_ids)
)

# Select first medication for group_by argument in measures
first_selected_medication = (
Expand Down
10 changes: 0 additions & 10 deletions analysis/pf_codelist_functions.py

This file was deleted.

3 changes: 3 additions & 0 deletions analysis/pf_dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

from pf_variables_library import check_pregnancy_status, count_past_events

# This file contains functions for the denominators of the patient population for each clinical condition.
# It will be used to calculate rates, and is separate from pf_variables_library

# Create denominator variables for each clinical condition
# These are based on NHS England rules using sex, age, pregnancy status and repeated diagnoses
# NOTE: The following exclusions have not been added:
Expand Down
23 changes: 13 additions & 10 deletions analysis/pf_variables_library.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# Function to check status of a condition within a specified time window
from ehrql import months


def check_pregnancy_status(index_date, selected_events, codelist):
return (
selected_events.where(selected_events.snomedct_code.is_in(codelist))
Expand All @@ -11,7 +10,6 @@ def check_pregnancy_status(index_date, selected_events, codelist):
.exists_for_patient()
)


# Function to count number of coded events within a specified time window
def count_past_events(index_date, selected_events, codelist, num_months):
return (
Expand All @@ -24,19 +22,24 @@ def count_past_events(index_date, selected_events, codelist, num_months):
.count_for_patient()
)

# Function to get events linked to a specified codelist
def get_events(event_frame, codelist):
selected_events = event_frame.where(
event_frame.snomedct_code.is_in(codelist)
)

# Function to get consultation IDs linked to a specified codelist
def get_consultation_ids(clinical_events, codelist):
consultation_ids = clinical_events.where(
clinical_events.snomedct_code.is_in(codelist)
).consultation_id

return consultation_ids

return selected_events

# Function to get events with specific consultation IDs
def get_consultationid_events(event_frame, consultation_ids):
selected_events = event_frame.where(
event_frame.consultation_id.is_in(consultation_ids)
)
return selected_events

# Function to get events within a time frame
def get_events_between(event_frame, start_date, end_date):
selected_events = event_frame.where(
event_frame.date.is_on_or_between(start_date, end_date)
)
return selected_events

0 comments on commit 6fe82d2

Please sign in to comment.