Skip to content

Commit 66d43b3

Browse files
Omesh37cwhanse
andauthored
Add test coverage for irradiance.dirint for array and series inputs (#2752)
* BUG: fix dirint KeyError with scalar inputs on pandas >= 2.0 * TST,CHANGELOG: add test and whatsnew entry for dirint scalar fix GH#2751 * BUG: fix dirint KeyError for scalar inputs on pandas >= 2.0 * STY: fix flake8 whitespace and blank line errors * BUG: add test coverage for dirint with array-like inputs GH#2751 * Update pvlib/irradiance.py Co-authored-by: Cliff Hansen <cwhanse@sandia.gov> * Update pvlib/irradiance.py Co-authored-by: Cliff Hansen <cwhanse@sandia.gov> * TST: fix test_dirint_array_inputs to use 2 time points * BUG: raise ValueError in dirint when use_delta_kt_prime=True and len(times)<2 * Update pvlib/irradiance.py Co-authored-by: Cliff Hansen <cwhanse@sandia.gov> * Update pvlib/irradiance.py Co-authored-by: Cliff Hansen <cwhanse@sandia.gov> * Update tests/test_irradiance.py Co-authored-by: Cliff Hansen <cwhanse@sandia.gov> * TST: remove orphaned times_single reference from dirint test * STY: fix line length and blank lines in dirint docstring --------- Co-authored-by: Cliff Hansen <cwhanse@sandia.gov>
1 parent 7929b38 commit 66d43b3

3 files changed

Lines changed: 41 additions & 8 deletions

File tree

docs/sphinx/source/whatsnew/v0.15.2.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ Deprecations
1818

1919
Bug fixes
2020
~~~~~~~~~
21+
* Added test coverage for :py:func:`pvlib.irradiance.dirint` with
22+
``np.array`` and ``pd.Series`` inputs.
23+
(:issue:`2751`, :pull:`2752`)
2124
* Corrects a bug in :py:func:`pvlib.temperature.fuentes`. If inputs were
2225
data type integer, users can expect modeled cell temperature values to
2326
increase slightly.

pvlib/irradiance.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ def _handle_extra_radiation_types(datetime_or_doy, epoch_year):
132132
# a better way to do it.
133133
if isinstance(datetime_or_doy, pd.DatetimeIndex):
134134
to_doy = tools._pandas_to_doy # won't be evaluated unless necessary
135-
def to_datetimeindex(x): return x # noqa: E306
135+
136+
def to_datetimeindex(x):
137+
return x # noqa: E306
136138
to_output = partial(pd.Series, index=datetime_or_doy)
137139
elif isinstance(datetime_or_doy, pd.Timestamp):
138140
to_doy = tools._pandas_to_doy
@@ -146,12 +148,14 @@ def to_datetimeindex(x): return x # noqa: E306
146148
tools._datetimelike_scalar_to_datetimeindex
147149
to_output = tools._scalar_out
148150
elif np.isscalar(datetime_or_doy): # ints and floats of various types
149-
def to_doy(x): return x # noqa: E306
151+
def to_doy(x):
152+
return x # noqa: E306
150153
to_datetimeindex = partial(tools._doy_to_datetimeindex,
151154
epoch_year=epoch_year)
152155
to_output = tools._scalar_out
153156
else: # assume that we have an array-like object of doy
154-
def to_doy(x): return x # noqa: E306
157+
def to_doy(x):
158+
return x # noqa: E306
155159
to_datetimeindex = partial(tools._doy_to_datetimeindex,
156160
epoch_year=epoch_year)
157161
to_output = tools._array_out
@@ -1972,14 +1976,14 @@ def dirint(ghi, solar_zenith, times, pressure=101325., use_delta_kt_prime=True,
19721976
19731977
Returns
19741978
-------
1975-
dni : array-like
1976-
The modeled direct normal irradiance, as provided by the
1977-
DIRINT model. [Wm⁻²]
1979+
dni : pd.Series
1980+
Estimated direct normal irradiance. [Wm⁻²]
19781981
19791982
Notes
19801983
-----
1981-
DIRINT model requires time series data (ie. one of the inputs must
1982-
be a vector of length > 2).
1984+
The DIRINT model was developed for time series data with length > 2.
1985+
The implementation in pvlib assumes the data are periodic which may
1986+
affect the first and last DNI values.
19831987
19841988
References
19851989
----------
@@ -2117,6 +2121,7 @@ def _dirint_bins(times, kt_prime, zenith, w, delta_kt_prime):
21172121
-------
21182122
tuple of kt_prime_bin, zenith_bin, w_bin, delta_kt_prime_bin
21192123
"""
2124+
21202125
# @wholmgren: the following bin assignments use MATLAB's 1-indexing.
21212126
# Later, we'll subtract 1 to conform to Python's 0-indexing.
21222127

tests/test_irradiance.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,6 +1147,31 @@ def test_dirindex_min_cos_zenith_max_zenith():
11471147
assert_series_equal(out, expected)
11481148

11491149

1150+
def test_dirint_array_inputs():
1151+
"""np.array and pd.Series inputs work correctly. GH #2751"""
1152+
times = pd.date_range('2023-06-21 10:00', periods=2, freq='h', tz='UTC')
1153+
1154+
# np.array input → should return pd.Series
1155+
result = irradiance.dirint(
1156+
ghi=np.array([500.0, 400.0]),
1157+
solar_zenith=np.array([45.0, 50.0]),
1158+
times=times,
1159+
use_delta_kt_prime=False
1160+
)
1161+
assert isinstance(result, pd.Series)
1162+
assert result.iloc[0] > 0
1163+
1164+
# pd.Series input → should return pd.Series
1165+
times2 = pd.date_range('2023-06-21 10:00', periods=3, freq='h', tz='UTC')
1166+
result2 = irradiance.dirint(
1167+
ghi=pd.Series([400, 500, 300], index=times2),
1168+
solar_zenith=pd.Series([50, 40, 60], index=times2),
1169+
times=times2
1170+
)
1171+
assert isinstance(result2, pd.Series)
1172+
assert (result2 >= 0).all()
1173+
1174+
11501175
def test_dni():
11511176
ghi = pd.Series([90, 100, 100, 100, 100])
11521177
dhi = pd.Series([100, 90, 50, 50, 50])

0 commit comments

Comments
 (0)