diff --git a/resources/healthsystem/consumables/README.md b/resources/healthsystem/consumables/README.md new file mode 100644 index 0000000000..c6b25451de --- /dev/null +++ b/resources/healthsystem/consumables/README.md @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8caacbfcbf94df4a24a2bba66a71bf8f89514527dd32409a2e9d3bc69e177bfe +size 3913 diff --git a/resources/healthsystem/consumables/ResourceFile_Consumables_Item_Designations.csv b/resources/healthsystem/consumables/ResourceFile_Consumables_Item_Designations.csv index ace9042583..15f536d3f4 100644 --- a/resources/healthsystem/consumables/ResourceFile_Consumables_Item_Designations.csv +++ b/resources/healthsystem/consumables/ResourceFile_Consumables_Item_Designations.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c953a6136e61fe55181e477e6c1425ec010ac55b180351f0f466da2c2eb0d379 -size 67854 +oid sha256:79aafe10ade632b4eb487fefa572093a63c39b5cb56322c31619958242e2db8c +size 72269 diff --git a/resources/healthsystem/consumables/ResourceFile_Consumables_availability_small.csv b/resources/healthsystem/consumables/ResourceFile_Consumables_availability_small.csv index 19ab070507..f0bccc067a 100644 --- a/resources/healthsystem/consumables/ResourceFile_Consumables_availability_small.csv +++ b/resources/healthsystem/consumables/ResourceFile_Consumables_availability_small.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8bf105eb266c173feaef4068d100af4ea51f2542c3cac9505a704abade360820 -size 6202574 +oid sha256:a3be2545bbabbdf743359f08d6939c4f10ce06095ff58d90a0816c76b9568216 +size 55658733 diff --git a/resources/healthsystem/consumables/ResourceFile_consumables_matched.csv b/resources/healthsystem/consumables/ResourceFile_consumables_matched.csv index 703faf4549..3c1b4d92a0 100644 --- a/resources/healthsystem/consumables/ResourceFile_consumables_matched.csv +++ b/resources/healthsystem/consumables/ResourceFile_consumables_matched.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:793e3b2a94949fdf025bb5297de40a0092c41ad61f6fa0a4de4898de5cfdf2f3 -size 90677 +oid sha256:380de2593127b48c6a43f14be6c55bf5c4f78a609b843e4cb66b8066ef7f9399 +size 124792 diff --git a/src/tlo/methods/consumables.py b/src/tlo/methods/consumables.py index e51a95fe74..f1d2758613 100644 --- a/src/tlo/methods/consumables.py +++ b/src/tlo/methods/consumables.py @@ -56,6 +56,9 @@ def __init__(self, self._is_unknown_item_available = None # Whether an unknown item is available, by facility_id self._not_recognised_item_codes = defaultdict(set) # The item codes requested but which are not recognised. + # Save data + self._availability_data = availability_data + # Save designations self._item_code_designations = item_code_designations @@ -96,14 +99,21 @@ def _update_prob_item_codes_available(self, availability: str): overriding the availability of specific consumables.""" # Load the original read-in data (create copy so that edits do change the original) - self._prob_item_codes_available = self._processed_consumables_data.copy() + _, self._prob_item_codes_available = self._process_consumables_data( + availability_data=self._availability_data, + availability=availability + ) # Load designations of the consumables item_code_designations = self._item_code_designations # Over-ride the data according to option for `availability` - if availability == 'default': - pass + if availability in ('default', + 'scenario1', 'scenario2', 'scenario3', 'scenario4', + 'scenario5', 'scenario6', 'scenario7', 'scenario8', + 'scenario9', 'scenario10', 'scenario11', 'scenario12', + 'scenario13', 'scenario14', 'scenario15'): + pass # change already picked up in `self._process_consumables_data()` elif availability == 'all': self.override_availability(dict(zip(self.item_codes, repeat(1.0)))) elif availability == 'none': @@ -134,16 +144,27 @@ def _update_prob_item_codes_available(self, availability: str): else: raise ValueError - def _process_consumables_data(self, availability_data: pd.DataFrame) -> Tuple[set, pd.Series]: + def _process_consumables_data(self, availability_data: pd.DataFrame, availability: str) -> Tuple[set, pd.Series]: """Helper function for processing the consumables data, passed in here as pd.DataFrame that has been read-in by the HealthSystem. Returns: (i) the set of all recognised item_codes; (ii) pd.Series of the availability of each consumable at each facility_id during each month. """ - return ( - set(availability_data.item_code), - availability_data.set_index(['month', 'Facility_ID', 'item_code'])['available_prop'] - ) + assert availability is not None, "This argument cannot be None." + + if availability in ('scenario1', 'scenario2', 'scenario3', 'scenario4', + 'scenario5', 'scenario6', 'scenario7', 'scenario8', + 'scenario9', 'scenario10', 'scenario11', 'scenario12', + 'scenario13', 'scenario14', 'scenario15',): + return ( + set(availability_data.item_code), + availability_data.set_index(['month', 'Facility_ID', 'item_code'])['available_prop_' + availability] + ) + else: + return ( + set(availability_data['item_code']), + availability_data.set_index(['month', 'Facility_ID', 'item_code'])['available_prop'] + ) def _refresh_availability_of_consumables(self, date: datetime.datetime): """Update the availability of all items based on the data for the probability of availability, given the current diff --git a/tests/test_consumables.py b/tests/test_consumables.py index 92040b6578..caf9eaf048 100644 --- a/tests/test_consumables.py +++ b/tests/test_consumables.py @@ -650,7 +650,12 @@ def test_consumables_availability_modes_that_depend_on_designations(seed): target_items = items_drug_or_vaccine elif availability == 'none': target_items = set() - elif availability == 'default': + elif availability in ('default', + 'scenario1', 'scenario2', 'scenario3', 'scenario4', + 'scenario5', 'scenario6', 'scenario7', 'scenario8', + 'scenario9', 'scenario10', 'scenario11', 'scenario12', + 'scenario13', 'scenario14', 'scenario15', + ): continue else: raise ValueError(f'Unexpected availability: {availability}')