Skip to content

Commit 242830c

Browse files
committed
BUG: add test coverage for dirint with array-like inputs GH#2751
1 parent fe8055c commit 242830c

3 files changed

Lines changed: 18 additions & 30 deletions

File tree

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ Deprecations
1414

1515
Bug fixes
1616
~~~~~~~~~
17-
* Fixed :py:func:`pvlib.irradiance.dirint` raising ``KeyError`` with
18-
scalar inputs on pandas >= 2.0. (:pull:`2752`, :issue:`2751`)
19-
By :ghuser:`Omesh37`.
17+
* Added test coverage for :py:func:`pvlib.irradiance.dirint` with
18+
``np.array`` and ``pd.Series`` inputs.
19+
(:issue:`2751`, :pull:`2752`)
2020
* Corrects a bug in :py:func:`pvlib.temperature.fuentes`. If inputs were
2121
data type integer, users can expect modeled cell temperature values to
2222
increase slightly.

pvlib/irradiance.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1927,10 +1927,10 @@ def dirint(ghi, solar_zenith, times, pressure=101325., use_delta_kt_prime=True,
19271927
19281928
Parameters
19291929
----------
1930-
ghi : numeric
1930+
ghi : array-like
19311931
Global horizontal irradiance. See :term:`ghi`. [Wm⁻²]
19321932
1933-
solar_zenith : numeric
1933+
solar_zenith : array-like
19341934
True (not refraction-corrected) solar zenith angles. See
19351935
:term:`solar_zenith`. [°]
19361936
@@ -1964,7 +1964,7 @@ def dirint(ghi, solar_zenith, times, pressure=101325., use_delta_kt_prime=True,
19641964
19651965
Returns
19661966
-------
1967-
dni : numeric or pd.Series
1967+
dni : pd.Series
19681968
Estimated direct normal irradiance. Returns float if all inputs
19691969
are scalar, pd.Series otherwise. [Wm⁻²]
19701970
@@ -1983,7 +1983,6 @@ def dirint(ghi, solar_zenith, times, pressure=101325., use_delta_kt_prime=True,
19831983
Global Horizontal to Direct Normal Insolation", Technical Report No.
19841984
SERI/TR-215-3087, Golden, CO: Solar Energy Research Institute, 1987.
19851985
"""
1986-
scalar_input = np.isscalar(solar_zenith)
19871986

19881987
disc_out = disc(ghi, solar_zenith, times, pressure=pressure,
19891988
min_cos_zenith=min_cos_zenith, max_zenith=max_zenith)
@@ -2002,8 +2001,6 @@ def dirint(ghi, solar_zenith, times, pressure=101325., use_delta_kt_prime=True,
20022001
# Perez eqn 5
20032002
dni = disc_out['dni'] * dirint_coeffs
20042003

2005-
if scalar_input:
2006-
return float(dni.iloc[0])
20072004
return dni
20082005

20092006

@@ -2115,10 +2112,6 @@ def _dirint_bins(times, kt_prime, zenith, w, delta_kt_prime):
21152112
# Ensure scalar inputs are converted to Series so that boolean masks
21162113
# produce a boolean Series rather than a scalar bool.
21172114
# Scalar bools cause KeyError in pandas >= 2.0. GH #XXXX
2118-
kt_prime = pd.Series(kt_prime, index=times, dtype=float)
2119-
zenith = pd.Series(zenith, index=times, dtype=float)
2120-
w = pd.Series(w, index=times, dtype=float)
2121-
delta_kt_prime = pd.Series(delta_kt_prime, index=times, dtype=float)
21222115

21232116
# @wholmgren: the following bin assignments use MATLAB's 1-indexing.
21242117
# Later, we'll subtract 1 to conform to Python's 0-indexing.

tests/test_irradiance.py

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,34 +1140,29 @@ def test_dirindex_min_cos_zenith_max_zenith():
11401140
assert_series_equal(out, expected)
11411141

11421142

1143-
def test_dirint_scalar_inputs():
1144-
"""Scalar numeric inputs return scalar float output. GH #2751"""
1143+
def test_dirint_array_inputs():
1144+
"""np.array inputs work correctly. GH #2751"""
11451145
times = pd.DatetimeIndex(['2023-06-21 12:00'], tz='UTC')
11461146

1147-
# scalar int input → should return float (not Series)
1147+
# np.array input (1-element) -- return pd.Series
11481148
result = irradiance.dirint(
1149-
ghi=500, solar_zenith=45, times=times
1150-
)
1151-
assert np.isscalar(result), "scalar input should return scalar output"
1152-
assert isinstance(result, float)
1153-
1154-
# scalar float with delta_kt_prime disabled → non-NaN value check
1155-
result = irradiance.dirint(
1156-
ghi=500.0, solar_zenith=45.0, times=times,
1149+
ghi=np.array([500.0]),
1150+
solar_zenith=np.array([45.0]),
1151+
times=times,
11571152
use_delta_kt_prime=False
11581153
)
1159-
assert np.isscalar(result)
1160-
assert isinstance(result, float)
1161-
assert result > 0 # should be positive DNI
1154+
assert isinstance(result, pd.Series)
1155+
assert result.iloc[0] > 0
11621156

1163-
# Series input → should still return Series (regression check)
1157+
# pd.Series input -- return pd.Series
11641158
times2 = pd.date_range('2023-06-21 10:00', periods=3, freq='h', tz='UTC')
1165-
result_series = irradiance.dirint(
1159+
result2 = irradiance.dirint(
11661160
ghi=pd.Series([400, 500, 300], index=times2),
11671161
solar_zenith=pd.Series([50, 40, 60], index=times2),
11681162
times=times2
11691163
)
1170-
assert isinstance(result_series, pd.Series)
1164+
assert isinstance(result2, pd.Series)
1165+
assert (result2 >= 0).all()
11711166

11721167

11731168
def test_dni():

0 commit comments

Comments
 (0)