Source code for nh_observations.frequencies

# -*- coding: utf-8 -*-
"""A single place for different frequency values to be read from."""
import copy

# TODO EOBS-840: Make frequencies.py a model and split it across modules as
# appropriate.
# Frequencies in minutes.
FIFTEEN_MINUTES = 15
THIRTY_MINUTES = 30
ONE_HOUR = 60
TWO_HOURS = 120
FOUR_HOURS = 240
SIX_HOURS = 360
EIGHT_HOURS = 480
TEN_HOURS = 600
TWELVE_HOURS = 720
ONE_DAY = 1440
THREE_DAYS = 4320
ONE_WEEK = 10080

# Tuples with the time and a label.
EVERY_15_MINUTES = (FIFTEEN_MINUTES, 'Every 15 Minutes')
EVERY_30_MINUTES = (THIRTY_MINUTES, 'Every 30 Minutes')
EVERY_HOUR = (ONE_HOUR, 'Every Hour')
EVERY_2_HOURS = (TWO_HOURS, 'Every 2 Hours')
EVERY_4_HOURS = (FOUR_HOURS, 'Every 4 Hours')
EVERY_6_HOURS = (SIX_HOURS, 'Every 6 Hours')
EVERY_8_HOURS = (EIGHT_HOURS, 'Every 8 Hours')
EVERY_10_HOURS = (TEN_HOURS, 'Every 10 Hours')
EVERY_12_HOURS = (TWELVE_HOURS, 'Every 12 Hours')
EVERY_DAY = (ONE_DAY, 'Every Day')
EVERY_3_DAYS = (THREE_DAYS, 'Every 3 Days')
EVERY_WEEK = (ONE_WEEK, 'Every Week')

# Dictionary to lookup tuples by frequency in minutes.
ALL_FREQUENCIES = {
    FIFTEEN_MINUTES: EVERY_15_MINUTES,
    THIRTY_MINUTES: EVERY_30_MINUTES,
    ONE_HOUR: EVERY_HOUR,
    TWO_HOURS: EVERY_2_HOURS,
    FOUR_HOURS: EVERY_4_HOURS,
    SIX_HOURS: EVERY_6_HOURS,
    EIGHT_HOURS: EVERY_8_HOURS,
    TEN_HOURS: EVERY_10_HOURS,
    TWELVE_HOURS: EVERY_12_HOURS,
    ONE_DAY: EVERY_DAY,
    THREE_DAYS: EVERY_3_DAYS,
    ONE_WEEK: EVERY_WEEK
}

# Frequency tuples organised by risk and frequency in minutes.
FREQUENCIES_BY_RISK = {
    'None': {
        EVERY_12_HOURS[0]: EVERY_12_HOURS,
        EVERY_DAY[0]: EVERY_DAY,
        EVERY_3_DAYS[0]: EVERY_3_DAYS,
        EVERY_WEEK[0]: EVERY_WEEK
    },
    'Low': {
        EVERY_15_MINUTES[0]: EVERY_15_MINUTES,
        EVERY_30_MINUTES[0]: EVERY_30_MINUTES,
        EVERY_HOUR[0]: EVERY_HOUR,
        EVERY_2_HOURS[0]: EVERY_2_HOURS,
        EVERY_4_HOURS[0]: EVERY_4_HOURS,
        EVERY_6_HOURS[0]: EVERY_6_HOURS,
        EVERY_8_HOURS[0]: EVERY_8_HOURS,
        EVERY_12_HOURS[0]: EVERY_12_HOURS,
        EVERY_DAY[0]: EVERY_DAY,
        EVERY_3_DAYS[0]: EVERY_3_DAYS,
        EVERY_WEEK[0]: EVERY_WEEK
    },
    'Medium': {
        EVERY_HOUR[0]: EVERY_HOUR
    },
    'High': {
        EVERY_30_MINUTES[0]: EVERY_30_MINUTES
    },
    'Unknown': EVERY_4_HOURS,
    'Transfer': EVERY_15_MINUTES,
    'Obs Restart': EVERY_HOUR
}

# To summarise the mappings below, frequencies after refusals are capped at
# 24 hours.
#
# Could have just made a simple function but decided to write them out long
# hand as they may change in the future. Return the tuple with the label rather
# than just the time so it can be useful in more scenarios.
PATIENT_REFUSAL_ADJUSTMENTS = copy.deepcopy(FREQUENCIES_BY_RISK)
PATIENT_REFUSAL_ADJUSTMENTS['None'][EVERY_3_DAYS[0]] = EVERY_DAY
PATIENT_REFUSAL_ADJUSTMENTS['None'][EVERY_WEEK[0]] = EVERY_DAY
PATIENT_REFUSAL_ADJUSTMENTS['Low'][EVERY_3_DAYS[0]] = EVERY_DAY
PATIENT_REFUSAL_ADJUSTMENTS['Low'][EVERY_WEEK[0]] = EVERY_DAY


[docs]def as_list(max=None): """ Returns frequency tuples in a list. Passing the max keyword argument will only return frequencies up to and including that frequency (in ascending order). :param max: :type max: int :return: """ frequency_tuples = sorted(ALL_FREQUENCIES.values()) if max: frequency_minutes = sorted(ALL_FREQUENCIES.keys()) index = frequency_minutes.index(max) + 1 frequency_tuples = frequency_tuples[:index] return frequency_tuples
[docs]def minutes_only(): return [minutes for minutes, _ in as_list()]
[docs]def get_label_for_minutes(minutes): label = '' for frequency in as_list(): if frequency[0] == minutes: label = frequency[1] return label