%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
# built in python modules
import datetime
import logging
import os
import inspect
# python add-ons
import numpy as np
import pandas as pd
times = pd.date_range('2014-01-01', '2015-01-01', freq='1D')
spencer = pd.Series(pvlib.irradiance.extraradiation(times.dayofyear, method='spencer'), times)
asce = pd.Series(pvlib.irradiance.extraradiation(times.dayofyear, method='asce'), times)
ephem = pvlib.irradiance.extraradiation_ephem(times) # approx 100x slower than the above
spencer.plot(label='spencer')
asce.plot(label='asce')
ephem.plot(label='pyephem')
plt.legend()
<matplotlib.legend.Legend at 0x3802650>
et_diff = spencer - ephem
et_diff.plot()
plt.ylabel('spencer-ephem (W/m**2)')
<matplotlib.text.Text at 0x5572090>
import pvlib
from pvlib.location import Location
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
print(tus)
Tucson: latitude=32.2, longitude=-111, tz=US/Arizona, altitude=700
times = pd.date_range(start=datetime.datetime(2014,1,1), end=datetime.datetime(2014,1,2), freq='1Min')
ephem_data = pvlib.solarposition.get_solarposition(times, tus, method='pyephem')
ephem_data.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x5e2e9d0>
irrad_data = pvlib.clearsky.ineichen(times, tus, solarposition_method='pyephem')
irrad_data.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7123610>
ground_irrad = pvlib.irradiance.grounddiffuse(40, irrad_data['GHI'], albedo=.25)
ground_irrad.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7461b50>
sns.set_palette('husl', len(pvlib.irradiance.SURFACE_ALBEDOS.items()))
for surface, albedo in pvlib.irradiance.SURFACE_ALBEDOS.items():
ground_irrad = pvlib.irradiance.grounddiffuse(40, irrad_data['GHI'], surface_type=surface)
ground_irrad.plot(label='{}: {}'.format(surface, albedo))
plt.legend()
<matplotlib.legend.Legend at 0x712aad0>
for surf_tilt in np.linspace(0, 90, 5):
ground_irrad = pvlib.irradiance.grounddiffuse(surf_tilt, irrad_data['GHI'])
ground_irrad.plot(label=surf_tilt)
plt.legend()
<matplotlib.legend.Legend at 0x77e1b50>
sns.set_palette('deep')
sky_diffuse = pvlib.irradiance.isotropic(40, irrad_data['DHI'])
sky_diffuse.plot(label='isotropic diffuse')
irrad_data['DHI'].plot()
irrad_data['GHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0x88d2e10>
irrad_data['DHI'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7927510>
sky_diffuse = pvlib.irradiance.isotropic(40, irrad_data['DHI'])
sky_diffuse.plot(label='isotropic diffuse')
irrad_data['DHI'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x8be21d0>
surf_tilt = 40
surf_az = 180
sky_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az, irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
sky_diffuse.plot(label='klucher diffuse')
irrad_data['DHI'].plot()
#irrad_data['GHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0x7915790>
surf_tilt = 40
surf_az = 180 # south facing
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az, irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0x9001590>
surf_tilt = 40
surf_az = 90 # east facing
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az, irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0x951be10>
surf_tilt = 40
irrad_data['DHI'].plot()
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic')
for surf_az in np.linspace(0, 270, 4):
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az, irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher: {}'.format(surf_az))
plt.legend()
<matplotlib.legend.Legend at 0x8ca0ad0>
surf_tilt = 0
irrad_data['DHI'].plot()
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic')
for surf_az in np.linspace(0, 270, 4):
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az, irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher: {}'.format(surf_az))
plt.legend()
<matplotlib.legend.Legend at 0x9a3f350>
surf_tilt = 32
surf_az = 180 # south facing
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
dni_et = pvlib.irradiance.extraradiation(times.dayofyear)
reindl_diffuse = pvlib.irradiance.reindl(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], irrad_data['GHI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
reindl_diffuse.plot(label='reindl diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0xa151710>
surf_tilt = 32
surf_az = 90
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
dni_et = pvlib.irradiance.extraradiation(times.dayofyear)
reindl_diffuse = pvlib.irradiance.reindl(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], irrad_data['GHI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
reindl_diffuse.plot(label='reindl diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0xa721110>
surf_tilt = 32
surf_az = 180
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
dni_et = pvlib.irradiance.extraradiation(times.dayofyear)
haydavies_diffuse = pvlib.irradiance.haydavies(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
haydavies_diffuse.plot(label='haydavies diffuse')
reindl_diffuse = pvlib.irradiance.reindl(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], irrad_data['GHI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
reindl_diffuse.plot(label='reindl diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0xa6e02d0>
surf_tilt = 32
surf_az = 90
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
dni_et = pvlib.irradiance.extraradiation(times.dayofyear)
haydavies_diffuse = pvlib.irradiance.haydavies(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
haydavies_diffuse.plot(label='haydavies diffuse')
reindl_diffuse = pvlib.irradiance.reindl(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], irrad_data['GHI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
reindl_diffuse.plot(label='reindl diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0xa921450>
surf_tilt = 32
surf_az = 90
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
dni_et = pvlib.irradiance.extraradiation(times.dayofyear)
haydavies_diffuse = pvlib.irradiance.haydavies(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
haydavies_diffuse.plot(label='haydavies diffuse')
king_diffuse = pvlib.irradiance.king(surf_tilt,irrad_data['DHI'], irrad_data['GHI'], ephem_data['apparent_zenith'])
king_diffuse.plot(label='king diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0xa6e0350>
The Perez algorithm shows some strange discontinuities, so this section goes into the algorithm in more detail.
sun_zen = ephem_data['apparent_zenith']
sun_az = ephem_data['apparent_azimuth']
DNI = irrad_data['DNI']
DHI = irrad_data['DHI']
DNI_ET = pvlib.irradiance.extraradiation(times.dayofyear)
AM = pvlib.atmosphere.relativeairmass(sun_zen)
surf_tilt = 32
surf_az = 180
kappa = 1.041 #for sun_zen in radians
z = np.radians(sun_zen) # convert to radians
#Dhfilter = DHI > 0
# epsilon is the sky's clearness
eps = ( (DHI + DNI)/DHI + kappa*(z**3) ) / ( 1 + kappa*(z**3) )
eps.plot()
<matplotlib.axes._subplots.AxesSubplot at 0xa6e0990>
ebin = eps.copy()
ebin[(eps<1.065)] = 1
ebin[(eps>=1.065) & (eps<1.23)] = 2
ebin[(eps>=1.23) & (eps<1.5)] = 3
ebin[(eps>=1.5) & (eps<1.95)] = 4
ebin[(eps>=1.95) & (eps<2.8)] = 5
ebin[(eps>=2.8) & (eps<4.5)] = 6
ebin[(eps>=4.5) & (eps<6.2)] = 7
ebin[eps>=6.2] = 8
ebin.plot()
plt.ylim(0,9)
(0, 9)
ebin = ebin - 1
ebin = ebin.dropna().astype(int)
ebin.plot()
<matplotlib.axes._subplots.AxesSubplot at 0xacf0050>
delta = DHI * AM / DNI_ET
delta = delta[ebin.index]
delta.plot()
<matplotlib.axes._subplots.AxesSubplot at 0xbd11610>
z = z[ebin.index]
modelt = 'allsitescomposite1990'
F1c, F2c = pvlib.irradiance._get_perez_coefficients(modelt)
F1 = F1c[ebin,0] + F1c[ebin,1]*delta + F1c[ebin,2]*z
F1[F1<0]=0;
F1=F1.astype(float)
#F2= F2c[ebin,0] + F2c[ebin,1]*delta[ebinfilter] + F2c[ebin,2]*z[ebinfilter]
F2= F2c[ebin,0] + F2c[ebin,1]*delta + F2c[ebin,2]*z
F2[F2<0]=0
F2=F2.astype(float)
F1.plot(label='F1')
F2.plot(label='F2')
plt.legend()
<matplotlib.legend.Legend at 0xc19ced0>
from pvlib import pvl_tools
A = pvl_tools.cosd(surf_tilt)*pvl_tools.cosd(sun_zen) + pvl_tools.sind(surf_tilt)*pvl_tools.sind(sun_zen)*pvl_tools.cosd(sun_az-surf_az); #removed +180 from azimuth modifier: Rob Andrews October 19th 2012
#A[A < 0] = 0
B = pvl_tools.cosd(sun_zen);
#B[B < pvl_tools.cosd(85)] = pvl_tools.cosd(85)
A.plot(label='A')
B.plot(label='B')
plt.legend()
<matplotlib.legend.Legend at 0xa772690>
sky_diffuse = DHI[ebin.index]*( 0.5* (1-F1)*(1+pvl_tools.cosd(surf_tilt))+F1 * A[ebin.index]/ B[ebin.index] + F2*pvl_tools.sind(surf_tilt))
sky_diffuse[sky_diffuse < 0] = 0
sky_diffuse.plot()
<matplotlib.axes._subplots.AxesSubplot at 0xa778a10>
sun_zen = ephem_data['apparent_zenith']
sun_az = ephem_data['apparent_azimuth']
DNI = irrad_data['DNI']
DHI = irrad_data['DHI']
DNI_ET = pvlib.irradiance.extraradiation(times.dayofyear)
AM = pvlib.atmosphere.relativeairmass(sun_zen)
surf_tilt = 32
surf_az = 180
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
dni_et = pvlib.irradiance.extraradiation(times.dayofyear)
haydavies_diffuse = pvlib.irradiance.haydavies(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
haydavies_diffuse.plot(label='haydavies diffuse')
perez_diffuse = pvlib.irradiance.perez(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
AM)
perez_diffuse.plot(label='perez diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0xbd36950>
sun_zen = ephem_data['apparent_zenith']
sun_az = ephem_data['apparent_azimuth']
DNI = irrad_data['DNI']
DHI = irrad_data['DHI']
DNI_ET = pvlib.irradiance.extraradiation(times.dayofyear)
AM = pvlib.atmosphere.relativeairmass(sun_zen)
surf_tilt = 32
surf_az = 90
iso_diffuse = pvlib.irradiance.isotropic(surf_tilt, irrad_data['DHI'])
iso_diffuse.plot(label='isotropic diffuse')
klucher_diffuse = pvlib.irradiance.klucher(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['GHI'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
klucher_diffuse.plot(label='klucher diffuse')
dni_et = pvlib.irradiance.extraradiation(times.dayofyear)
haydavies_diffuse = pvlib.irradiance.haydavies(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
haydavies_diffuse.plot(label='haydavies diffuse')
perez_diffuse = pvlib.irradiance.perez(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
AM)
perez_diffuse.plot(label='perez diffuse')
irrad_data['DHI'].plot()
plt.legend()
<matplotlib.legend.Legend at 0xccde090>
perez_diffuse = pvlib.irradiance.perez(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
AM, modelt='allsitescomposite1990')
perez_diffuse.plot(label='allsitescomposite1990')
perez_diffuse = pvlib.irradiance.perez(surf_tilt, surf_az,
irrad_data['DHI'], irrad_data['DNI'], dni_et,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
AM, modelt='phoenix1988')
perez_diffuse.plot(label='phoenix1988')
plt.legend()
<matplotlib.legend.Legend at 0xbc7a650>
import pvlib.irradiance
proj = pvlib.irradiance.aoi_projection(32, 180, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj.plot()
plt.ylim(-1.1,1.1)
plt.legend()
<matplotlib.legend.Legend at 0xb716d10>
proj = pvlib.irradiance.aoi(32, 180, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj.plot()
#plt.ylim(-1.1,1.1)
plt.legend()
<matplotlib.legend.Legend at 0xcb09650>
ratio = pvlib.irradiance.poa_horizontal_ratio(32, 180, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
ratio.plot()
plt.ylim(-2,2)
(-2, 2)
surf_tilt = 90
surf_az = 90
sen_alt_rad = np.radians(90 - surf_tilt)
sen_azi_rad = np.radians(surf_az)
alts = np.radians(90 - ephem_data['apparent_zenith'])
azis = np.radians(ephem_data['apparent_azimuth'])
dotprod = np.cos(sen_alt_rad)*np.cos(alts)*np.cos(sen_azi_rad-azis) + np.sin(sen_alt_rad)*np.sin(alts)
dotprod.plot(label='dotprod')
proj = pvlib.irradiance.aoi_projection(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj.plot()
plt.ylim(-1.1,1.1)
plt.legend()
<matplotlib.legend.Legend at 0xca15fd0>
surf_tilt = 32
surf_az = 180
proj = pvlib.irradiance.aoi_projection(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj[ephem_data['apparent_zenith'] > 90] = np.nan
proj.plot('surf_tilt=32')
surf_tilt = ephem_data['apparent_zenith']
surf_az = 180
proj = pvlib.irradiance.aoi_projection(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj[ephem_data['apparent_zenith'] > 90] = np.nan
proj.plot('surf_tilt=sun_zen\nsurf_az=180')
surf_tilt = ephem_data['apparent_zenith']
surf_az = ephem_data['apparent_azimuth'].copy()
surf_az[ephem_data['apparent_azimuth'] < 180] = 90
surf_az[ephem_data['apparent_azimuth'] > 180] = 270
proj = pvlib.irradiance.aoi_projection(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj[ephem_data['apparent_zenith'] > 90] = np.nan
proj.plot('surf_tilt=sun_zen\nsurf_az=90,270')
surf_tilt = 90 - ephem_data['apparent_zenith']
surf_az = 180
proj = pvlib.irradiance.aoi_projection(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj[ephem_data['apparent_zenith'] > 90] = np.nan
proj.plot('surf_tilt=90-sun_zen')
plt.ylim(-1.1,1.1)
plt.legend()
<matplotlib.legend.Legend at 0xdf88e50>
models = ['isotropic', 'klutcher', 'haydavies', 'reindl', 'king', 'perez']
totals = {}
for model in models:
total = pvlib.irradiance.total_irrad(32, 180,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
DNI=irrad_data['DNI'], GHI=irrad_data['GHI'], DHI=irrad_data['DHI'],
DNI_ET=dni_et, AM=AM,
model=model,
surface_type='urban')
totals[model] = total
total.plot()
plt.title(model)
plt.figure()
for model, total in totals.items():
total['total'].plot(lw=.5, label=model)
plt.legend()
<matplotlib.legend.Legend at 0xe5dad90>
models = ['isotropic', 'klutcher', 'haydavies', 'reindl', 'king', 'perez']
totals = {}
for model in models:
total = pvlib.irradiance.total_irrad(0, 180,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
DNI=irrad_data['DNI'], GHI=irrad_data['GHI'], DHI=irrad_data['DHI'],
DNI_ET=dni_et, AM=AM,
model=model,
surface_type='urban')
totals[model] = total
total.plot()
plt.title(model)
plt.figure()
for model, total in totals.items():
total['total'].plot(lw=.5, label=model)
plt.legend()
<matplotlib.legend.Legend at 0xf6f4d50>
models = ['isotropic', 'klutcher', 'haydavies', 'reindl', 'king', 'perez']
totals = {}
for model in models:
total = pvlib.irradiance.total_irrad(32, 90,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
DNI=irrad_data['DNI'], GHI=irrad_data['GHI'], DHI=irrad_data['DHI'],
DNI_ET=dni_et, AM=AM,
model=model,
surface_type='urban')
totals[model] = total
total.plot()
plt.title(model)
plt.figure()
for model, total in totals.items():
total['total'].plot(lw=.5, label=model)
plt.legend()
<matplotlib.legend.Legend at 0xe77c450>
model = 'haydavies'
total = pvlib.irradiance.total_irrad(ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
DNI=irrad_data['DNI'], GHI=irrad_data['GHI'], DHI=irrad_data['DHI'],
DNI_ET=dni_et, AM=AM,
model=model,
surface_type='soil')
total.plot()
plt.title('dual axis tracker')
plt.legend()
<matplotlib.legend.Legend at 0xe5daa10>
times = pd.date_range(start=datetime.datetime(2014,3,21), end=datetime.datetime(2014,3,22), freq='1Min')
pyephem_ephem = pvlib.solarposition.get_solarposition(times, tus, method='pyephem')
#print(pyephem_ephem.head())
pyephem_ephem.plot()
plt.legend(ncol=3)
plt.title('ephemeris data')
ephem_data = pyephem_ephem
# for horizontal single axis trackers
axis_az = 0 # radians
plt.figure()
rotation = np.arctan(np.tan(np.deg2rad(ephem_data['apparent_zenith'])*np.sin(np.deg2rad(ephem_data['apparent_azimuth'] - axis_az))))
surf_tilt = np.abs(rotation)
surf_az = axis_az + np.arcsin(np.sin(rotation)/np.sin(surf_tilt))
surf_tilt = np.rad2deg(surf_tilt)
surf_az = np.rad2deg(surf_az)
rotation = np.rad2deg(rotation)
#surf_tilt[surf_tilt < 0] = rotation + 180
#surf_az[ephem_data['apparent_azimuth'] < 180] = 90
#surf_az[ephem_data['apparent_azimuth'] > 180] = 270
surf_tilt.plot(label='surface tilt')
surf_az.plot(label='surface azimuth')
rotation.plot(label='rotation')
plt.legend(ncol=3)
plt.title('panel angles')
plt.figure()
aoi = pvlib.irradiance.aoi(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
aoi[ephem_data['apparent_zenith'] > 90] = np.nan
aoi.plot()#label='surf_tilt=sun_zen\nsurf_az=90,270')
plt.legend()
plt.title('angle of incidence')
plt.figure()
proj = pvlib.irradiance.aoi_projection(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj[ephem_data['apparent_zenith'] > 90] = np.nan
proj.plot()#label='surf_tilt=sun_zen\nsurf_az=90,270')
plt.legend()
plt.title('aoi projection')
model = 'haydavies'
irrad_data = pvlib.clearsky.ineichen(times, tus, solarposition_method='pyephem')
total = pvlib.irradiance.total_irrad(surf_tilt, surf_az,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
DNI=irrad_data['DNI'], GHI=irrad_data['GHI'], DHI=irrad_data['DHI'],
DNI_ET=dni_et, AM=AM,
model=model,
surface_type='soil')
total.plot()
plt.title('single axis tracker no shading')
plt.legend()
<matplotlib.legend.Legend at 0x10f04590>
surf_tilt = ephem_data['apparent_zenith']
surf_az = ephem_data['apparent_azimuth'].copy()
surf_az[ephem_data['apparent_azimuth'] < 180] = 90
surf_az[ephem_data['apparent_azimuth'] > 180] = 270
proj = pvlib.irradiance.aoi_projection(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj[ephem_data['apparent_zenith'] > 90] = np.nan
proj.plot(label='surf_tilt=sun_zen\nsurf_az=90,270')
plt.legend()
<matplotlib.legend.Legend at 0x113da390>
surf_tilt = ephem_data['apparent_zenith']
surf_az = ephem_data['apparent_azimuth'].copy()
surf_az[ephem_data['apparent_azimuth'] < 180] = 90
surf_az[ephem_data['apparent_azimuth'] > 180] = 270
proj = pvlib.irradiance.aoi_projection(surf_tilt, surf_az, ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'])
proj[ephem_data['apparent_zenith'] > 90] = np.nan
proj.plot(label='surf_tilt=sun_zen\nsurf_az=90,270')
plt.legend()
model = 'haydavies'
irrad_data = pvlib.clearsky.ineichen(times, tus, solarposition_method='pyephem')
total = pvlib.irradiance.total_irrad(surf_tilt, surf_az,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
DNI=irrad_data['DNI'], GHI=irrad_data['GHI'], DHI=irrad_data['DHI'],
DNI_ET=dni_et, AM=AM,
model=model,
surface_type='soil')
total.plot()
plt.title('single axis tracker no shading')
plt.legend()
<matplotlib.legend.Legend at 0x711a810>
def irrad_to_power(irrad, scale_factor, peak_power):
power = irrad * scale_factor
power[power > peak_power] = peak_power
return power
nrg_peak_power = 25
nrg_scale_factor = .05
nrg_power = irrad_to_power(total['total'], nrg_scale_factor, nrg_peak_power)
nrg_power.head()
2014-06-24 00:00:00-07:00 0 2014-06-24 00:01:00-07:00 0 2014-06-24 00:02:00-07:00 0 2014-06-24 00:03:00-07:00 0 2014-06-24 00:04:00-07:00 0 Freq: T, Name: total, dtype: float64
import DbController
dbc_util = DbController.DbController(database='utility_data')
dbc_irrad = DbController.DbController(database='irradsensors')
nrg_data = dbc_util.get_data_util(1101, datetime.datetime(2014,6,24, tzinfo=aztz), datetime.datetime(2014,6,25, tzinfo=aztz))
nrg_peak_power = 27
nrg_scale_factor = .027
nrg_power = irrad_to_power(total['total'], nrg_scale_factor, nrg_peak_power)
nrg_power.plot(label='modeled')
nrg_data.plot(label='measured')
<matplotlib.axes.AxesSubplot at 0xa250d610>
surf_tilt = 32
surf_az = 180
reload(pvlib.planeofarray)
model = 'haydavies'
total = pvlib.planeofarray.total_irrad(surf_tilt, surf_az,
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
DNI=irrad_data['DNI'], GHI=irrad_data['GHI'], DHI=irrad_data['DHI'],
DNI_ET=dni_et, AM=AM,
model=model,
surface_type='soil')
total.plot()
plt.title('fixed at lat')
plt.legend()
DEBUG:pvlib:planeofarray.total_irrad() DEBUG:pvlib:diffuse_sky.haydavies() INFO:pvlib:surface_type=soil mapped to albedo=0.17
<matplotlib.legend.Legend at 0x1705f5d0>
fixed_data = dbc_irrad.get_data_util(407, datetime.datetime(2014,6,23, tzinfo=aztz), datetime.datetime(2014,6,25, tzinfo=aztz))
fixed_peak_power = 5000
fixed_scale_factor = 4.1
fixed_power = irrad_to_power(total['total'], fixed_scale_factor, fixed_peak_power)
fixed_power.plot(label='modeled')
fixed_data.plot(label='measured')
plt.legend(loc='upper center')
plt.ylabel('Power (MW)')
<matplotlib.text.Text at 0xaae19c50>
dni_data = dbc_irrad.get_data_util(11181, datetime.datetime(2014,6,23, tzinfo=aztz), datetime.datetime(2014,6,25, tzinfo=aztz))
reload(pvlib.planeofarray)
model = 'haydavies'
total = pvlib.planeofarray.total_irrad(ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
ephem_data['apparent_zenith'], ephem_data['apparent_azimuth'],
DNI=irrad_data['DNI'], GHI=irrad_data['GHI'], DHI=irrad_data['DHI'],
DNI_ET=dni_et, AM=AM,
model=model,
surface_type='soil')
total.plot()
dni_data.plot(label='DNI')
plt.title('dual axis tracker')
plt.legend(loc='upper center')
DEBUG:pvlib:planeofarray.total_irrad() DEBUG:pvlib:diffuse_sky.haydavies() INFO:pvlib:surface_type=soil mapped to albedo=0.17
<matplotlib.legend.Legend at 0xb5d9c790>