A Python library for calculating malaria intervention budgets across different countries and time periods.
Install from PyPI:
pip install snt-malaria-budgetingFor development, clone the repository and install with development dependencies:
pip install -e .[dev]This installs the package in editable mode along with all development tools (pytest, ruff, mypy, etc.).
To fetch budgets for a given country and years:
from snt_malaria_budgeting.core.budget_calculator import get_budget
from snt_malaria_budgeting.models import (
DEFAULT_COST_ASSUMPTIONS,
InterventionDetailModel,
)
start_year = 2025
end_year = 2027
# places are a list of ids
interventions = [InterventionDetailModel(code="iptp", type="SP", places=[1001])]
settings = DEFAULT_COST_ASSUMPTIONS
budgets = []
budget_calculator = BudgetCalculator(
interventions_input=interventions_input,
settings=settings,
cost_df=cost_df, # refer to unit tests for an example
population_df=population_df, # refer to unit tests for an example
local_currency="EUR",
spatial_planning_unit="key",
cost_overrides=[], # optional
unknown_intervention_handling="ignore", #optional can be: ignore, handle or error
)
for year in range(start_year, end_year + 1):
print(f"Fetching budget for year: {year}")
interventions_costs = budget_calculator.get_interventions_costs(year)
places_costs = budget_calculator.get_places_costs(year)
budgets.append({
"year": year,
"interventions": interventions_costs,
"org_units_costs": places_costs
})
print(budgets)- code: Intervention code (e.g., "iptp", "smc", etc.)
- type: Unique identifier for the intervention within a code (e.g., "SP", "SP+AQ")
- places: List of place IDs assigned to the intervention
- target_population_columns: (Optional) List of population columns to use for quantification (e.g., ["pop_total"], ["pop_0_5", "pop_pw"])
Default Target Population & Required Cost Units by Intervention:
| Intervention Code | Default Target Population Column(s) | Required Cost Unit(s) |
|---|---|---|
| itn_campaign | pop_total | per ITN, per bale |
| itn_routine | pop_0_5, pop_pw | per ITN |
| iptp | pop_pw | per SP |
| smc | pop_0_5 | per SPAQ pack 3-11 month olds, per SPAQ pack 12-59 month olds |
| pmc | pop_0_1, pop_1_2 | per SP |
| vacc | pop_vaccine_5_36_months | per dose, per child |
| default | pop_total | Other |
Note:
- The
unitcolumn in yourcost_dfmust match the required cost unit(s) for each intervention code above.- Some interventions (like SMC and Vacc) require multiple units for different age groups or quantification types.
Dictionary of cost and quantification assumptions. Defaults are provided in DEFAULT_COST_ASSUMPTIONS (see models.py).
DataFrame of unit costs, with columns such as:
- code_intervention
- type_intervention
- cost_class
- unit
- ngn_cost
- usd_cost
- cost_year
DataFrame with population data by place and year, with columns:
- org_unit_id: Place ID
- year: Year
- Population columns: e.g., pop_total, pop_0_5, pop_pw, etc.
If target_population_columns is not specified in the intervention, the default columns above are used.
The local currency symbol (e.g., "NGN", "EUR").
The column name in population_df that identifies the spatial unit (e.g., "org_unit_id").
The currency for the budget output. Defaults to local_currency.
List of cost override items (see CostItems model).
How to handle unknown interventions: "ignore", "handle", or "error".
After installing with development dependencies, run the test suite:
pytest
pytest -v # verbose output
pytest --cov=snt_malaria_budgeting --cov-report=html # with coverage report
# specific test files or methods:
pytest tests/core/test_budget_calculator.py
pytest tests/core/test_budget_calculator.py::TestGetBudget::test_get_budget_iptpThis library is a Python port of the PATH Budget Generation Function (R implementation).