Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
The DataFrame contains the following new columns: poa_global,
poa_diffuse, poa_direct
References
----------
.. [5] `pvlib globalinplane `_.
.. [6] `pvlib atmosphere `_.
See Also
--------
solarposition_hourly_mean, solarposition, angle_of_incidenc
"""
# Determine the extraterrestrial radiation
data['dni_extra'] = pvlib.irradiance.extraradiation(
datetime_or_doy=data.index.dayofyear)
# Determine the relative air mass
data['airmass'] = pvlib.atmosphere.relativeairmass(data['zenith'])
# Determine direct normal irradiation
data['dni'] = (data['dirhi']) / np.sin(np.radians(90 - data['zenith']))
# what for??
data['dni'][data['zenith'] > 88] = data['dirhi']
# Determine the sky diffuse irradiation in plane
# with model of Perez (modell switch would be good)
data['poa_sky_diffuse'] = pvlib.irradiance.perez(
surface_tilt=self.powerplant.tilt,
surface_azimuth=self.powerplant.azimuth,
"""
Function used to calculate the luminance and the view factor terms from the
Perez diffuse light transposition model, as implemented in the
``pvlib-python`` library.
:param df_inputs: class:`pandas.DataFrame` with following columns:
['solar_zenith', 'solar_azimuth', 'array_tilt', 'array_azimuth', 'dhi',
'dni']. Units are: ['deg', 'deg', 'deg', 'deg', 'W/m2', 'W/m2']
:return: class:`pandas.DataFrame` with the following columns:
['solar_zenith', 'solar_azimuth', 'array_tilt', 'array_azimuth', 'dhi',
'dni', 'vf_horizon', 'vf_circumsolar', 'vf_isotropic',
'luminance_horizon', 'luminance_circumsolar', 'luminance_isotropic',
'poa_isotropic', 'poa_circumsolar', 'poa_horizon', 'poa_total_diffuse']
"""
dni_et = irradiance.extraradiation(df_inputs.index.dayofyear)
am = atmosphere.relativeairmass(df_inputs.solar_zenith)
# Need to treat the case when the sun is hitting the back surface of pvrow
aoi_proj = aoi_projection(df_inputs.array_tilt, df_inputs.array_azimuth,
df_inputs.solar_zenith, df_inputs.solar_azimuth)
sun_hitting_back_surface = ((aoi_proj < 0) &
(df_inputs.solar_zenith <= 90))
df_inputs_back_surface = df_inputs.loc[sun_hitting_back_surface]
# Reverse the surface normal to switch to back-surface circumsolar calc
df_inputs_back_surface.loc[:, 'array_azimuth'] -= 180.
df_inputs_back_surface.loc[:, 'array_azimuth'] = np.mod(
df_inputs_back_surface.loc[:, 'array_azimuth'], 360.
)
df_inputs_back_surface.loc[:, 'array_tilt'] = (
180. - df_inputs_back_surface.array_tilt)
# Compute insolation
poa_insolation = pecos.pv.insolation(poa, tfilter=pm.tfilter)
poa_insolation = poa_insolation.values[0]
# Compute performance ratio
PR = pecos.pv.performance_ratio(energy, poa_insolation, P_ref)
# Compute performance index
predicted_energy = pecos.pv.energy(modeled_dcpower, tfilter=pm.tfilter)
predicted_energy = predicted_energy.values[0]
PI = pecos.pv.performance_index(energy, predicted_energy)
# Compute clearness index
dni_insolation = pecos.pv.insolation(dni, tfilter=pm.tfilter)
dni_insolation = dni_insolation.values[0]
ea = pvlib.irradiance.extraradiation(index.dayofyear)
ea = pd.Series(index=index, data=ea)
ea_insolation = pecos.pv.insolation(ea, tfilter=pm.tfilter)
ea_insolation = ea_insolation.values[0]
Kt = pecos.pv.clearness_index(dni_insolation, ea_insolation)
# Compute energy yield
energy_yield = pecos.pv.energy_yield(energy, P_ref)
# Collect metrics for reporting
metrics = {'Performance Ratio': PR,
'Performance Index': PI,
'Clearness Index': Kt,
'Total Energy (kWh)': energy/3600/1000, # convert Ws to kWh
'POA Insolation (kWh/m2)': poa_insolation/3600/1000, # convert Ws to kWh
'Energy Yield (kWh/kWp)': energy_yield/3600} # convert s to h
df_inputs : `pandas.DataFrame`
Dataframe with the following columns:
['solar_zenith', 'solar_azimuth', 'surface_tilt', 'surface_azimuth',
'dhi', 'dni', 'vf_horizon', 'vf_circumsolar', 'vf_isotropic',
'luminance_horizon', 'luminance_circumsolar', 'luminance_isotropic',
'poa_isotropic', 'poa_circumsolar', 'poa_horizon', 'poa_total_diffuse']
"""
# Create a dataframe to help filtering on all arrays
df_inputs = pd.DataFrame(
{'surface_tilt': surface_tilt, 'surface_azimuth': surface_azimuth,
'solar_zenith': solar_zenith, 'solar_azimuth': solar_azimuth,
'dni': dni, 'dhi': dhi},
index=pd.DatetimeIndex(timestamps))
dni_et = irradiance.extraradiation(df_inputs.index.dayofyear)
am = atmosphere.relativeairmass(df_inputs.solar_zenith)
# Need to treat the case when the sun is hitting the back surface of pvrow
aoi_proj = aoi_projection(
df_inputs.surface_tilt, df_inputs.surface_azimuth,
df_inputs.solar_zenith, df_inputs.solar_azimuth)
sun_hitting_back_surface = ((aoi_proj < 0) &
(df_inputs.solar_zenith <= 90))
df_inputs_back_surface = df_inputs.loc[sun_hitting_back_surface].copy()
# Reverse the surface normal to switch to back-surface circumsolar calc
df_inputs_back_surface.loc[:, 'surface_azimuth'] = (
df_inputs_back_surface.loc[:, 'surface_azimuth'] - 180.)
df_inputs_back_surface.loc[:, 'surface_azimuth'] = np.mod(
df_inputs_back_surface.loc[:, 'surface_azimuth'], 360.
)
df_inputs_back_surface.loc[:, 'surface_tilt'] = (
# parallelism not needed for this example
graph = Graph(parallel=False)
graph.add_node(
unpack_df(pvlib.solarposition.get_solarposition),
inputs=["index", "latitude", "longitude"],
outputs=[
"apparent_elevation",
"apparent_zenith",
"azimuth",
"elevation",
"equation_of_time",
"zenith",
],
)
graph.add_node(pvlib.irradiance.extraradiation, inputs=["index"], outputs=["dni_extra"])
graph.add_node(
pvlib.atmosphere.relativeairmass, inputs=["apparent_zenith"], outputs=["airmass"]
)
graph.add_node(
pvlib.irradiance.haydavies,
inputs=[
"surface_tilt",
"surface_azimuth",
"DHI",
"DNI",
"dni_extra",
"apparent_zenith",
"azimuth",
],
outputs=["poa_sky_diffuse"],
)