diff --git a/.gitignore b/.gitignore index a8304db0b7..baee919633 100644 --- a/.gitignore +++ b/.gitignore @@ -77,3 +77,8 @@ coverage.xml #Ignore some notebooks *.ipynb !docs/tutorials/*.ipynb + +#Ignore during development: +pvlib_ToC_structure.txt +make.bat +*.png \ No newline at end of file diff --git a/docs/sphinx/source/index.rst b/docs/sphinx/source/index.rst index 45f10ecedf..595d015dc8 100644 --- a/docs/sphinx/source/index.rst +++ b/docs/sphinx/source/index.rst @@ -72,16 +72,65 @@ Contents package_overview whatsnew + usage installation contributing timetimezones + solarposition + transposition clearsky + io + system forecasts + statistics + plotting + reporting modules classes comparison_pvlib_matlab variables_style_rules + +Contents (potential new ToC) +============================ + +* What’s New +* Overview: Why pvlib? + * Introduction + * Modeling paradigms + * User extensions + * What it is not + * Comparison with PVLIB_MATLAB +* Installation +* Examples + * Using the principal components + * atmosphere.py tutorial + * solarposition.py tutorial + * irradiance.py tutorial + * Specific datasets + * TMY tutorial + * TMY data and diffuse irradiance model + * TMY to Power Tutorial + * System Modelling + * pvsystem tutorial + * Tracking + * Modeling multiple systems with system losses + * Validations + * SAPM – Some simulations using the Sandia Array Performance Model. + * IV curves – Make some IV curves based on this data +* API reference with principal components + * Modules + * Classes +* Support and Development + * Getting support + * How do I contribute? +* Frequently Asked Questions +* Citing and References + * Citing pvlib + * References used for the code + * Publications and projects using pvlib + * Credits + Indices and tables ================== diff --git a/docs/sphinx/source/io.rst b/docs/sphinx/source/io.rst new file mode 100644 index 0000000000..86850caa98 --- /dev/null +++ b/docs/sphinx/source/io.rst @@ -0,0 +1,21 @@ +.. _io: + +************************************************* +Import of Data & Export to other Industry Formats +************************************************* + +Solar Data +====================== + + +Web Information +======================= + + +Locations +-------------- + + +PVSyst +====================== + diff --git a/docs/sphinx/source/multi_array_losses.rst b/docs/sphinx/source/multi_array_losses.rst new file mode 100644 index 0000000000..2a748960e9 --- /dev/null +++ b/docs/sphinx/source/multi_array_losses.rst @@ -0,0 +1,10 @@ +.. _single_array: + +********************************************* +Multiple Array PV System or Multiple Systems +********************************************* + +Insert here: + +http://nbviewer.jupyter.org/github/jforbess/pvlib-python/blob/Issue84/docs/tutorials/system_loss_modeling.ipynb + diff --git a/docs/sphinx/source/plotting.rst b/docs/sphinx/source/plotting.rst new file mode 100644 index 0000000000..88b66034ed --- /dev/null +++ b/docs/sphinx/source/plotting.rst @@ -0,0 +1,6 @@ +.. _plotting: + +************************************************* +Plotting of Solar Data and Simulation Results +************************************************* + diff --git a/docs/sphinx/source/reporting.rst b/docs/sphinx/source/reporting.rst new file mode 100644 index 0000000000..d76b0ee022 --- /dev/null +++ b/docs/sphinx/source/reporting.rst @@ -0,0 +1,6 @@ +.. _reporting: + +********************* +Reporting of Results +********************* + diff --git a/docs/sphinx/source/single_array.rst b/docs/sphinx/source/single_array.rst new file mode 100644 index 0000000000..f0f460a284 --- /dev/null +++ b/docs/sphinx/source/single_array.rst @@ -0,0 +1,3613 @@ +.. _single_array: + +************************* +Single Array PV System +************************* + +This tutorial explores the ``pvlib.pvsystem`` module. The module has +functions for importing PV module and inverter data and functions for +modeling module and inverter performance. + +1. `systemdef <#systemdef>`__ +2. `Angle of Incidence Modifiers <#Angle-of-Incidence-Modifiers>`__ +3. `Sandia Cell Temp correction <#Sandia-Cell-Temp-correction>`__ +4. `Sandia Inverter Model <#snlinverter>`__ +5. `Sandia Array Performance Model <#SAPM>`__ + + 1. `SAPM IV curves <#SAPM-IV-curves>`__ + +6. `DeSoto Model <#desoto>`__ +7. `Single Diode Model <#Single-diode-model>`__ + +This tutorial has been tested against the following package versions: \* +pvlib 0.3.0 \* Python 3.5.1 \* IPython 3.2 \* Pandas 0.18.0 + +It should work with other Python and Pandas versions. It requires pvlib +>= 0.3.0 and IPython >= 3.0. + +Authors: \* Will Holmgren (@wholmgren), University of Arizona. 2015, +March 2016. + +.. code:: python + + # built-in python modules + import os + import inspect + import datetime + + # scientific python add-ons + import numpy as np + import pandas as pd + + # plotting stuff + # first line makes the plots appear in the notebook + %matplotlib inline + import matplotlib.pyplot as plt + # seaborn makes your plots look better + try: + import seaborn as sns + sns.set(rc={"figure.figsize": (12, 6)}) + except ImportError: + print('We suggest you install seaborn using conda or pip and rerun this cell') + + # finally, we import the pvlib library + import pvlib + +.. code:: python + + import pvlib + from pvlib import pvsystem + +systemdef +~~~~~~~~~ + +``pvlib`` can import TMY2 and TMY3 data. Here, we import the example +files. + +.. code:: python + + pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvlib))) + + tmy3_data, tmy3_metadata = pvlib.tmy.readtmy3(os.path.join(pvlib_abspath, 'data', '703165TY.csv')) + tmy2_data, tmy2_metadata = pvlib.tmy.readtmy2(os.path.join(pvlib_abspath, 'data', '12839.tm2')) + +.. code:: python + + pvlib.pvsystem.systemdef(tmy3_metadata, 0, 0, .1, 5, 5) + + + + +.. parsed-literal:: + + {'albedo': 0.1, + 'altitude': 7.0, + 'latitude': 55.317, + 'longitude': -160.517, + 'name': '"SAND POINT"', + 'strings_per_inverter': 5, + 'modules_per_string': 5, + 'surface_azimuth': 0, + 'surface_tilt': 0, + 'tz': -9.0} + + + +.. code:: python + + pvlib.pvsystem.systemdef(tmy2_metadata, 0, 0, .1, 5, 5) + + + + +.. parsed-literal:: + + {'albedo': 0.1, + 'altitude': 2.0, + 'latitude': 25.8, + 'longitude': -80.26666666666667, + 'name': 'MIAMI', + 'strings_per_inverter': 5, + 'modules_per_string': 5, + 'surface_azimuth': 0, + 'surface_tilt': 0, + 'tz': -5} + + + +Angle of Incidence Modifiers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + angles = np.linspace(-180,180,3601) + ashraeiam = pd.Series(pvsystem.ashraeiam(.05, angles), index=angles) + + ashraeiam.plot() + plt.ylabel('ASHRAE modifier') + plt.xlabel('input angle (deg)') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_10_1.png + + +.. code:: python + + angles = np.linspace(-180,180,3601) + physicaliam = pd.Series(pvsystem.physicaliam(4, 0.002, 1.526, angles), index=angles) + + physicaliam.plot() + plt.ylabel('physical modifier') + plt.xlabel('input index') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_11_1.png + + +.. code:: python + + plt.figure() + ashraeiam.plot(label='ASHRAE') + physicaliam.plot(label='physical') + plt.ylabel('modifier') + plt.xlabel('input angle (deg)') + plt.legend() + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_12_1.png + + +Sandia Cell Temp correction +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PV system efficiency can vary by up to 0.5% per degree C, so it's +important to accurately model cell and module temperature. The +``sapm_celltemp`` function uses plane of array irradiance, ambient +temperature, wind speed, and module and racking type to calculate cell +and module temperatures. From King et. al. (2004): + +.. math:: T_m = E e^{a+b*WS} + T_a + +.. math:: T_c = T_m + \frac{E}{E_0} \Delta T + +The :math:`a`, :math:`b`, and :math:`\Delta T` parameters depend on the +module and racking type. The default parameter set is +``open_rack_cell_glassback``. + +``sapm_celltemp`` works with either scalar or vector inputs, but always +returns a pandas DataFrame. + +.. code:: python + + # scalar inputs + pvsystem.sapm_celltemp(900, 5, 20) # irrad, wind, temp + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + +
temp_celltemp_module
043.50919140.809191
+
+ + + +.. code:: python + + # vector inputs + times = pd.DatetimeIndex(start='2015-01-01', end='2015-01-02', freq='12H') + temps = pd.Series([0, 10, 5], index=times) + irrads = pd.Series([0, 500, 0], index=times) + winds = pd.Series([10, 5, 0], index=times) + + pvtemps = pvsystem.sapm_celltemp(irrads, winds, temps) + pvtemps.plot() + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_17_1.png + + +Cell and module temperature as a function of wind speed. + +.. code:: python + + wind = np.linspace(0,20,21) + temps = pd.DataFrame(pvsystem.sapm_celltemp(900, wind, 20), index=wind) + + temps.plot() + plt.legend() + plt.xlabel('wind speed (m/s)') + plt.ylabel('temperature (deg C)') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_19_1.png + + +Cell and module temperature as a function of ambient temperature. + +.. code:: python + + atemp = np.linspace(-20,50,71) + temps = pvsystem.sapm_celltemp(900, 2, atemp).set_index(atemp) + + temps.plot() + plt.legend() + plt.xlabel('ambient temperature (deg C)') + plt.ylabel('temperature (deg C)') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_21_1.png + + +Cell and module temperature as a function of incident irradiance. + +.. code:: python + + irrad = np.linspace(0,1000,101) + temps = pvsystem.sapm_celltemp(irrad, 2, 20).set_index(irrad) + + temps.plot() + plt.legend() + plt.xlabel('incident irradiance (W/m**2)') + plt.ylabel('temperature (deg C)') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_23_1.png + + +Cell and module temperature for different module and racking types. + +.. code:: python + + models = ['open_rack_cell_glassback', + 'roof_mount_cell_glassback', + 'open_rack_cell_polymerback', + 'insulated_back_polymerback', + 'open_rack_polymer_thinfilm_steel', + '22x_concentrator_tracker'] + + temps = pd.DataFrame(index=['temp_cell','temp_module']) + + for model in models: + temps[model] = pd.Series(pvsystem.sapm_celltemp(1000, 5, 20, model=model).ix[0]) + + temps.T.plot(kind='bar') # try removing the transpose operation and replotting + plt.legend() + plt.ylabel('temperature (deg C)') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_25_1.png + + +snlinverter +~~~~~~~~~~~ + +.. code:: python + + inverters = pvsystem.retrieve_sam('sandiainverter') + inverters + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_ABB__MICRO_0_25_I_OUTD_US_240_240V__CEC_2014_ABB__MICRO_0_3HV_I_OUTD_US_208_208V__CEC_2014_ABB__MICRO_0_3HV_I_OUTD_US_240_240V__CEC_2014_ABB__MICRO_0_3_I_OUTD_US_208_208V__CEC_2014_ABB__MICRO_0_3_I_OUTD_US_240_240V__CEC_2014_ABB__PVI_3_0_OUTD_S_US_Z_M_A__208_V__208V__CEC_2014_ABB__PVI_3_0_OUTD_S_US_Z_M_A__240_V__240V__CEC_2014_ABB__PVI_3_0_OUTD_S_US_Z_M_A__277_V__277V__CEC_2014_ABB__PVI_3_6_OUTD_S_US_Z_M__208_V__208V__CEC_2014_...Yes!_Solar_Inc___ES5000__240V__240V__CEC_2009_Yes!_Solar_Inc___ES5300__208V__208V__CEC_2009_Yes!_Solar_Inc___ES5300__240V__240V__CEC_2009_Zhejiang_Yuhui_Solar_Energy_Source__Replus_250A_240V__CEC_2012_Zhejiang_Yuhui_Solar_Energy_Source__Replus_250B_208V__CEC_2012_Zigor__Sunzet_2_TL_US_240V__CEC_2011_Zigor__Sunzet_3_TL_US_240V__CEC_2011_Zigor__Sunzet_4_TL_US_240V__CEC_2011_Zigor__Sunzet_5_TL_US_240V__CEC_2011_Zigor__SUNZET4_USA_240V__CEC_2011_
Vac208.000000240.000000208.000000240.000000208.000000240.000000208.000000240.000000277.000000208.000000...240.000000208.000000240.0000002.400000e+02208.000000240.000000240.000000240.000000240.000000240.000000
Paco250.000000250.000000300.000000300.000000300.000000300.0000003000.0000003000.0000003000.0000003600.000000...4900.0000004600.0000005300.0000002.251900e+02213.8300002110.0000003180.0000004160.0000005240.0000004030.000000
Pdco259.522050259.552697312.523347312.022059311.714554311.5049613147.0095283125.7582223110.3429423759.288140...5135.5841324829.4224095571.1809562.348419e+02225.5630552191.8251293313.6758054342.4093145495.8299264267.477069
Vdco40.24260339.98224645.25942945.49500940.22711140.136095313.429286340.842937389.986270309.948254...275.000000275.000000274.9000002.846843e+0128.632617399.207333389.513254388.562050386.082539302.851707
Pso1.7716141.9311941.8826201.9285911.9710531.99134218.10412219.86611222.72013524.202212...29.35894326.07150628.5190331.646711e+001.84502930.84370331.26504631.60170432.45080837.372766
C0-0.000025-0.000027-0.000049-0.000035-0.000036-0.000031-0.000009-0.000007-0.000006-0.000005...-0.000006-0.000006-0.000006-3.860000e-07-0.000121-0.000004-0.000006-0.000004-0.000005-0.000009
C1-0.000090-0.000158-0.000241-0.000228-0.000256-0.000289-0.000012-0.000025-0.0000440.000002...0.0000200.0000240.000019-3.580000e-04-0.000533-0.000077-0.000095-0.000079-0.000097-0.000029
C20.0006690.0014800.000975-0.000224-0.000833-0.0021100.0016200.0010500.0000360.001730...0.0018700.0026200.001630-1.350000e-020.0259000.0005020.0002610.000213-0.0002510.002150
C3-0.018900-0.034600-0.027600-0.039600-0.039100-0.049500-0.000217-0.000471-0.0015500.001140...-0.0002760.000468-0.000371-3.350684e+01-0.066800-0.003260-0.001960-0.001870-0.002340-0.001900
Pnt0.0200000.0500000.0600000.0600000.0200000.0500000.1000000.1000000.2000000.100000...0.5000000.5000000.5000001.700000e-010.1700000.2500000.2500000.2000000.2000000.190000
Vdcmax65.00000065.00000079.00000079.00000065.00000065.000000600.000000600.000000600.000000600.000000...600.000000600.000000600.0000005.500000e+0155.000000500.000000500.000000500.000000500.000000600.000000
Idcmax10.00000010.00000010.50000010.50000010.00000010.00000020.00000020.00000020.00000032.000000...25.00000025.00000025.0000001.400000e+0114.00000014.60000022.00000028.00000035.30000020.000000
Mppt_low20.00000020.00000030.00000030.00000030.00000030.000000160.000000160.000000160.000000120.000000...200.000000200.000000200.0000002.200000e+0122.000000150.000000150.000000150.000000150.000000240.000000
Mppt_high50.00000050.00000075.00000075.00000050.00000050.000000530.000000530.000000530.000000530.000000...550.000000550.000000550.0000004.500000e+0145.000000450.000000450.000000450.000000450.000000480.000000
+

14 rows × 1799 columns

+
+ + + +.. code:: python + + vdcs = pd.Series(np.linspace(0,50,51)) + idcs = pd.Series(np.linspace(0,11,110)) + pdcs = idcs * vdcs + + pacs = pvsystem.snlinverter(inverters['ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_'], vdcs, pdcs) + #pacs.plot() + plt.plot(pacs, pdcs) + plt.ylabel('ac power') + plt.xlabel('dc power') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_28_1.png + + +Need to put more effort into describing this function. + +SAPM +~~~~ + +The CEC module database. + +.. code:: python + + cec_modules = pvsystem.retrieve_sam('cecmod') + cec_modules + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BEoptCA_Default_ModuleExample_Module1Soltech_1STH_215_P1Soltech_1STH_220_P1Soltech_1STH_225_P1Soltech_1STH_230_P1Soltech_1STH_235_WH1Soltech_1STH_240_WH1Soltech_1STH_245_WH1Soltech_1STH_FRL_4H_245_M60_BLK...Zytech_Solar_ZT275PZytech_Solar_ZT280PZytech_Solar_ZT285PZytech_Solar_ZT290PZytech_Solar_ZT295PZytech_Solar_ZT300PZytech_Solar_ZT305PZytech_Solar_ZT310PZytech_Solar_ZT315PZytech_Solar_ZT320P
BIPVYYNNNNNNNN...NNNNNNNNNN
Date12/17/20084/28/200810/7/201010/4/201010/4/201010/4/20103/4/20103/4/20103/4/20101/14/2013...12/23/201412/23/201412/23/201412/23/201412/23/201412/23/201412/23/201412/23/201412/23/201412/23/2014
T_NOCT656547.447.447.447.449.949.949.948.3...46.446.446.446.446.446.446.446.446.446.4
A_c0.670.671.5671.5671.5671.5671.6351.6351.6351.668...1.9311.9311.9311.9311.9311.9311.9311.9311.9311.931
N_s18186060606060606060...72727272727272727272
I_sc_ref7.57.57.847.978.098.188.548.588.628.81...8.318.48.488.558.648.718.878.99.019.12
V_oc_ref10.410.436.336.636.937.13737.137.238.3...45.145.2545.4345.5945.7545.9646.1246.2846.4446.6
I_mp_ref6.66.67.357.477.587.658.028.078.18.06...7.767.877.978.078.168.268.368.468.568.66
V_mp_ref8.48.42929.329.629.929.329.730.230.2...35.4435.6235.835.9436.1636.3236.4936.6636.8137
alpha_sc0.0030.0030.0079970.0081290.0082520.0083440.007430.0074650.0074990.006167...0.0040140.0040570.0040960.004130.0041730.0042070.0042840.0042990.0043520.004405
beta_oc-0.04-0.04-0.13104-0.13213-0.13321-0.13393-0.13653-0.1369-0.13727-0.13635...-0.14428-0.14476-0.14533-0.14584-0.14635-0.14703-0.14754-0.14805-0.14856-0.14907
a_ref0.4730.4731.64131.65721.67321.68881.62921.64251.66171.6351...1.81021.81471.821.82271.83111.84431.8491.85731.86491.8737
I_L_ref7.5457.5457.8437.9748.0948.1858.5438.5828.6238.844...8.3248.418.4878.5528.6428.8058.8748.9959.1079.218
I_o_ref1.943e-091.943e-091.936e-092.03e-092.126e-092.332e-091.166e-091.325e-091.623e-095.7e-10...1.24e-101.23e-101.22e-101.17e-101.22e-101.31e-101.3e-101.35e-101.38e-101.44e-10
R_s0.0940.0940.3590.3460.3340.3110.3830.3350.2720.421...0.5670.5530.5440.5390.5210.5160.5070.4960.4880.476
R_sh_ref15.7215.72839.4751.03670.65462.561257.841463.82724.06109.31...341.66457.29687.162344.162910.76552.21118.01767.45681.89603.91
Adjust10.610.616.516.817.117.98.79.811.66.502...5.5545.4065.1974.7925.0335.5485.3735.5785.7115.971
gamma_r-0.5-0.5-0.495-0.495-0.495-0.495-0.482-0.482-0.482-0.453...-0.431-0.431-0.431-0.431-0.431-0.431-0.431-0.431-0.431-0.431
VersionMM106MM105MM107MM107MM107MM107MM107MM107MM107NRELv1...NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1
PTC48.948.9189.4194198.5203.1205.1209.6214.1217.7...248252.6257.3261.9266.5271.2275.8280.5285.1289.8
TechnologyMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMono-c-SiMono-c-SiMono-c-SiMono-c-Si...Multi-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-Si
+

21 rows × 13953 columns

+
+ + + +.. code:: python + + cecmodule = cec_modules.Example_Module + cecmodule + + + + +.. parsed-literal:: + + BIPV Y + Date 4/28/2008 + T_NOCT 65 + A_c 0.67 + N_s 18 + I_sc_ref 7.5 + V_oc_ref 10.4 + I_mp_ref 6.6 + V_mp_ref 8.4 + alpha_sc 0.003 + beta_oc -0.04 + a_ref 0.473 + I_L_ref 7.545 + I_o_ref 1.943e-09 + R_s 0.094 + R_sh_ref 15.72 + Adjust 10.6 + gamma_r -0.5 + Version MM105 + PTC 48.9 + Technology Multi-c-Si + Name: Example_Module, dtype: object + + + +The Sandia module database. + +.. code:: python + + sandia_modules = pvsystem.retrieve_sam(name='SandiaMod') + sandia_modules + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advent_Solar_AS160___2006_Advent_Solar_Ventura_210___2008_Advent_Solar_Ventura_215___2009_Aleo_S03_160__2007__E__Aleo_S03_165__2007__E__Aleo_S16_165__2007__E__Aleo_S16_170__2007__E__Aleo_S16_175__2007__E__Aleo_S16_180__2007__E__Aleo_S16_185__2007__E__...Panasonic_VBHN235SA06B__2013_Trina_TSM_240PA05__2013_Hanwha_HSL60P6_PA_4_250T__2013_Suniva_OPT300_72_4_100__2013_Canadian_Solar_CS6X_300M__2013_LG_LG290N1C_G3__2013_Sharp_NDQ235F4__2013_Solar_Frontier_SF_160S__2013_SolarWorld_Sunmodule_250_Poly__2013_Silevo_Triex_U300_Black__2014_
Vintage2006200820092007 (E)2007 (E)2007 (E)2007 (E)2007 (E)2007 (E)2007 (E)...2013201320132013201320132013201320132014
Area1.3121.6461.6461.281.281.3781.3781.3781.3781.378...1.261.631.651.931.911.641.561.221.681.68
Materialmc-Simc-Simc-Sic-Sic-Simc-Simc-Simc-Simc-Simc-Si...a-Si / mono-Simc-Simc-Sic-Sic-Sic-Simc-SiCISmc-Sic-Si
Cells_in_Series72606072725050505050...726060727260601726096
Parallel_Strings1111111111...1111111111
Isco5.5648.348.495.15.27.97.958.18.158.2...5.87388.84498.59358.57538.63889.85258.67392.02598.37685.771
Voco42.83235.3135.9243.543.63030.130.230.330.5...52.004236.892636.807544.292143.591839.611736.8276112.50536.380668.5983
Impo5.0287.497.744.554.657.087.237.387.537.67...5.53838.29558.08227.9638.13599.24738.12431.83567.69215.383
Vmpo32.4127.6127.9235.635.823.323.523.723.924.1...43.120429.06629.201135.083734.953131.292129.198886.675228.34855.4547
Aisc0.0005370.000770.000820.00030.00030.00080.00080.00080.00080.0008...0.00050.00040.00040.00060.00050.00020.00060.00010.00060.0003
Aimp-0.000491-0.00015-0.00013-0.00025-0.00025-0.0003-0.0003-0.0003-0.0003-0.0003...-0.0001-0.0003-0.0003-0.0002-0.0001-0.0004-0.0002-0.0003-0.0001-0.0003
C01.02330.9371.0150.990.990.990.990.990.990.99...1.00151.01161.00610.9991.01211.01451.00491.00961.01580.995
C1-0.02330.063-0.0150.010.010.010.010.010.010.01...-0.0015-0.0116-0.00610.001-0.0121-0.0145-0.0049-0.0096-0.01580.005
Bvoco-0.1703-0.133-0.135-0.152-0.152-0.11-0.11-0.11-0.11-0.11...-0.1411-0.137-0.1263-0.155-0.1532-0.1205-0.1279-0.3044-0.1393-0.1913
Mbvoc0000000000...0000000000
Bvmpo-0.1731-0.135-0.136-0.158-0.158-0.115-0.115-0.115-0.115-0.115...-0.1366-0.1441-0.1314-0.1669-0.1634-0.1337-0.1348-0.2339-0.1449-0.184
Mbvmp0000000000...0000000000
N1.1741.4951.3731.251.251.351.351.351.351.35...1.0291.20731.06861.07711.00251.09251.06951.20661.2261.345
C2-0.764440.01820.0036-0.15-0.15-0.12-0.12-0.12-0.12-0.12...0.2859-0.07993-0.2585-0.355-0.171-0.4647-0.2718-0.5426-0.096770.3221
C3-15.5087-10.758-7.2509-8.96-8.96-11.08-11.08-11.08-11.08-11.08...-5.48455-7.27624-9.85905-13.0643-9.39745-11.9008-11.4033-15.2598-8.51148-6.7178
A00.92810.90670.93230.9380.9380.9240.9240.9240.9240.924...0.91610.96450.94280.93270.93710.97310.94360.93540.92880.9191
A10.066150.095730.065260.054220.054220.067490.067490.067490.067490.06749...0.079680.027530.05360.072830.062620.029660.047650.068090.072010.09988
A2-0.01384-0.0266-0.01567-0.009903-0.009903-0.012549-0.012549-0.012549-0.012549-0.012549...-0.01866-0.002848-0.01281-0.02402-0.01667-0.01024-0.007405-0.02094-0.02065-0.04273
A30.0012980.003430.001930.00072970.00072970.00100490.00100490.00100490.00100490.0010049...0.002278-0.00014390.0018260.0038190.0021680.0017930.00038180.002930.0028620.00937
A4-4.6e-05-0.0001794-9.81e-05-1.907e-05-1.907e-05-2.8797e-05-2.8797e-05-2.8797e-05-2.8797e-05-2.8797e-05...-0.00011182.219e-05-0.0001048-0.000235-0.0001087-0.0001286-1.101e-05-0.0001564-0.0001544-0.0007643
B01111111111...1111111111
B1-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438...-0.01053-0.00261-0.007861-0.006801-0.00789-0.0154-0.00464-0.0152-0.00308-0.006498
B20.00031030.000310.000310.00031030.00031030.00031030.00031030.00031030.00031030.0003103...0.0011490.00032790.00090580.00079680.00086560.0015720.0005590.0015980.00040530.0006908
B3-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05...-4.268e-05-1.458e-05-3.496e-05-3.095e-05-3.298e-05-5.525e-05-2.249e-05-5.682e-05-1.729e-05-2.678e-05
B42.11e-072.11e-072.11e-072.11e-072.11e-072.11e-072.11e-072.11e-072.11e-072.11e-07...6.517e-072.654e-075.473e-074.896e-075.178e-078.04e-073.673e-078.326e-072.997e-074.322e-07
B5-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09...-3.556e-09-1.732e-09-3.058e-09-2.78e-09-2.918e-09-4.202e-09-2.144e-09-4.363e-09-1.878e-09-2.508e-09
DTC3333333333...2.033.032.552.583.23.053.273.293.193.13
FD1111111111...1111111111
A-3.35-3.45-3.47-3.56-3.56-3.56-3.56-3.56-3.56-3.56...-3.7489-3.5924-3.5578-3.7566-3.6024-3.4247-3.7445-3.6836-3.73-3.6866
B-0.1161-0.077-0.087-0.075-0.075-0.075-0.075-0.075-0.075-0.075...-0.1287-0.1319-0.1766-0.156-0.2106-0.0951-0.149-0.1483-0.1483-0.104
C40.99740.9720.9890.9950.9950.9950.9950.9950.9950.995...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
C50.00260.0280.0120.0050.0050.0050.0050.0050.0050.005...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
IXO5.548.258.495.045.147.87.8588.058.1...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
IXXO3.565.25.453.163.254.925.085.185.395.54...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
C61.1731.0671.1371.151.151.151.151.151.151.15...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
C7-0.173-0.067-0.137-0.15-0.15-0.15-0.15-0.15-0.15-0.15...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
NotesSource: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9......Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2014. Mo...
+

42 rows × 523 columns

+
+ + + +.. code:: python + + sandia_module = sandia_modules.Canadian_Solar_CS5P_220M___2009_ + sandia_module + + + + +.. parsed-literal:: + + Vintage 2009 + Area 1.701 + Material c-Si + Cells_in_Series 96 + Parallel_Strings 1 + Isco 5.09115 + Voco 59.2608 + Impo 4.54629 + Vmpo 48.3156 + Aisc 0.000397 + Aimp 0.000181 + C0 1.01284 + C1 -0.0128398 + Bvoco -0.21696 + Mbvoc 0 + Bvmpo -0.235488 + Mbvmp 0 + N 1.4032 + C2 0.279317 + C3 -7.24463 + A0 0.928385 + A1 0.068093 + A2 -0.0157738 + A3 0.0016606 + A4 -6.93e-05 + B0 1 + B1 -0.002438 + B2 0.0003103 + B3 -1.246e-05 + B4 2.11e-07 + B5 -1.36e-09 + DTC 3 + FD 1 + A -3.40641 + B -0.0842075 + C4 0.996446 + C5 0.003554 + IXO 4.97599 + IXXO 3.18803 + C6 1.15535 + C7 -0.155353 + Notes Source: Sandia National Laboratories Updated 9... + Name: Canadian_Solar_CS5P_220M___2009_, dtype: object + + + +Generate some irradiance data for modeling. + +.. code:: python + + from pvlib import clearsky + from pvlib import irradiance + from pvlib import atmosphere + from pvlib.location import Location + + tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson') + times_loc = pd.date_range(start=datetime.datetime(2014,4,1), end=datetime.datetime(2014,4,2), freq='30s', tz=tus.tz) + ephem_data = pvlib.solarposition.get_solarposition(times_loc, tus.latitude, tus.longitude) + irrad_data = clearsky.ineichen(times_loc, tus.latitude, tus.longitude) + #irrad_data.plot() + + aoi = irradiance.aoi(0, 0, ephem_data['apparent_zenith'], ephem_data['azimuth']) + #plt.figure() + #aoi.plot() + + am = atmosphere.relativeairmass(ephem_data['apparent_zenith']) + + # a hot, sunny spring day in the desert. + temps = pvsystem.sapm_celltemp(irrad_data['ghi'], 0, 30) + +Now we can run the module parameters and the irradiance data through the +SAPM function. + +.. code:: python + + sapm_1 = pvsystem.sapm(sandia_module, irrad_data['dni']*np.cos(np.radians(aoi)), + irrad_data['dhi'], temps['temp_cell'], am, aoi) + sapm_1.head() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
i_sci_mpv_ocv_mpp_mpi_xi_xxeffective_irradiance
2014-04-01 00:00:00-07:000.00.00.00.00.00.00.00.0
2014-04-01 00:00:30-07:000.00.00.00.00.00.00.00.0
2014-04-01 00:01:00-07:000.00.00.00.00.00.00.00.0
2014-04-01 00:01:30-07:000.00.00.00.00.00.00.00.0
2014-04-01 00:02:00-07:000.00.00.00.00.00.00.00.0
+
+ + + +.. code:: python + + def plot_sapm(sapm_data): + """ + Makes a nice figure with the SAPM data. + + Parameters + ---------- + sapm_data : DataFrame + The output of ``pvsystem.sapm`` + """ + fig, axes = plt.subplots(2, 3, figsize=(16,10), sharex=False, sharey=False, squeeze=False) + plt.subplots_adjust(wspace=.2, hspace=.3) + + ax = axes[0,0] + sapm_data.filter(like='i_').plot(ax=ax) + ax.set_ylabel('Current (A)') + + ax = axes[0,1] + sapm_data.filter(like='v_').plot(ax=ax) + ax.set_ylabel('Voltage (V)') + + ax = axes[0,2] + sapm_data.filter(like='p_').plot(ax=ax) + ax.set_ylabel('Power (W)') + + ax = axes[1,0] + [ax.plot(sapm_data['effective_irradiance'], current, label=name) for name, current in + sapm_data.filter(like='i_').iteritems()] + ax.set_ylabel('Current (A)') + ax.set_xlabel('Effective Irradiance') + ax.legend(loc=2) + + ax = axes[1,1] + [ax.plot(sapm_data['effective_irradiance'], voltage, label=name) for name, voltage in + sapm_data.filter(like='v_').iteritems()] + ax.set_ylabel('Voltage (V)') + ax.set_xlabel('Effective Irradiance') + ax.legend(loc=4) + + ax = axes[1,2] + ax.plot(sapm_data['effective_irradiance'], sapm_data['p_mp'], label='p_mp') + ax.set_ylabel('Power (W)') + ax.set_xlabel('Effective Irradiance') + ax.legend(loc=2) + + # needed to show the time ticks + for ax in axes.flatten(): + for tk in ax.get_xticklabels(): + tk.set_visible(True) + +.. code:: python + + plot_sapm(sapm_1) + + + +.. image:: _images/pvsystem_files/pvsystem_42_0.png + + +For comparison, here's the SAPM for a sunny, windy, cold version of the +same day. + +.. code:: python + + temps = pvsystem.sapm_celltemp(irrad_data['ghi'], 10, 5) + + sapm_2 = pvsystem.sapm(sandia_module, irrad_data['dni']*np.cos(np.radians(aoi)), + irrad_data['dhi'], temps['temp_cell'], am, aoi) + + plot_sapm(sapm_2) + + + +.. image:: _images/pvsystem_files/pvsystem_44_0.png + + +.. code:: python + + sapm_1['p_mp'].plot(label='30 C, 0 m/s') + sapm_2['p_mp'].plot(label=' 5 C, 10 m/s') + plt.legend() + plt.ylabel('Pmp') + plt.title('Comparison of a hot, calm day and a cold, windy day') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_45_1.png + + +SAPM IV curves +^^^^^^^^^^^^^^ + +The IV curve function only calculates the 5 points of the SAPM. We will +add arbitrary points in a future release, but for now we just +interpolate between the 5 SAPM points. + +.. code:: python + + import warnings + warnings.simplefilter('ignore', np.RankWarning) + +.. code:: python + + def sapm_to_ivframe(sapm_row): + pnt = sapm_row.T.ix[:,0] + + ivframe = {'Isc': (pnt['i_sc'], 0), + 'Pmp': (pnt['i_mp'], pnt['v_mp']), + 'Ix': (pnt['i_x'], 0.5*pnt['v_oc']), + 'Ixx': (pnt['i_xx'], 0.5*(pnt['v_oc']+pnt['v_mp'])), + 'Voc': (0, pnt['v_oc'])} + ivframe = pd.DataFrame(ivframe, index=['current', 'voltage']).T + ivframe = ivframe.sort_values(by='voltage') + + return ivframe + + def ivframe_to_ivcurve(ivframe, points=100): + ivfit_coefs = np.polyfit(ivframe['voltage'], ivframe['current'], 30) + fit_voltages = np.linspace(0, ivframe.ix['Voc', 'voltage'], points) + fit_currents = np.polyval(ivfit_coefs, fit_voltages) + + return fit_voltages, fit_currents + +.. code:: python + + sapm_to_ivframe(sapm_1['2014-04-01 10:00:00']) + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
currentvoltage
Isc3.8482140.000000
Ix3.75778425.754530
Pmp3.42503840.706316
Ixx2.50449746.107688
Voc0.00000051.509060
+
+ + + +.. code:: python + + times = ['2014-04-01 07:00:00', '2014-04-01 08:00:00', '2014-04-01 09:00:00', + '2014-04-01 10:00:00', '2014-04-01 11:00:00', '2014-04-01 12:00:00'] + times.reverse() + + fig, ax = plt.subplots(1, 1, figsize=(12,8)) + + for time in times: + ivframe = sapm_to_ivframe(sapm_1[time]) + + fit_voltages, fit_currents = ivframe_to_ivcurve(ivframe) + + ax.plot(fit_voltages, fit_currents, label=time) + ax.plot(ivframe['voltage'], ivframe['current'], 'ko') + + ax.set_xlabel('Voltage (V)') + ax.set_ylabel('Current (A)') + ax.set_ylim(0, None) + ax.set_title('IV curves at multiple times') + ax.legend() + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_51_1.png + + +desoto +~~~~~~ + +The same data run through the desoto model. + +.. code:: python + + photocurrent, saturation_current, resistance_series, resistance_shunt, nNsVth = ( + pvsystem.calcparams_desoto(irrad_data.ghi, + temp_cell=temps['temp_cell'], + alpha_isc=cecmodule['alpha_sc'], + module_parameters=cecmodule, + EgRef=1.121, + dEgdT=-0.0002677) ) + +.. code:: python + + photocurrent.plot() + plt.ylabel('Light current I_L (A)') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_55_1.png + + +.. code:: python + + saturation_current.plot() + plt.ylabel('Saturation current I_0 (A)') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_56_1.png + + +.. code:: python + + resistance_series + + + + +.. parsed-literal:: + + 0.094 + + + +.. code:: python + + resistance_shunt.plot() + plt.ylabel('Shunt resistance (ohms)') + plt.ylim(0,100) + + + + +.. parsed-literal:: + + (0, 100) + + + + +.. image:: _images/pvsystem_files/pvsystem_58_1.png + + +.. code:: python + + nNsVth.plot() + plt.ylabel('nNsVth') + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_59_1.png + + +Single diode model +~~~~~~~~~~~~~~~~~~ + +.. code:: python + + single_diode_out = pvsystem.singlediode(cecmodule, photocurrent, saturation_current, + resistance_series, resistance_shunt, nNsVth) + single_diode_out + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
i_mpi_sci_xi_xxp_mpv_mpv_oc
2014-04-01 00:00:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:00:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:01:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:01:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:02:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:02:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:03:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:03:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:04:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:04:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:05:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:05:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:06:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:06:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:07:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:07:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:08:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:08:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:09:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:09:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:10:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:10:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:11:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:11:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:12:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:12:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:13:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:13:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:14:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:14:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
........................
2014-04-01 23:45:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:46:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:46:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:47:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:47:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:48:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:48:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:49:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:49:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:50:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:50:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:51:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:51:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:52:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:52:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:53:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:53:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:54:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:54:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:55:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:55:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:56:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:56:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:57:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:57:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:58:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:58:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:59:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:59:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-02 00:00:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
+

2881 rows × 7 columns

+
+ + + +.. code:: python + + single_diode_out['i_sc'].plot() + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_62_1.png + + +.. code:: python + + single_diode_out['v_oc'].plot() + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_63_1.png + + +.. code:: python + + single_diode_out['p_mp'].plot() + + + + +.. parsed-literal:: + + + + + + +.. image:: _images/pvsystem_files/pvsystem_64_1.png + + diff --git a/docs/sphinx/source/solarposition.rst b/docs/sphinx/source/solarposition.rst new file mode 100644 index 0000000000..1aa6abab79 --- /dev/null +++ b/docs/sphinx/source/solarposition.rst @@ -0,0 +1,6 @@ +.. _solarposition: + +************************************************* +Solar Geometry and Solar Position +************************************************* + diff --git a/docs/sphinx/source/statistics.rst b/docs/sphinx/source/statistics.rst new file mode 100644 index 0000000000..b666481805 --- /dev/null +++ b/docs/sphinx/source/statistics.rst @@ -0,0 +1,18 @@ +.. _statistics: + +************************************************* +Statistics of Solar Data and Simulation Results +************************************************* + +Descriptive Statistics +====================== + +Comparison +====================== + +Distributions +====================== + + +Special Indicators +====================== \ No newline at end of file diff --git a/docs/sphinx/source/system.rst b/docs/sphinx/source/system.rst new file mode 100644 index 0000000000..6a8050d177 --- /dev/null +++ b/docs/sphinx/source/system.rst @@ -0,0 +1,25 @@ +.. _system: + +***************** +System Modelling +***************** + +This section deals with modelling of diffrent configurations of a PV system. +It builds on previous sections which explained the +* Fundamentals & Basics + + * Prepration of input data timeseries + * modelling of modules + * modelling of inverter + +System modelling can be scaled depending on the compelexity of the target system or the objective of the calculation. + +The sequenced steps for different system types are described in the following: + +.. toctree:: + :maxdepth: 3 + + single_array + multi_array_losses + trackers + diff --git a/docs/sphinx/source/system_loss_modeling.rst b/docs/sphinx/source/system_loss_modeling.rst new file mode 100644 index 0000000000..0a4a84c53f --- /dev/null +++ b/docs/sphinx/source/system_loss_modeling.rst @@ -0,0 +1,410 @@ + +Modeling multiple systems with system losses +============================================ + +This tutorial provides an outline of techniques to model single inverter +systems with multiple strings. + +A number of complexities are included: + +- Converting a CSV to a dictionary of system losses +- Modeling multiple systems at a time +- Modeling inverters with temperature derating applied to maximum power + output + +Author: + +:: + + Jessica Forbess (@jforbess), Sunshine Analytics, September 2015 + +.. code:: python + + # built-in imports + import sys + import datetime + import os.path + import inspect + + # add-on imports + import pandas as pd + import matplotlib + import matplotlib.pyplot as plt + %matplotlib inline + try: + import seaborn as sns + sns.set(rc={"figure.figsize": (12, 6)}) + sns.set_color_codes() + except ImportError: + print('We suggest you install seaborn using conda or pip and rerun this cell') + + import numpy as np + + # pvlib imports + from pvlib.location import Location + import pvlib.solarposition + import pvlib.clearsky + import pvlib.tmy + + import logging + logging.getLogger('pvlib').setLevel(logging.WARNING) # WARNING to avoid clearsky output, INFO or DEBUG for more + + + +Import site configuration data +============================== + +The dictionary holding the configuration data below is a beginning point +to discuss a structure for system losses. It will likely be improved +upon and standardized in the future. + +.. code:: python + + # Replaces all punctuation in equipment (module/inverter) names with underscores to match Sandia databases + def clean_punc(equip): + equip = equip.replace(' ', '_').replace('-', '_').replace('.', '_').replace('(', '_').replace('/', '_') + equip = equip.replace(')', '_').replace('[', '_').replace(']', '_').replace(':', '_').replace('+', '_') + equip = equip.replace('"', '_') + return equip + + + # Find the absolute file path to your pvlib installation + pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvlib))) + + # absolute path to a data file + datapath = os.path.join(pvlib_abspath, 'data', 'site_config.csv') + + # Import site config data, skipping any row starting with # + # In this file, each line represents a site with one inverter + site_config = pd.read_csv(datapath, comment='#') + # Load list of site names to iterate over + site_names = list(set(site_config['Plant Name'].tolist())) + site_names.sort() + + # initialize config dictionary + meta = {} + + # Load site config data from csv file into meta dict variable + for n in site_names: + # Solar position code needs a Location object + m = pvlib.location.Location(site_config[site_config['Plant Name'] == n].iloc[0]['Latitude'], + site_config[site_config['Plant Name'] == n].iloc[0]['Longitude'], + site_config[site_config['Plant Name'] == n].iloc[0]['Timezone'], + float(site_config[site_config['Plant Name'] == n].iloc[0]['Elev (meters)']), + site_config[site_config['Plant Name'] == n].iloc[0]['Plant Name']) ## One common name for site + # Systemdef needs a dict instead of a Location object + s = pvlib.pvsystem.systemdef({'latitude': site_config[site_config['Plant Name'] == n].iloc[0]['Latitude'], + 'longitude': site_config[site_config['Plant Name'] == n].iloc[0]['Longitude'], + 'altitude': float(site_config[site_config['Plant Name'] == n].iloc[0]['Elev (meters)']), + 'TZ': site_config[site_config['Plant Name'] == n].iloc[0]['Timezone'], + 'Name': n}, ## Specific name for subarray + int(site_config[site_config['Plant Name'] == n].iloc[0]['surface_tilt']), + int(site_config[site_config['Plant Name'] == n].iloc[0]['surface_azimuth']), + float(site_config[site_config['Plant Name'] == n].iloc[0]['albedo']), + int(site_config[site_config['Plant Name'] == n].iloc[0]['series_modules']), + float(site_config[site_config['Plant Name'] == n].iloc[0]['parallel_modules'])) + # Other equipment information that isn't stored in systemdef + e = {'module_name': clean_punc(site_config[site_config['Plant Name'] == n].iloc[0]['module_name']), + 'module_count': int(site_config[site_config['Plant Name'] == n].iloc[0]['module_count']), + 'module_wattage': float(site_config[site_config['Plant Name'] == n].iloc[0]['module_wattage']), + 'inverter_name': clean_punc(site_config[site_config['Plant Name'] == n].iloc[0]['inverter_name']), + 'inverter_count': int(site_config[site_config['Plant Name'] == n].iloc[0]['inverter_count']), + 'inverter_pmax': int(site_config[site_config['Plant Name'] == n].iloc[0]['inv_pmax']), + 'inverter_pnom': int(site_config[site_config['Plant Name'] == n].iloc[0]['inv_pnom']*1000), # in kW in config file + 'inverter_pmax_default': int(site_config[site_config['Plant Name'] == n].iloc[0]['inv_pmax_default']*1000), # in kW in config file + 'inverter_pmax_temp': int(site_config[site_config['Plant Name'] == n].iloc[0]['inv_pmax_temp']), + 'inverter_pnom_temp': int(site_config[site_config['Plant Name'] == n].iloc[0]['inv_pnom_temp']), + 'row_pitch': float(site_config[site_config['Plant Name'] == n].iloc[0]['pitch']), + 'collector': float(site_config[site_config['Plant Name'] == n].iloc[0]['collector']),} + # System Losses + q = {'soiling': float(site_config[site_config['Plant Name'] == n].iloc[0]['Soiling']), + 'dcohmic': float(site_config[site_config['Plant Name'] == n].iloc[0]['DCOhmic']), + 'mqf': float(site_config[site_config['Plant Name'] == n].iloc[0]['MQF']), + 'lid': float(site_config[site_config['Plant Name'] == n].iloc[0]['LID']), + 'mismatch': float(site_config[site_config['Plant Name'] == n].iloc[0]['Mismatch']), + 'acohmic': float(site_config[site_config['Plant Name'] == n].iloc[0]['ACOhmic']), + 'mvload': float(site_config[site_config['Plant Name'] == n].iloc[0]['MVLoad']), + } + meta[n] = [m,s,e,q] + + # Load Module and Inverter dbs + ## Direct from Sandia, or can download locally and provide filename -- much faster + moddb = pvlib.pvsystem.retrieve_sam(name='CECMod') + invdb = pvlib.pvsystem.retrieve_sam(name='CECInverter') + + # Confirm sites loaded, and Lat/Long + for n in site_names: + print(meta[n][1]['name'],": ",meta[n][1]['latitude'], meta[n][1]['longitude']) + + +.. parsed-literal:: + + Site 1: 500kWac : 38.6 -121.5 + Site 2: 880kWac : 38.6 -121.5 + Site 3: 660kWac : 38.6 -121.5 + + +Define key system model method +============================== + +This method takes system configuration information and applies it to the +environmental data to create modeled power for each time sample. It can +be used with standard TMY3 hour data, or finer grain environmental data, +if available. + +Note that the meta defined in this method is a subset of the meta +defined in the overarching script. + +.. code:: python + + def subarray(meta, d, module_type, inverter_type, + inv_pmax, inv_pnom, inv_pmax_default, inv_pmax_temp, inv_pnom_temp, + pitch, col, losses): + df = d + # Find Isc at STC for DC ohmic loss estimate + IL,I0,Rs,Rsh,nNsVth=pvlib.pvsystem.calcparams_desoto(poa_global=1000, + temp_cell=25, + alpha_isc=.003, + module_parameters=module_type, + EgRef=1.121, + dEgdT= -0.0002677) + DFOut = pvlib.pvsystem.singlediode(module_type, IL, I0, Rs, Rsh, nNsVth) + stc_i_sc = DFOut['i_sc'] + # Calculate Isc for entire array by multiplying Isc by number of parallel modules (actually strings) + # Used as basis to scale DC and AC ohmic losses + stc_array_i_sc = stc_i_sc * meta['parallel_modules'] + + # Calculate IAM + df['IAMa'] = pvlib.pvsystem.ashraeiam(b = 0.05, aoi = df['AOI']) + df['IAMa'].fillna(0, inplace=True) + + # Soiling + df['Soiling'] = 1 - losses['soiling'] + + # Calculate module IV params for POA and temps experienced + IL,I0,Rs,Rsh,nNsVth=pvlib.pvsystem.calcparams_desoto(poa_global=df['poa_global'], + temp_cell=df['tcell'], + alpha_isc=.003, + module_parameters=module_type, + EgRef=1.121, + dEgdT= -0.0002677) + DFOut = pvlib.pvsystem.singlediode(module_type, IL, I0, Rs, Rsh, nNsVth) + df['sd_i_mp'] = DFOut['i_mp'] + df['sd_v_oc'] = DFOut['v_oc'] + df['sd_v_mp'] = DFOut['v_mp'] + df['sd_p_mp'] = DFOut['p_mp'] + df['sd_i_x'] = DFOut['i_x'] + df['sd_i_xx'] = DFOut['i_xx'] + + + # Module Quality + df['MQF'] = 1 - losses['mqf'] + # LID + df['LID'] = 1 - losses['lid'] + # Mismatch + df['Mismatch'] = 1 - losses['mismatch'] + # DC kW + df['sd_string_v_mp'] = meta['series_modules'] * df.sd_v_mp + df['sd_array_i_mp'] = meta['parallel_modules'] * df.sd_i_mp + # DC ohmic + df['DCohmic'] = 1 - losses['dcohmic'] * pow(df.sd_array_i_mp / stc_array_i_sc, 2) + df['sd_array_p_mp'] = df.sd_string_v_mp * df.sd_array_i_mp * df.DCohmic * df.MQF * df.LID * df.Mismatch + df['sd_array_kp_mp'] = df.sd_array_p_mp / 1000 + + # Temperature Derate of Inverter + # Approximating warmer temps input to inverter + df['Tinv'] = df['DryBulb'] + 4 + ## Model doesn't include sharp drop limit over 50C + # Calculate maximum clipping level based on temperature. Clip level is never lower than nominal inverter level (pmax). + def clip_level(tamb): + return min(inv_pmax, + inv_pmax_default - max(tamb - inv_pmax_temp,0) * (inv_pmax_default - inv_pnom) / (inv_pnom_temp - inv_pmax_temp))/1000 + + df['ACPowerClipLevel'] = df['Tinv'].apply(clip_level) + # AC kW + df['ACPower'] = pvlib.pvsystem.snlinverter(v_dc = df.sd_string_v_mp, + p_dc = df.sd_array_p_mp, + inverter = inverter_type) / 1000 + # Clip any ACPower values that exceed temperature bounded maximum + df['ACPowerClipped'] = pd.DataFrame([df['ACPower'], df['ACPowerClipLevel']]).min() + + # AC ohmic + df['ACohmic'] = 1 - losses['acohmic'] * pow(df.sd_array_i_mp / stc_array_i_sc, 2) # Scaled by DC current as rough approximation + + # MV Transformer + df['MVLoad'] = 1 - losses['mvload'] + + df['ArrayPower'] = df.ACPowerClipped * df.ACohmic * df.MVLoad + + +Load environmental data +======================= + +Data is a dictionary of DataFrames, with each site\_name as a key. Plane +of Array irradiance and module temperatures are calculated here as well. + +.. code:: python + + # Initialize the dataframe dictionary + Data = {} + + # Find the absolute file path to your pvlib installation + pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvlib))) + + # absolute path to a data file + datapath = os.path.join(pvlib_abspath, 'data', '724839TYA.csv') + + # read tmy data with year values coerced to a single year + tmy_data, meta_tmy = pvlib.tmy.readtmy3(datapath, coerce_year=2015) + tmy_data.index.name = 'Time' + + # TMY data seems to be given as hourly data with time stamp at the end + # shift the index 30 Minutes back for calculation of sun positions + tmy_data = tmy_data.shift(freq='-30Min') + + for n in site_names: + print('System Name: ' + n + '\n') + # Initialize dataset with environmental data + Data[n] = tmy_data + # Generate clear sky data for site to compare to POA sensors + # Calculate solar position using Ephemeris Calculations + solpos = pvlib.solarposition.get_solarposition(Data[n].index, meta[n][0], method='pyephem') + Data[n] = pd.concat([Data[n], solpos], axis=1) + + # Calculate extraterrestrial radiation and air mass and AOI + Data[n]['HExtra']=pvlib.irradiance.extraradiation(Data[n].index) + Data[n]['AM']=pvlib.atmosphere.relativeairmass(zenith=Data[n].apparent_zenith) + Data[n]['AOI'] = pvlib.irradiance.aoi(meta[n][1]['surface_tilt'], + meta[n][1]['surface_azimuth'], + Data[n]['apparent_zenith'], + Data[n]['azimuth']) + # Calculate GHI clear sky + csky = pvlib.clearsky.ineichen(Data[n].index, meta[n][0]) + csky.rename(columns=lambda x: 'cs_'+x, inplace=True) + Data[n] = pd.concat([Data[n], csky], axis=1) + # Generate POA clear sky + cs_poa = pvlib.irradiance.total_irrad(surface_tilt = meta[n][1]['surface_tilt'], + surface_azimuth = meta[n][1]['surface_azimuth'], + solar_zenith = Data[n].apparent_zenith, + solar_azimuth = Data[n].apparent_azimuth, + albedo = meta[n][1]['albedo'], + ghi = Data[n].cs_ghi, + dhi = Data[n].cs_dhi, + dni = Data[n].cs_dni, + dni_extra = Data[n].HExtra, + airmass=Data[n].AM, + model='perez') + cs_poa.rename(columns=lambda x: 'cs_poa_' + x, inplace=True) + Data[n] = pd.concat([Data[n], cs_poa], axis=1) + + # Generate POA from GHI data + poa_sky_diffuse = pvlib.irradiance.haydavies(meta[n][1]['surface_tilt'], + meta[n][1]['surface_azimuth'], + Data[n]['DHI'], Data[n]['DNI'], Data[n]['HExtra'], + Data[n]['apparent_zenith'], Data[n]['azimuth']) + poa_ground_diffuse = pvlib.irradiance.grounddiffuse(meta[n][1]['surface_tilt'], + Data[n]['GHI'], + albedo=meta[n][1]['albedo']) + poa_total = pvlib.irradiance.globalinplane(Data[n]['AOI'], Data[n]['DNI'], + poa_sky_diffuse, poa_ground_diffuse) + Data[n] = pd.concat([Data[n], poa_total], axis=1) + + # Calculate model cell temperature + tcells = pvlib.pvsystem.sapm_celltemp(irrad = Data[n]['poa_global'], + wind = Data[n]['Wspd'], + temp = Data[n]['DryBulb'], + model = 'Open_rack_cell_polymerback') + Data[n]['tcell'] = tcells['temp_cell'] + Data[n]['tmodule'] = tcells['temp_module'] + + + + + +.. parsed-literal:: + + System Name: Site 1: 500kWac + + System Name: Site 2: 880kWac + + System Name: Site 3: 660kWac + + + +Run performance simulation for each array +----------------------------------------- + +This method calls the modeling method, and compiles a smaller DataFrame +of all the sites for graphing. + +Note that because Data[n] is a dictionary, it is modified by the +modeling method, and doesn't need to be explicitly returned. + +.. code:: python + + # Initialize DataFrame for graphing + graph_data = pd.DataFrame() + + for n in site_names: + print('System Name: ' + n) + + # Load equipment coefficients + module = moddb[meta[n][2]['module_name']] + inverter = invdb[meta[n][2]['inverter_name']] + # Adjust max inverter output to match field settings + inverter.Paco = meta[n][2]['inverter_pmax'] + + # Call modeling method + subarray(meta[n][1], Data[n], module, inverter, + meta[n][2]['inverter_pmax'], meta[n][2]['inverter_pnom'], meta[n][2]['inverter_pmax_default'], + meta[n][2]['inverter_pmax_temp'], meta[n][2]['inverter_pnom_temp'], + meta[n][2]['row_pitch'], meta[n][2]['collector'], meta[n][3]) + + # Calculate kWh for each time sample + Data[n]['ModelEnergy'] = Data[n]['ArrayPower'] # hour data samples only -- e.g., divide by 4 for 15 minute samples + Data[n]['Name'] = n + + # Load key data points into a smaller data frame with all sites + graph_data_n = pd.concat([Data[n]['Name'],Data[n]['poa_global'],Data[n]['ModelEnergy']],axis=1) + graph_data = pd.concat([graph_data,graph_data_n],axis=0) + + + + + + + +.. parsed-literal:: + + System Name: Site 1: 500kWac + System Name: Site 2: 880kWac + System Name: Site 3: 660kWac + + +Plot plane of array irradiance vs output energy +=============================================== + +.. code:: python + + # Note that linear regression fit includes inverter clipping data as well as linear region + # Usually the clipping region is removed from a linear regression fit of system performance. + sns.lmplot(x="poa_global", y="ModelEnergy", col="Name", hue="Name", data=graph_data, + ci=None, palette="muted", size=4, + scatter_kws={"s": 50, "alpha": 1}) + + + + + + + +.. parsed-literal:: + + + + + + +.. image:: system_loss_modeling_files%5Csystem_loss_modeling_11_1.png + + diff --git a/docs/sphinx/source/trackers.rst b/docs/sphinx/source/trackers.rst new file mode 100644 index 0000000000..130b2bf6fb --- /dev/null +++ b/docs/sphinx/source/trackers.rst @@ -0,0 +1,6 @@ +.. _trackers: + +************************************************* +Tracked PV Systems +************************************************* + diff --git a/docs/sphinx/source/transposition.rst b/docs/sphinx/source/transposition.rst new file mode 100644 index 0000000000..2f5e638bdf --- /dev/null +++ b/docs/sphinx/source/transposition.rst @@ -0,0 +1,7 @@ +.. _transposition: + +************************************************* +Transposition Models +************************************************* + +`doc: how to get dhi & bni `_ \ No newline at end of file diff --git a/docs/sphinx/source/usage.rst b/docs/sphinx/source/usage.rst new file mode 100644 index 0000000000..9dc90b1430 --- /dev/null +++ b/docs/sphinx/source/usage.rst @@ -0,0 +1,110 @@ +.. _usage: + +Examples on Usage +================= + + +Tutorials +----------- + +These tutorials aim at exemplifying the usage of the core library for various uses. + +* generals + * imports + * locations + +* atmosphere.py tutorial -- source: http://nbviewer.jupyter.org/github/pvlib/pvlib-python/blob/master/docs/tutorials/atmosphere.ipynb + * +* solarposition.py tutorial -- source + * Setup + * SPA output + * sunset / sun rise? + * Speed tests +* irradiance.py tutorial -- source: http://nbviewer.jupyter.org/github/pvlib/pvlib-python/blob/master/docs/tutorials/irradiance.ipynb + * Extraterrestrial radiation + * Clear sky models + * Diffuse ground + * Diffuse sky + * Isotropic + * Klucher + * Reindl + * Hay-Davies + * Perez + * Angle of incidence + * total_irrad (on plane of arry) +* pvsystem tutorial -- source: http://nbviewer.jupyter.org/github/pvlib/pvlib-python/blob/master/docs/tutorials/pvsystem.ipynb + * systemdef + * Angle of Incidence Modifiers + * Sandia Cell Temp correction + * Sandia Inverter Model + * Sandia Array Performance Model + * SAPM IV curves + * DeSoto Model + * Single Diode Model +* Tracking -- source: http://nbviewer.jupyter.org/github/pvlib/pvlib-python/blob/master/docs/tutorials/tracking.ipynb + * Setup + * Define input parameters. + * Transform solar position to South facing coordinate system. + * Transform solar position to panel coordinate system. + * Determine the ideal tracking angle when ignoring backtracking. + * Correct the tracking angle to account for backtracking. + * Calculate the panel normal vector based on tracking angle. + * Calculate the solar angle of incidence. + * Calculate the panel tilt and azimuth. +* TMY tutorial -- source: http://nbviewer.jupyter.org/github/pvlib/pvlib-python/blob/master/docs/tutorials/tmy.ipynb + * Import modules +* TMY data and diffuse irradiance model -- source: http://nbviewer.jupyter.org/github/pvlib/pvlib-python/blob/master/docs/tutorials/tmy_and_diffuse_irrad_models.ipynb + * Setup + * Diffuse irradiance models + * Perez + * HayDavies + * Isotropic + * King Diffuse model + * Klucher Model + * Reindl + * Plot Results +* TMY to Power Tutorial -- http://nbviewer.jupyter.org/github/pvlib/pvlib-python/blob/master/docs/tutorials/tmy_to_power.ipynb + * Setup + * Load TMY data + * Calculate modeling intermediates + * DC power using SAPM + * AC power using SAPM +* Modeling multiple systems with system losses -- source: http://nbviewer.jupyter.org/github/jforbess/pvlib-python/blob/Issue84/docs/tutorials/system_loss_modeling.ipynb + + + +Links to Notebooks +------------------------ + +Papers and Publications +_________________________________ + +* `PVSC 2015 `_ + * Single axis tracker -- Simulation of single axis tracker output near Albuquerque + * SAPM -- Some simulations using the Sandia Array Performance Model. + * IV curves -- Make some IV curves based on this data +* + +Temporary edit hints +---------------------------- + +List of all notebooks: + +* atmosphere.ipynb +* irradiance.ipynb +* package_overview.ipynb +* pvsystem.ipynb +* solarposition.ipynb +* tmy.ipynb +* tmy_and_diffuse_irrad_models.ipynb +* tmy_to_power.ipynb +* tracking.ipynb + +Further tutorials + +* `Modeling multiple systems with system losses `_ -- discussion at: https://github.com/pvlib/pvlib-python/issues/84 + * Import site configuration data + * Define key system model method + * Load environmental data + * Run performance simulation for each array + * Plot plane of array irradiance vs output energy \ No newline at end of file diff --git a/docs/tutorials/pvsystem.rst b/docs/tutorials/pvsystem.rst new file mode 100644 index 0000000000..ebc545beb6 --- /dev/null +++ b/docs/tutorials/pvsystem.rst @@ -0,0 +1,3611 @@ + +pvsystem tutorial +================= + +This tutorial explores the ``pvlib.pvsystem`` module. The module has +functions for importing PV module and inverter data and functions for +modeling module and inverter performance. + +1. `systemdef <#systemdef>`__ +2. `Angle of Incidence Modifiers <#Angle-of-Incidence-Modifiers>`__ +3. `Sandia Cell Temp correction <#Sandia-Cell-Temp-correction>`__ +4. `Sandia Inverter Model <#snlinverter>`__ +5. `Sandia Array Performance Model <#SAPM>`__ + + 1. `SAPM IV curves <#SAPM-IV-curves>`__ + +6. `DeSoto Model <#desoto>`__ +7. `Single Diode Model <#Single-diode-model>`__ + +This tutorial has been tested against the following package versions: \* +pvlib 0.3.0 \* Python 3.5.1 \* IPython 3.2 \* Pandas 0.18.0 + +It should work with other Python and Pandas versions. It requires pvlib +>= 0.3.0 and IPython >= 3.0. + +Authors: \* Will Holmgren (@wholmgren), University of Arizona. 2015, +March 2016. + +.. code:: python + + # built-in python modules + import os + import inspect + import datetime + + # scientific python add-ons + import numpy as np + import pandas as pd + + # plotting stuff + # first line makes the plots appear in the notebook + %matplotlib inline + import matplotlib.pyplot as plt + # seaborn makes your plots look better + try: + import seaborn as sns + sns.set(rc={"figure.figsize": (12, 6)}) + except ImportError: + print('We suggest you install seaborn using conda or pip and rerun this cell') + + # finally, we import the pvlib library + import pvlib + +.. code:: python + + import pvlib + from pvlib import pvsystem + +systemdef +~~~~~~~~~ + +``pvlib`` can import TMY2 and TMY3 data. Here, we import the example +files. + +.. code:: python + + pvlib_abspath = os.path.dirname(os.path.abspath(inspect.getfile(pvlib))) + + tmy3_data, tmy3_metadata = pvlib.tmy.readtmy3(os.path.join(pvlib_abspath, 'data', '703165TY.csv')) + tmy2_data, tmy2_metadata = pvlib.tmy.readtmy2(os.path.join(pvlib_abspath, 'data', '12839.tm2')) + +.. code:: python + + pvlib.pvsystem.systemdef(tmy3_metadata, 0, 0, .1, 5, 5) + + + + +.. parsed-literal:: + + {'albedo': 0.1, + 'altitude': 7.0, + 'latitude': 55.317, + 'longitude': -160.517, + 'name': '"SAND POINT"', + 'strings_per_inverter': 5, + 'modules_per_string': 5, + 'surface_azimuth': 0, + 'surface_tilt': 0, + 'tz': -9.0} + + + +.. code:: python + + pvlib.pvsystem.systemdef(tmy2_metadata, 0, 0, .1, 5, 5) + + + + +.. parsed-literal:: + + {'albedo': 0.1, + 'altitude': 2.0, + 'latitude': 25.8, + 'longitude': -80.26666666666667, + 'name': 'MIAMI', + 'strings_per_inverter': 5, + 'modules_per_string': 5, + 'surface_azimuth': 0, + 'surface_tilt': 0, + 'tz': -5} + + + +Angle of Incidence Modifiers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code:: python + + angles = np.linspace(-180,180,3601) + ashraeiam = pd.Series(pvsystem.ashraeiam(.05, angles), index=angles) + + ashraeiam.plot() + plt.ylabel('ASHRAE modifier') + plt.xlabel('input angle (deg)') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_10_1.png + + +.. code:: python + + angles = np.linspace(-180,180,3601) + physicaliam = pd.Series(pvsystem.physicaliam(4, 0.002, 1.526, angles), index=angles) + + physicaliam.plot() + plt.ylabel('physical modifier') + plt.xlabel('input index') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_11_1.png + + +.. code:: python + + plt.figure() + ashraeiam.plot(label='ASHRAE') + physicaliam.plot(label='physical') + plt.ylabel('modifier') + plt.xlabel('input angle (deg)') + plt.legend() + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_12_1.png + + +Sandia Cell Temp correction +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +PV system efficiency can vary by up to 0.5% per degree C, so it's +important to accurately model cell and module temperature. The +``sapm_celltemp`` function uses plane of array irradiance, ambient +temperature, wind speed, and module and racking type to calculate cell +and module temperatures. From King et. al. (2004): + +.. math:: T_m = E e^{a+b*WS} + T_a + +.. math:: T_c = T_m + \frac{E}{E_0} \Delta T + +The :math:`a`, :math:`b`, and :math:`\Delta T` parameters depend on the +module and racking type. The default parameter set is +``open_rack_cell_glassback``. + +``sapm_celltemp`` works with either scalar or vector inputs, but always +returns a pandas DataFrame. + +.. code:: python + + # scalar inputs + pvsystem.sapm_celltemp(900, 5, 20) # irrad, wind, temp + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + +
temp_celltemp_module
043.50919140.809191
+
+ + + +.. code:: python + + # vector inputs + times = pd.DatetimeIndex(start='2015-01-01', end='2015-01-02', freq='12H') + temps = pd.Series([0, 10, 5], index=times) + irrads = pd.Series([0, 500, 0], index=times) + winds = pd.Series([10, 5, 0], index=times) + + pvtemps = pvsystem.sapm_celltemp(irrads, winds, temps) + pvtemps.plot() + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_17_1.png + + +Cell and module temperature as a function of wind speed. + +.. code:: python + + wind = np.linspace(0,20,21) + temps = pd.DataFrame(pvsystem.sapm_celltemp(900, wind, 20), index=wind) + + temps.plot() + plt.legend() + plt.xlabel('wind speed (m/s)') + plt.ylabel('temperature (deg C)') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_19_1.png + + +Cell and module temperature as a function of ambient temperature. + +.. code:: python + + atemp = np.linspace(-20,50,71) + temps = pvsystem.sapm_celltemp(900, 2, atemp).set_index(atemp) + + temps.plot() + plt.legend() + plt.xlabel('ambient temperature (deg C)') + plt.ylabel('temperature (deg C)') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_21_1.png + + +Cell and module temperature as a function of incident irradiance. + +.. code:: python + + irrad = np.linspace(0,1000,101) + temps = pvsystem.sapm_celltemp(irrad, 2, 20).set_index(irrad) + + temps.plot() + plt.legend() + plt.xlabel('incident irradiance (W/m**2)') + plt.ylabel('temperature (deg C)') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_23_1.png + + +Cell and module temperature for different module and racking types. + +.. code:: python + + models = ['open_rack_cell_glassback', + 'roof_mount_cell_glassback', + 'open_rack_cell_polymerback', + 'insulated_back_polymerback', + 'open_rack_polymer_thinfilm_steel', + '22x_concentrator_tracker'] + + temps = pd.DataFrame(index=['temp_cell','temp_module']) + + for model in models: + temps[model] = pd.Series(pvsystem.sapm_celltemp(1000, 5, 20, model=model).ix[0]) + + temps.T.plot(kind='bar') # try removing the transpose operation and replotting + plt.legend() + plt.ylabel('temperature (deg C)') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_25_1.png + + +snlinverter +~~~~~~~~~~~ + +.. code:: python + + inverters = pvsystem.retrieve_sam('sandiainverter') + inverters + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_ABB__MICRO_0_25_I_OUTD_US_240_240V__CEC_2014_ABB__MICRO_0_3HV_I_OUTD_US_208_208V__CEC_2014_ABB__MICRO_0_3HV_I_OUTD_US_240_240V__CEC_2014_ABB__MICRO_0_3_I_OUTD_US_208_208V__CEC_2014_ABB__MICRO_0_3_I_OUTD_US_240_240V__CEC_2014_ABB__PVI_3_0_OUTD_S_US_Z_M_A__208_V__208V__CEC_2014_ABB__PVI_3_0_OUTD_S_US_Z_M_A__240_V__240V__CEC_2014_ABB__PVI_3_0_OUTD_S_US_Z_M_A__277_V__277V__CEC_2014_ABB__PVI_3_6_OUTD_S_US_Z_M__208_V__208V__CEC_2014_...Yes!_Solar_Inc___ES5000__240V__240V__CEC_2009_Yes!_Solar_Inc___ES5300__208V__208V__CEC_2009_Yes!_Solar_Inc___ES5300__240V__240V__CEC_2009_Zhejiang_Yuhui_Solar_Energy_Source__Replus_250A_240V__CEC_2012_Zhejiang_Yuhui_Solar_Energy_Source__Replus_250B_208V__CEC_2012_Zigor__Sunzet_2_TL_US_240V__CEC_2011_Zigor__Sunzet_3_TL_US_240V__CEC_2011_Zigor__Sunzet_4_TL_US_240V__CEC_2011_Zigor__Sunzet_5_TL_US_240V__CEC_2011_Zigor__SUNZET4_USA_240V__CEC_2011_
Vac208.000000240.000000208.000000240.000000208.000000240.000000208.000000240.000000277.000000208.000000...240.000000208.000000240.0000002.400000e+02208.000000240.000000240.000000240.000000240.000000240.000000
Paco250.000000250.000000300.000000300.000000300.000000300.0000003000.0000003000.0000003000.0000003600.000000...4900.0000004600.0000005300.0000002.251900e+02213.8300002110.0000003180.0000004160.0000005240.0000004030.000000
Pdco259.522050259.552697312.523347312.022059311.714554311.5049613147.0095283125.7582223110.3429423759.288140...5135.5841324829.4224095571.1809562.348419e+02225.5630552191.8251293313.6758054342.4093145495.8299264267.477069
Vdco40.24260339.98224645.25942945.49500940.22711140.136095313.429286340.842937389.986270309.948254...275.000000275.000000274.9000002.846843e+0128.632617399.207333389.513254388.562050386.082539302.851707
Pso1.7716141.9311941.8826201.9285911.9710531.99134218.10412219.86611222.72013524.202212...29.35894326.07150628.5190331.646711e+001.84502930.84370331.26504631.60170432.45080837.372766
C0-0.000025-0.000027-0.000049-0.000035-0.000036-0.000031-0.000009-0.000007-0.000006-0.000005...-0.000006-0.000006-0.000006-3.860000e-07-0.000121-0.000004-0.000006-0.000004-0.000005-0.000009
C1-0.000090-0.000158-0.000241-0.000228-0.000256-0.000289-0.000012-0.000025-0.0000440.000002...0.0000200.0000240.000019-3.580000e-04-0.000533-0.000077-0.000095-0.000079-0.000097-0.000029
C20.0006690.0014800.000975-0.000224-0.000833-0.0021100.0016200.0010500.0000360.001730...0.0018700.0026200.001630-1.350000e-020.0259000.0005020.0002610.000213-0.0002510.002150
C3-0.018900-0.034600-0.027600-0.039600-0.039100-0.049500-0.000217-0.000471-0.0015500.001140...-0.0002760.000468-0.000371-3.350684e+01-0.066800-0.003260-0.001960-0.001870-0.002340-0.001900
Pnt0.0200000.0500000.0600000.0600000.0200000.0500000.1000000.1000000.2000000.100000...0.5000000.5000000.5000001.700000e-010.1700000.2500000.2500000.2000000.2000000.190000
Vdcmax65.00000065.00000079.00000079.00000065.00000065.000000600.000000600.000000600.000000600.000000...600.000000600.000000600.0000005.500000e+0155.000000500.000000500.000000500.000000500.000000600.000000
Idcmax10.00000010.00000010.50000010.50000010.00000010.00000020.00000020.00000020.00000032.000000...25.00000025.00000025.0000001.400000e+0114.00000014.60000022.00000028.00000035.30000020.000000
Mppt_low20.00000020.00000030.00000030.00000030.00000030.000000160.000000160.000000160.000000120.000000...200.000000200.000000200.0000002.200000e+0122.000000150.000000150.000000150.000000150.000000240.000000
Mppt_high50.00000050.00000075.00000075.00000050.00000050.000000530.000000530.000000530.000000530.000000...550.000000550.000000550.0000004.500000e+0145.000000450.000000450.000000450.000000450.000000480.000000
+

14 rows × 1799 columns

+
+ + + +.. code:: python + + vdcs = pd.Series(np.linspace(0,50,51)) + idcs = pd.Series(np.linspace(0,11,110)) + pdcs = idcs * vdcs + + pacs = pvsystem.snlinverter(inverters['ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_'], vdcs, pdcs) + #pacs.plot() + plt.plot(pacs, pdcs) + plt.ylabel('ac power') + plt.xlabel('dc power') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_28_1.png + + +Need to put more effort into describing this function. + +SAPM +~~~~ + +The CEC module database. + +.. code:: python + + cec_modules = pvsystem.retrieve_sam('cecmod') + cec_modules + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BEoptCA_Default_ModuleExample_Module1Soltech_1STH_215_P1Soltech_1STH_220_P1Soltech_1STH_225_P1Soltech_1STH_230_P1Soltech_1STH_235_WH1Soltech_1STH_240_WH1Soltech_1STH_245_WH1Soltech_1STH_FRL_4H_245_M60_BLK...Zytech_Solar_ZT275PZytech_Solar_ZT280PZytech_Solar_ZT285PZytech_Solar_ZT290PZytech_Solar_ZT295PZytech_Solar_ZT300PZytech_Solar_ZT305PZytech_Solar_ZT310PZytech_Solar_ZT315PZytech_Solar_ZT320P
BIPVYYNNNNNNNN...NNNNNNNNNN
Date12/17/20084/28/200810/7/201010/4/201010/4/201010/4/20103/4/20103/4/20103/4/20101/14/2013...12/23/201412/23/201412/23/201412/23/201412/23/201412/23/201412/23/201412/23/201412/23/201412/23/2014
T_NOCT656547.447.447.447.449.949.949.948.3...46.446.446.446.446.446.446.446.446.446.4
A_c0.670.671.5671.5671.5671.5671.6351.6351.6351.668...1.9311.9311.9311.9311.9311.9311.9311.9311.9311.931
N_s18186060606060606060...72727272727272727272
I_sc_ref7.57.57.847.978.098.188.548.588.628.81...8.318.48.488.558.648.718.878.99.019.12
V_oc_ref10.410.436.336.636.937.13737.137.238.3...45.145.2545.4345.5945.7545.9646.1246.2846.4446.6
I_mp_ref6.66.67.357.477.587.658.028.078.18.06...7.767.877.978.078.168.268.368.468.568.66
V_mp_ref8.48.42929.329.629.929.329.730.230.2...35.4435.6235.835.9436.1636.3236.4936.6636.8137
alpha_sc0.0030.0030.0079970.0081290.0082520.0083440.007430.0074650.0074990.006167...0.0040140.0040570.0040960.004130.0041730.0042070.0042840.0042990.0043520.004405
beta_oc-0.04-0.04-0.13104-0.13213-0.13321-0.13393-0.13653-0.1369-0.13727-0.13635...-0.14428-0.14476-0.14533-0.14584-0.14635-0.14703-0.14754-0.14805-0.14856-0.14907
a_ref0.4730.4731.64131.65721.67321.68881.62921.64251.66171.6351...1.81021.81471.821.82271.83111.84431.8491.85731.86491.8737
I_L_ref7.5457.5457.8437.9748.0948.1858.5438.5828.6238.844...8.3248.418.4878.5528.6428.8058.8748.9959.1079.218
I_o_ref1.943e-091.943e-091.936e-092.03e-092.126e-092.332e-091.166e-091.325e-091.623e-095.7e-10...1.24e-101.23e-101.22e-101.17e-101.22e-101.31e-101.3e-101.35e-101.38e-101.44e-10
R_s0.0940.0940.3590.3460.3340.3110.3830.3350.2720.421...0.5670.5530.5440.5390.5210.5160.5070.4960.4880.476
R_sh_ref15.7215.72839.4751.03670.65462.561257.841463.82724.06109.31...341.66457.29687.162344.162910.76552.21118.01767.45681.89603.91
Adjust10.610.616.516.817.117.98.79.811.66.502...5.5545.4065.1974.7925.0335.5485.3735.5785.7115.971
gamma_r-0.5-0.5-0.495-0.495-0.495-0.495-0.482-0.482-0.482-0.453...-0.431-0.431-0.431-0.431-0.431-0.431-0.431-0.431-0.431-0.431
VersionMM106MM105MM107MM107MM107MM107MM107MM107MM107NRELv1...NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1NRELv1
PTC48.948.9189.4194198.5203.1205.1209.6214.1217.7...248252.6257.3261.9266.5271.2275.8280.5285.1289.8
TechnologyMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMono-c-SiMono-c-SiMono-c-SiMono-c-Si...Multi-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-SiMulti-c-Si
+

21 rows × 13953 columns

+
+ + + +.. code:: python + + cecmodule = cec_modules.Example_Module + cecmodule + + + + +.. parsed-literal:: + + BIPV Y + Date 4/28/2008 + T_NOCT 65 + A_c 0.67 + N_s 18 + I_sc_ref 7.5 + V_oc_ref 10.4 + I_mp_ref 6.6 + V_mp_ref 8.4 + alpha_sc 0.003 + beta_oc -0.04 + a_ref 0.473 + I_L_ref 7.545 + I_o_ref 1.943e-09 + R_s 0.094 + R_sh_ref 15.72 + Adjust 10.6 + gamma_r -0.5 + Version MM105 + PTC 48.9 + Technology Multi-c-Si + Name: Example_Module, dtype: object + + + +The Sandia module database. + +.. code:: python + + sandia_modules = pvsystem.retrieve_sam(name='SandiaMod') + sandia_modules + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Advent_Solar_AS160___2006_Advent_Solar_Ventura_210___2008_Advent_Solar_Ventura_215___2009_Aleo_S03_160__2007__E__Aleo_S03_165__2007__E__Aleo_S16_165__2007__E__Aleo_S16_170__2007__E__Aleo_S16_175__2007__E__Aleo_S16_180__2007__E__Aleo_S16_185__2007__E__...Panasonic_VBHN235SA06B__2013_Trina_TSM_240PA05__2013_Hanwha_HSL60P6_PA_4_250T__2013_Suniva_OPT300_72_4_100__2013_Canadian_Solar_CS6X_300M__2013_LG_LG290N1C_G3__2013_Sharp_NDQ235F4__2013_Solar_Frontier_SF_160S__2013_SolarWorld_Sunmodule_250_Poly__2013_Silevo_Triex_U300_Black__2014_
Vintage2006200820092007 (E)2007 (E)2007 (E)2007 (E)2007 (E)2007 (E)2007 (E)...2013201320132013201320132013201320132014
Area1.3121.6461.6461.281.281.3781.3781.3781.3781.378...1.261.631.651.931.911.641.561.221.681.68
Materialmc-Simc-Simc-Sic-Sic-Simc-Simc-Simc-Simc-Simc-Si...a-Si / mono-Simc-Simc-Sic-Sic-Sic-Simc-SiCISmc-Sic-Si
Cells_in_Series72606072725050505050...726060727260601726096
Parallel_Strings1111111111...1111111111
Isco5.5648.348.495.15.27.97.958.18.158.2...5.87388.84498.59358.57538.63889.85258.67392.02598.37685.771
Voco42.83235.3135.9243.543.63030.130.230.330.5...52.004236.892636.807544.292143.591839.611736.8276112.50536.380668.5983
Impo5.0287.497.744.554.657.087.237.387.537.67...5.53838.29558.08227.9638.13599.24738.12431.83567.69215.383
Vmpo32.4127.6127.9235.635.823.323.523.723.924.1...43.120429.06629.201135.083734.953131.292129.198886.675228.34855.4547
Aisc0.0005370.000770.000820.00030.00030.00080.00080.00080.00080.0008...0.00050.00040.00040.00060.00050.00020.00060.00010.00060.0003
Aimp-0.000491-0.00015-0.00013-0.00025-0.00025-0.0003-0.0003-0.0003-0.0003-0.0003...-0.0001-0.0003-0.0003-0.0002-0.0001-0.0004-0.0002-0.0003-0.0001-0.0003
C01.02330.9371.0150.990.990.990.990.990.990.99...1.00151.01161.00610.9991.01211.01451.00491.00961.01580.995
C1-0.02330.063-0.0150.010.010.010.010.010.010.01...-0.0015-0.0116-0.00610.001-0.0121-0.0145-0.0049-0.0096-0.01580.005
Bvoco-0.1703-0.133-0.135-0.152-0.152-0.11-0.11-0.11-0.11-0.11...-0.1411-0.137-0.1263-0.155-0.1532-0.1205-0.1279-0.3044-0.1393-0.1913
Mbvoc0000000000...0000000000
Bvmpo-0.1731-0.135-0.136-0.158-0.158-0.115-0.115-0.115-0.115-0.115...-0.1366-0.1441-0.1314-0.1669-0.1634-0.1337-0.1348-0.2339-0.1449-0.184
Mbvmp0000000000...0000000000
N1.1741.4951.3731.251.251.351.351.351.351.35...1.0291.20731.06861.07711.00251.09251.06951.20661.2261.345
C2-0.764440.01820.0036-0.15-0.15-0.12-0.12-0.12-0.12-0.12...0.2859-0.07993-0.2585-0.355-0.171-0.4647-0.2718-0.5426-0.096770.3221
C3-15.5087-10.758-7.2509-8.96-8.96-11.08-11.08-11.08-11.08-11.08...-5.48455-7.27624-9.85905-13.0643-9.39745-11.9008-11.4033-15.2598-8.51148-6.7178
A00.92810.90670.93230.9380.9380.9240.9240.9240.9240.924...0.91610.96450.94280.93270.93710.97310.94360.93540.92880.9191
A10.066150.095730.065260.054220.054220.067490.067490.067490.067490.06749...0.079680.027530.05360.072830.062620.029660.047650.068090.072010.09988
A2-0.01384-0.0266-0.01567-0.009903-0.009903-0.012549-0.012549-0.012549-0.012549-0.012549...-0.01866-0.002848-0.01281-0.02402-0.01667-0.01024-0.007405-0.02094-0.02065-0.04273
A30.0012980.003430.001930.00072970.00072970.00100490.00100490.00100490.00100490.0010049...0.002278-0.00014390.0018260.0038190.0021680.0017930.00038180.002930.0028620.00937
A4-4.6e-05-0.0001794-9.81e-05-1.907e-05-1.907e-05-2.8797e-05-2.8797e-05-2.8797e-05-2.8797e-05-2.8797e-05...-0.00011182.219e-05-0.0001048-0.000235-0.0001087-0.0001286-1.101e-05-0.0001564-0.0001544-0.0007643
B01111111111...1111111111
B1-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438-0.002438...-0.01053-0.00261-0.007861-0.006801-0.00789-0.0154-0.00464-0.0152-0.00308-0.006498
B20.00031030.000310.000310.00031030.00031030.00031030.00031030.00031030.00031030.0003103...0.0011490.00032790.00090580.00079680.00086560.0015720.0005590.0015980.00040530.0006908
B3-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05-1.246e-05...-4.268e-05-1.458e-05-3.496e-05-3.095e-05-3.298e-05-5.525e-05-2.249e-05-5.682e-05-1.729e-05-2.678e-05
B42.11e-072.11e-072.11e-072.11e-072.11e-072.11e-072.11e-072.11e-072.11e-072.11e-07...6.517e-072.654e-075.473e-074.896e-075.178e-078.04e-073.673e-078.326e-072.997e-074.322e-07
B5-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09-1.36e-09...-3.556e-09-1.732e-09-3.058e-09-2.78e-09-2.918e-09-4.202e-09-2.144e-09-4.363e-09-1.878e-09-2.508e-09
DTC3333333333...2.033.032.552.583.23.053.273.293.193.13
FD1111111111...1111111111
A-3.35-3.45-3.47-3.56-3.56-3.56-3.56-3.56-3.56-3.56...-3.7489-3.5924-3.5578-3.7566-3.6024-3.4247-3.7445-3.6836-3.73-3.6866
B-0.1161-0.077-0.087-0.075-0.075-0.075-0.075-0.075-0.075-0.075...-0.1287-0.1319-0.1766-0.156-0.2106-0.0951-0.149-0.1483-0.1483-0.104
C40.99740.9720.9890.9950.9950.9950.9950.9950.9950.995...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
C50.00260.0280.0120.0050.0050.0050.0050.0050.0050.005...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
IXO5.548.258.495.045.147.87.8588.058.1...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
IXXO3.565.25.453.163.254.925.085.185.395.54...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
C61.1731.0671.1371.151.151.151.151.151.151.15...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
C7-0.173-0.067-0.137-0.15-0.15-0.15-0.15-0.15-0.15-0.15...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
NotesSource: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9...Source: Sandia National Laboratories Updated 9......Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2013. Mo...Source: CFV Solar Test Lab. Tested 2014. Mo...
+

42 rows × 523 columns

+
+ + + +.. code:: python + + sandia_module = sandia_modules.Canadian_Solar_CS5P_220M___2009_ + sandia_module + + + + +.. parsed-literal:: + + Vintage 2009 + Area 1.701 + Material c-Si + Cells_in_Series 96 + Parallel_Strings 1 + Isco 5.09115 + Voco 59.2608 + Impo 4.54629 + Vmpo 48.3156 + Aisc 0.000397 + Aimp 0.000181 + C0 1.01284 + C1 -0.0128398 + Bvoco -0.21696 + Mbvoc 0 + Bvmpo -0.235488 + Mbvmp 0 + N 1.4032 + C2 0.279317 + C3 -7.24463 + A0 0.928385 + A1 0.068093 + A2 -0.0157738 + A3 0.0016606 + A4 -6.93e-05 + B0 1 + B1 -0.002438 + B2 0.0003103 + B3 -1.246e-05 + B4 2.11e-07 + B5 -1.36e-09 + DTC 3 + FD 1 + A -3.40641 + B -0.0842075 + C4 0.996446 + C5 0.003554 + IXO 4.97599 + IXXO 3.18803 + C6 1.15535 + C7 -0.155353 + Notes Source: Sandia National Laboratories Updated 9... + Name: Canadian_Solar_CS5P_220M___2009_, dtype: object + + + +Generate some irradiance data for modeling. + +.. code:: python + + from pvlib import clearsky + from pvlib import irradiance + from pvlib import atmosphere + from pvlib.location import Location + + tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson') + times_loc = pd.date_range(start=datetime.datetime(2014,4,1), end=datetime.datetime(2014,4,2), freq='30s', tz=tus.tz) + ephem_data = pvlib.solarposition.get_solarposition(times_loc, tus.latitude, tus.longitude) + irrad_data = clearsky.ineichen(times_loc, tus.latitude, tus.longitude) + #irrad_data.plot() + + aoi = irradiance.aoi(0, 0, ephem_data['apparent_zenith'], ephem_data['azimuth']) + #plt.figure() + #aoi.plot() + + am = atmosphere.relativeairmass(ephem_data['apparent_zenith']) + + # a hot, sunny spring day in the desert. + temps = pvsystem.sapm_celltemp(irrad_data['ghi'], 0, 30) + +Now we can run the module parameters and the irradiance data through the +SAPM function. + +.. code:: python + + sapm_1 = pvsystem.sapm(sandia_module, irrad_data['dni']*np.cos(np.radians(aoi)), + irrad_data['dhi'], temps['temp_cell'], am, aoi) + sapm_1.head() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
i_sci_mpv_ocv_mpp_mpi_xi_xxeffective_irradiance
2014-04-01 00:00:00-07:000.00.00.00.00.00.00.00.0
2014-04-01 00:00:30-07:000.00.00.00.00.00.00.00.0
2014-04-01 00:01:00-07:000.00.00.00.00.00.00.00.0
2014-04-01 00:01:30-07:000.00.00.00.00.00.00.00.0
2014-04-01 00:02:00-07:000.00.00.00.00.00.00.00.0
+
+ + + +.. code:: python + + def plot_sapm(sapm_data): + """ + Makes a nice figure with the SAPM data. + + Parameters + ---------- + sapm_data : DataFrame + The output of ``pvsystem.sapm`` + """ + fig, axes = plt.subplots(2, 3, figsize=(16,10), sharex=False, sharey=False, squeeze=False) + plt.subplots_adjust(wspace=.2, hspace=.3) + + ax = axes[0,0] + sapm_data.filter(like='i_').plot(ax=ax) + ax.set_ylabel('Current (A)') + + ax = axes[0,1] + sapm_data.filter(like='v_').plot(ax=ax) + ax.set_ylabel('Voltage (V)') + + ax = axes[0,2] + sapm_data.filter(like='p_').plot(ax=ax) + ax.set_ylabel('Power (W)') + + ax = axes[1,0] + [ax.plot(sapm_data['effective_irradiance'], current, label=name) for name, current in + sapm_data.filter(like='i_').iteritems()] + ax.set_ylabel('Current (A)') + ax.set_xlabel('Effective Irradiance') + ax.legend(loc=2) + + ax = axes[1,1] + [ax.plot(sapm_data['effective_irradiance'], voltage, label=name) for name, voltage in + sapm_data.filter(like='v_').iteritems()] + ax.set_ylabel('Voltage (V)') + ax.set_xlabel('Effective Irradiance') + ax.legend(loc=4) + + ax = axes[1,2] + ax.plot(sapm_data['effective_irradiance'], sapm_data['p_mp'], label='p_mp') + ax.set_ylabel('Power (W)') + ax.set_xlabel('Effective Irradiance') + ax.legend(loc=2) + + # needed to show the time ticks + for ax in axes.flatten(): + for tk in ax.get_xticklabels(): + tk.set_visible(True) + +.. code:: python + + plot_sapm(sapm_1) + + + +.. image:: pvsystem_files%5Cpvsystem_42_0.png + + +For comparison, here's the SAPM for a sunny, windy, cold version of the +same day. + +.. code:: python + + temps = pvsystem.sapm_celltemp(irrad_data['ghi'], 10, 5) + + sapm_2 = pvsystem.sapm(sandia_module, irrad_data['dni']*np.cos(np.radians(aoi)), + irrad_data['dhi'], temps['temp_cell'], am, aoi) + + plot_sapm(sapm_2) + + + +.. image:: pvsystem_files%5Cpvsystem_44_0.png + + +.. code:: python + + sapm_1['p_mp'].plot(label='30 C, 0 m/s') + sapm_2['p_mp'].plot(label=' 5 C, 10 m/s') + plt.legend() + plt.ylabel('Pmp') + plt.title('Comparison of a hot, calm day and a cold, windy day') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_45_1.png + + +SAPM IV curves +^^^^^^^^^^^^^^ + +The IV curve function only calculates the 5 points of the SAPM. We will +add arbitrary points in a future release, but for now we just +interpolate between the 5 SAPM points. + +.. code:: python + + import warnings + warnings.simplefilter('ignore', np.RankWarning) + +.. code:: python + + def sapm_to_ivframe(sapm_row): + pnt = sapm_row.T.ix[:,0] + + ivframe = {'Isc': (pnt['i_sc'], 0), + 'Pmp': (pnt['i_mp'], pnt['v_mp']), + 'Ix': (pnt['i_x'], 0.5*pnt['v_oc']), + 'Ixx': (pnt['i_xx'], 0.5*(pnt['v_oc']+pnt['v_mp'])), + 'Voc': (0, pnt['v_oc'])} + ivframe = pd.DataFrame(ivframe, index=['current', 'voltage']).T + ivframe = ivframe.sort_values(by='voltage') + + return ivframe + + def ivframe_to_ivcurve(ivframe, points=100): + ivfit_coefs = np.polyfit(ivframe['voltage'], ivframe['current'], 30) + fit_voltages = np.linspace(0, ivframe.ix['Voc', 'voltage'], points) + fit_currents = np.polyval(ivfit_coefs, fit_voltages) + + return fit_voltages, fit_currents + +.. code:: python + + sapm_to_ivframe(sapm_1['2014-04-01 10:00:00']) + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
currentvoltage
Isc3.8482140.000000
Ix3.75778425.754530
Pmp3.42503840.706316
Ixx2.50449746.107688
Voc0.00000051.509060
+
+ + + +.. code:: python + + times = ['2014-04-01 07:00:00', '2014-04-01 08:00:00', '2014-04-01 09:00:00', + '2014-04-01 10:00:00', '2014-04-01 11:00:00', '2014-04-01 12:00:00'] + times.reverse() + + fig, ax = plt.subplots(1, 1, figsize=(12,8)) + + for time in times: + ivframe = sapm_to_ivframe(sapm_1[time]) + + fit_voltages, fit_currents = ivframe_to_ivcurve(ivframe) + + ax.plot(fit_voltages, fit_currents, label=time) + ax.plot(ivframe['voltage'], ivframe['current'], 'ko') + + ax.set_xlabel('Voltage (V)') + ax.set_ylabel('Current (A)') + ax.set_ylim(0, None) + ax.set_title('IV curves at multiple times') + ax.legend() + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_51_1.png + + +desoto +~~~~~~ + +The same data run through the desoto model. + +.. code:: python + + photocurrent, saturation_current, resistance_series, resistance_shunt, nNsVth = ( + pvsystem.calcparams_desoto(irrad_data.ghi, + temp_cell=temps['temp_cell'], + alpha_isc=cecmodule['alpha_sc'], + module_parameters=cecmodule, + EgRef=1.121, + dEgdT=-0.0002677) ) + +.. code:: python + + photocurrent.plot() + plt.ylabel('Light current I_L (A)') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_55_1.png + + +.. code:: python + + saturation_current.plot() + plt.ylabel('Saturation current I_0 (A)') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_56_1.png + + +.. code:: python + + resistance_series + + + + +.. parsed-literal:: + + 0.094 + + + +.. code:: python + + resistance_shunt.plot() + plt.ylabel('Shunt resistance (ohms)') + plt.ylim(0,100) + + + + +.. parsed-literal:: + + (0, 100) + + + + +.. image:: pvsystem_files%5Cpvsystem_58_1.png + + +.. code:: python + + nNsVth.plot() + plt.ylabel('nNsVth') + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_59_1.png + + +Single diode model +~~~~~~~~~~~~~~~~~~ + +.. code:: python + + single_diode_out = pvsystem.singlediode(cecmodule, photocurrent, saturation_current, + resistance_series, resistance_shunt, nNsVth) + single_diode_out + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
i_mpi_sci_xi_xxp_mpv_mpv_oc
2014-04-01 00:00:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:00:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:01:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:01:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:02:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:02:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:03:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:03:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:04:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:04:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:05:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:05:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:06:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:06:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:07:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:07:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:08:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:08:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:09:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:09:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:10:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:10:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:11:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:11:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:12:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:12:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:13:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:13:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:14:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 00:14:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
........................
2014-04-01 23:45:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:46:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:46:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:47:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:47:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:48:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:48:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:49:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:49:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:50:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:50:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:51:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:51:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:52:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:52:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:53:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:53:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:54:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:54:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:55:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:55:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:56:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:56:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:57:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:57:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:58:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:58:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:59:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-01 23:59:30-07:00NaNNaNNaNNaNNaN0.0227560.019739
2014-04-02 00:00:00-07:00NaNNaNNaNNaNNaN0.0227560.019739
+

2881 rows × 7 columns

+
+ + + +.. code:: python + + single_diode_out['i_sc'].plot() + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_62_1.png + + +.. code:: python + + single_diode_out['v_oc'].plot() + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_63_1.png + + +.. code:: python + + single_diode_out['p_mp'].plot() + + + + +.. parsed-literal:: + + + + + + +.. image:: pvsystem_files%5Cpvsystem_64_1.png + +