Skip to content

Commit dbdb28c

Browse files
authored
Fix SSMIS configs (#218)
* 👽 Fix type signature of DoublingFilter.forward_transform * ✨ Add a new NaN-to-num filter to remove NaNs * 🐛 Apply NaN filtering to SSMIS datasets to avoid NaNs in input/target
1 parent f1c67f6 commit dbdb28c

7 files changed

Lines changed: 66 additions & 17 deletions

icenet_mp/config/data/datasets/full_sicnorth_ssmis_25k_1979_2024_24h_v1.yaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,5 +353,10 @@ full-sicnorth-ssmis-25k-1979-2024-24h-v1:
353353
offset: 0.0
354354
param: total_standard_uncertainty
355355

356-
statistics:
357-
allow_nans: [algorithm_standard_uncertainty]
356+
# Replace NaNs with 0 for concentration variables and 99 for uncertainty variables
357+
- nan_to_num:
358+
variables: [ice_conc, raw_ice_conc_values]
359+
replace_with: 0.0
360+
- nan_to_num:
361+
variables: [algorithm_standard_uncertainty, smearing_standard_uncertainty, total_standard_uncertainty]
362+
replace_with: 99

icenet_mp/config/data/datasets/full_sicsouth_ssmis_25k_1979_2024_24h_v1.yaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -764,5 +764,10 @@ full-sicsouth-ssmis-25k-1979-2024-24h-v1:
764764
offset: 0.0
765765
param: total_standard_uncertainty
766766

767-
statistics:
768-
allow_nans: [algorithm_standard_uncertainty]
767+
# Replace NaNs with 0 for concentration variables and 99 for uncertainty variables
768+
- nan_to_num:
769+
variables: [ice_conc, raw_ice_conc_values]
770+
replace_with: 0.0
771+
- nan_to_num:
772+
variables: [algorithm_standard_uncertainty, smearing_standard_uncertainty, total_standard_uncertainty]
773+
replace_with: 99

icenet_mp/config/data/datasets/samp_sicnorth_ssmis_25k_2017_2019_24h_v1.yaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,10 @@ samp-sicnorth-ssmis-25k-2017-2019-24h-v1:
5353
offset: 0.0
5454
param: total_standard_uncertainty
5555

56-
statistics:
57-
allow_nans: [algorithm_standard_uncertainty]
56+
# Replace NaNs with 0 for concentration variables and 99 for uncertainty variables
57+
- nan_to_num:
58+
variables: [ice_conc, raw_ice_conc_values]
59+
replace_with: 0.0
60+
- nan_to_num:
61+
variables: [algorithm_standard_uncertainty, smearing_standard_uncertainty, total_standard_uncertainty]
62+
replace_with: 99

icenet_mp/config/data/datasets/samp_sicsouth_ssmis_25k_2017_2019_24h_v1.yaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,10 @@ samp-sicsouth-ssmis-25k-2017-2019-24h-v1:
5353
offset: 0.0
5454
param: total_standard_uncertainty
5555

56-
statistics:
57-
allow_nans: [algorithm_standard_uncertainty]
56+
# Replace NaNs with 0 for concentration variables and 99 for uncertainty variables
57+
- nan_to_num:
58+
variables: [ice_conc, raw_ice_conc_values]
59+
replace_with: 0.0
60+
- nan_to_num:
61+
variables: [algorithm_standard_uncertainty, smearing_standard_uncertainty, total_standard_uncertainty]
62+
replace_with: 99

icenet_mp/data_processors/filters/__init__.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,25 @@
33
from anemoi.transform.filters import filter_registry
44

55
from .doubling_filter import DoublingFilter
6+
from .nan_to_num import NanToNum
67

78
logger = logging.getLogger(__name__)
89

910

1011
def register_filters() -> None:
1112
"""Register all filters with anemoi-transform."""
12-
if "doubling_filter" not in filter_registry.registered:
13-
filter_registry.register("doubling_filter", DoublingFilter)
14-
logger.debug("Registered DoublingFilter with anemoi-transform.")
13+
filters = {
14+
"doubling_filter": DoublingFilter,
15+
"nan_to_num": NanToNum,
16+
}
17+
for filter_name, filter_class in filters.items():
18+
if filter_name not in filter_registry.registered:
19+
filter_registry.register(filter_name, filter_class)
20+
logger.debug("Registered %s with anemoi-transform.", filter_class.__name__)
1521

1622

1723
__all__ = [
1824
"DoublingFilter",
25+
"NanToNum",
1926
"register_filters",
2027
]

icenet_mp/data_processors/filters/doubling_filter.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@ def __init__(
1616
self.input_field = input_field
1717
self.output_field = output_field
1818

19-
def forward_transform(self, input_field: ekd.Field) -> Iterator[ekd.Field]:
20-
"""An example forward transform that doubles the input field as a new field."""
21-
yield input_field
22-
yield self.new_field_from_numpy(
23-
input_field.to_numpy() * 2, template=input_field, param=self.output_field
24-
)
19+
def forward_transform(self, *input_fields: ekd.Field) -> Iterator[ekd.Field]:
20+
"""A forward transform that doubles the input field as a new field."""
21+
for input_field in input_fields:
22+
yield input_field
23+
yield self.new_field_from_numpy(
24+
input_field.to_numpy() * 2,
25+
template=input_field,
26+
param=self.output_field,
27+
)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"""Filter that replaces all NaN values in the 'variables' list with the 'replace_with' value."""
2+
3+
import earthkit.data as ekd
4+
import numpy as np
5+
from anemoi.transform.filter import SingleFieldFilter
6+
7+
8+
class NanToNum(SingleFieldFilter):
9+
required_inputs = ("variables", "replace_with")
10+
11+
def forward_select(self) -> dict[str, str | list[str] | tuple[str]]:
12+
"""Select which fields to transform."""
13+
return {"param": list(self.variables)}
14+
15+
def forward_transform(self, field: ekd.Field) -> ekd.Field:
16+
"""A forward transform that replaces NaNs in the input field with 'replace_with'."""
17+
return self.new_field_from_numpy(
18+
np.nan_to_num(field.to_numpy(), nan=self.replace_with), template=field
19+
)

0 commit comments

Comments
 (0)