Skip to content

Commit 4048fe8

Browse files
authored
Merge pull request #99 from emiliom/transect-select-bug
Fix transect subset selection bug and increment version for new release
2 parents afb5e4d + 0201c1a commit 4048fe8

3 files changed

Lines changed: 70 additions & 11 deletions

File tree

EchoPro/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
__all__ = ["Survey"]
44

5-
__version__ = "0.3.0"
5+
__version__ = "0.3.1"
66

EchoPro/computation/transect_results.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,34 +1233,48 @@ def set_adult_NASC(self) -> None:
12331233
columns=["val"], index=len_age_dist_all_norm.stratum_num, dtype=np.float64
12341234
)
12351235

1236-
for i in len_age_dist_all_norm.stratum_num.values:
1236+
# for stratum in self.all_strata:
1237+
for stratum in len_age_dist_all_norm.stratum_num.values:
12371238
sig_bs_aged_ave = np.sum(
12381239
self.survey.params["sig_b_coef"]
12391240
* np.matmul(
12401241
(self.survey.params["bio_hake_len_bin"] ** 2),
1241-
len_age_dist_all_norm.sel(stratum_num=i).values,
1242+
len_age_dist_all_norm.sel(stratum_num=stratum).values,
12421243
)
12431244
)
12441245

12451246
temp = self.survey.params["sig_b_coef"] * np.matmul(
12461247
(self.survey.params["bio_hake_len_bin"] ** 2),
1247-
len_age_dist_all_norm.sel(stratum_num=i).isel(age_bin=0).values,
1248+
len_age_dist_all_norm.sel(stratum_num=stratum).isel(age_bin=0).values,
12481249
)
12491250

12501251
age1_nasc_proportion = temp / sig_bs_aged_ave
12511252

1252-
nasc_fraction_adult_df.loc[i] = abs(1.0 - age1_nasc_proportion)
1253+
nasc_fraction_adult_df.loc[stratum] = abs(1.0 - age1_nasc_proportion)
1254+
1255+
# Identify and populate strata missing in nasc_fraction_adult_df
1256+
# (and therefore in self.bin_ds.len_age_dist_all)
1257+
# based on surrounding strata as pre-allocated in stratum_choices
1258+
# TODO: This scheme actually reflects the simpler implementation from v0.1.0-alpha.
1259+
# Revisit the Matlab code and related missing-stratum handling in this module
1260+
# https://github.com/uw-echospace/EchoPro_matlab/blob/26b939c9c7c0ccbf8828d402e249e1fdf6ed2b5a/general/load_files_parameters/get_historical_strata_data.m#L731-L795 # noqa
1261+
missing_stratum_num = (
1262+
set(self.nasc_df.stratum_num.values) - set(len_age_dist_all_norm.stratum_num.values)
1263+
)
1264+
for stratum in missing_stratum_num:
1265+
nasc_fraction_adult_df.loc[stratum] = (
1266+
nasc_fraction_adult_df.loc[self.stratum_choices[stratum]]['val'].mean()
1267+
)
1268+
# Storing nasc_fraction_adult_df is not required but will be very useful
1269+
# in the interim for ongoing development and testing
1270+
self.nasc_fraction_adult_df = nasc_fraction_adult_df
12531271

1254-
# obtain the adult NASC proportion coefficient for each stratum value
12551272
fraction_adult_stratum_df = nasc_fraction_adult_df.loc[
12561273
self.nasc_df.stratum_num
12571274
].values.flatten()
12581275

1259-
# obtain the NASC for adults
1260-
NASC_adult = self.nasc_df["NASC"] * fraction_adult_stratum_df
1261-
1262-
# assign values to results gdf
1263-
self.transect_results_gdf["NASC_adult"] = NASC_adult
1276+
# Calculate NASC for adults and assign values to results gdf
1277+
self.transect_results_gdf["NASC_adult"] = self.nasc_df["NASC"] * fraction_adult_stratum_df
12641278

12651279
def _construct_results_gdf(self) -> None:
12661280
"""

EchoPro/tests/computation/test_transect_selection.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,55 @@
11
import pytest
22

3+
import math
4+
35
import numpy as np
46
import EchoPro
57
from EchoPro.computation import SemiVariogram as SV
68

79

10+
@pytest.mark.parametrize(["removal_percentage"], [
11+
[38.0], [50.0], [60.0]
12+
])
13+
def test_transects_selection_success(removal_percentage, config_base_path):
14+
# initialize Survey object
15+
survey_2019 = EchoPro.Survey(
16+
init_file_path=config_base_path / 'initialization_config.yml',
17+
survey_year_file_path=config_base_path / 'survey_year_2019_config.yml',
18+
source=3,
19+
exclude_age1=True
20+
)
21+
22+
# load all data
23+
survey_2019.load_survey_data()
24+
25+
# obtain all unique transects in nasc_df
26+
unique_transects = survey_2019.nasc_df.index.unique().values
27+
28+
# determine the number of transects that should be selected
29+
num_sel_transects = math.floor(len(unique_transects) * (1.0 - removal_percentage / 100.0))
30+
31+
# initialize the random number generator object and fix the seed
32+
rng = np.random.default_rng(seed=1234)
33+
34+
num_iterations = 5
35+
for iteration in range(num_iterations):
36+
# randomly select transects without replacement
37+
selected_transects = list(rng.choice(unique_transects, num_sel_transects, replace=False))
38+
39+
print("Iteration #", iteration, len(selected_transects))
40+
41+
# compute all transect variables
42+
survey_2019.compute_transect_results(selected_transects=selected_transects)
43+
44+
nasc_fraction_adult_df_set = set(survey_2019.bio_calc.nasc_fraction_adult_df.index)
45+
nasc_stratum_num_set = set(survey_2019.bio_calc.nasc_df.stratum_num.unique())
46+
47+
# This test is intended mainly to verify that survey_2019.compute_transect_results
48+
# runs successfully. Not sure what other assertion test would be better
49+
assert nasc_stratum_num_set <= nasc_fraction_adult_df_set
50+
# assert nasc_stratum_num_set <= nasc_fraction_adult_df_set | {0}
51+
52+
853
def test_transect_selection_output(config_base_path):
954
# initialize Survey object
1055
survey_2019 = EchoPro.Survey(

0 commit comments

Comments
 (0)