From aebfc6f2fadd06787cac9419b5ae966482767014 Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Tue, 10 May 2016 10:01:48 -0700 Subject: [PATCH 01/11] add timezone for package overview --- docs/sphinx/source/package_overview.rst | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/sphinx/source/package_overview.rst b/docs/sphinx/source/package_overview.rst index a2c333a92f..3e48a49aa9 100644 --- a/docs/sphinx/source/package_overview.rst +++ b/docs/sphinx/source/package_overview.rst @@ -43,14 +43,12 @@ configuration at a handful of sites listed below. import seaborn as sns sns.set_color_codes() - times = pd.DatetimeIndex(start='2015', end='2016', freq='1h') - # very approximate - # latitude, longitude, name, altitude - coordinates = [(30, -110, 'Tucson', 700), - (35, -105, 'Albuquerque', 1500), - (40, -120, 'San Francisco', 10), - (50, 10, 'Berlin', 34)] + # latitude, longitude, name, altitude, timezone + coordinates = [(30, -110, 'Tucson', 700, 'US/Mountain'), + (35, -105, 'Albuquerque', 1500, 'US/Mountain'), + (40, -120, 'San Francisco', 10, 'US/Pacific'), + (50, 10, 'Berlin', 34, 'Europe/Berlin')] import pvlib @@ -80,7 +78,10 @@ to accomplish our system modeling goal: 'surface_azimuth': 180} energies = {} - for latitude, longitude, name, altitude in coordinates: + for latitude, longitude, name, altitude, timezone in coordinates: + # create datetime indices localized to timezone (pvlib>=0.3.0) + times = pd.DatetimeIndex(start='2015', end='2016', freq='1h', + tz=timezone) system['surface_tilt'] = latitude cs = pvlib.clearsky.ineichen(times, latitude, longitude, altitude=altitude) solpos = pvlib.solarposition.get_solarposition(times, latitude, longitude) From ccd1fc793171c9a6869f4a36e1ee21cf609e865f Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Tue, 10 May 2016 10:04:54 -0700 Subject: [PATCH 02/11] add test docs in tests --- pvlib/test/test_docs.py | 87 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 pvlib/test/test_docs.py diff --git a/pvlib/test/test_docs.py b/pvlib/test/test_docs.py new file mode 100644 index 0000000000..6fb40bca5e --- /dev/null +++ b/pvlib/test/test_docs.py @@ -0,0 +1,87 @@ +""" +Tests for examples in documentation +""" + +from nose.tools import ok_ +import pandas as pd +from docutils.core import publish_doctree + + +def test_package_overview(): + """ + test package update + """ + + # very approximate + # latitude, longitude, name, altitude, timezone + coordinates = [(30, -110, 'Tucson', 700, 'US/Mountain'), + (35, -105, 'Albuquerque', 1500, 'US/Mountain'), + (40, -120, 'San Francisco', 10, 'US/Pacific'), + (50, 10, 'Berlin', 34, 'Europe/Berlin')] + + import pvlib + + # get the module and inverter specifications from SAM + sandia_modules = pvlib.pvsystem.retrieve_sam('SandiaMod') + sapm_inverters = pvlib.pvsystem.retrieve_sam('sandiainverter') + module = sandia_modules['Canadian_Solar_CS5P_220M___2009_'] + inverter = sapm_inverters['ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_'] + + # specify constant ambient air temp and wind for simplicity + temp_air = 20 + wind_speed = 0 + system = {'module': module, 'inverter': inverter, + 'surface_azimuth': 180} + + energies = {} + for latitude, longitude, name, altitude, timezone in coordinates: + # create datetime indices localized to timezone (pvlib>=0.3.0) + times = pd.DatetimeIndex(start='2015', end='2016', freq='1h', + tz=timezone) + system['surface_tilt'] = latitude + cs = pvlib.clearsky.ineichen(times, latitude, longitude, altitude=altitude) + solpos = pvlib.solarposition.get_solarposition(times, latitude, longitude) + dni_extra = pvlib.irradiance.extraradiation(times) + dni_extra = pd.Series(dni_extra, index=times) + airmass = pvlib.atmosphere.relativeairmass(solpos['apparent_zenith']) + pressure = pvlib.atmosphere.alt2pres(altitude) + am_abs = pvlib.atmosphere.absoluteairmass(airmass, pressure) + aoi = pvlib.irradiance.aoi(system['surface_tilt'], system['surface_azimuth'], + solpos['apparent_zenith'], solpos['azimuth']) + total_irrad = pvlib.irradiance.total_irrad(system['surface_tilt'], + system['surface_azimuth'], + solpos['apparent_zenith'], + solpos['azimuth'], + cs['dni'], cs['ghi'], cs['dhi'], + dni_extra=dni_extra, + model='haydavies') + temps = pvlib.pvsystem.sapm_celltemp(total_irrad['poa_global'], + wind_speed, temp_air) + dc = pvlib.pvsystem.sapm(module, total_irrad['poa_direct'], + total_irrad['poa_diffuse'], temps['temp_cell'], + am_abs, aoi) + ac = pvlib.pvsystem.snlinverter(inverter, dc['v_mp'], dc['p_mp']) + annual_energy = ac.sum() + energies[name] = annual_energy + + energies = pd.Series(energies) + + # based on the parameters specified above, these are in W*hrs + print(energies.round(0)) + +# energies.plot(kind='bar', rot=0) +# @savefig proc-energies.png width=6in +# plt.ylabel('Yearly energy yield (W hr)') + +# with open('docs/sphinx/source/package_overview.rst') as f: +# doctree = publish_doctree(f.read()) +# +# source_code = [child.astext() for child in doctree.children +# if 'code' in child.attributes['classes']] +# +# def is_code_block(node): +# return (node.tagname == 'literal_block' +# and 'code' in node.attributes['classes']) +# +# code_blocks = doctree.traverse(condition=is_code_block) +# source_code = [block.astext() for block in code_blocks] \ No newline at end of file From 085498fd2c8b5a235fa222f2443559ace51b4340 Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Tue, 10 May 2016 10:17:40 -0700 Subject: [PATCH 03/11] test passes, but it's a hack --- pvlib/test/test_docs.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/pvlib/test/test_docs.py b/pvlib/test/test_docs.py index 6fb40bca5e..8d5835957d 100644 --- a/pvlib/test/test_docs.py +++ b/pvlib/test/test_docs.py @@ -4,23 +4,33 @@ from nose.tools import ok_ import pandas as pd -from docutils.core import publish_doctree +import pvlib +import numpy as np +# from docutils.core import publish_doctree + +ENERGIES = { + 'Albuquerque': 512617.0, + 'Berlin': 399745.0, + 'San Francisco': 458293., + 'Tucson': 477008., +} +# Tucson: 477027.0 +# San Francisco: 458334.0 def test_package_overview(): """ - test package update + test package overview update to timezone """ - # very approximate + # TODO: this is not DRY, so grab this text directly from documentation + # latitude, longitude, name, altitude, timezone coordinates = [(30, -110, 'Tucson', 700, 'US/Mountain'), (35, -105, 'Albuquerque', 1500, 'US/Mountain'), (40, -120, 'San Francisco', 10, 'US/Pacific'), (50, 10, 'Berlin', 34, 'Europe/Berlin')] - import pvlib - # get the module and inverter specifications from SAM sandia_modules = pvlib.pvsystem.retrieve_sam('SandiaMod') sapm_inverters = pvlib.pvsystem.retrieve_sam('sandiainverter') @@ -65,14 +75,9 @@ def test_package_overview(): energies[name] = annual_energy energies = pd.Series(energies) + ok_(np.allclose(energies.values, pd.Series(ENERGIES).values)) - # based on the parameters specified above, these are in W*hrs - print(energies.round(0)) - -# energies.plot(kind='bar', rot=0) -# @savefig proc-energies.png width=6in -# plt.ylabel('Yearly energy yield (W hr)') - +# TODO: use docutils to get doctree to get actual code to test # with open('docs/sphinx/source/package_overview.rst') as f: # doctree = publish_doctree(f.read()) # From 2a90c20b3b26f2277caf926a12bbd75c60a47b6f Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 1 Jun 2016 09:17:35 -0700 Subject: [PATCH 04/11] remove test_docs --- pvlib/test/test_docs.py | 92 ----------------------------------------- 1 file changed, 92 deletions(-) delete mode 100644 pvlib/test/test_docs.py diff --git a/pvlib/test/test_docs.py b/pvlib/test/test_docs.py deleted file mode 100644 index 8d5835957d..0000000000 --- a/pvlib/test/test_docs.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -Tests for examples in documentation -""" - -from nose.tools import ok_ -import pandas as pd -import pvlib -import numpy as np -# from docutils.core import publish_doctree - -ENERGIES = { - 'Albuquerque': 512617.0, - 'Berlin': 399745.0, - 'San Francisco': 458293., - 'Tucson': 477008., -} -# Tucson: 477027.0 -# San Francisco: 458334.0 - - -def test_package_overview(): - """ - test package overview update to timezone - """ - - # TODO: this is not DRY, so grab this text directly from documentation - - # latitude, longitude, name, altitude, timezone - coordinates = [(30, -110, 'Tucson', 700, 'US/Mountain'), - (35, -105, 'Albuquerque', 1500, 'US/Mountain'), - (40, -120, 'San Francisco', 10, 'US/Pacific'), - (50, 10, 'Berlin', 34, 'Europe/Berlin')] - - # get the module and inverter specifications from SAM - sandia_modules = pvlib.pvsystem.retrieve_sam('SandiaMod') - sapm_inverters = pvlib.pvsystem.retrieve_sam('sandiainverter') - module = sandia_modules['Canadian_Solar_CS5P_220M___2009_'] - inverter = sapm_inverters['ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_'] - - # specify constant ambient air temp and wind for simplicity - temp_air = 20 - wind_speed = 0 - system = {'module': module, 'inverter': inverter, - 'surface_azimuth': 180} - - energies = {} - for latitude, longitude, name, altitude, timezone in coordinates: - # create datetime indices localized to timezone (pvlib>=0.3.0) - times = pd.DatetimeIndex(start='2015', end='2016', freq='1h', - tz=timezone) - system['surface_tilt'] = latitude - cs = pvlib.clearsky.ineichen(times, latitude, longitude, altitude=altitude) - solpos = pvlib.solarposition.get_solarposition(times, latitude, longitude) - dni_extra = pvlib.irradiance.extraradiation(times) - dni_extra = pd.Series(dni_extra, index=times) - airmass = pvlib.atmosphere.relativeairmass(solpos['apparent_zenith']) - pressure = pvlib.atmosphere.alt2pres(altitude) - am_abs = pvlib.atmosphere.absoluteairmass(airmass, pressure) - aoi = pvlib.irradiance.aoi(system['surface_tilt'], system['surface_azimuth'], - solpos['apparent_zenith'], solpos['azimuth']) - total_irrad = pvlib.irradiance.total_irrad(system['surface_tilt'], - system['surface_azimuth'], - solpos['apparent_zenith'], - solpos['azimuth'], - cs['dni'], cs['ghi'], cs['dhi'], - dni_extra=dni_extra, - model='haydavies') - temps = pvlib.pvsystem.sapm_celltemp(total_irrad['poa_global'], - wind_speed, temp_air) - dc = pvlib.pvsystem.sapm(module, total_irrad['poa_direct'], - total_irrad['poa_diffuse'], temps['temp_cell'], - am_abs, aoi) - ac = pvlib.pvsystem.snlinverter(inverter, dc['v_mp'], dc['p_mp']) - annual_energy = ac.sum() - energies[name] = annual_energy - - energies = pd.Series(energies) - ok_(np.allclose(energies.values, pd.Series(ENERGIES).values)) - -# TODO: use docutils to get doctree to get actual code to test -# with open('docs/sphinx/source/package_overview.rst') as f: -# doctree = publish_doctree(f.read()) -# -# source_code = [child.astext() for child in doctree.children -# if 'code' in child.attributes['classes']] -# -# def is_code_block(node): -# return (node.tagname == 'literal_block' -# and 'code' in node.attributes['classes']) -# -# code_blocks = doctree.traverse(condition=is_code_block) -# source_code = [block.astext() for block in code_blocks] \ No newline at end of file From 272767a52ae6efa2b9b2a97bf6f618ed2106846b Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 1 Jun 2016 09:52:22 -0700 Subject: [PATCH 05/11] use Etc/GMT+7 for US-Mountain and Etc/GMT-1 for EU/Berlin --- docs/sphinx/source/package_overview.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/sphinx/source/package_overview.rst b/docs/sphinx/source/package_overview.rst index 3e48a49aa9..eeb4c76d26 100644 --- a/docs/sphinx/source/package_overview.rst +++ b/docs/sphinx/source/package_overview.rst @@ -43,12 +43,14 @@ configuration at a handful of sites listed below. import seaborn as sns sns.set_color_codes() + naive_times = pd.DatetimeIndex(start='2015', end='2016', freq='1h') + # very approximate # latitude, longitude, name, altitude, timezone - coordinates = [(30, -110, 'Tucson', 700, 'US/Mountain'), - (35, -105, 'Albuquerque', 1500, 'US/Mountain'), - (40, -120, 'San Francisco', 10, 'US/Pacific'), - (50, 10, 'Berlin', 34, 'Europe/Berlin')] + coordinates = [(30, -110, 'Tucson', 700, 'Etc/GMT+7'), + (35, -105, 'Albuquerque', 1500, 'Etc/GMT+7'), + (40, -120, 'San Francisco', 10, 'Etc/GMT+7'), + (50, 10, 'Berlin', 34, 'Etc/GMT-1')] import pvlib @@ -79,9 +81,8 @@ to accomplish our system modeling goal: energies = {} for latitude, longitude, name, altitude, timezone in coordinates: - # create datetime indices localized to timezone (pvlib>=0.3.0) - times = pd.DatetimeIndex(start='2015', end='2016', freq='1h', - tz=timezone) + # localize datetime indices (pvlib>=0.3.0) + times = naive_times.tz_localize(timezone) system['surface_tilt'] = latitude cs = pvlib.clearsky.ineichen(times, latitude, longitude, altitude=altitude) solpos = pvlib.solarposition.get_solarposition(times, latitude, longitude) @@ -284,4 +285,3 @@ The pvlib-python maintainers thank all of pvlib's contributors of issues and especially pull requests. The pvlib-python community thanks all of the maintainers and contributors to the PyData stack. - From 83315749f5b460b1dfef0f7e317e17a207edbd79 Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 1 Jun 2016 09:56:49 -0700 Subject: [PATCH 06/11] update modelchain example to use timezones too --- docs/sphinx/source/package_overview.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/sphinx/source/package_overview.rst b/docs/sphinx/source/package_overview.rst index eeb4c76d26..5240a45e22 100644 --- a/docs/sphinx/source/package_overview.rst +++ b/docs/sphinx/source/package_overview.rst @@ -127,8 +127,9 @@ a full understanding of what it is doing internally! from pvlib.modelchain import basic_chain energies = {} - for latitude, longitude, name, altitude in coordinates: - dc, ac = basic_chain(times, latitude, longitude, + for latitude, longitude, name, altitude, timezone in coordinates: + dc, ac = basic_chain(naive_times.tz_localize(timezone), + latitude, longitude, module, inverter, altitude=altitude, orientation_strategy='south_at_latitude_tilt') From abe959fcf50b8f774136d851a306fb1d7e1e5bd3 Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 1 Jun 2016 10:03:05 -0700 Subject: [PATCH 07/11] localize OOP-Loc/PVSys example --- docs/sphinx/source/package_overview.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/sphinx/source/package_overview.rst b/docs/sphinx/source/package_overview.rst index 5240a45e22..f23b68c11f 100644 --- a/docs/sphinx/source/package_overview.rst +++ b/docs/sphinx/source/package_overview.rst @@ -214,7 +214,7 @@ object to accomplish our modeling goal: from pvlib.pvsystem import LocalizedPVSystem energies = {} - for latitude, longitude, name, altitude in coordinates: + for latitude, longitude, name, altitude, timezone in coordinates: localized_system = LocalizedPVSystem(module_parameters=module, inverter_parameters=inverter, surface_tilt=latitude, @@ -222,7 +222,9 @@ object to accomplish our modeling goal: latitude=latitude, longitude=longitude, name=name, - altitude=altitude) + altitude=altitude, + tz=timezone) + times = naive_times.tz_localize(timezone) clearsky = localized_system.get_clearsky(times) solar_position = localized_system.get_solarposition(times) total_irrad = localized_system.get_irradiance(solar_position['apparent_zenith'], From 91c8e25dcd1bdcd100757164a4fb2dba0581da8f Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 1 Jun 2016 10:07:41 -0700 Subject: [PATCH 08/11] localize OOP-Localized-PVSystem example --- docs/sphinx/source/package_overview.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/source/package_overview.rst b/docs/sphinx/source/package_overview.rst index f23b68c11f..317dcc7c5c 100644 --- a/docs/sphinx/source/package_overview.rst +++ b/docs/sphinx/source/package_overview.rst @@ -176,14 +176,15 @@ objects to accomplish our system modeling goal: inverter_parameters=inverter) energies = {} - for latitude, longitude, name, altitude in coordinates: - location = Location(latitude, longitude, name=name, altitude=altitude) + for latitude, longitude, name, altitude, timezone in coordinates: + location = Location(latitude, longitude, name=name, altitude=altitude, + tz=timezone) # very experimental mc = ModelChain(system, location, orientation_strategy='south_at_latitude_tilt') # model results (ac, dc) and intermediates (aoi, temps, etc.) # assigned as mc object attributes - mc.run_model(times) + mc.run_model(naive_times.tz_localize(timezone)) annual_energy = mc.ac.sum() energies[name] = annual_energy From c719f0acb10ab814026c82d1cfcfdfa50b28795f Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 1 Jun 2016 10:18:16 -0700 Subject: [PATCH 09/11] move 'localize datetime indices' comment before for loop --- docs/sphinx/source/package_overview.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sphinx/source/package_overview.rst b/docs/sphinx/source/package_overview.rst index 317dcc7c5c..2cc46f996d 100644 --- a/docs/sphinx/source/package_overview.rst +++ b/docs/sphinx/source/package_overview.rst @@ -80,8 +80,8 @@ to accomplish our system modeling goal: 'surface_azimuth': 180} energies = {} + # localize datetime indices (pvlib>=0.3.0) for latitude, longitude, name, altitude, timezone in coordinates: - # localize datetime indices (pvlib>=0.3.0) times = naive_times.tz_localize(timezone) system['surface_tilt'] = latitude cs = pvlib.clearsky.ineichen(times, latitude, longitude, altitude=altitude) From 5e117307bdf821b50118daea48bf86b20e965a33 Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 1 Jun 2016 16:19:26 -0700 Subject: [PATCH 10/11] San Francisco is +8 --- docs/sphinx/source/package_overview.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sphinx/source/package_overview.rst b/docs/sphinx/source/package_overview.rst index 2cc46f996d..2a8ce6b091 100644 --- a/docs/sphinx/source/package_overview.rst +++ b/docs/sphinx/source/package_overview.rst @@ -49,7 +49,7 @@ configuration at a handful of sites listed below. # latitude, longitude, name, altitude, timezone coordinates = [(30, -110, 'Tucson', 700, 'Etc/GMT+7'), (35, -105, 'Albuquerque', 1500, 'Etc/GMT+7'), - (40, -120, 'San Francisco', 10, 'Etc/GMT+7'), + (40, -120, 'San Francisco', 10, 'Etc/GMT+8'), (50, 10, 'Berlin', 34, 'Etc/GMT-1')] import pvlib From 142740ecfbfd2adc0ed1b9d0c212854ffcfaeba0 Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 1 Jun 2016 16:26:35 -0700 Subject: [PATCH 11/11] add note to whatsnew v0.3.3 and add my name to contributors --- docs/sphinx/source/whatsnew/v0.3.3.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/sphinx/source/whatsnew/v0.3.3.txt b/docs/sphinx/source/whatsnew/v0.3.3.txt index eb1bd80c02..cee80cec60 100644 --- a/docs/sphinx/source/whatsnew/v0.3.3.txt +++ b/docs/sphinx/source/whatsnew/v0.3.3.txt @@ -27,6 +27,8 @@ Bug fixes Documentation ~~~~~~~~~~~~~ +* Localize datetime indices in package overview examples. + (:issue:`156`) * Clarify that ``ModelChain`` and ``basic_chain`` currently only supports SAPM. (:issue:`177`) * Fix version number in 0.3.2 whatsnew file. @@ -47,3 +49,4 @@ Contributors ~~~~~~~~~~~~ * Will Holmgren +* Mark Mikofski