Skip to content

Commit 9c89b3d

Browse files
committed
Merge branch 'main' into king-deprecation
2 parents 4044ac5 + 35c9e61 commit 9c89b3d

12 files changed

Lines changed: 123 additions & 149 deletions

File tree

.github/CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
Contributing
22
============
33

4-
We welcome your contributions! Please see the [contributing](http://pvlib-python.readthedocs.io/en/latest/contributing.html) page for information about how to contribute.
4+
We welcome your contributions! Please see the [contributing](https://pvlib-python.readthedocs.io/en/stable/contributing/index.html) page for information about how to contribute.

docs/examples/system-models/oedi_9068.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"""
88
# %%
99
# This example model uses satellite-based solar resource data from the
10-
# NSRDB PSM3. This approach is useful for pre-construction energy modeling
10+
# NSRDB PSM4. This approach is useful for pre-construction energy modeling
1111
# and in retrospective analyses where the system’s own irradiance
1212
# measurements are not present or unreliable.
1313
#
@@ -135,17 +135,18 @@
135135
#
136136
# The system does have measured plane-of-array irradiance data, but the
137137
# measurements suffer from row-to-row shading and tracker stalls. In this
138-
# example, we will use weather data taken from the NSRDB PSM3 for the year
138+
# example, we will use weather data taken from the NSRDB PSM4 for the year
139139
# 2019.
140140

141141
api_key = 'DEMO_KEY'
142142
email = 'your_email@domain.com'
143143

144144
keys = ['ghi', 'dni', 'dhi', 'temp_air', 'wind_speed',
145145
'albedo', 'precipitable_water']
146-
psm3, psm3_metadata = pvlib.iotools.get_nsrdb_psm4_conus(latitude, longitude,
146+
psm4, psm4_metadata = pvlib.iotools.get_nsrdb_psm4_conus(latitude, longitude,
147147
api_key, email,
148-
year=2019, interval=5,
148+
year=2019,
149+
time_step=5,
149150
parameters=keys,
150151
map_variables=True,
151152
leap_day=True)
@@ -167,20 +168,20 @@
167168
# module fraction and returns the average irradiance over the total module
168169
# surface.
169170

170-
solar_position = location.get_solarposition(psm3.index)
171+
solar_position = location.get_solarposition(psm4.index)
171172
tracker_angles = mount.get_orientation(
172173
solar_position['apparent_zenith'],
173174
solar_position['azimuth']
174175
)
175-
dni_extra = pvlib.irradiance.get_extra_radiation(psm3.index)
176+
dni_extra = pvlib.irradiance.get_extra_radiation(psm4.index)
176177

177178
# note: this system is monofacial, so only calculate irradiance for the
178179
# front side:
179180
averaged_irradiance = pvlib.bifacial.infinite_sheds.get_irradiance_poa(
180181
tracker_angles['surface_tilt'], tracker_angles['surface_azimuth'],
181182
solar_position['apparent_zenith'], solar_position['azimuth'],
182183
gcr, axis_height, pitch,
183-
psm3['ghi'], psm3['dhi'], psm3['dni'], psm3['albedo'],
184+
psm4['ghi'], psm4['dhi'], psm4['dni'], psm4['albedo'],
184185
model='haydavies', dni_extra=dni_extra,
185186
)
186187

@@ -191,14 +192,14 @@
191192

192193
cell_temperature_steady_state = pvlib.temperature.faiman(
193194
poa_global=averaged_irradiance['poa_global'],
194-
temp_air=psm3['temp_air'],
195-
wind_speed=psm3['wind_speed'],
195+
temp_air=psm4['temp_air'],
196+
wind_speed=psm4['wind_speed'],
196197
**temperature_model_parameters,
197198
)
198199

199200
cell_temperature = pvlib.temperature.prilliman(
200201
cell_temperature_steady_state,
201-
psm3['wind_speed'],
202+
psm4['wind_speed'],
202203
unit_mass=module_unit_mass
203204
)
204205

@@ -215,7 +216,7 @@
215216
'poa_direct': averaged_irradiance['poa_direct'],
216217
'poa_diffuse': averaged_irradiance['poa_diffuse'],
217218
'cell_temperature': cell_temperature,
218-
'precipitable_water': psm3['precipitable_water'], # for the spectral model
219+
'precipitable_water': psm4['precipitable_water'], # for the spectral model
219220
})
220221
model.run_model_from_poa(weather_inputs)
221222

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@ Bug fixes
2121

2222
Enhancements
2323
~~~~~~~~~~~~
24+
* Ensure all timezones are available in all OSs. (:issue:`2795`, :pull:`2809`)
2425

2526

2627
Documentation
2728
~~~~~~~~~~~~~
29+
* Fix broken link in GitHub Contributing tab. (:issue:`2628`, :pull:`2806`)
30+
* Fixed broken ``interval`` keyword argument in the ``oedi_9068`` gallery
31+
example; the correct parameter name is ``time_step``. (:issue:`2791`)
2832

2933

3034
Testing
@@ -41,8 +45,14 @@ Requirements
4145

4246
Maintenance
4347
~~~~~~~~~~~
48+
* Removed unused internal function ``clearsky._is_leap_year`` (:issue:`2768`, :pull:`2813`)
49+
* Fix documentation builds on runner images lacking link-type timezones. (:issue:`2795`, :pull:`2809`)
4450

4551

4652
Contributors
4753
~~~~~~~~~~~~
48-
54+
* Eesh Saxena (:ghuser:`eeshsaxena`)
55+
* Karl Hill (:ghuser:`karlhillx`)
56+
* Mathias Aschwanden (:ghuser:`maschwanden`)
57+
* Yonry Zhu (:ghuser:`yonryzhu`)
58+
* Darshan Gowda (:ghuser:`dgowdaan-cmyk`)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
.. _whatsnew_0_16_0:
2+
3+
4+
v0.16.0
5+
Breaking Changes
6+
~~~~~~~~~~~~~~~~
7+
* Change output type of :py:func:`pvlib.irradiance.perez` and
8+
:py:func:`pvlib.irradiance.perez_driesse` from ``OrderedDict`` to ``dict`` when
9+
``return_components=True`` to be consistent with other models.
10+
(:pull:`2789`)
11+
* Remove empty ``poa_horizon`` key from the ``diffuse_components`` output of
12+
:py:func:`pvlib.irradiance.haydavies`.
13+
(:pull:`2788`)
14+
15+
16+
Deprecations
17+
~~~~~~~~~~~~
18+
19+
20+
Bug fixes
21+
~~~~~~~~~
22+
23+
24+
Enhancements
25+
~~~~~~~~~~~~
26+
27+
28+
Documentation
29+
~~~~~~~~~~~~~
30+
31+
32+
Testing
33+
~~~~~~~
34+
35+
36+
Benchmarking
37+
~~~~~~~~~~~~
38+
39+
40+
Requirements
41+
~~~~~~~~~~~~
42+
43+
44+
Maintenance
45+
~~~~~~~~~~~
46+
47+
48+
Contributors
49+
~~~~~~~~~~~~
50+
* Carolina Crespo (:ghuser:`cbcrespo`)

pvlib/bifacial/infinite_sheds.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,6 @@ def _poa_sky_diffuse_pv(dhi, gcr, surface_tilt):
4545
Integrated view factors from the shaded and unshaded parts of
4646
the row slant height to the sky.
4747
48-
Parameters
49-
----------
50-
f_x : numeric
51-
Fraction of row slant height from the bottom that is shaded from
52-
direct irradiance. [unitless]
53-
surface_tilt : numeric
54-
Surface tilt angle in degrees from horizontal, e.g., surface facing up
55-
= 0, surface facing horizon = 90. [degree]
56-
gcr : float
57-
Ratio of row slant length to row spacing (pitch). [unitless]
58-
npoints : int, default 100
59-
Number of points for integration. [unitless]
60-
6148
A detailed calculation would be
6249
6350
dhi * (f_x * vf_shade_sky_integ + (1 - f_x) * vf_noshade_sky_integ)
@@ -73,9 +60,6 @@ def _poa_sky_diffuse_pv(dhi, gcr, surface_tilt):
7360
7461
Parameters
7562
----------
76-
f_x : numeric
77-
Fraction of row slant height from the bottom that is shaded from
78-
direct irradiance. [unitless]
7963
dhi : numeric
8064
Diffuse horizontal irradiance (DHI). [W/m^2]
8165
gcr : float

pvlib/clearsky.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -220,22 +220,6 @@ def lookup_linke_turbidity(time, latitude, longitude, filepath=None,
220220
return linke_turbidity
221221

222222

223-
def _is_leap_year(year):
224-
"""Determine if a year is leap year.
225-
226-
Parameters
227-
----------
228-
year : numeric
229-
230-
Returns
231-
-------
232-
isleap : array of bools
233-
"""
234-
isleap = ((np.mod(year, 4) == 0) &
235-
((np.mod(year, 100) != 0) | (np.mod(year, 400) == 0)))
236-
return isleap
237-
238-
239223
def _interpolate_turbidity(lts, time):
240224
"""
241225
Interpolated monthly Linke turbidity onto daily values.

pvlib/irradiance.py

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,7 @@ def haydavies(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
787787
788788
Returns
789789
--------
790-
numeric, OrderedDict, or DataFrame
790+
numeric, dict, or DataFrame
791791
Return type controlled by ``return_components`` argument.
792792
If `False`, ``sky_diffuse`` is returned.
793793
If `True`, ``diffuse_components`` is returned.
@@ -796,13 +796,11 @@ def haydavies(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
796796
The sky diffuse component of the solar radiation on a tilted
797797
surface. [Wm⁻²]
798798
799-
diffuse_components : OrderedDict (array input) or DataFrame (Series input)
799+
diffuse_components : dict (array input) or DataFrame (Series input)
800800
Keys/columns are:
801801
* poa_sky_diffuse: Total sky diffuse
802802
* poa_isotropic
803803
* poa_circumsolar
804-
* poa_horizon (always zero, not accounted for by the
805-
Hay-Davies model)
806804
807805
Notes
808806
------
@@ -860,14 +858,11 @@ def haydavies(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
860858
sky_diffuse = poa_isotropic + poa_circumsolar
861859

862860
if return_components:
863-
diffuse_components = OrderedDict()
864-
diffuse_components['poa_sky_diffuse'] = sky_diffuse
865-
866-
# Calculate the individual components
867-
diffuse_components['poa_isotropic'] = poa_isotropic
868-
diffuse_components['poa_circumsolar'] = poa_circumsolar
869-
diffuse_components['poa_horizon'] = np.where(
870-
np.isnan(diffuse_components['poa_isotropic']), np.nan, 0.)
861+
diffuse_components = {
862+
'poa_sky_diffuse': sky_diffuse,
863+
'poa_isotropic': poa_isotropic,
864+
'poa_circumsolar': poa_circumsolar
865+
}
871866

872867
if isinstance(sky_diffuse, pd.Series):
873868
diffuse_components = pd.DataFrame(diffuse_components)
@@ -1115,7 +1110,7 @@ def perez(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
11151110
11161111
Returns
11171112
--------
1118-
numeric, OrderedDict, or DataFrame
1113+
numeric, dict, or DataFrame
11191114
Return type controlled by `return_components` argument.
11201115
If ``return_components=False``, `sky_diffuse` is returned.
11211116
If ``return_components=True``, `diffuse_components` is returned.
@@ -1124,7 +1119,7 @@ def perez(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
11241119
The sky diffuse component of the solar radiation on a tilted
11251120
surface.
11261121
1127-
diffuse_components : OrderedDict (array input) or DataFrame (Series input)
1122+
diffuse_components : dict (array input) or DataFrame (Series input)
11281123
Keys/columns are:
11291124
* poa_sky_diffuse: Total sky diffuse
11301125
* poa_isotropic
@@ -1211,13 +1206,12 @@ def perez(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
12111206
sky_diffuse = np.where(np.isnan(airmass), 0, sky_diffuse)
12121207

12131208
if return_components:
1214-
diffuse_components = OrderedDict()
1215-
diffuse_components['poa_sky_diffuse'] = sky_diffuse
1216-
1217-
# Calculate the different components
1218-
diffuse_components['poa_isotropic'] = dhi * term1
1219-
diffuse_components['poa_circumsolar'] = dhi * term2
1220-
diffuse_components['poa_horizon'] = dhi * term3
1209+
diffuse_components = {
1210+
'poa_sky_diffuse': sky_diffuse,
1211+
'poa_isotropic': dhi * term1,
1212+
'poa_circumsolar': dhi * term2,
1213+
'poa_horizon': dhi * term3
1214+
}
12211215

12221216
# Set values of components to 0 when sky_diffuse is 0
12231217
mask = sky_diffuse == 0
@@ -1357,7 +1351,7 @@ def perez_driesse(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
13571351
13581352
Returns
13591353
--------
1360-
numeric, OrderedDict, or DataFrame
1354+
numeric, dict, or DataFrame
13611355
Return type controlled by `return_components` argument.
13621356
If ``return_components=False``, `sky_diffuse` is returned.
13631357
If ``return_components=True``, `diffuse_components` is returned.
@@ -1366,7 +1360,7 @@ def perez_driesse(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
13661360
The sky diffuse component of the solar radiation on a tilted
13671361
surface.
13681362
1369-
diffuse_components : OrderedDict (array input) or DataFrame (Series input)
1363+
diffuse_components : dict (array input) or DataFrame (Series input)
13701364
Keys/columns are:
13711365
* poa_sky_diffuse: Total sky diffuse
13721366
* poa_isotropic
@@ -1431,13 +1425,12 @@ def perez_driesse(surface_tilt, surface_azimuth, dhi, dni, dni_extra,
14311425
sky_diffuse = np.maximum(dhi * (term1 + term2 + term3), 0)
14321426

14331427
if return_components:
1434-
diffuse_components = OrderedDict()
1435-
diffuse_components['poa_sky_diffuse'] = sky_diffuse
1436-
1437-
# Calculate the different components
1438-
diffuse_components['poa_isotropic'] = dhi * term1
1439-
diffuse_components['poa_circumsolar'] = dhi * term2
1440-
diffuse_components['poa_horizon'] = dhi * term3
1428+
diffuse_components = {
1429+
'poa_sky_diffuse': sky_diffuse,
1430+
'poa_isotropic': dhi * term1,
1431+
'poa_circumsolar': dhi * term2,
1432+
'poa_horizon': dhi * term3
1433+
}
14411434

14421435
if isinstance(sky_diffuse, pd.Series):
14431436
diffuse_components = pd.DataFrame(diffuse_components)
@@ -3128,8 +3121,8 @@ def _liujordan(zenith, transmittance, airmass, dni_extra=1367.0):
31283121
transmittance: float
31293122
Atmospheric transmittance between 0 and 1.
31303123
3131-
pressure: float, default 101325.0
3132-
Air pressure
3124+
airmass: numeric
3125+
Optical air mass. [unitless]
31333126
31343127
dni_extra: float, default 1367.0
31353128
Direct irradiance incident at the top of the atmosphere.

pvlib/pvsystem.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ def get_iam(self, aoi, iam_model='physical'):
395395
aoi : numeric or tuple of numeric
396396
The angle of incidence in degrees.
397397
398-
aoi_model : string, default 'physical'
398+
iam_model : string, default 'physical'
399399
The IAM model to be used. Valid strings are 'physical', 'ashrae',
400400
'martin_ruiz', 'sapm' and 'interp'.
401401
Returns
@@ -1188,7 +1188,7 @@ def get_iam(self, aoi, iam_model='physical'):
11881188
aoi : numeric
11891189
The angle of incidence in degrees.
11901190
1191-
aoi_model : string, default 'physical'
1191+
iam_model : string, default 'physical'
11921192
The IAM model to be used. Valid strings are 'physical', 'ashrae',
11931193
'martin_ruiz', 'sapm' and 'interp'.
11941194

pvlib/solarposition.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ def sun_rise_set_transit_ephem(times, latitude, longitude,
516516
517517
Parameters
518518
----------
519-
time : pandas.DatetimeIndex
519+
times : pandas.DatetimeIndex
520520
Must be localized
521521
latitude : float
522522
Latitude in degrees, positive north of equator, negative to south

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ dependencies = [
1717
'requests',
1818
'scipy >= 1.7.2',
1919
'h5py',
20+
'tzdata', # ensure all timezones are available in all installs for consistency GH#2795
2021
]
2122
license = "BSD-3-Clause"
2223
classifiers = [

0 commit comments

Comments
 (0)