epydemix.model package
Submodules
epydemix.model.epimodel module
- class epydemix.model.epimodel.EpiModel(name: str = 'EpiModel', compartments: List | None = None, parameters: Dict | None = None, population_name: str = 'epydemix_population', population_data_path: str | None = None, contact_layers: List | None = None, contacts_source: str | None = None, age_group_mapping: Dict | None = None, supported_contacts_sources: Dict | None = None, use_default_population: bool = True, default_population_size: int = 100000, data_version: str = 'v1.2.0', attribute: str = 'age')[source]
Bases:
objectEpiModel: A compartmental epidemic model simulator
Example
>>> model = EpiModel(compartments=["S", "I", "R"], parameters={"beta": 0.3, "gamma": 0.1}) >>> model.add_transition(source="S", target="I", params=("beta", "I")) >>> model.add_transition(source="I", target="R", params="gamma") >>> results = model.run_simulations( ... start_date="2020-01-01", ... end_date="2020-12-31", ... Nsim=100 ... )
- add_compartments(compartments: List | object) None[source]
Adds compartments to the epidemic model.
- Parameters:
compartments (list or object) – A list of compartments or a single compartment to be added.
- Raises:
ValueError – If a compartment is already in the model or is repeated in the input.
- Returns:
None
- add_intervention(layer_name: str, start_date: str | Timestamp, end_date: str | Timestamp, reduction_factor: float | None = None, new_matrix: ndarray | None = None, name: str = '') None[source]
Adds an intervention to the epidemic model.
- Parameters:
layer_name (str) – The name of the layer to which the intervention applies.
start_date (str or datetime) – The start date of the intervention.
end_date (str or datetime) – The end date of the intervention.
reduction_factor (float, optional) – The factor by which to reduce the contact matrix. Default is None.
new_matrix (np.ndarray, optional) – A new contact matrix to use during the intervention. Default is None.
name (str, optional) – The name of the intervention. Default is an empty string.
- Raises:
ValueError – If neither reduction_factor nor new_matrix is provided.
- Returns:
None
- add_parameter(parameter_name: str | None = None, value: Any = None, parameters_dict: Dict | None = None) None[source]
Adds new parameters to the model.
- Parameters:
parameter_name (str, optional) – The name of the parameter to add. Ignored if parameters_dict is provided.
value (any, optional) – The value of the parameter to add. Ignored if parameters_dict is provided.
parameters_dict (dict, optional) – A dictionary of parameter names and values. If provided, parameter_name and value are ignored and the parameters are updated using this dictionary.
- Raises:
ValueError – If neither parameter_name/value nor parameters_dict is provided.
- Returns:
None
- add_transition(source: str, target: str, kind: str, params: Any) None[source]
Adds a transition to the epidemic model.
- Parameters:
source (str) – The source compartment of the transition.
target (str) – The target compartment of the transition.
kind (str) – The kind of transition (e.g., spontaneous or mediated). Custom kinds must be registered with register_transition_kind before being used here.
params (Any) – The parameters involved in the transition.
- Raises:
ValueError – If the source or target is not in the compartments list, or if the kind is not a registered transition kind.
- Returns:
None
- apply_intervention(intervention: Dict, simulation_dates: List[Timestamp]) None[source]
Applies an intervention to the contact matrices for specified simulation dates.
- Parameters:
intervention (dict) – A dictionary containing intervention details with the following keys: - “layer” (str): The name of the layer to which the intervention applies. - “start_date” (pd.Timestamp): The start date of the intervention. - “end_date” (pd.Timestamp): The end date of the intervention. - “reduction_factor” (float, optional): The factor by which to reduce the contact matrix. - “new_matrix” (np.ndarray, optional): A new contact matrix to use during the intervention.
simulation_dates (list of pd.Timestamp) – A list of dates for which the simulation is run.
- Raises:
ValueError – If neither reduction_factor nor new_matrix is provided in the intervention.
- Returns:
None
- clear_compartments() None[source]
This method resets the compartments list and clears the compartments_idx dictionary. Transitions are cleared as well, since they refer to compartments that no longer exist.
- Returns:
None
- clear_interventions() None[source]
Clears all interventions from the model.
This method resets the interventions list, removing all existing interventions.
- Returns:
None
- clear_parameters() None[source]
Clears all parameters from the model’s parameters dictionary.
- Returns:
None
- clear_transitions() None[source]
Clears all transitions from the model.
This method resets the transitions_list and transitions_idx and reinitializes the transitions dictionary, clearing all existing transitions while keeping the structure intact for each compartment.
- Returns:
None
- compute_contact_reductions(simulation_dates: List[Timestamp]) None[source]
Computes the contact reductions for a population over the given simulation dates.
This function applies interventions to the contact matrices and computes the overall contact matrix for each date in the simulation period.
- Parameters:
simulation_dates (list of pd.Timestamp) – A list of dates over which the simulation is run.
- Returns:
- The function updates the instance variable self.Cs with the contact matrices for each date,
including the overall contact matrix after applying interventions.
- Return type:
None
- create_default_initial_conditions(percentage_in_agents: float = 0.0005) Dict[str, ndarray][source]
Creates default initial conditions for the epidemic model. If initial conditions are not provided, assigns a percentage of the population to agent compartments and the rest to source compartments, considering different age groups.
- Parameters:
percentage_in_agents (float) – Percentage of population to place in agent compartments. Defaults to 0.05%.
initial_conditions (dict, optional) – A dictionary specifying initial conditions. If None, this function creates default conditions.
- Returns:
A dictionary with initial conditions for each compartment, with values as arrays representing different age groups.
- Return type:
dict
- Raises:
ValueError – If the model has no mediated transitions, since the defaults are inferred from them.
- delete_override(parameter_name: str) None[source]
Deletes overrides for a specific parameter.
- Parameters:
parameter_name (str) – The name of the parameter whose overrides are to be deleted.
- Returns:
None
- delete_parameter(parameter_name: str) Any[source]
Deletes a parameter from the dictionary of the model’s parameters.
- Parameters:
parameter_name (str) – The name of the parameter to delete.
- Returns:
The value of the deleted parameter.
- Return type:
any
- Raises:
KeyError – If the parameter with the given name is not found.
- get_parameter(parameter_name: str) Any[source]
Retrieves the value of a specified parameter.
- Parameters:
parameter_name (str) – The name of the parameter to retrieve.
- Returns:
The value of the specified parameter.
- Return type:
any
- Raises:
KeyError – If the parameter with the given name is not found.
- import_epydemix_population(population_name: str, population_data_path: str | None = None, contact_layers: List | None = None, contacts_source: str | None = None, age_group_mapping: Dict | None = None, supported_contacts_sources: Dict | None = None, data_version: str = 'v1.2.0', attribute: str = 'age') None[source]
Sets or updates the population for the model.
- Parameters:
population_name (str) – The name of the population to set.
population_data_path (str or None, optional) – The path to the population data file. If None, data may be fetched online.
contact_layers (list or None, optional) – A list of contact layers to load for the population. Defaults to [“school”, “work”, “home”, “community”] if None.
contacts_source (str or None, optional) – The source of contact data. If None, the function will attempt to determine the source automatically.
age_group_mapping (dict or None, optional) – A mapping for age groups. If None, a default mapping is used.
supported_contacts_sources (list or None, optional) – A list of supported contact data sources (e.g., “prem_2017”, “prem_2021”). Defaults to [“prem_2017”, “prem_2021”, “mistry_2021”, “litvinova_2025”] for age, [“litvinova_2025”] for sex and race_ethnicity if None.
data_version (str, optional) – The git tag/version of the epydemix-data repository. Defaults to “v1.2.0”.
attribute (str, optional) – The demographic attribute layer. Defaults to “age”.
- Returns:
None
- property n_compartments: int
Get total number of compartments.
- property n_transitions: int
Get total number of transitions.
- override_parameter(start_date: str, end_date: str, parameter_name: str, value: Any) None[source]
Adds an override for a parameter with the specified name.
- Parameters:
start_date (str) – The start date for the override period.
end_date (str) – The end date for the override period.
parameter_name (str) – The name of the parameter to override.
value (any) – The value to override the parameter with.
- Returns:
None
- register_transition_kind(kind: str, function: Callable)[source]
Registers a new transition kind providing a function to compute the rate of the transition.
- Parameters:
kind (str) – The kind of transition (e.g., spontaneous or mediated).
function (Callable) – The function to register.
- Returns:
None
- remove_compartment(compartment: str) List[Transition][source]
Removes a compartment from the model, together with every transition that involves it: transitions leaving it, entering it, and mediated transitions in which it is the agent.
Transitions of custom kinds that refer to the compartment only through their params cannot be detected and must be removed with remove_transition.
- Parameters:
compartment (str) – The compartment to remove.
- Raises:
ValueError – If the compartment is not in the model.
- Returns:
The transitions removed along with the compartment.
- Return type:
List[Transition]
- remove_transition(source: str, target: str, kind: str | None = None, agent: str | None = None) List[Transition][source]
Removes the transitions going from source to target.
A model can have several transitions between the same two compartments (e.g. infection mediated by two different infectious compartments). By default all of them are removed; use kind and/or agent to remove only some.
- Parameters:
source (str) – The source compartment of the transitions.
target (str) – The target compartment of the transitions.
kind (str, optional) – Only remove transitions of this kind (e.g. “mediated”).
agent (str, optional) – Only remove mediated transitions whose agent (the compartment mediating the transition, e.g. “I” in params=(“beta”, “I”)) is this compartment.
- Raises:
ValueError – If no transition matches.
- Returns:
The removed transitions.
- Return type:
List[Transition]
- run_simulations(start_date: str | Timestamp = '2020-01-01', end_date: str | Timestamp = '2020-12-31', initial_conditions_dict: Dict[str, ndarray] | None = None, Nsim: int = 100, percentage_in_agents: float = 0.0005, dt: float | None = 1.0, resample_frequency: str | None = 'D', resample_aggregation_compartments: str | dict | None = 'last', resample_aggregation_transitions: str | dict | None = 'sum', fill_method: str | None = 'ffill', apply_linear_approximation: bool = False, rng: int | Generator | None = None) SimulationResults[source]
Simulates the epidemic model multiple times over the given time period.
- Parameters:
start_date (str or pd.Timestamp) – The start date of the simulation. Default is “2020-01-01”.
end_date (str or pd.Timestamp) – The end date of the simulation. Default is “2020-12-31”.
initial_conditions_dict (dict, optional) – A dictionary of initial conditions for the simulation.
Nsim (int, optional) – The number of simulation runs to perform (default is 100).
percentage_in_agents (float, optional) – The percentage of the population to initialize in the agents compartment.
dt (float, optional) – The time step for the simulation, expressed in days. Default is 1 (day).
resample_frequency (str, optional) – The frequency at which to resample the simulation results. Default is “D” (daily).
resample_aggregation_compartments (str, optional) – The aggregation method to use when resampling the compartments. Default is “last”.
resample_aggregation_transitions (str, optional) – The aggregation method to use when resampling the transitions. Default is “sum”.
fill_method (str, optional) – Method to fill NaN values after resampling. Default is “ffill”.
apply_linear_approximation (bool, optional) – Whether to use linear approximation to the probabilities. Default is False.
rng (int or np.random.Generator, optional) – Seed or random number generator. Default is None.
- Returns:
An object containing all simulation trajectories.
- Return type:
- Raises:
RuntimeError – If the simulation fails.
- set_population(population: Population) None[source]
Sets the population for the epidemic model.
- Parameters:
population (Population) – The population object to set.
- Returns:
None
- epydemix.model.epimodel.compute_mediated_transition_rate(params, data)[source]
Compute the rate of a mediated transition.
- Parameters:
params – The parameters of the transition provided by the user.
data – A dictionary containing the data needed for the transition. - parameters: The model parameters - t: The current time step - comp_indices: The indices of the compartments - contact_matrix: The contact matrix - pop: The population in different compartments - pop_sizes: The population sizes
- epydemix.model.epimodel.compute_spontaneous_transition_rate(params, data)[source]
Compute the rate of a spontaneous transition.
- Parameters:
params – The parameters of the transition provided by the user.
data – A dictionary containing the data needed for the transition. - parameters: The model parameters - t: The current time step
- Returns:
The rate of the transition
- epydemix.model.epimodel.evaluate_rate_expression(expr: str, data: Dict) ndarray[source]
Evaluate a rate written as an expression of the model parameters (e.g. “beta * (1 - eff)”).
The parameters are fixed for the whole simulation, so the result (one row per time step) does not depend on the current step. When data has an “expression_cache” dictionary, as set up by stochastic_simulation, each expression is evaluated once per simulation and reused at every step. Without it, the expression is evaluated at every call.
- Parameters:
expr – The expression to evaluate.
data – A dictionary containing the data needed for the transition. - parameters: The model parameters - expression_cache (optional): Expressions already evaluated in this simulation
- Returns:
The evaluated expression for all time steps
- epydemix.model.epimodel.simulate(epimodel, start_date: str | Timestamp = '2020-01-01', end_date: str | Timestamp = '2020-12-31', initial_conditions_dict: Dict[str, ndarray] | None = None, percentage_in_agents: float = 0.0005, dt: float | None = 1.0, resample_frequency: str | None = 'D', resample_aggregation_compartments: str | dict | None = 'last', resample_aggregation_transitions: str | dict | None = 'sum', fill_method: str | None = 'ffill', apply_linear_approximation: bool = False, rng: int | Generator | None = None, contact_matrices: List[Dict[str, ndarray]] | None = None, simulation_dates: List[Timestamp] | None = None, **kwargs) Trajectory[source]
Runs a simulation of the epidemic model over the specified simulation dates.
- Parameters:
epimodel (EpiModel) – The epidemic model instance to simulate.
start_date (str or pd.Timestamp) – The start date of the simulation. Default is “2020-01-01”.
end_date (str or pd.Timestamp) – The end date of the simulation. Default is “2020-12-31”.
initial_conditions_dict (dict, optional) – A dictionary of initial conditions for the simulation.
percentage_in_agents (float, optional) – The percentage of the population to initialize in the agents compartment.
dt (float, optional) – The time step for the simulation, expressed in days. Default is 1 (day).
resample_frequency (str, optional) – The frequency at which to resample the simulation results. Default is “D” (daily).
resample_aggregation_compartments (str, optional) – The aggregation method to use when resampling the compartments. Default is “last”.
resample_aggregation_transitions (str, optional) – The aggregation method to use when resampling the transitions. Default is “sum”.
fill_method (str, optional) – The method to use when filling NaN values after resampling. Default is “ffill”.
apply_linear_approximation (bool, optional) – Whether to use linear approximation to the probabilities. Default is False.
rng (int or np.random.Generator, optional) – Seed or random number generator. Default is None.
contact_matrices (list, optional) – A list of contact matrices for the simulation. Default is None.
simulation_dates (list, optional) – A list of simulation dates. Default is None.
**kwargs – Additional parameters to overwrite model parameters during the simulation.
- Returns:
The trajectory of the simulation
- Return type:
- Raises:
ValueError – If the model has no transitions defined.
- epydemix.model.epimodel.stochastic_simulation(T: int, contact_matrices: List[Dict[str, ndarray]], epimodel, parameters: Dict, initial_conditions: ndarray, dt: float, apply_linear_approximation: bool = False, rng: int | Generator | None = None) ndarray[source]
Run a stochastic simulation of the epidemic model.
- Parameters:
T – Number of time steps
contact_matrices – Pre-computed list of contact matrices dictionaries (key is the layer, value is the contact matrix)
epimodel – The epidemic model
parameters – Model parameters
initial_conditions – Initial population distribution
dt – Time step size
apply_linear_approximation (bool, optional) – Whether to use linear approximation to the probabilities. Default is False.
rng (int or np.random.Generator, optional) – Seed or random number generator. Default is None.
- epydemix.model.epimodel.validate_transition_function(func: Callable) None[source]
Validates that a transition rate function has the correct signature and parameters.
- Parameters:
func – The transition rate function to validate
- Raises:
ValueError – If the function signature doesn’t match requirements
epydemix.model.predefined_models module
- epydemix.model.predefined_models.add_outcome(model: EpiModel, outcome: str, mortality_rate: float, hospitalization_rate: float, hospitalization_recovery_rate: float) EpiModel[source]
Add an outcome compartment (Dead or Hospitalized) branching from the Infected compartment.
mortality_rate / hospitalization_rate are the fraction of the Infected outflow that goes to Dead / Hospitalized; the existing Infected outflow (e.g. Infected -> Recovered) is rescaled by (1 - rate) accordingly.
- epydemix.model.predefined_models.add_vaccination(model: EpiModel, vaccination_rate: float, vaccine_efficacy: float) EpiModel[source]
Add a vaccination compartment (Susceptible → Vaccinated → Infected/Exposed at reduced rate).
- epydemix.model.predefined_models.add_waning_immunity(model: EpiModel, waning_rate: float) EpiModel[source]
Add waning immunity (Recovered → Susceptible) to an existing model.
- epydemix.model.predefined_models.create_seiar(transmission_rate: float, incubation_rate: float, recovery_rate: float, asymptomatic_fraction: float, asymptomatic_recovery_rate: float, asymptomatic_relative_infectivity: float) EpiModel[source]
Create a SEIAR model with symptomatic and asymptomatic infectious compartments.
- epydemix.model.predefined_models.create_seir(transmission_rate: float, incubation_rate: float, recovery_rate: float) EpiModel[source]
Create a SEIR model with the given transmission rate, incubation rate, and recovery rate.
- epydemix.model.predefined_models.create_sir(transmission_rate: float, recovery_rate: float) EpiModel[source]
Create a SIR model with the given transmission rate and recovery rate.
- epydemix.model.predefined_models.create_sis(transmission_rate: float, recovery_rate: float) EpiModel[source]
Create a SIS model with the given transmission rate and recovery rate.
- epydemix.model.predefined_models.load_predefined_model(model_name: str, transmission_rate: float = 0.3, recovery_rate: float = 0.1, incubation_rate: float = 0.2, asymptomatic_fraction: float = 0.4, asymptomatic_recovery_rate: float = 0.14, asymptomatic_relative_infectivity: float = 0.5, waning_immunity: bool = False, waning_rate: float = 0.0027397260273972603, vaccination: bool = False, vaccination_rate: float = 0.01, vaccine_efficacy: float = 0.9, outcome: str = None, mortality_rate: float = 0.01, hospitalization_rate: float = 0.01, hospitalization_recovery_rate: float = 0.1) EpiModel[source]
Load a predefined epidemic model with optional modular extensions.
- Parameters:
model_name (str) – Backbone model. One of “SIR”, “SEIR”, “SIS”, “SEIAR”.
transmission_rate (float) – Rate of transmission. Default 0.3.
recovery_rate (float) – Rate of recovery from Infected. Default 0.1.
incubation_rate (float) – Rate of progression from Exposed to Infected (SEIR, SEIAR). Default 0.2.
asymptomatic_fraction (float) – Fraction of exposed who become asymptomatic (SEIAR only). Default 0.4.
asymptomatic_recovery_rate (float) – Recovery rate for asymptomatic individuals (SEIAR only). Default 0.14.
asymptomatic_relative_infectivity (float) – Infectivity of asymptomatics relative to symptomatics (SEIAR only). Default 0.5.
waning_immunity (bool) – Add waning immunity (R → S). Not compatible with SIS. Default False.
waning_rate (float) – Rate of immunity waning. Default 1/365 (~1 year). Interpreted as the inverse of the average immunity duration in days.
vaccination (bool) – Add vaccination compartment (S → Vaccinated → Infected/Exposed at reduced rate; breakthrough infections go to Exposed if the backbone has an Exposed compartment, otherwise Infected). Default False.
vaccination_rate (float) – Rate of vaccination from Susceptible. Default 0.01.
vaccine_efficacy (float) – Fraction by which vaccine reduces transmission. Default 0.9.
outcome (str or None) – Track a disease outcome. One of None, “deaths”, “hospitalization”. Default None.
mortality_rate (float) – Fraction of the Infected outflow that goes to Dead, rescaling the existing Infected outflow (e.g. recovery_rate) by (1 - mortality_rate). Used when outcome=”deaths”. Default 0.01.
hospitalization_rate (float) – Fraction of the Infected outflow that goes to Hospitalized, rescaling recovery_rate by (1 - hospitalization_rate). Used when outcome=”hospitalization”. Default 0.01.
hospitalization_recovery_rate (float) – Rate of recovery from Hospitalized. Used when outcome=”hospitalization”. Default 0.1.
All rate parameters accept scalars, 1D arrays of shape (T,) for time-varying values, or 2D arrays of shape (T, G) for age-stratified values, consistent with the rest of the epydemix parameter system.
- Returns:
Configured epidemic model.
- Return type:
- Raises:
ValueError – If model_name is not recognised, or a module is incompatible with the chosen backbone.
Examples
SIRS: load_predefined_model(“SIR”, waning_immunity=True) SEIRS: load_predefined_model(“SEIR”, waning_immunity=True) SEIR-V: load_predefined_model(“SEIR”, vaccination=True) SIRD: load_predefined_model(“SIR”, outcome=”deaths”) SEIRD: load_predefined_model(“SEIR”, outcome=”deaths”) SEIRH: load_predefined_model(“SEIR”, outcome=”hospitalization”)
epydemix.model.simulation_output module
- class epydemix.model.simulation_output.Trajectory(compartments: Dict[str, ndarray], transitions: Dict[str, ndarray], dates: List[Timestamp], compartment_idx: Dict[str, int], transitions_idx: Dict[str, int], parameters: Dict[str, Any])[source]
Bases:
objectClass to store a single trajectory data.
- compartments
Dictionary mapping compartment names to arrays of shape (timesteps,)
- Type:
Dict[str, np.ndarray]
- transitions
Dictionary mapping transition names to arrays of shape (timesteps,)
- Type:
Dict[str, np.ndarray]
- dates
List of simulation dates
- Type:
List[pd.Timestamp]
- compartment_idx
Dictionary mapping compartment names to indices
- Type:
Dict[str, int]
- transitions_idx
Dictionary mapping transition names to indices
- Type:
Dict[str, int]
- parameters
Dictionary of parameters used in the simulation
- Type:
Dict[str, Any]
- compartment_idx: Dict[str, int]
- compartments: Dict[str, ndarray]
- dates: List[Timestamp]
- parameters: Dict[str, Any]
- resample(freq: str, method_compartments: str = 'last', method_transitions: str = 'sum', fill_method: str = 'ffill') None[source]
Resample trajectory to new frequency.
- Parameters:
freq (str) – Frequency for resampling (e.g., ‘D’ for daily, ‘W’ for weekly)
method_compartments (str) – Aggregation method for compartments. Default is ‘last’
method_transitions (str) – Aggregation method for transitions. Default is ‘sum’
fill_method (str) – Method to fill NaN values after resampling. Options are: - ‘ffill’: Forward fill (use last valid observation) - ‘bfill’: Backward fill (use next valid observation) - ‘interpolate’: Linear interpolation between points Default is ‘ffill’.
- Raises:
ValueError – If fill_method is not one of [‘ffill’, ‘bfill’, ‘interpolate’]
- transitions: Dict[str, ndarray]
- transitions_idx: Dict[str, int]
epydemix.model.simulation_results module
- class epydemix.model.simulation_results.SimulationResults(trajectories: List[Trajectory], parameters: Dict[str, Any])[source]
Bases:
objectClass to store and manage multiple simulation results.
- trajectories
List of simulation trajectories
- Type:
List[Trajectory]
- parameters
Dictionary of parameters used in the simulations
- Type:
Dict[str, Any]
- property Nsim: int
Number of simulations.
- property compartment_idx: Dict[str, int]
Compartment indices.
- property dates: List[Timestamp]
Simulation dates.
- get_quantiles(stacked: Dict[str, ndarray], quantiles: List[float] | None = None, ignore_nan: bool = False) DataFrame[source]
Compute quantiles across all trajectories.
- Parameters:
stacked – Dictionary of stacked trajectory arrays
quantiles – List of quantile values to compute. If None, defaults to [0.025, 0.05, 0.25, 0.5, 0.75, 0.95, 0.975]
ignore_nan – If True, use np.nanquantile to ignore NaN values. Defaults to False. When enabled, a warning is issued if any time point has >50% NaN values, as quantiles may be unreliable with small sample sizes.
- get_quantiles_compartments(quantiles: List[float] | None = None, ignore_nan: bool = False, variables: List[str] | None = None) DataFrame[source]
Compute quantiles across all trajectories for compartments. The name of the columns are the compartments names and the demographic groups, in the following format: {compartment_name}_{demographic_group}. For example, the column I_total contains the quantiles of the number of infected (“I”) individuals across all demographic groups (“total”).
- Parameters:
quantiles – List of quantile values to compute. If None, defaults to [0.025, 0.05, 0.25, 0.5, 0.75, 0.95, 0.975]
ignore_nan – If True, use np.nanquantile to ignore NaN values. Defaults to False.
variables – List of compartment names to include. If None, all compartments are included.
- get_quantiles_transitions(quantiles: List[float] | None = None, ignore_nan: bool = False, variables: List[str] | None = None) DataFrame[source]
Compute quantiles across all trajectories for transitions. The name of the columns are the transitions names and the demographic groups, in the following format: {source_compartment_name}_to_{target_compartment_name}_{demographic_group}. For example, the column S_to_I_total contains the quantiles of the number of individuals transitioning from susceptible (“S”) to infected (“I”) individuals across all demographic groups (“total”).
- Parameters:
quantiles – List of quantile values to compute. If None, defaults to [0.025, 0.05, 0.25, 0.5, 0.75, 0.95, 0.975]
ignore_nan – If True, use np.nanquantile to ignore NaN values. Defaults to False.
variables – List of transition names to include. If None, all transitions are included.
- get_stacked_compartments(variables: List[str] | None = None) Dict[str, ndarray][source]
Get trajectories stacked into arrays of shape (Nsim, timesteps).
- Parameters:
variables – List of compartment names to include. If None, all compartments are included.
- get_stacked_transitions(variables: List[str] | None = None) Dict[str, ndarray][source]
Get trajectories stacked into arrays of shape (Nsim, timesteps).
- Parameters:
variables – List of transition names to include. If None, all transitions are included.
- parameters: Dict[str, Any]
- resample(freq: str, method: str = 'last', fill_method: str = 'ffill') SimulationResults[source]
Resample all trajectories to new frequency.
- trajectories: List[Trajectory]
epydemix.model.transition module
- class epydemix.model.transition.Transition(source: str, target: str, kind: str, params: Any)[source]
Bases:
objectRepresents a transition in an epidemic model.
A transition defines a change from one compartment to another with a specified rate. Optionally, it can involve a specific agent.
- source
The source compartment of the transition.
- Type:
str
- target
The target compartment of the transition.
- Type:
str
- kind
The kind of transition (e.g., spontaneous or mediated).
- Type:
str
- params
The parameters involved in the transition.
- Type:
Any
Module contents
- class epydemix.model.EpiModel(name: str = 'EpiModel', compartments: List | None = None, parameters: Dict | None = None, population_name: str = 'epydemix_population', population_data_path: str | None = None, contact_layers: List | None = None, contacts_source: str | None = None, age_group_mapping: Dict | None = None, supported_contacts_sources: Dict | None = None, use_default_population: bool = True, default_population_size: int = 100000, data_version: str = 'v1.2.0', attribute: str = 'age')[source]
Bases:
objectEpiModel: A compartmental epidemic model simulator
Example
>>> model = EpiModel(compartments=["S", "I", "R"], parameters={"beta": 0.3, "gamma": 0.1}) >>> model.add_transition(source="S", target="I", params=("beta", "I")) >>> model.add_transition(source="I", target="R", params="gamma") >>> results = model.run_simulations( ... start_date="2020-01-01", ... end_date="2020-12-31", ... Nsim=100 ... )
- add_compartments(compartments: List | object) None[source]
Adds compartments to the epidemic model.
- Parameters:
compartments (list or object) – A list of compartments or a single compartment to be added.
- Raises:
ValueError – If a compartment is already in the model or is repeated in the input.
- Returns:
None
- add_intervention(layer_name: str, start_date: str | Timestamp, end_date: str | Timestamp, reduction_factor: float | None = None, new_matrix: ndarray | None = None, name: str = '') None[source]
Adds an intervention to the epidemic model.
- Parameters:
layer_name (str) – The name of the layer to which the intervention applies.
start_date (str or datetime) – The start date of the intervention.
end_date (str or datetime) – The end date of the intervention.
reduction_factor (float, optional) – The factor by which to reduce the contact matrix. Default is None.
new_matrix (np.ndarray, optional) – A new contact matrix to use during the intervention. Default is None.
name (str, optional) – The name of the intervention. Default is an empty string.
- Raises:
ValueError – If neither reduction_factor nor new_matrix is provided.
- Returns:
None
- add_parameter(parameter_name: str | None = None, value: Any = None, parameters_dict: Dict | None = None) None[source]
Adds new parameters to the model.
- Parameters:
parameter_name (str, optional) – The name of the parameter to add. Ignored if parameters_dict is provided.
value (any, optional) – The value of the parameter to add. Ignored if parameters_dict is provided.
parameters_dict (dict, optional) – A dictionary of parameter names and values. If provided, parameter_name and value are ignored and the parameters are updated using this dictionary.
- Raises:
ValueError – If neither parameter_name/value nor parameters_dict is provided.
- Returns:
None
- add_transition(source: str, target: str, kind: str, params: Any) None[source]
Adds a transition to the epidemic model.
- Parameters:
source (str) – The source compartment of the transition.
target (str) – The target compartment of the transition.
kind (str) – The kind of transition (e.g., spontaneous or mediated). Custom kinds must be registered with register_transition_kind before being used here.
params (Any) – The parameters involved in the transition.
- Raises:
ValueError – If the source or target is not in the compartments list, or if the kind is not a registered transition kind.
- Returns:
None
- apply_intervention(intervention: Dict, simulation_dates: List[Timestamp]) None[source]
Applies an intervention to the contact matrices for specified simulation dates.
- Parameters:
intervention (dict) – A dictionary containing intervention details with the following keys: - “layer” (str): The name of the layer to which the intervention applies. - “start_date” (pd.Timestamp): The start date of the intervention. - “end_date” (pd.Timestamp): The end date of the intervention. - “reduction_factor” (float, optional): The factor by which to reduce the contact matrix. - “new_matrix” (np.ndarray, optional): A new contact matrix to use during the intervention.
simulation_dates (list of pd.Timestamp) – A list of dates for which the simulation is run.
- Raises:
ValueError – If neither reduction_factor nor new_matrix is provided in the intervention.
- Returns:
None
- clear_compartments() None[source]
This method resets the compartments list and clears the compartments_idx dictionary. Transitions are cleared as well, since they refer to compartments that no longer exist.
- Returns:
None
- clear_interventions() None[source]
Clears all interventions from the model.
This method resets the interventions list, removing all existing interventions.
- Returns:
None
- clear_parameters() None[source]
Clears all parameters from the model’s parameters dictionary.
- Returns:
None
- clear_transitions() None[source]
Clears all transitions from the model.
This method resets the transitions_list and transitions_idx and reinitializes the transitions dictionary, clearing all existing transitions while keeping the structure intact for each compartment.
- Returns:
None
- compute_contact_reductions(simulation_dates: List[Timestamp]) None[source]
Computes the contact reductions for a population over the given simulation dates.
This function applies interventions to the contact matrices and computes the overall contact matrix for each date in the simulation period.
- Parameters:
simulation_dates (list of pd.Timestamp) – A list of dates over which the simulation is run.
- Returns:
- The function updates the instance variable self.Cs with the contact matrices for each date,
including the overall contact matrix after applying interventions.
- Return type:
None
- create_default_initial_conditions(percentage_in_agents: float = 0.0005) Dict[str, ndarray][source]
Creates default initial conditions for the epidemic model. If initial conditions are not provided, assigns a percentage of the population to agent compartments and the rest to source compartments, considering different age groups.
- Parameters:
percentage_in_agents (float) – Percentage of population to place in agent compartments. Defaults to 0.05%.
initial_conditions (dict, optional) – A dictionary specifying initial conditions. If None, this function creates default conditions.
- Returns:
A dictionary with initial conditions for each compartment, with values as arrays representing different age groups.
- Return type:
dict
- Raises:
ValueError – If the model has no mediated transitions, since the defaults are inferred from them.
- delete_override(parameter_name: str) None[source]
Deletes overrides for a specific parameter.
- Parameters:
parameter_name (str) – The name of the parameter whose overrides are to be deleted.
- Returns:
None
- delete_parameter(parameter_name: str) Any[source]
Deletes a parameter from the dictionary of the model’s parameters.
- Parameters:
parameter_name (str) – The name of the parameter to delete.
- Returns:
The value of the deleted parameter.
- Return type:
any
- Raises:
KeyError – If the parameter with the given name is not found.
- get_parameter(parameter_name: str) Any[source]
Retrieves the value of a specified parameter.
- Parameters:
parameter_name (str) – The name of the parameter to retrieve.
- Returns:
The value of the specified parameter.
- Return type:
any
- Raises:
KeyError – If the parameter with the given name is not found.
- import_epydemix_population(population_name: str, population_data_path: str | None = None, contact_layers: List | None = None, contacts_source: str | None = None, age_group_mapping: Dict | None = None, supported_contacts_sources: Dict | None = None, data_version: str = 'v1.2.0', attribute: str = 'age') None[source]
Sets or updates the population for the model.
- Parameters:
population_name (str) – The name of the population to set.
population_data_path (str or None, optional) – The path to the population data file. If None, data may be fetched online.
contact_layers (list or None, optional) – A list of contact layers to load for the population. Defaults to [“school”, “work”, “home”, “community”] if None.
contacts_source (str or None, optional) – The source of contact data. If None, the function will attempt to determine the source automatically.
age_group_mapping (dict or None, optional) – A mapping for age groups. If None, a default mapping is used.
supported_contacts_sources (list or None, optional) – A list of supported contact data sources (e.g., “prem_2017”, “prem_2021”). Defaults to [“prem_2017”, “prem_2021”, “mistry_2021”, “litvinova_2025”] for age, [“litvinova_2025”] for sex and race_ethnicity if None.
data_version (str, optional) – The git tag/version of the epydemix-data repository. Defaults to “v1.2.0”.
attribute (str, optional) – The demographic attribute layer. Defaults to “age”.
- Returns:
None
- property n_compartments: int
Get total number of compartments.
- property n_transitions: int
Get total number of transitions.
- override_parameter(start_date: str, end_date: str, parameter_name: str, value: Any) None[source]
Adds an override for a parameter with the specified name.
- Parameters:
start_date (str) – The start date for the override period.
end_date (str) – The end date for the override period.
parameter_name (str) – The name of the parameter to override.
value (any) – The value to override the parameter with.
- Returns:
None
- register_transition_kind(kind: str, function: Callable)[source]
Registers a new transition kind providing a function to compute the rate of the transition.
- Parameters:
kind (str) – The kind of transition (e.g., spontaneous or mediated).
function (Callable) – The function to register.
- Returns:
None
- remove_compartment(compartment: str) List[Transition][source]
Removes a compartment from the model, together with every transition that involves it: transitions leaving it, entering it, and mediated transitions in which it is the agent.
Transitions of custom kinds that refer to the compartment only through their params cannot be detected and must be removed with remove_transition.
- Parameters:
compartment (str) – The compartment to remove.
- Raises:
ValueError – If the compartment is not in the model.
- Returns:
The transitions removed along with the compartment.
- Return type:
List[Transition]
- remove_transition(source: str, target: str, kind: str | None = None, agent: str | None = None) List[Transition][source]
Removes the transitions going from source to target.
A model can have several transitions between the same two compartments (e.g. infection mediated by two different infectious compartments). By default all of them are removed; use kind and/or agent to remove only some.
- Parameters:
source (str) – The source compartment of the transitions.
target (str) – The target compartment of the transitions.
kind (str, optional) – Only remove transitions of this kind (e.g. “mediated”).
agent (str, optional) – Only remove mediated transitions whose agent (the compartment mediating the transition, e.g. “I” in params=(“beta”, “I”)) is this compartment.
- Raises:
ValueError – If no transition matches.
- Returns:
The removed transitions.
- Return type:
List[Transition]
- run_simulations(start_date: str | Timestamp = '2020-01-01', end_date: str | Timestamp = '2020-12-31', initial_conditions_dict: Dict[str, ndarray] | None = None, Nsim: int = 100, percentage_in_agents: float = 0.0005, dt: float | None = 1.0, resample_frequency: str | None = 'D', resample_aggregation_compartments: str | dict | None = 'last', resample_aggregation_transitions: str | dict | None = 'sum', fill_method: str | None = 'ffill', apply_linear_approximation: bool = False, rng: int | Generator | None = None) SimulationResults[source]
Simulates the epidemic model multiple times over the given time period.
- Parameters:
start_date (str or pd.Timestamp) – The start date of the simulation. Default is “2020-01-01”.
end_date (str or pd.Timestamp) – The end date of the simulation. Default is “2020-12-31”.
initial_conditions_dict (dict, optional) – A dictionary of initial conditions for the simulation.
Nsim (int, optional) – The number of simulation runs to perform (default is 100).
percentage_in_agents (float, optional) – The percentage of the population to initialize in the agents compartment.
dt (float, optional) – The time step for the simulation, expressed in days. Default is 1 (day).
resample_frequency (str, optional) – The frequency at which to resample the simulation results. Default is “D” (daily).
resample_aggregation_compartments (str, optional) – The aggregation method to use when resampling the compartments. Default is “last”.
resample_aggregation_transitions (str, optional) – The aggregation method to use when resampling the transitions. Default is “sum”.
fill_method (str, optional) – Method to fill NaN values after resampling. Default is “ffill”.
apply_linear_approximation (bool, optional) – Whether to use linear approximation to the probabilities. Default is False.
rng (int or np.random.Generator, optional) – Seed or random number generator. Default is None.
- Returns:
An object containing all simulation trajectories.
- Return type:
- Raises:
RuntimeError – If the simulation fails.
- set_population(population: Population) None[source]
Sets the population for the epidemic model.
- Parameters:
population (Population) – The population object to set.
- Returns:
None
- class epydemix.model.SimulationResults(trajectories: List[Trajectory], parameters: Dict[str, Any])[source]
Bases:
objectClass to store and manage multiple simulation results.
- trajectories
List of simulation trajectories
- Type:
List[Trajectory]
- parameters
Dictionary of parameters used in the simulations
- Type:
Dict[str, Any]
- property Nsim: int
Number of simulations.
- property compartment_idx: Dict[str, int]
Compartment indices.
- property dates: List[Timestamp]
Simulation dates.
- get_quantiles(stacked: Dict[str, ndarray], quantiles: List[float] | None = None, ignore_nan: bool = False) DataFrame[source]
Compute quantiles across all trajectories.
- Parameters:
stacked – Dictionary of stacked trajectory arrays
quantiles – List of quantile values to compute. If None, defaults to [0.025, 0.05, 0.25, 0.5, 0.75, 0.95, 0.975]
ignore_nan – If True, use np.nanquantile to ignore NaN values. Defaults to False. When enabled, a warning is issued if any time point has >50% NaN values, as quantiles may be unreliable with small sample sizes.
- get_quantiles_compartments(quantiles: List[float] | None = None, ignore_nan: bool = False, variables: List[str] | None = None) DataFrame[source]
Compute quantiles across all trajectories for compartments. The name of the columns are the compartments names and the demographic groups, in the following format: {compartment_name}_{demographic_group}. For example, the column I_total contains the quantiles of the number of infected (“I”) individuals across all demographic groups (“total”).
- Parameters:
quantiles – List of quantile values to compute. If None, defaults to [0.025, 0.05, 0.25, 0.5, 0.75, 0.95, 0.975]
ignore_nan – If True, use np.nanquantile to ignore NaN values. Defaults to False.
variables – List of compartment names to include. If None, all compartments are included.
- get_quantiles_transitions(quantiles: List[float] | None = None, ignore_nan: bool = False, variables: List[str] | None = None) DataFrame[source]
Compute quantiles across all trajectories for transitions. The name of the columns are the transitions names and the demographic groups, in the following format: {source_compartment_name}_to_{target_compartment_name}_{demographic_group}. For example, the column S_to_I_total contains the quantiles of the number of individuals transitioning from susceptible (“S”) to infected (“I”) individuals across all demographic groups (“total”).
- Parameters:
quantiles – List of quantile values to compute. If None, defaults to [0.025, 0.05, 0.25, 0.5, 0.75, 0.95, 0.975]
ignore_nan – If True, use np.nanquantile to ignore NaN values. Defaults to False.
variables – List of transition names to include. If None, all transitions are included.
- get_stacked_compartments(variables: List[str] | None = None) Dict[str, ndarray][source]
Get trajectories stacked into arrays of shape (Nsim, timesteps).
- Parameters:
variables – List of compartment names to include. If None, all compartments are included.
- get_stacked_transitions(variables: List[str] | None = None) Dict[str, ndarray][source]
Get trajectories stacked into arrays of shape (Nsim, timesteps).
- Parameters:
variables – List of transition names to include. If None, all transitions are included.
- parameters: Dict[str, Any]
- resample(freq: str, method: str = 'last', fill_method: str = 'ffill') SimulationResults[source]
Resample all trajectories to new frequency.
- trajectories: List[Trajectory]
- class epydemix.model.Transition(source: str, target: str, kind: str, params: Any)[source]
Bases:
objectRepresents a transition in an epidemic model.
A transition defines a change from one compartment to another with a specified rate. Optionally, it can involve a specific agent.
- source
The source compartment of the transition.
- Type:
str
- target
The target compartment of the transition.
- Type:
str
- kind
The kind of transition (e.g., spontaneous or mediated).
- Type:
str
- params
The parameters involved in the transition.
- Type:
Any
- epydemix.model.load_predefined_model(model_name: str, transmission_rate: float = 0.3, recovery_rate: float = 0.1, incubation_rate: float = 0.2, asymptomatic_fraction: float = 0.4, asymptomatic_recovery_rate: float = 0.14, asymptomatic_relative_infectivity: float = 0.5, waning_immunity: bool = False, waning_rate: float = 0.0027397260273972603, vaccination: bool = False, vaccination_rate: float = 0.01, vaccine_efficacy: float = 0.9, outcome: str = None, mortality_rate: float = 0.01, hospitalization_rate: float = 0.01, hospitalization_recovery_rate: float = 0.1) EpiModel[source]
Load a predefined epidemic model with optional modular extensions.
- Parameters:
model_name (str) – Backbone model. One of “SIR”, “SEIR”, “SIS”, “SEIAR”.
transmission_rate (float) – Rate of transmission. Default 0.3.
recovery_rate (float) – Rate of recovery from Infected. Default 0.1.
incubation_rate (float) – Rate of progression from Exposed to Infected (SEIR, SEIAR). Default 0.2.
asymptomatic_fraction (float) – Fraction of exposed who become asymptomatic (SEIAR only). Default 0.4.
asymptomatic_recovery_rate (float) – Recovery rate for asymptomatic individuals (SEIAR only). Default 0.14.
asymptomatic_relative_infectivity (float) – Infectivity of asymptomatics relative to symptomatics (SEIAR only). Default 0.5.
waning_immunity (bool) – Add waning immunity (R → S). Not compatible with SIS. Default False.
waning_rate (float) – Rate of immunity waning. Default 1/365 (~1 year). Interpreted as the inverse of the average immunity duration in days.
vaccination (bool) – Add vaccination compartment (S → Vaccinated → Infected/Exposed at reduced rate; breakthrough infections go to Exposed if the backbone has an Exposed compartment, otherwise Infected). Default False.
vaccination_rate (float) – Rate of vaccination from Susceptible. Default 0.01.
vaccine_efficacy (float) – Fraction by which vaccine reduces transmission. Default 0.9.
outcome (str or None) – Track a disease outcome. One of None, “deaths”, “hospitalization”. Default None.
mortality_rate (float) – Fraction of the Infected outflow that goes to Dead, rescaling the existing Infected outflow (e.g. recovery_rate) by (1 - mortality_rate). Used when outcome=”deaths”. Default 0.01.
hospitalization_rate (float) – Fraction of the Infected outflow that goes to Hospitalized, rescaling recovery_rate by (1 - hospitalization_rate). Used when outcome=”hospitalization”. Default 0.01.
hospitalization_recovery_rate (float) – Rate of recovery from Hospitalized. Used when outcome=”hospitalization”. Default 0.1.
All rate parameters accept scalars, 1D arrays of shape (T,) for time-varying values, or 2D arrays of shape (T, G) for age-stratified values, consistent with the rest of the epydemix parameter system.
- Returns:
Configured epidemic model.
- Return type:
- Raises:
ValueError – If model_name is not recognised, or a module is incompatible with the chosen backbone.
Examples
SIRS: load_predefined_model(“SIR”, waning_immunity=True) SEIRS: load_predefined_model(“SEIR”, waning_immunity=True) SEIR-V: load_predefined_model(“SEIR”, vaccination=True) SIRD: load_predefined_model(“SIR”, outcome=”deaths”) SEIRD: load_predefined_model(“SEIR”, outcome=”deaths”) SEIRH: load_predefined_model(“SEIR”, outcome=”hospitalization”)
- epydemix.model.simulate(epimodel, start_date: str | Timestamp = '2020-01-01', end_date: str | Timestamp = '2020-12-31', initial_conditions_dict: Dict[str, ndarray] | None = None, percentage_in_agents: float = 0.0005, dt: float | None = 1.0, resample_frequency: str | None = 'D', resample_aggregation_compartments: str | dict | None = 'last', resample_aggregation_transitions: str | dict | None = 'sum', fill_method: str | None = 'ffill', apply_linear_approximation: bool = False, rng: int | Generator | None = None, contact_matrices: List[Dict[str, ndarray]] | None = None, simulation_dates: List[Timestamp] | None = None, **kwargs) Trajectory[source]
Runs a simulation of the epidemic model over the specified simulation dates.
- Parameters:
epimodel (EpiModel) – The epidemic model instance to simulate.
start_date (str or pd.Timestamp) – The start date of the simulation. Default is “2020-01-01”.
end_date (str or pd.Timestamp) – The end date of the simulation. Default is “2020-12-31”.
initial_conditions_dict (dict, optional) – A dictionary of initial conditions for the simulation.
percentage_in_agents (float, optional) – The percentage of the population to initialize in the agents compartment.
dt (float, optional) – The time step for the simulation, expressed in days. Default is 1 (day).
resample_frequency (str, optional) – The frequency at which to resample the simulation results. Default is “D” (daily).
resample_aggregation_compartments (str, optional) – The aggregation method to use when resampling the compartments. Default is “last”.
resample_aggregation_transitions (str, optional) – The aggregation method to use when resampling the transitions. Default is “sum”.
fill_method (str, optional) – The method to use when filling NaN values after resampling. Default is “ffill”.
apply_linear_approximation (bool, optional) – Whether to use linear approximation to the probabilities. Default is False.
rng (int or np.random.Generator, optional) – Seed or random number generator. Default is None.
contact_matrices (list, optional) – A list of contact matrices for the simulation. Default is None.
simulation_dates (list, optional) – A list of simulation dates. Default is None.
**kwargs – Additional parameters to overwrite model parameters during the simulation.
- Returns:
The trajectory of the simulation
- Return type:
- Raises:
ValueError – If the model has no transitions defined.