Skip to content

Commit e22ee66

Browse files
committed
add jit compiling and make lower level filter method
1 parent 925f654 commit e22ee66

2 files changed

Lines changed: 16 additions & 18 deletions

File tree

python/events/src/hydrotools/events/baseflow/eckhardt.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import numpy as np
2626
import numpy.typing as npt
27+
from numba import jit, float64
2728

2829
def linear_recession_analysis(
2930
series: npt.ArrayLike,
@@ -67,8 +68,9 @@ def maximum_baseflow_analysis(
6768
"""
6869
return 0.5
6970

71+
@jit(float64[:](float64[:], float64, float64), nogil=True)
7072
def separate_baseflow(
71-
series: npt.ArrayLike,
73+
series: npt.NDArray,
7274
recession_constant: float,
7375
maximum_baseflow_index: float
7476
) -> npt.NDArray:
@@ -77,8 +79,8 @@ def separate_baseflow(
7779
7880
Parameters
7981
----------
80-
series: array-like, required
81-
An array of streamflow values. Assumes first value in series is baseflow.
82+
series: array-type, required
83+
A numpy array of streamflow values. Assumes first value in series is baseflow.
8284
recession_constant: float, required
8385
Linear reservoir recession constant, a, from Eckhardt (2005, 2008).
8486
maximum_baseflow_index: float
@@ -96,10 +98,10 @@ def separate_baseflow(
9698

9799
# Instantiate baseflow series
98100
# Assume first value is baseflow
99-
streamflow = np.asarray(series)
100-
baseflow = np.empty(len(series))
101-
baseflow[0] = streamflow[0]
102-
for i in range(1, len(series)):
103-
baseflow[i] = A * baseflow[i-1] + B * streamflow[i]
101+
baseflow = np.empty(series.size)
102+
baseflow[0] = series[0]
104103

105-
return np.minimum(baseflow, streamflow)
104+
# Apply filter and return result
105+
for i in range(1, len(series)):
106+
baseflow[i] = min(series[i], A * baseflow[i-1] + B * series[i])
107+
return baseflow

python/events/tests/test_baseflow.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,12 @@ def test_maximum_baseflow_analysis():
1818

1919
def test_separate_baseflow():
2020
rng = np.random.default_rng()
21-
s = rng.normal(100.0, 10.0, 1000)
21+
s = rng.normal(100.0, 10.0, 100)
2222

2323
# Test numpy
24+
from time import perf_counter
25+
start = perf_counter()
2426
b = bf.separate_baseflow(s, 0.9, 0.5)
25-
assert b[0] == s[0]
26-
27-
# Test list
28-
b = bf.separate_baseflow(s.tolist(), 0.9, 0.5)
29-
assert b[0] == s[0]
30-
31-
# Test pandas
32-
b = bf.separate_baseflow(pd.Series(s), 0.9, 0.5)
27+
end = perf_counter()
28+
print(f"{end-start:.6f} s")
3329
assert b[0] == s[0]

0 commit comments

Comments
 (0)