Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use same timeframes for similar measures definitions #111

Merged
merged 2 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions analysis/codelists.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@
# Community Pharmacy Pharmacy First Service
"pf_consultation_cp_service": pf_consultation_cp_service,
"pf_consultation_services_combined": pf_consultation_cp_minorillness
+ pf_consultation_service + pf_consultation_cp_service,
+ pf_consultation_service
+ pf_consultation_cp_service,
}

uti_code = ["1090711000000102"]
Expand All @@ -96,4 +97,4 @@
otitismedia_code = ["3110003"]
sorethroat_code = ["363746003"]
shingles_code = ["4740000"]
impetigo_code = ["48277006"]
impetigo_code = ["48277006"]
29 changes: 17 additions & 12 deletions analysis/config.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
# measures_definition_pf_breakdown.py (01/11/2023 - 31/12/2024)
# Measure: measures_definition_pf_breakdown.py
# Timeframe: 01/11/2023 - 31/01/2025
start_date_measure_pf_breakdown = "2023-11-01"
monthly_intervals_measure_pf_breakdown = 14
monthly_intervals_measure_pf_breakdown = 15

# measures_definition_pf_condition_provider.py (01/01/2023 - 31/12/2024)
# Measure: measures_definition_pf_condition_provider.py
# Timeframe: 01/01/2023 - 31/01/2025
start_date_measure_condition_provider = "2023-01-01"
monthly_intervals_measure_condition_provider = 24
monthly_intervals_measure_condition_provider = 25

# measures_definition_pf_descriptive_stats.py (01/02/2024 - 31/12/2024)
start_date_measure_descriptive_stats = "2024-02-01"
monthly_intervals_measure_descriptive_stats = 11
# Measure: measures_definition_pf_descriptive_stats.py
# Timeframe: 01/11/2023 - 31/01/2025
start_date_measure_descriptive_stats = "2023-11-01"
monthly_intervals_measure_descriptive_stats = 15

# measures_definition_pf_medications.py (01/11/2023 - 31/12/2024)
# Measure: measures_definition_pf_medications.py
# Timeframe: 01/11/2023 - 31/01/2025
start_date_measure_medications = "2023-11-01"
monthly_intervals_measure_medications = 14
monthly_intervals_measure_medications = 15

# measures_definition_pf_consultation_pf_counts.py (01/02/2024 - 31/12/2024)
start_date_measure_med_counts = "2024-02-01"
monthly_intervals_measure_med_counts = 11
# Measure: measures_definition_pf_consultation_pf_counts.py
# Timeframe: 01/11/2023 - 31/01/2025
start_date_measure_med_counts = "2023-11-01"
monthly_intervals_measure_med_counts = 15
49 changes: 37 additions & 12 deletions analysis/dataset_definition_table1.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
get_numerator,
get_latest_ethnicity,
get_age_band,
get_imd
get_imd,
)
from pf_variables_library import select_events
import codelists
Expand All @@ -27,15 +27,21 @@
dataset = create_dataset()

registration = practice_registrations.for_patient_on(index_date)
selected_events = clinical_events.where(clinical_events.date.is_on_or_before(index_date))
selected_events = clinical_events.where(
clinical_events.date.is_on_or_before(index_date)
)

# Columns for demographics table
dataset.sex = patients.sex
dataset.age_band = get_age_band(patients, index_date)
dataset.region = registration.practice_nuts1_region_name
dataset.imd = get_imd(addresses, index_date)
dataset.ethnicity = get_latest_ethnicity(
index_date, selected_events, codelists.ethnicity_group16_codelist, ethnicity_from_sus, grouping=16
index_date,
selected_events,
codelists.ethnicity_group16_codelist,
ethnicity_from_sus,
grouping=16,
)


Expand Down Expand Up @@ -65,17 +71,36 @@
index_date, selected_events, codelists.pregnancy_codelist
)

dataset.uti_numerator = get_numerator(selected_events, codelists.uti_code, dataset.uti_denominator)
dataset.sinusitis_numerator = get_numerator(selected_events, codelists.sinusitis_code, dataset.sinusitis_denominator)
dataset.insectbite_numerator = get_numerator(selected_events, codelists.insectbite_code, dataset.insectbite_denominator)
dataset.otitismedia_numerator = get_numerator(selected_events, codelists.otitismedia_code, dataset.otitismedia_denominator)
dataset.sorethroat_numerator = get_numerator(selected_events, codelists.sorethroat_code, dataset.sorethroat_denominator)
dataset.shingles_numerator = get_numerator(selected_events, codelists.shingles_code, dataset.shingles_denominator)
dataset.impetigo_numerator = get_numerator(selected_events, codelists.impetigo_code, dataset.impetigo_denominator)
dataset.uti_numerator = get_numerator(
selected_events, codelists.uti_code, dataset.uti_denominator
)
dataset.sinusitis_numerator = get_numerator(
selected_events, codelists.sinusitis_code, dataset.sinusitis_denominator
)
dataset.insectbite_numerator = get_numerator(
selected_events, codelists.insectbite_code, dataset.insectbite_denominator
)
dataset.otitismedia_numerator = get_numerator(
selected_events, codelists.otitismedia_code, dataset.otitismedia_denominator
)
dataset.sorethroat_numerator = get_numerator(
selected_events, codelists.sorethroat_code, dataset.sorethroat_denominator
)
dataset.shingles_numerator = get_numerator(
selected_events, codelists.shingles_code, dataset.shingles_denominator
)
dataset.impetigo_numerator = get_numerator(
selected_events, codelists.impetigo_code, dataset.impetigo_denominator
)

pf_consultation_events = select_events(selected_events, codelist=codelists.pf_consultation_events_dict["pf_consultation_services_combined"])
pf_consultation_events = select_events(
selected_events,
codelist=codelists.pf_consultation_events_dict["pf_consultation_services_combined"],
)
has_pf_consultation = pf_consultation_events.exists_for_patient()

dataset.define_population(
registration.exists_for_patient() & patients.sex.is_in(["male", "female"]) & has_pf_consultation
registration.exists_for_patient()
& patients.sex.is_in(["male", "female"])
& has_pf_consultation
)
29 changes: 21 additions & 8 deletions analysis/measures_definition_pf_breakdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@

from pf_dataset import get_latest_ethnicity
from codelists import pf_consultation_events_dict
from config import start_date_measure_pf_breakdown, monthly_intervals_measure_pf_breakdown
from config import (
start_date_measure_pf_breakdown,
monthly_intervals_measure_pf_breakdown,
)
from pf_variables_library import select_events

measures = create_measures()
Expand Down Expand Up @@ -59,12 +62,15 @@
otherwise="Missing",
)

pharmacy_first_ids = select_events(clinical_events, codelist=pf_consultation_events_dict["pf_consultation_services_combined"]).consultation_id
pharmacy_first_ids = select_events(
clinical_events,
codelist=pf_consultation_events_dict["pf_consultation_services_combined"],
).consultation_id

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

# Breakdown metrics to be produced as graphs
breakdown_metrics = {
Expand All @@ -75,11 +81,18 @@
"ethnicity": ethnicity_combined,
}

pf_consultation_events = select_events(selected_events, codelist=pf_consultation_events_dict["pf_consultation_services_combined"])
pf_consultation_events = select_events(
selected_events,
codelist=pf_consultation_events_dict["pf_consultation_services_combined"],
)
has_pf_consultation = pf_consultation_events.exists_for_patient()

# Define the denominator as the number of patients registered
denominator = registration.exists_for_patient() & patients.sex.is_in(["male", "female"]) & has_pf_consultation
denominator = (
registration.exists_for_patient()
& patients.sex.is_in(["male", "female"])
& has_pf_consultation
)

# Create measures for pharmacy first services
for pharmacy_first_event, codelist in pf_consultation_events_dict.items():
Expand Down Expand Up @@ -150,4 +163,4 @@
denominator=pf_condition_denominators[condition_name],
group_by={breakdown: variable},
intervals=months(monthly_intervals).starting_on(start_date),
)
)
25 changes: 16 additions & 9 deletions analysis/measures_definition_pf_condition_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
imd_quintile,
)
from codelists import pf_consultation_events_dict
from config import start_date_measure_condition_provider, monthly_intervals_measure_condition_provider
from config import (
start_date_measure_condition_provider,
monthly_intervals_measure_condition_provider,
)
from pf_variables_library import select_events

measures = create_measures()
Expand All @@ -20,10 +23,15 @@

registration = practice_registrations.for_patient_on(INTERVAL.end_date)

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

# Create variable which contains boolean values of whether pharmacy first event exists for patient
has_pharmacy_first = select_events(selected_events, codelist=pf_consultation_events_dict["pf_consultation_services_combined"]).exists_for_patient()
has_pharmacy_first = select_events(
selected_events,
codelist=pf_consultation_events_dict["pf_consultation_services_combined"],
).exists_for_patient()

for condition_name, condition_code in pharmacy_first_conditions_codes.items():
condition_events = selected_events.where(
Expand All @@ -32,16 +40,15 @@

# Define the numerator as the count of events for the condition
numerator = condition_events.count_for_patient()
denominator = registration.exists_for_patient() & patients.sex.is_in(["male", "female"])
denominator = registration.exists_for_patient() & patients.sex.is_in(
["male", "female"]
)

# Measures for overall clinical services graph
measures.define_measure(
name=f"count_{condition_name}_total",
numerator=numerator,
denominator=denominator,
group_by={
"pf_status": has_pharmacy_first,
"imd": imd_quintile
},
group_by={"pf_status": has_pharmacy_first, "imd": imd_quintile},
intervals=months(monthly_intervals).starting_on(start_date),
)
)
16 changes: 7 additions & 9 deletions analysis/measures_definition_pf_consultation_med_counts.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,19 @@

# Select Pharmacy First events during interval date range
pharmacy_first_events = select_events(
clinical_events,
start_date=INTERVAL.start_date,
end_date=INTERVAL.end_date).where(
clinical_events.snomedct_code.is_in(
pf_consultation_events_dict["pf_consultation_services_combined"]
)
clinical_events, start_date=INTERVAL.start_date, end_date=INTERVAL.end_date
).where(
clinical_events.snomedct_code.is_in(
pf_consultation_events_dict["pf_consultation_services_combined"]
)
)

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

# Select Pharmacy First consultations during interval date range
selected_medications = select_events(
medications,
start_date=INTERVAL.start_date, end_date=INTERVAL.end_date
medications, start_date=INTERVAL.start_date, end_date=INTERVAL.end_date
).where(medications.consultation_id.is_in(pharmacy_first_ids))

# First medication for each patient
Expand All @@ -62,7 +60,7 @@

measures.define_measure(
name="pf_medication_count",
numerator = first_selected_medication.is_not_null(),
numerator=first_selected_medication.is_not_null(),
denominator=denominator,
group_by={
"dmd_code": first_selected_medication,
Expand Down
24 changes: 12 additions & 12 deletions analysis/measures_definition_pf_medications.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,27 +20,29 @@
registration = practice_registrations.for_patient_on(INTERVAL.end_date)

# Select Pharmacy First consultations during interval date range
pharmacy_first_events = select_events(clinical_events, start_date=INTERVAL.start_date, end_date=INTERVAL.end_date).where(
clinical_events.snomedct_code.is_in(pf_consultation_events_dict["pf_consultation_services_combined"])
pharmacy_first_events = select_events(
clinical_events, start_date=INTERVAL.start_date, end_date=INTERVAL.end_date
).where(
clinical_events.snomedct_code.is_in(
pf_consultation_events_dict["pf_consultation_services_combined"]
)
)

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

# Select medications prescribed with PF consultation ID
selected_medications = select_events(medications, start_date=INTERVAL.start_date, end_date=INTERVAL.end_date).where(
medications.consultation_id.is_in(pharmacy_first_ids)
)
selected_medications = select_events(
medications, start_date=INTERVAL.start_date, end_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 = (
selected_medications.sort_by(medications.date).first_for_patient().dmd_code
)

# Check if a medication is from our PF codelists
has_pharmacy_first_medication = first_selected_medication.is_in(
pf_med_codelist
)
# Check if a medication is from our PF codelists
has_pharmacy_first_medication = first_selected_medication.is_in(pf_med_codelist)

# Numerator, patients with a PF medication
# This allows me to count all (first) medications linked to a PF consultation
Expand All @@ -58,8 +60,6 @@
name="pf_medication_count",
numerator=has_pharmacy_first_medication,
denominator=denominator,
group_by={
"dmd_code": first_selected_medication
},
group_by={"dmd_code": first_selected_medication},
intervals=months(monthly_intervals).starting_on(start_date),
)
Loading