Skip to content

Commit 1688641

Browse files
Evelyn-MValentinGebhartpeanutfun
authored
1127 - Forecast base class init (#1167)
* define base class * add init test * Fix #1127 --------- Co-authored-by: Valentin Gebhart <[email protected]> Co-authored-by: Lukas Riedel <[email protected]>
1 parent abafba4 commit 1688641

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

climada/util/forecast.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,40 @@
1919
Define Forecast base class.
2020
"""
2121

22+
import numpy as np
23+
2224

2325
class Forecast:
24-
pass
26+
"""Mixin class for forecast data.
27+
28+
Attributes
29+
----------
30+
lead_time : np.ndarray
31+
Array of forecast lead times, given as datetime64 objects.
32+
Represents the time points for which forecasts are made.
33+
member : np.ndarray
34+
Array of ensemble member identifiers, given as integers.
35+
Represents different forecast ensemble members.
36+
"""
37+
38+
def __init__(
39+
self,
40+
lead_time: np.ndarray | None = None,
41+
member: np.ndarray | None = None,
42+
**kwargs,
43+
):
44+
"""Initialize Forecast.
45+
46+
Parameters
47+
----------
48+
lead_time : np.ndarray or None, optional
49+
Forecast lead times. Default is empty array.
50+
member : np.ndarray or None, optional
51+
Ensemble member identifiers. Default is empty array.
52+
"""
53+
54+
self.lead_time = (
55+
np.asarray(lead_time) if lead_time is not None else np.array([])
56+
)
57+
self.member = np.asarray(member) if member is not None else np.array([])
58+
super().__init__(**kwargs)

climada/util/test/test_forecast.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,35 @@
1818
1919
Tests for Forecast base class.
2020
"""
21+
22+
import numpy as np
23+
import numpy.testing as npt
24+
25+
from climada.util.forecast import Forecast
26+
27+
28+
def test_forecast_init():
29+
"""Test initialization of Forecast class."""
30+
forecast = Forecast()
31+
npt.assert_array_equal(forecast.lead_time, np.array([]))
32+
npt.assert_array_equal(forecast.member, np.array([]))
33+
34+
forecast = Forecast(member=np.array([1, 2]))
35+
npt.assert_array_equal(forecast.member, np.array([1, 2]), strict=True)
36+
37+
forecast = Forecast(lead_time=np.array([1, 2]))
38+
npt.assert_array_equal(forecast.lead_time, np.array([1, 2]), strict=True)
39+
40+
forecast = Forecast(lead_time=np.array([1, 2]), member=[3, 4])
41+
npt.assert_array_equal(forecast.lead_time, np.array([1, 2]), strict=True)
42+
npt.assert_array_equal(forecast.member, np.array([3, 4]), strict=True)
43+
assert isinstance(forecast.member, np.ndarray)
44+
45+
# Test with datetime64 including seconds
46+
lead_times_seconds = np.array(
47+
["2024-01-01T00:00:00", "2024-01-01T00:01:00", "2024-01-01"],
48+
dtype="datetime64[s]",
49+
)
50+
forecast = Forecast(lead_time=lead_times_seconds, member=[1, 2, 3])
51+
npt.assert_array_equal(forecast.lead_time, lead_times_seconds, strict=True)
52+
assert forecast.lead_time.dtype == np.dtype("datetime64[s]")

0 commit comments

Comments
 (0)