Skip to content

Commit 9d6fef9

Browse files
add idx boolean selection for member and leadtime (#1183)
* add idx boolean selection for member and leadtime * Add test for weird data types --------- Co-authored-by: Lukas Riedel <[email protected]>
1 parent 6a156ac commit 9d6fef9

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

climada/util/forecast.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,35 @@ def __init__(
5656
)
5757
self.member = np.asarray(member) if member is not None else np.array([])
5858
super().__init__(**kwargs)
59+
60+
def idx_member(self, member: np.ndarray) -> np.ndarray:
61+
"""Return boolean array where self.member == member using numpy.isin()
62+
63+
Parameters
64+
----------
65+
member : np.ndarray
66+
Array of ensemble members (ints) for which to return an indexer
67+
68+
Returns
69+
-------
70+
np.ndarray
71+
Boolean array where self.member is in member.
72+
"""
73+
74+
return np.isin(self.member, member)
75+
76+
def idx_lead_time(self, lead_time: np.ndarray) -> np.ndarray:
77+
"""Return boolean array where self.lead_time == lead_time using numpy.isin()
78+
79+
Parameters
80+
----------
81+
lead_time : np.ndarray
82+
Array of lead times (numpy.timedelta64) for which to return an indexer
83+
84+
Returns
85+
-------
86+
np.ndarray
87+
Boolean array where self.lead_time is in lead_time.
88+
"""
89+
90+
return np.isin(self.lead_time, lead_time)

climada/util/test/test_forecast.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,46 @@ def test_forecast_init():
5050
forecast = Forecast(lead_time=lead_times_seconds, member=[1, 2, 3])
5151
npt.assert_array_equal(forecast.lead_time, lead_times_seconds, strict=True)
5252
assert forecast.lead_time.dtype == np.dtype("timedelta64[ns]")
53+
54+
55+
def test_idx_member():
56+
"""Test idx_member method of Forecast class."""
57+
forecast = Forecast(member=np.array([1, 2, 3, 4]))
58+
59+
idx = forecast.idx_member(1)
60+
npt.assert_array_equal(idx, np.array([True, False, False, False]), strict=True)
61+
62+
idx = forecast.idx_member(np.array([2, 4]))
63+
npt.assert_array_equal(idx, np.array([False, True, False, True]), strict=True)
64+
65+
idx = forecast.idx_member([2, 4])
66+
npt.assert_array_equal(idx, np.array([False, True, False, True]), strict=True)
67+
68+
idx = forecast.idx_member(None)
69+
npt.assert_array_equal(idx, np.array([False, False, False, False]), strict=True)
70+
71+
# Try once with inconsitent types
72+
forecast = Forecast(member=np.array(["1", -2, np.nan]))
73+
npt.assert_array_equal(
74+
forecast.idx_member([np.nan, "1"]), np.array([True, False, True]), strict=True
75+
)
76+
77+
78+
def test_idx_lead_time():
79+
"""Test idx_lead_time method of Forecast class."""
80+
forecast = Forecast(
81+
lead_time=pd.timedelta_range(start="1 day", periods=4).to_numpy()
82+
)
83+
84+
idx = forecast.idx_lead_time(
85+
pd.timedelta_range(start="1 day", periods=4).to_numpy()[::2]
86+
)
87+
npt.assert_array_equal(idx, np.array([True, False, True, False]), strict=True)
88+
89+
idx = forecast.idx_lead_time(
90+
pd.timedelta_range(start="1 day", periods=4).to_numpy()[0]
91+
)
92+
npt.assert_array_equal(idx, np.array([True, False, False, False]), strict=True)
93+
94+
idx = forecast.idx_lead_time(None)
95+
npt.assert_array_equal(idx, np.array([False, False, False, False]), strict=True)

0 commit comments

Comments
 (0)