Skip to content

Commit b319f5d

Browse files
committed
fix cloud_cover_to_irradiance_liujordan bugs. improve tests
1 parent 3f90083 commit b319f5d

File tree

2 files changed

+36
-25
lines changed

2 files changed

+36
-25
lines changed

pvlib/forecast.py

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,10 @@ def __init__(self, model_type, model_name, set_type):
122122
try:
123123
self.model = TDSCatalog(model_url)
124124
except HTTPError:
125-
raise HTTPError(self.model_name + ' model may be unavailable.')
125+
try:
126+
self.model = TDSCatalog(model_url)
127+
except HTTPError:
128+
raise HTTPError(self.model_name + ' model may be unavailable.')
126129

127130
self.datasets_list = list(self.model.datasets.keys())
128131
self.set_dataset()
@@ -346,7 +349,8 @@ def set_time(self, time):
346349
times = num2date(time[:].squeeze(), time.units)
347350
self.time = pd.DatetimeIndex(pd.Series(times), tz=self.location.tz)
348351

349-
def cloud_cover_to_ghi_linear(self, cloud_cover, ghi_clear, offset=20):
352+
def cloud_cover_to_ghi_linear(self, cloud_cover, ghi_clear, offset=20,
353+
**kwargs):
350354
"""
351355
Convert cloud cover to GHI using a linear relationship.
352356
@@ -362,6 +366,8 @@ def cloud_cover_to_ghi_linear(self, cloud_cover, ghi_clear, offset=20):
362366
GHI under clear sky conditions.
363367
offset: numeric
364368
Determines the minimum GHI.
369+
kwargs
370+
Not used.
365371
366372
Returns
367373
-------
@@ -420,7 +426,8 @@ def cloud_cover_to_irradiance_clearsky_scaling(self, cloud_cover,
420426
irrads = pd.DataFrame({'ghi': ghi, 'dni': dni, 'dhi': dhi}).fillna(0)
421427
return irrads
422428

423-
def cloud_cover_to_transmittance_linear(self, cloud_cover, offset=0.75):
429+
def cloud_cover_to_transmittance_linear(self, cloud_cover, offset=0.75,
430+
**kwargs):
424431
"""
425432
Convert cloud cover to atmospheric transmittance using a linear
426433
model.
@@ -435,6 +442,8 @@ def cloud_cover_to_transmittance_linear(self, cloud_cover, offset=0.75):
435442
Cloud cover in %.
436443
offset : numeric
437444
Determines the maximum transmittance.
445+
kwargs
446+
Not used.
438447
439448
Returns
440449
-------
@@ -445,7 +454,7 @@ def cloud_cover_to_transmittance_linear(self, cloud_cover, offset=0.75):
445454

446455
return transmittance
447456

448-
def cloud_cover_to_irradiance_liujordan(self, cloud_cover):
457+
def cloud_cover_to_irradiance_liujordan(self, cloud_cover, **kwargs):
449458
"""
450459
Estimates irradiance from cloud cover in the following steps:
451460
@@ -466,14 +475,14 @@ def cloud_cover_to_irradiance_liujordan(self, cloud_cover):
466475
# in principle, get_solarposition could use the forecast
467476
# pressure, temp, etc., but the cloud cover forecast is not
468477
# accurate enough to justify using these minor corrections
469-
solar_position = self.location.get_solarposition(self.time)
470-
dni_extra = extraradiation(self.time.dayofyear)
471-
airmass = self.location.get_airmass(self.time)
478+
solar_position = self.location.get_solarposition(cloud_cover.index)
479+
dni_extra = extraradiation(cloud_cover.index)
480+
airmass = self.location.get_airmass(cloud_cover.index)
472481

473482
transmittance = self.cloud_cover_to_transmittance_linear(cloud_cover,
474483
**kwargs)
475484

476-
irrads = liujordan(self.solar_position['apparent_zenith'],
485+
irrads = liujordan(solar_position['apparent_zenith'],
477486
transmittance, airmass['airmass_absolute'],
478487
dni_extra=dni_extra)
479488
irrads = irrads.fillna(0)
@@ -679,8 +688,8 @@ def process_data(self, data, cloud_cover='total_clouds', **kwargs):
679688
data = super(GFS, self).process_data(data, **kwargs)
680689
data['temp_air'] = self.kelvin_to_celsius(data['temp_air'])
681690
data['wind_speed'] = self.uv_to_speed(data)
682-
data = data.join(self.cloud_cover_to_irradiance(data[cloud_cover]),
683-
how='outer')
691+
irrads = self.cloud_cover_to_irradiance(data[cloud_cover], **kwargs)
692+
data = data.join(irrads, how='outer')
684693
return data.ix[:, self.output_variables]
685694

686695

@@ -765,8 +774,8 @@ def process_data(self, data, cloud_cover='total_clouds', **kwargs):
765774
data = super(HRRR_ESRL, self).process_data(data, **kwargs)
766775
data['temp_air'] = self.kelvin_to_celsius(data['temp_air'])
767776
data['wind_speed'] = self.gust_to_speed(data)
768-
data = data.join(self.cloud_cover_to_irradiance(data[cloud_cover]),
769-
how='outer')
777+
irrads = self.cloud_cover_to_irradiance(data[cloud_cover], **kwargs)
778+
data = data.join(irrads, how='outer')
770779
return data.ix[:, self.output_variables]
771780

772781

@@ -846,8 +855,8 @@ def process_data(self, data, cloud_cover='total_clouds', **kwargs):
846855
data = super(NAM, self).process_data(data, **kwargs)
847856
data['temp_air'] = self.kelvin_to_celsius(data['temp_air'])
848857
data['wind_speed'] = self.gust_to_speed(data)
849-
data = data.join(self.cloud_cover_to_irradiance(data[cloud_cover]),
850-
how='outer')
858+
irrads = self.cloud_cover_to_irradiance(data[cloud_cover], **kwargs)
859+
data = data.join(irrads, how='outer')
851860
return data.ix[:, self.output_variables]
852861

853862

@@ -930,8 +939,8 @@ def process_data(self, data, cloud_cover='total_clouds', **kwargs):
930939
data['temp_air'] = self.isobaric_to_ambient_temperature(data)
931940
data['temp_air'] = self.kelvin_to_celsius(data['temp_air'])
932941
data['wind_speed'] = self.gust_to_speed(data)
933-
data = data.join(self.cloud_cover_to_irradiance(data[cloud_cover]),
934-
how='outer')
942+
irrads = self.cloud_cover_to_irradiance(data[cloud_cover], **kwargs)
943+
data = data.join(irrads, how='outer')
935944
return data.ix[:, self.output_variables]
936945

937946

@@ -999,8 +1008,8 @@ def process_data(self, data, **kwargs):
9991008
cloud_cover = 'total_clouds'
10001009
data = super(NDFD, self).process_data(data, **kwargs)
10011010
data['temp_air'] = self.kelvin_to_celsius(data['temp_air'])
1002-
data = data.join(self.cloud_cover_to_irradiance(data[cloud_cover]),
1003-
how='outer')
1011+
irrads = self.cloud_cover_to_irradiance(data[cloud_cover], **kwargs)
1012+
data = data.join(irrads, how='outer')
10041013
return data.ix[:, self.output_variables]
10051014

10061015

@@ -1084,6 +1093,6 @@ def process_data(self, data, cloud_cover='total_clouds', **kwargs):
10841093
data = super(RAP, self).process_data(data, **kwargs)
10851094
data['temp_air'] = self.kelvin_to_celsius(data['temp_air'])
10861095
data['wind_speed'] = self.gust_to_speed(data)
1087-
data = data.join(self.cloud_cover_to_irradiance(data[cloud_cover]),
1088-
how='outer')
1096+
irrads = self.cloud_cover_to_irradiance(data[cloud_cover], **kwargs)
1097+
data = data.join(irrads, how='outer')
10891098
return data.ix[:, self.output_variables]

pvlib/test/test_forecast.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,17 @@
4747
@pytest.fixture(scope='module', params=_modelclasses)
4848
def model(request):
4949
amodel = request.param()
50-
amodel.data = \
51-
amodel.get_processed_data(_latitude, _longitude, _start, _end)
50+
amodel.raw_data = \
51+
amodel.get_data(_latitude, _longitude, _start, _end)
5252
return amodel
5353

5454

5555
@requires_siphon
56-
def test_dataframe_variables(model):
57-
for variable in _nonnan_variables:
58-
assert not model.data[variable].isnull().values.any()
56+
def test_process_data(model):
57+
for how in ['liujordan', 'clearsky_scaling']:
58+
data = model.process_data(model.raw_data, how=how)
59+
for variable in _nonnan_variables:
60+
assert not data[variable].isnull().values.any()
5961

6062

6163
@requires_siphon

0 commit comments

Comments
 (0)