What’s New#

This page contains the release notes for PVDeg, documenting new features, breaking changes, bug fixes, and other improvements in each version.

For information on contributing to future releases, see Contributing.

Release Notes#

v0.7.0 (2025-12-05)#

Breaking Changes#

  • Update NSRDB weather data retrieval to use PSM v4 instead of PSM v3. Instances of pvlib.iotools.get_psm3() replaced with pvlib.iotools.get_nsrdb_psm4_tmy(). (issue 286, pull 287)

  • Enable multi-material handling in the Scenario class:
    • Allow material parameter in scenario.addModule() to be a nested dictionary of multiple materials from different materials files

    • Update utilities._add_material() and scenario.add_material() to support this functionality.

Enhancements#

  • Add Python 3.13 support. (issue 279, pull 281)

  • Remove kinetic_parameters.json and merged parameters into ‘DegradationDatabase.json`. (issue 176, pull 248)

  • Update citation references in documentation homepage (index.rst) and README with current Zenodo DOI link, JOSS paper (in review), and software record. (issue 283, pull 302)

  • Add CONTRIBUTING.md with comprehensive guidelines for code contributions, pre-commit hooks, and database contributions. Highlights community-driven material property and degradation parameter databases. Includes detailed pre-commit installation and usage documentation, and ipykernel setup instructions for conda environments. (issue 145, issue 293, issue 296, pull 302)

  • Configure ReadTheDocs to build documentation on every pull request for preview and review. (issue 258, pull 302)

  • Restructure tutorial notebooks and migrate from tutorials_and_tools/ to new tutorials/ directory with improved organization and naming conventions. (issue 232, issue 271, pull 302)

    • Reorganize tutorials into logical themed folders: 01_basics (4 notebooks), 02_degradation (6 notebooks), 03_monte_carlo (2 notebooks), 04_scenario (3 notebooks), 05_geospatial (5 notebooks), 06_advanced (4 notebooks), 10_workshop_demos (2 notebooks), and tools (3 tool notebooks).

    • Add newer notebooks to Jupyter Book build and update table of contents.

    • Update notebooks to load pre-saved weather data by default to avoid API rate limits: 03_monte_carlo/01_arrhenius.ipynb (Miami), 01_basics/04_weather_database_access.ipynb (Golden, CO), 03_monte_carlo/02_standoff.ipynb (NYC).

    • Add jupytext configuration and Python script versions for all notebooks with pre-commit hook synchronization for version control.

    • Update Eagle HPC references to Kestrel (NREL’s current HPC system).

    • Update all configuration files (_toc.yml, _config.yml, myst.yml), GitHub Actions workflows (nbval.yaml, testbook.yaml, deploy-books.yml), and CI/CD pipelines for new structure.

  • Add pysam module to support InSPIRE Agrivoltaics geospatial simulations. Currently our pysam wrapper implementation is largely project specific. We aim to generalize this module in the future to support out of the box geospatial pysam calculations for all users. (pull 252)

    • Expert options added to pvdeg.geospatial.analysis. Details are as follows:

    • preserve_gid_dim optional boolean flag. Keeps model outputs in gid dimension rather than converting to latitude, longitude domain.

    • compute optional boolean flag. Prevents eager computation inside of anlysis function. analysis(..., compute=False) will return a dask.Delayed object which can be used to build a task graph.

  • Add new (public) module pvdeg.pysam to wrap NREL-PySAM for easy SAM simulations. - Add new (public) functions as follows:

    • pvdeg.pysam.pysam() to run SAM simulations.

    • optimal_gcr_pitch() to calculate optimal gcr and pitch for fixed tilt bifacial systems according to latitude and optimal GCR parameters.

    • inspire_practical_pitch() to calcuate tilt, pitch, and gcr for practically constrained systems according to optimal_gcr_pitch()

    • inspire_ground_irradiance() to calculate inter-row ground irradiance for the InSPIRE agrivoltaics irradiance dataset.

    • solar_resource_dict() to create solar_resource collections for SAM input from PVDeg weather and metadata.

Deprecations#

  • Drop Python 3.9 support. The minimum supported Python version is now 3.10. (issue 279, pull 281)

Bug Fixes#

  • Update MD5 checksum references in documentation from old hash to new hash (pull 276)

Dependencies#

Contributors#

v0.6.1 (2025-10-04)#

Bug Fixes#

  • Include 0.6.0 changes in the whatsnew.

  • Fix formatting in README.md

  • Update logo in tutorials_and_tools/_config.yml

Contributors#

v0.6.0 (2025-10-04)#

Breaking Changes#

  • Update dependency requirements: - pvlib-python: was ==0.10.3, now >=0.12.0 - numpy: was ==1.26.4, now >1.19.3 - scipy: was <1.14.0, now >1.6.0 (issue 103, pull 163)

  • Remove deprecated vertical_poa function from pysam.py and related (incorrect) reference to standards.vertical_poa in geospatial.py. (issue 167, pull 174)

  • Replaced ambiguous variable name l in :py:func`pvdeg.collection.collection_probability` with diffusion_length to enhance code readability and maintainability. (issue 198, pull 199)

  • Replace print messages for failure or succesful addition of objects (location, job…) with try/except blocks and warnings in scenario. (pull 192)

  • Remove deprecated pvdeg.store module. (issue 168, pull 180)

  • Refactored and cleaned up :py:mod:pvdeg.humiditiy by removing unused functions, improving docstrings, and standardizing physical constants. Full details are as follows:

    • Remove unused helper function _ambient()

    • Remove _diffusivity_numerator() and _diffusivity_denominator() helper functionsby refactoring them into _diffusivity_weighted_water()

    • Remove legacy comments and commented out code

    • Clean and streamlined docstrings, for example removing redundant docstring from helper functions

    • Improve function docstrings

    • Introduce a module level constant R_GAS for the universal gas constant and replaced all hardcoded instances of the gas constant (0.00831446261815324) with R_GAS

    • Add Ead argument to front_encapsulant to enable user to specify custom material fully, previous behaviour enforced the Ead value for EVA material

    • Improve argument handling in front_encapsulant to include check for presence of Ead. (issue 202, pull 212)

  • Rename several variable and function names in pvdeg.humidity to improve code clarity and maintainability. Full details are as follows:

    • Variable psat and function psat() to water_saturation_pressure

    • Variable avg_psat to avg_water_saturation_pressure

    • Variable surface_outside to surface_relative

    • Variable RHfront_series to front_encapsulant

    • Variable t to backsheet_thickness

    • Function front_encap() to front_encapsulant

    • Function Ce() to back_encapsulant_water_concentration

    • Function back_encap to back_encapsulant

    (issue 213, issue 233, pull 224, pull 236)

Enhancements#

  • Change GeospatialScenario.get_geospatial_data() to a @property, now use

GeospatialScenario.geospatial_data - Change GeospatialScenario.coords_tonumpy() to a @property, now use GeospatialScenario.coords - Refactor META_MAP in pvdeg.weather to module-level constant (pull 182) - Update pytest workflow to cancel in-progress runs for the same branch in favour of

running on the latest commit. (pull 191)

Deprecations#

  • GeospatialScenario._get_geospatial_data()

  • GeospatialScenario.getValidRegions()

  • GeospatialScenario.gids_tonumpy()

  • GeospatialScenario.gids_tolist()

  • Deprecate see_added argument, and associated UserWarning for succesful addition of objects, in several scenario functions. (pull 192)

Bug Fixes#

  • v0.5.0 incorrectly claimed that GeospatialScenario was moved to pvdeg/geospatialscenario.py. Completed the move.

  • Code cleanup and standardization in pvdeg.degradation module: - Improve readability of mathematical expressions - Refactor redundant helper functions - Update docstrings - Remove unused functions and variables - Improve code consistency (issue 177, pull 178)

  • Clean up and fix bugs in notebooks. (issue 179, pull 184)

  • Resolves non-deterministic source ambiguity when picking NSRDB TMY files from Kestrel when using weather.get(..., TMY=True, geospatial=True). - PVDeg will always use the most recent version. - Added new kestrel_nsrdb_fnames attribute to returned weather dataset for traceability.

Dependencies#

  • Update aiohttp from 3.10.11 to 3.12.14 for improved security and performance (pull 185)

  • Update NREL-PySAM dependency from 5.1.0 to the newest version to leverage latest features and improvements. (issue 254, pull 255)

Testing#

Contributors#

v0.5.0 (2025-2-7)#

Enhancements#

  • New Logo!🎉🎉🎉

  • Created utilities for parallelized downloads of PVGIS and NSRDB so users can download geospatial data for at home simulations. This will interface nicely with the soon to be released GeoGridStore, allowing users to grow stores of geospatial data overtime as their needs grow for at-home, large-scale analyses.

  • Documenation overhaul. Significant User Guide improvements. Added geospatial information with visual aids, added meteorological data page and materials access page.

  • Suite of utility functions to facilitate accessing material parameter json files.

  • Moved GeospatialScenario class definition to geospatialscenario.py

  • Remove kdtree as required argument from GeospatialScenario downselection methods, kdtree objects are now generated on the fly when required and saved to scenario object for future use.

  • decorators.geospatial_quick_shape arguments modified. numeric_or_timeseries, now takes a string ('numeric', 'timeseries') to determine type of outputs rather than a Bool or Int
    • previously, 0 or False represented a numeric/scalar result, now this is represented by 'numeric'

    • previosuly, 1 or True represented a timeseries result, now this is represented by 'timeseries'

  • decorators.py namespace changed to default pvdeg namespace. now this can be directly accessed via pvdeg.decorators. This reduces the need for an extra import.
    • geospatial_quick_shape decorator namespace changed to defualt pvdeg namespace

Previously,

import pvdeg
from pvdeg.decorator import geospatial_quick_shape

@geospatial_quick_shape(0, ...)
def myfunc(...):
    ....

Now, either of the following options work.

import pvdeg

# now takes string instead of integer or boolean value
@pvdeg.decorators.geospatial_quick_shape('numeric', ...)
def myfunc(...):
    ....
# this is the style used in the PVDeg package implementations
import pvdeg.decorators

@decorators.geospatial_quick_shape('numeric', ...)
def myfunc(...):
    ....

Bug Fixes#

  • fixed an issue where pvdeg.geospatial.elevation_stochastic_downselect would return metadata row indicies which were downselected instead of named gids.

Contributors#

v0.4.3 (2024-11-1)#

Enhancements#

pvdeg.geospatial.analysis implements autotemplating. No need to specify a template for common pvdeg functions during analysis. Manually creating and providing templates is still an option. Docstrings updated with examples.

Suite of utility functions to facilitate accessing material parameter json files.

  • pvdeg.utilities.read_material creates a public api to replace the private pvdeg.untility._read_material function (to be deprecated soon)

  • pvdeg.utilities.search_json to search jsons and identify keys for desired materials.

  • pvdeg.utilities.display_json to view 2 level jsons in Jupyter Notebooks using HTML.

Contributors#

v0.4.2 (2024-09-13)#

Bug Fixes#

  • Remove duplicate gid’s from pvdeg.geospatial.elevation_stochastic_downselection

Tests#

  • Added a test for Xmin in test_standards.py and removed dependency on pvgis.

Contributors#

v0.4.1 (2024-08-30)#

Enhancements#

Diffusion

  • Created a 1D diffsion tool. Tools - Edge Seal Oxygen Ingress.ipynb

  • Created a diffusion module. Only has a 1D diffusion calculation function (pvdeg.diffusion.esdiffusion)

but 2D calculation combing soon.

Contributors#

v0.4.0 (2024-07-29)#

Enhancements#

Scenarios

  • Unified Cell and Module Temperature function. See:
    • temperature.temperature

  • Added support for pvlib temperature models. See pvlib docs:
  • Overhauled scenario class for pv system analysis. Scenario object for single point analysis and GeospatialScenario object for geospatial analysis. See: scenario.Scenario and scenario.GeospatialScenario

  • Created Scenario tutorials to showcase new scenario functionality.

  • Added a number of geospatial downselection functions. Find coordinates near mountains, rivers, coastlines and lakes from NSRDB data. See:
    • geospatial.identify_mountains_weights

    • geospatial.identify_mountains_radii

    • geospatial.feature_downselect

  • Added geospatial bounding box support. Clip unwanted data with rectangular bounding boxes. See:
    • geospatial.apply_bounding_box

  • Added stochastic non-uniform density downselection function to preferentially select for mountains (higher point density with changes in elevation, lower density when flatter.) See:
    • geospatial.elevation_stochastic_downselection

  • Updated non-uniform downselection with thresholding and non-linear normalization (support for logarithmic and exponential normalization) See:
    • geospatial.identify_mountains_weights

  • Added Scenario and GeospatialScenario methods for quick plotting and downselection. See:
    • GeospatialScenario.plot_coords

    • GeospatialScenario.plot_meta_classification

    • GeospatialScenario.plot_USA

    • Scenario.extract

    • Scenario.plot

    • GeospatialScenario.classify_mountain_weights

    • GeospatialScenario.classify_mountain_radii

    • GeospatialScenario.downselect_elevation_stochastic

  • Added a convenience method GepspatialScenario.geospatial_data to quickly pull the geospatial weather and metadata from a scenario. Matches the API for pvdeg.weather.get.

Geospatial Improvements

  • Autotemplating system for geospatial analysis using pvdeg.geospatial.autotemplate.

  • New module pvdeg.decorators that contains pvdeg specific decorator functions.

  • Implemented geospatial_result_type decorator to update functions and preform runtime introspection to determine if a function is autotemplate-able.

  • Geospatial Templates.ipynb notebook to showcase new and old templating functionality for users.

  • Implemented testing for geospatial analysis.

  • Added chunked and unchunked testing.

Symbolic Evaluation

  • symbolic equation solver for simple models.

  • notebook tutorial Custom-Functions-Nopython.ipynb

IEC-63126 Tool

  • Added GeospatialScenario to standoff tool for regional analyses.

  • Increased plotting functionality within tool.

Bug Fixes#

  • Added type hinting to many pvdeg functions

  • Fixed broken keywords in many pvdeg.standards function calls

  • Replaced deprecated numba jit(nopython=True) calls with njit

  • Fix incorrect keyword arguments in pvdeg.standards.T98_estimate

  • Fixed pvdeg.temperature.module and pvdeg.temperature.cell docstring return type. Correct return type pd.Series

  • Fixed broken Geospatial Analysis, when using chunked (dask) xarrays for weather data

Dependencies#

  • sympy package required for pvdeg.symbolic functions and notebook. Not added to dependency list.

  • Restrict the following dependencies to fix unit testing

  • numpy==1.26.4

  • pvlib==0.10.3

  • scipy<1.14.0

Contributors#

v0.3.3 (2024-05-06)#

Bug Fixes#

  • Fix logo path in documenation

Documentation#

  • Updated Zenodo citation in readme.

Contributors#

v0.3.2 (2024-05-06)#

Enhancements#

  • Added workflow for automated deployment of jupyter-books

Bug Fixes#

  • Re-run notebooks and fixed minor bugs

Contributors#

v0.3.1 (2024-05-06)#

Enhancements#

  • Added new LETID tests

Bug Fixes#

  • Multiple bug fixes in geospatial analysis

Documentation#

  • Renamed pvdeg_tutorials folder to tutorials_and_tools, and added more tutorials

to be run easily in google collab. * Jupyter Journals now have information regarding the version of the programs used near the beginning, to simplify debugging and user support.

Contributors#

v0.3.0 (2024-02-12)#

Enhancements#

  • Initial integration of the Monte-Carlo analysis package

Contributors#

v0.2.3 (2024-02-09)#

Enhancements#

  • refactor of the standoff calculation

  • refactor to wind_speed height instead of wind_speed factor

  • updates to standoff calculation notebooks

  • updates to documentation

  • include issue and pull request templates

Contributors#

v0.2.2 (2024-01-30)#

Enhancements#

  • automatically deploy to pypi

Contributors#

v0.2.1 (2024-01-30)#

Enhancements#

  • integration of LeTID degradation modelling.

  • new geospatial demo notebooks

  • pre-commit hooks for code quality

Requirements#

  • update repo to use pyproject.toml for package management

  • requirements for multiple packages updated

Bug Fixes#

  • minor bug fixes in the documentation

Contributors#

v0.2.0 (2023-12-04)#

Integrated geospatial analysis via dask and xarray.

  • new geospatial analysis functions

  • dask for parallel processing

  • xarray for geospatial data handling

v0.1.3 (2023-09-13)#

Minor bug fixes.

v0.1.2 (2023-07-07)#

ASTM Conference Release.

  • Tutorial examples for live workshop demo.

v0.1.0 (2023-06-28)#

First official release.

  • pvdeg populated with various classes, including functions for: - energy calculations of water, vapor pressure, ingress rate, edge seal width, van hoff irradiance degradation, weighted average irradiance, arrhenius acceleration factor, weighted average irradiance - fatigue of soldering bonds - humidity calculations, including relative humidity on outside surface, on front encapsulant, back encapsulant, and backsheet - BoLID and LeTID degradation profile calculations - Standards, such as minimum module stand-off distance calculation - support of internal calculations needed such as spectral, solar position, etc.

  • Re-structured folders to include Documentation, Versioning and Setup.

  • Tutorial examples available on the tutorials folder to run through Jupyter, Collab or Binder

  • Added Sphinx Documentation

  • Added Versioneer

  • pytests implemented for most functions