Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# calls operations that do not properly broadcast Series along
# a DataFrame time index. pvlib.irradiance.haydavies operation
# (AI = dni_ens / dni_extra) is the known culprit, though there
# may be more.
ac_power = {}
for col in forecasts[0].columns:
member_fx = [fx.get(col) for fx in forecasts]
member_ac_power = pvmodel.irradiance_to_power(
site.modeling_parameters,
solar_position['apparent_zenith'],
solar_position['azimuth'],
*member_fx)
ac_power[col] = member_ac_power
ac_power = pd.DataFrame(ac_power)
else:
ac_power = pvmodel.irradiance_to_power(
site.modeling_parameters, solar_position['apparent_zenith'],
solar_position['azimuth'], *forecasts)
else:
ac_power = None
# resample data after power calculation
resampled = list(map(resampler, (*forecasts, ac_power)))
nwpoutput = namedtuple(
'NWPOutput', ['ghi', 'dni', 'dhi', 'air_temperature', 'wind_speed',
'ac_power'])
return nwpoutput(*resampled)
# Consider putting the code within each if/else block below into its own
# function with standard outputs clear_ref and clear_fx. But with only two
# cases for now, it might be more clear to leave inline.
if (
isinstance(site, datamodel.SolarPowerPlant) and
observation.variable == 'ac_power'
):
# No temperature input is only OK so long as temperature effects
# do not push the system above or below AC clip point.
# It's only a reference forecast!
clear_ref = pvmodel.irradiance_to_power(
site.modeling_parameters, solar_position_obs['apparent_zenith'],
solar_position_obs['azimuth'], clearsky_obs['ghi'],
clearsky_obs['dni'], clearsky_obs['dhi']
)
clear_fx = pvmodel.irradiance_to_power(
site.modeling_parameters, solar_position_fx['apparent_zenith'],
solar_position_fx['azimuth'], clearsky_fx['ghi'],
clearsky_fx['dni'], clearsky_fx['dhi']
)
else:
# assume we are working with ghi, dni, or dhi.
clear_ref = clearsky_obs[observation.variable]
clear_fx = clearsky_fx[observation.variable]
# resample sub-interval reference clear sky to observation intervals
clear_ref_resampled = clear_ref.resample(
observation.interval_length, closed=closed, label=closed).mean()
# calculate persistence index (clear sky index or ac power index)
# avg{index_{t_start}...index_{t_end}} =
# avg{obs_{t_start}/clear_{t_start}...obs_{t_end}/clear_{t_end}}
# clear_ref is calculated at high temporal resolution, so this is accurate
*forecasts, resampler, solar_position_calculator = model(
site.latitude, site.longitude, site.elevation,
init_time, start, end, forecast.interval_label)
if isinstance(site, datamodel.SolarPowerPlant):
solar_position = solar_position_calculator()
if isinstance(forecasts[0], pd.DataFrame):
# must iterate over columns because pvmodel.irradiance_to_power
# calls operations that do not properly broadcast Series along
# a DataFrame time index. pvlib.irradiance.haydavies operation
# (AI = dni_ens / dni_extra) is the known culprit, though there
# may be more.
ac_power = {}
for col in forecasts[0].columns:
member_fx = [fx.get(col) for fx in forecasts]
member_ac_power = pvmodel.irradiance_to_power(
site.modeling_parameters,
solar_position['apparent_zenith'],
solar_position['azimuth'],
*member_fx)
ac_power[col] = member_ac_power
ac_power = pd.DataFrame(ac_power)
else:
ac_power = pvmodel.irradiance_to_power(
site.modeling_parameters, solar_position['apparent_zenith'],
solar_position['azimuth'], *forecasts)
else:
ac_power = None
# resample data after power calculation
resampled = list(map(resampler, (*forecasts, ac_power)))
nwpoutput = namedtuple(
fx_range = pd.date_range(start=forecast_start, end=forecast_end, freq=freq,
closed=closed_fx)
solar_position_fx = calc_solpos(fx_range)
clearsky_fx = calc_cs(solar_position_fx['apparent_zenith'])
# Consider putting the code within each if/else block below into its own
# function with standard outputs clear_ref and clear_fx. But with only two
# cases for now, it might be more clear to leave inline.
if (
isinstance(site, datamodel.SolarPowerPlant) and
observation.variable == 'ac_power'
):
# No temperature input is only OK so long as temperature effects
# do not push the system above or below AC clip point.
# It's only a reference forecast!
clear_ref = pvmodel.irradiance_to_power(
site.modeling_parameters, solar_position_obs['apparent_zenith'],
solar_position_obs['azimuth'], clearsky_obs['ghi'],
clearsky_obs['dni'], clearsky_obs['dhi']
)
clear_fx = pvmodel.irradiance_to_power(
site.modeling_parameters, solar_position_fx['apparent_zenith'],
solar_position_fx['azimuth'], clearsky_fx['ghi'],
clearsky_fx['dni'], clearsky_fx['dhi']
)
else:
# assume we are working with ghi, dni, or dhi.
clear_ref = clearsky_obs[observation.variable]
clear_fx = clearsky_fx[observation.variable]
# resample sub-interval reference clear sky to observation intervals
clear_ref_resampled = clear_ref.resample(