vivarium-public-health 4.3.5__tar.gz → 4.3.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/CHANGELOG.rst +4 -0
  2. {vivarium_public_health-4.3.5/src/vivarium_public_health.egg-info → vivarium_public_health-4.3.6}/PKG-INFO +1 -1
  3. vivarium_public_health-4.3.6/src/vivarium_public_health/_version.py +1 -0
  4. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/population/base_population.py +41 -6
  5. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6/src/vivarium_public_health.egg-info}/PKG-INFO +1 -1
  6. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/population/test_base_population.py +121 -0
  7. vivarium_public_health-4.3.5/src/vivarium_public_health/_version.py +0 -1
  8. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.bandit +0 -0
  9. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.flake8 +0 -0
  10. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.gitattributes +0 -0
  11. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.github/CODEOWNERS +0 -0
  12. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.github/pull_request_template.md +0 -0
  13. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.github/workflows/deploy.yml +0 -0
  14. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.gitignore +0 -0
  15. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.pylintrc +0 -0
  16. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.readthedocs.yml +0 -0
  17. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/.zenodo.json +0 -0
  18. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/CODE_OF_CONDUCT.rst +0 -0
  19. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/CONTRIBUTING.rst +0 -0
  20. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/Jenkinsfile +0 -0
  21. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/LICENSE.txt +0 -0
  22. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/MANIFEST.in +0 -0
  23. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/Makefile +0 -0
  24. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/README.rst +0 -0
  25. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/Makefile +0 -0
  26. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/nitpick-exceptions +0 -0
  27. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/_static/style.css +0 -0
  28. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/_templates/layout.html +0 -0
  29. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/disease/index.rst +0 -0
  30. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/disease/model.rst +0 -0
  31. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/disease/models.rst +0 -0
  32. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/disease/special_disease.rst +0 -0
  33. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/disease/state.rst +0 -0
  34. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/disease/transition.rst +0 -0
  35. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/index.rst +0 -0
  36. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/mslt/delay.rst +0 -0
  37. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/mslt/disease.rst +0 -0
  38. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/mslt/index.rst +0 -0
  39. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/mslt/intervention.rst +0 -0
  40. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/mslt/magic_wand_components.rst +0 -0
  41. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/mslt/observer.rst +0 -0
  42. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/mslt/population.rst +0 -0
  43. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/plugins/index.rst +0 -0
  44. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/plugins/parser.rst +0 -0
  45. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/population/add_new_birth_cohorts.rst +0 -0
  46. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/population/base_population.rst +0 -0
  47. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/population/data_transformations.rst +0 -0
  48. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/population/index.rst +0 -0
  49. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/population/mortality.rst +0 -0
  50. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/results/disability.rst +0 -0
  51. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/results/disease.rst +0 -0
  52. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/results/index.rst +0 -0
  53. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/results/mortality.rst +0 -0
  54. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/results/observer.rst +0 -0
  55. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/results/risk.rst +0 -0
  56. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/results/simple_cause.rst +0 -0
  57. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/results/stratification.rst +0 -0
  58. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/risks/base_risk.rst +0 -0
  59. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/risks/data_transformations.rst +0 -0
  60. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/risks/distributions.rst +0 -0
  61. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/risks/effect.rst +0 -0
  62. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/risks/implementations/index.rst +0 -0
  63. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/risks/implementations/low_birth_weight_and_short_gestation.rst +0 -0
  64. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/risks/index.rst +0 -0
  65. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/treatment/index.rst +0 -0
  66. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/treatment/magic_wand.rst +0 -0
  67. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/treatment/scale_up.rst +0 -0
  68. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/treatment/therapeutic_inertia.rst +0 -0
  69. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/api_reference/utilities.rst +0 -0
  70. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/conf.py +0 -0
  71. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/index.rst +0 -0
  72. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/tutorials/index.rst +0 -0
  73. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/docs/source/tutorials/risk_exposure.rst +0 -0
  74. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/pyproject.toml +0 -0
  75. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/python_versions.json +0 -0
  76. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/setup.cfg +0 -0
  77. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/setup.py +0 -0
  78. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/__about__.py +0 -0
  79. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/__init__.py +0 -0
  80. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/disease/__init__.py +0 -0
  81. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/disease/exceptions.py +0 -0
  82. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/disease/model.py +0 -0
  83. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/disease/models.py +0 -0
  84. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/disease/special_disease.py +0 -0
  85. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/disease/state.py +0 -0
  86. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/disease/transition.py +0 -0
  87. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/mslt/__init__.py +0 -0
  88. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/mslt/delay.py +0 -0
  89. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/mslt/disease.py +0 -0
  90. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/mslt/intervention.py +0 -0
  91. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/mslt/magic_wand_components.py +0 -0
  92. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/mslt/observer.py +0 -0
  93. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/mslt/population.py +0 -0
  94. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/plugins/__init__.py +0 -0
  95. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/plugins/parser.py +0 -0
  96. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/population/__init__.py +0 -0
  97. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/population/add_new_birth_cohorts.py +0 -0
  98. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/population/data_transformations.py +0 -0
  99. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/population/mortality.py +0 -0
  100. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/__init__.py +0 -0
  101. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/columns.py +0 -0
  102. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/disability.py +0 -0
  103. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/disease.py +0 -0
  104. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/mortality.py +0 -0
  105. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/observer.py +0 -0
  106. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/risk.py +0 -0
  107. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/simple_cause.py +0 -0
  108. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/results/stratification.py +0 -0
  109. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/risks/__init__.py +0 -0
  110. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/risks/base_risk.py +0 -0
  111. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/risks/data_transformations.py +0 -0
  112. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/risks/distributions.py +0 -0
  113. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/risks/effect.py +0 -0
  114. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/risks/implementations/__init__.py +0 -0
  115. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/risks/implementations/low_birth_weight_and_short_gestation.py +0 -0
  116. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/treatment/__init__.py +0 -0
  117. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/treatment/magic_wand.py +0 -0
  118. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/treatment/scale_up.py +0 -0
  119. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/treatment/therapeutic_inertia.py +0 -0
  120. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health/utilities.py +0 -0
  121. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health.egg-info/SOURCES.txt +0 -0
  122. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health.egg-info/dependency_links.txt +0 -0
  123. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health.egg-info/not-zip-safe +0 -0
  124. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health.egg-info/requires.txt +0 -0
  125. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/src/vivarium_public_health.egg-info/top_level.txt +0 -0
  126. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/__init__.py +0 -0
  127. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/conftest.py +0 -0
  128. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/data/rr_interpolator.csv +0 -0
  129. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/disease/__init__.py +0 -0
  130. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/disease/test_disease.py +0 -0
  131. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/disease/test_special_disease.py +0 -0
  132. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/mock_artifact.py +0 -0
  133. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/plugins/__init__.py +0 -0
  134. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/plugins/test_parser.py +0 -0
  135. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/population/__init__.py +0 -0
  136. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/population/conftest.py +0 -0
  137. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/population/test_add_new_birth_cohort.py +0 -0
  138. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/population/test_data_transformations.py +0 -0
  139. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/population/test_mortality.py +0 -0
  140. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/results/__init__.py +0 -0
  141. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/results/test_categorical_risk_observer.py +0 -0
  142. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/results/test_disability.py +0 -0
  143. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/results/test_disability_observer.py +0 -0
  144. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/results/test_disease_observer.py +0 -0
  145. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/results/test_mortality_observer.py +0 -0
  146. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/results/test_stratification.py +0 -0
  147. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/risks/__init__.py +0 -0
  148. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/risks/conftest.py +0 -0
  149. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/risks/test_base_risk.py +0 -0
  150. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/risks/test_data_transformations.py +0 -0
  151. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/risks/test_distributions.py +0 -0
  152. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/risks/test_effect.py +0 -0
  153. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/risks/test_low_birth_weight_and_short_gestation.py +0 -0
  154. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/test_utilities.py +0 -0
  155. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/treatment/__init__.py +0 -0
  156. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tests/treatment/test_scale_up.py +0 -0
  157. {vivarium_public_health-4.3.5 → vivarium_public_health-4.3.6}/tox.ini +0 -0
@@ -1,3 +1,7 @@
1
+ **4.3.6 - 08/28/25**
2
+
3
+ - Feature: ScaledPopulation can handle multiple year data inputs.
4
+
1
5
  **4.3.5 - 08/01/25**
2
6
 
3
7
  - Use vivarium_dependencies for common setup constraints
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vivarium_public_health
3
- Version: 4.3.5
3
+ Version: 4.3.6
4
4
  Summary: Components for modelling diseases, risks, and interventions with ``vivarium``
5
5
  Home-page: https://github.com/ihmeuw/vivarium_public_health
6
6
  Author: The vivarium developers
@@ -0,0 +1 @@
1
+ __version__ = "4.3.6"
@@ -235,15 +235,50 @@ class ScaledPopulation(BasePopulation):
235
235
  raise ValueError(
236
236
  f"Scaling factor must be a pandas DataFrame. Provided value: {scaling_factor}"
237
237
  )
238
- scaling_factor = scaling_factor.set_index(
239
- [col for col in scaling_factor.columns if col != "value"]
238
+ start_year = builder.configuration.time.start.year
239
+ population_structure, scaling_factor = self._format_data_inputs(
240
+ population_structure, scaling_factor, start_year
240
241
  )
241
- population_structure = population_structure.set_index(
242
- [col for col in population_structure.columns if col != "value"]
242
+
243
+ return (population_structure * scaling_factor).reset_index()
244
+
245
+ def _format_data_inputs(
246
+ self, pop_structure: pd.DataFrame, scalar_data: pd.DataFrame, year: int
247
+ ) -> tuple[pd.DataFrame, pd.DataFrame]:
248
+ """Data cleaning function to check whether scalar_data and population structure are compatible for scaling
249
+ the population structure of a simulation."""
250
+
251
+ scaling_factor = scalar_data.set_index(
252
+ [col for col in scalar_data.columns if col != "value"]
243
253
  )
244
- scaled_population_structure = (population_structure * scaling_factor).reset_index()
254
+ population_structure = pop_structure.set_index(
255
+ [col for col in pop_structure.columns if col != "value"]
256
+ )
257
+ if "year_start" not in scaling_factor.index.names:
258
+ return population_structure, scaling_factor
259
+
260
+ # Subset to start year of simulation or closest year
261
+ pop_reference_years = sorted(
262
+ set(population_structure.index.get_level_values("year_start"))
263
+ )
264
+ pop_year_index = np.digitize(year, pop_reference_years).item() - 1
265
+ scale_reference_years = sorted(
266
+ set(scaling_factor.index.get_level_values("year_start"))
267
+ )
268
+ scale_year_index = np.digitize(year, scale_reference_years).item() - 1
269
+ # Subset to start year of simulation or earliest year. E.g. if start year = 2021 and pop
270
+ # structure has 2021, we will subset to 2021. If pop structure minimum year is 2025, we
271
+ # will subset to 2025.
272
+ population_structure = population_structure.loc[
273
+ population_structure.index.get_level_values("year_start")
274
+ == pop_reference_years[pop_year_index]
275
+ ]
276
+ scaling_factor = scaling_factor.loc[
277
+ scaling_factor.index.get_level_values("year_start")
278
+ == scale_reference_years[scale_year_index]
279
+ ]
245
280
 
246
- return scaled_population_structure
281
+ return population_structure, scaling_factor
247
282
 
248
283
 
249
284
  class AgeOutSimulants(Component):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vivarium_public_health
3
- Version: 4.3.5
3
+ Version: 4.3.6
4
4
  Summary: Components for modelling diseases, risks, and interventions with ``vivarium``
5
5
  Home-page: https://github.com/ihmeuw/vivarium_public_health
6
6
  Author: The vivarium developers
@@ -1,8 +1,10 @@
1
1
  import math
2
+ from itertools import product
2
3
 
3
4
  import numpy as np
4
5
  import pandas as pd
5
6
  import pytest
7
+ from layered_config_tree import LayeredConfigTree
6
8
  from vivarium import InteractiveContext
7
9
  from vivarium.testing_utilities import get_randomness
8
10
  from vivarium_testing_utils import FuzzyChecker
@@ -349,6 +351,125 @@ def test_scaled_population(
349
351
  )
350
352
 
351
353
 
354
+ @pytest.mark.parametrize("test_case", ["pop_structure", "both"])
355
+ @pytest.mark.parametrize("year", [2021, 2025])
356
+ def test_scaled_population__format_data_inputs(
357
+ test_case: str,
358
+ year: int,
359
+ ) -> None:
360
+ """Test ScaledPopulation with multi-year data in population structure and/or scaling factor.
361
+
362
+ Cases:
363
+ 1. pop_structure: Population structure has multiple years, scaling factor does not
364
+ 2. both: Both population structure and scaling factor have multiple years
365
+ """
366
+
367
+ # Create multi-year population structure (2021-2024)
368
+ age_idx = pd.MultiIndex.from_tuples(
369
+ [
370
+ (0.0, 25.0, "Young People"),
371
+ (25.0, 50.0, "Old People"),
372
+ (50.0, 75.0, "Ancient People"),
373
+ (75.0, 100.0, "People Who Beat the Odds"),
374
+ ],
375
+ names=["age_start", "age_end", "age_group_name"],
376
+ )
377
+ age_df = pd.DataFrame(index=age_idx).reset_index()
378
+ age_bins = [(group.age_start, group.age_end) for group in age_df.itertuples()]
379
+ sexes = ("Male", "Female")
380
+ location = ["Kenya"]
381
+ years = [(2021, 2022), (2022, 2023), (2023, 2024)] # Multiple years
382
+
383
+ age_bins, sexes, years, location = zip(*product(age_bins, sexes, years, location))
384
+ mins, maxes = zip(*age_bins)
385
+ year_starts, year_ends = zip(*years)
386
+
387
+ pop_structure = pd.DataFrame(
388
+ {
389
+ "location": location,
390
+ "sex": sexes,
391
+ "age_start": mins,
392
+ "age_end": maxes,
393
+ "year_start": year_starts,
394
+ "year_end": year_ends,
395
+ # Base values for each demographic group
396
+ "value": [1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0] * 3, # Repeated for 3 years
397
+ }
398
+ )
399
+
400
+ # Create scaling factor data based on test case
401
+ if test_case == "pop_structure":
402
+ # Scaling factor single year
403
+ scalar_data = pd.DataFrame(
404
+ {
405
+ "sex": ["Male", "Female"] * 4,
406
+ "age_start": [0.0, 0.0, 25.0, 25.0, 50.0, 50.0, 75.0, 75.0],
407
+ "age_end": [25.0, 25.0, 50.0, 50.0, 75.0, 75.0, 100.0, 100.0],
408
+ "year_start": [2021] * 8,
409
+ "year_end": [2022] * 8,
410
+ "value": [1.5, 1.2, 2.1, 1.8, 0.9, 1.1, 1.3, 1.4],
411
+ }
412
+ )
413
+ # Remove year_start and year end since scalar data only has one year
414
+ formatted_scalar_data = scalar_data.set_index(
415
+ ["sex", "age_start", "age_end"], drop=True
416
+ )[["value"]]
417
+ elif test_case == "both":
418
+ # Both have multiple years - should be able to multiply together directly
419
+ scalar_data = pd.DataFrame(
420
+ {
421
+ "age_start": [0.0, 0.0, 25.0, 25.0, 50.0, 50.0, 75.0, 75.0] * 3,
422
+ "age_end": [25.0, 25.0, 50.0, 50.0, 75.0, 75.0, 100.0, 100.0] * 3,
423
+ "sex": ["Male", "Female"] * 12,
424
+ "year_start": [2021] * 8 + [2022] * 8 + [2023] * 8,
425
+ "year_end": [2022] * 8 + [2023] * 8 + [2024] * 8,
426
+ "value": [
427
+ 1.0,
428
+ 1.0,
429
+ 1.0,
430
+ 1.0,
431
+ 1.0,
432
+ 1.0,
433
+ 1.0,
434
+ 1.0,
435
+ 1.5,
436
+ 1.2,
437
+ 2.1,
438
+ 1.8,
439
+ 0.9,
440
+ 1.1,
441
+ 1.3,
442
+ 1.4,
443
+ 1.8,
444
+ 1.4,
445
+ 2.3,
446
+ 2.0,
447
+ 1.2,
448
+ 1.6,
449
+ 1.7,
450
+ 1.9,
451
+ ],
452
+ }
453
+ )
454
+
455
+ # Subset to 2021 or subset to 2023 since that is latest year start to verify
456
+ # we are subsetting to correct year in _format_data_inputs
457
+ query_year = 2021 if year == 2021 else 2023
458
+ formatted_pop_structure = pop_structure.loc[pop_structure["year_start"] == query_year]
459
+ formatted_scalar_data = scalar_data.loc[scalar_data["year_start"] == query_year]
460
+ formatted_scalar_data = formatted_scalar_data.set_index(
461
+ ["sex", "age_start", "age_end", "year_start", "year_end"], drop=True
462
+ )
463
+ formatted_pop_structure = formatted_pop_structure.set_index(
464
+ ["location", "sex", "age_start", "age_end", "year_start", "year_end"]
465
+ )
466
+ scaled_pop = bp.ScaledPopulation("placeholder")
467
+ formatted = scaled_pop._format_data_inputs(pop_structure, scalar_data, year)
468
+ expected = (formatted[0] * formatted[1]).reset_index()
469
+ data = (formatted_pop_structure * formatted_scalar_data).reset_index()
470
+ pd.testing.assert_frame_equal(data, expected)
471
+
472
+
352
473
  def _check_population(simulants, initial_age, step_size, include_sex):
353
474
  assert len(simulants) == len(simulants.age.unique())
354
475
  assert simulants.age.min() > initial_age
@@ -1 +0,0 @@
1
- __version__ = "4.3.5"