Source code for pythermalcomfort.models.discomfort_index

from __future__ import annotations

import numpy as np

from pythermalcomfort.classes_input import DIInputs
from pythermalcomfort.classes_return import DI
from pythermalcomfort.shared_functions import mapping


[docs] def discomfort_index( tdb: float | list[float], rh: float | list[float], ) -> DI: """Calculate the Discomfort Index (DI). The index is essentially an effective temperature based on air temperature and humidity. The discomfort index is usually divided into 6 discomfort categories and it only applies to warm environments: [Polydoros2015]_ * class 1 - DI < 21 °C - No discomfort * class 2 - 21 <= DI < 24 °C - Less than 50% feels discomfort * class 3 - 24 <= DI < 27 °C - More than 50% feels discomfort * class 4 - 27 <= DI < 29 °C - Most of the population feels discomfort * class 5 - 29 <= DI < 32 °C - Everyone feels severe stress * class 6 - DI >= 32 °C - State of medical emergency Parameters ---------- tdb : float or list of floats Dry bulb air temperature, [°C]. rh : float or list of floats Relative humidity, [%]. Returns ------- DI A dataclass containing the Discomfort Index and its classification. See :py:class:`~pythermalcomfort.classes_return.DI` for more details. To access the `di` and `discomfort_condition` values, use the respective attributes of the returned `DI` instance, e.g., `result.di`. Examples -------- .. code-block:: python from pythermalcomfort.models import discomfort_index result = discomfort_index(tdb=25, rh=50) print(result.di) # 22.1 print(result.discomfort_condition) # Less than 50% feels discomfort result = discomfort_index(tdb=[25, 30], rh=[50, 60]) print(result.di) # [22.1, 27.3] print( result.discomfort_condition ) # ['Less than 50% feels discomfort', 'Most of the population feels discomfort'] """ # Validate inputs using the DiscomfortIndexInputs class DIInputs( tdb=tdb, rh=rh, ) tdb = np.asarray(tdb) rh = np.asarray(rh) di = tdb - 0.55 * (1 - 0.01 * rh) * (tdb - 14.5) di_categories = { 21: "No discomfort", 24: "Less than 50% feels discomfort", 27: "More than 50% feels discomfort", 29: "Most of the population feels discomfort", 32: "Everyone feels severe stress", 99: "State of medical emergency", } return DI( di=np.around(di, 1), discomfort_condition=mapping(di, di_categories, right=False), )