Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
0.15.1 - 2026-05-12
Fixed
404 Error for examples launch binder badge
0.15.0 - 2026-05-12
Added
New
captest.captestmodule. ExportsCapTest,TEST_SETUPS, the three scatter callablesscatter_default,scatter_etotal,scatter_bifi_power_tc, and the helpersperc_wrap,print_results,highlight_pvals,load_config,resolve_test_setup,validate_test_setup.New
CapTestclass (captest.captest.CapTest) — Binds a measured and a modeledCapDatatogether, holds every test-level setting (regression formula, reporting-conditions recipe, filter bounds, nameplate, tolerance, calc-params scalars), and drives the full capacity-test workflow from a single object.New
TEST_SETUPSregistry of named regression presets shipped with pvcaptest. Four presets ship:e2848_default(default ASTM E2848),bifi_e2848_etotal(bifacial ASTM withe_total),bifi_power_tc(temperature-corrected bifacialpower ~ poa + rpoa), ande2848_spec_corrected_poa(ASTM with a spectral-correction factor applied to POA irradiance).New
process_regression_columnsmethod onCapData, which recursively walks theregression_colsdictionary.New calcparams module with simple functions that return calculated regressors. E.g., the
e_totalfunction calculates total POA irradiance from front and rear POA.New
captest.calcparamsfunctions for spectrally corrected irradiance tests:apparent_zenith,apparent_zenith_pvsyst(handles the PVsyst half-hour timestamp shift internally),absolute_airmass,precipitable_water_gueymard,scale,spectral_factor_firstsolar,multiply, and the named aliaspoa_spec_corrected.New
captest.calcparamsfunctions to support the defaultTEST_SETUPS:e_total,rpoa_pvsyst,avg_typ_cell_temp,cell_temp,bom_temp,power_temp_correct.CapTest.from_yaml/CapTest.to_yamlfor a curated round-trip through a yaml config file.New
ScatterPlotandScatterBifiPowerTcclasses incaptest.plottingthat are used with the shipped scatter callables (scatter_default,scatter_etotal,scatter_bifi_power_tc).POA vs power scatter plots can be split so morning and afternoon points are a different color or different marker (glyph).
POA vs power scatter plot function includes kwargs to switch between plotting raw power or temperature corrected power.
Documentation: new user-guide page
user_guide/captestdescribing use of CapTest class.
Changed
Breaking: The
agg_sensorsmethod no longer updates theregression_colsdictionary. This functionality has been moved toprocess_regression_columns.CapData.filter_timenow defaultsendto the last timestamp ofdata_filteredwhen onlystartis provided withoutdays, and defaultsstartto the first timestamp ofdata_filteredwhen onlyendis provided withoutdays.Breaking: the module-level cross-
CapDatafunctionscapdata.captest_results,capdata.captest_results_check_pvalues,capdata.pick_attr,capdata.get_summary(*args),capdata.overlay_scatters,capdata.determine_pass_or_fail, andplotting.residual_plothave been removed. Equivalent methods now live onCapTest(ct.captest_results(),ct.captest_results_check_pvalues(),ct.get_summary(),ct.overlay_scatters(),ct.determine_pass_or_fail(),ct.residual_plot()).pick_attris superseded by therep_cond_sourceparameter onCapTest. Single-CapDatacd.get_summary()is unchanged.Breaking: The
CapData.rep_condmethod has had the calculation of reporting conditions for multiple time periods moved to a separate method -rep_cond_freq.Breaking:
CapData.rep_condandCapData.rep_cond_freqare now formula-agnostic: they derive rhs variables fromregression_formulaviautil.parse_regression_formula.CapData.scatterandCapData.scatter_hvare now formula-agnostic thin wrappers: they resolve the y (lhs) and x (first rhs) columns fromregression_formularather than hardcoding"power"and"poa". For non-default regression presets preferCapTest.scatter_plots, which picks the correct scatter callable (single or multi-panel) from the resolved preset.In
filter_irrthe string to use the reporting irradiance as the reference irradiance to filter around has been changed fromrep_irr.
Convention
The left-hand-side key of the regression formula is always
"power"across shippedTEST_SETUPSpresets, even when the formula regresses a derived quantity like temperature-corrected power. Code that hardcodes"power"as the lhs key continues to work with all shipped presets.
0.14.0 - 2026-04-07
Added
perf_ratio_temp_corr_nrelaccepts measured back-of-module temperature viatemp_bomparameter, skipping the BOM calculation from ambient temp and wind.perf_ratio_temp_corr_nrelacceptssingle_irr_weighted_tempparameter to use a single irradiance-weighted cell temperature for the correction.Plotting function
residual_plotto create plots of residuals vs regression parameters.load_datacan be used with the defaultfile_readerto load csv files from an S3 bucket. Requires the new optional dependencys3fs.agg_sensorsmethod verbose option, which prints summary of aggregations.Column groups are now accessible as attributes of
CapDatainstances (e.g.,cd.poareturns the data for thepoagroup). Attributes are created automatically whenload_datais called or whenCapData.create_column_group_attributes()is called manually.CapData.rename_cols()method to rename columns consistently acrossdata,data_filtered, andcolumn_groups.agg_sensorssupports nested subgroup aggregation: pass a dictionary as the value for a group inagg_mapto first aggregate subgroups and then aggregate the subgroup results. Aggregated columns are added to a new"agg"key incolumn_groupsand are accessible asCapDataattributes prefixed withaggs_.CapData.plot()andplotting.plot()accept aplot_defaults_pathparameter to explicitly specify the path to the plot defaults JSON file.
Changed
DataLoader.loadnow has asummaryparameter (defaultTrue) that controls file loading status output.verbosedefault changed fromTruetoFalseand now enables both summary output and detailed reindexing information.DataLoader._reindex_loaded_filesandDataLoader._join_filesrenamed toreindex_loaded_filesandjoin_files(public API).load_datanow skips sort, drop_duplicates, and reindex when no data is loaded and issues a warning instead of raising an error.Failed-to-load troubleshooting message now includes kwargs passed to
file_reader.filter_clearskyno longer acceptswindow_lengthas a direct parameter. It now defaults toinfer_limits=True(pvlib recommended, Reno 2016). Passwindow_lengthand other pvlibdetect_clearskyparameters via**kwargs.filter_missingrefactored to use theflocindexer; thecolumnsparameter now accepts column group keys in addition to column names.
Fixed
Removed stale references to the removed
irr_rc_balancedfunction from docstrings ofperc_bounds,rep_cond, andpredict_capacities. These now referenceReportingIrradiance, the class that replaced it.rep_conddocstring now documents that whenirr_bal=True, the reporting temperature and wind speed are the means of the data within the balanced irradiance band.CapData.plot()now reads and writes a per-instance defaults file namedplot_defaults_{name}.jsoninstead of the sharedplot_defaults.json, preventing conflicts when multipleCapDataobjects are used in the same session (issue #117).Columns listed in the plot defaults file that are no longer present in the data are ignored with a
UserWarningrather than causing an error. If all stored columns are missing, the dashboard falls back to auto-detected default groups (issue #115).Fixed inaccurate docstring note: the plot defaults file is resolved relative to the current working directory, not the calling file’s directory.
filter_clearskypositional arg bug wherewindow_lengthwas passed asinfer_limitsto pvlib’sdetect_clearsky.filter_outliersnow detects NaN values in the poa and power columns before fitting the EllipticEnvelope. AUserWarningis issued andfilter_missingis automatically called on those columns; both are recorded in the filter summary.filter_powerno longer incorrectly removes rows with NaN values when filtering on a multi-column power group.DataLoader.loadno longer raisesUnboundLocalErrorwhen all files fail to load; setsdatatoNoneand issues a warning.reindex_datetimenow handles duplicate indices by dropping duplicates and warning instead of raising aValueError.filter_irrno longer uses pandasquery(), fixing a compatibility error with pandas v2.2.3.
0.13.4 - 2026-02-17
Changed
Removed upper version limits for numpy, pandas, and param dependencies
Replaced use of deprecated
copykwarg removed in numpy 2.4Removed use of pytz package and refactored timezone handling
Fixed
p-value checking for pandas 2 and 3 compatibility
param 2.0 deprecation for passing positional arg to ClassSelector
Various deprecation warnings in tests
Errors due to pandas 3.0 API changes, compatability for copy-on-write changes
0.13.3 - 2026-02-06
Changed
Migrated from versioneer to setuptools-scm for git-based version management
Migrated from setup.py to modern pyproject.toml with [project] section
Added uv for dependency management and development workflows
Updated version access to use
importlib.metadata.version()Updated
numpyversion constraint to<2.4.0for compatibility, temporarilyUpdated
paramversion constraint to<2.0for compatibilityUpdated
pandasversion constraint to<3.0for compatibility, temporarilyUpdated development status classifier to “4 - Beta”
Simplified license metadata format in pyproject.toml
Moved testing and documentation dependencies to dependency-groups
Updated read the docs configuration to use uv
Removed
setup.py (all configuration moved to pyproject.toml)
Versioneer dependency and configuration
scipy dependency (replaced scipy.stats.mode with pandas.Series.mode in July 2023, unused imports removed January 2026)
Added
setuptools-scm for automatic version generation from git tags
Modern pyproject.toml with complete project metadata
Just command runner (justfile) with development recipes
Just recipes for testing package builds and version checking
Just recipe for building docs
MAINTAINER.md documentation for project maintainers
0.13.2 - 2025-07-17
Fixed
Change to nan for compatability with numpy 2.0
Update file_reader to warn but load empty csv files
0.13.1 - 2024-06-05
Fixed
Issue 112 - plotting tool would plot only last curve for plots with more than 25 curves.
0.13.0 - 2024-05-05
Added
load_datacan read site location and system information for generating clear sky irradiance from a json or yaml file.New plotting module with a plot function which replaces the CapData.plot method. The new plot function creates a panel dashboard with expanded functionality. Internally, removes the plotting dependency on the CapData.trans_keys attribute.
locandfloccan be used to retrieve the regression columns, similar to previous rview functionality by usingregcols.
Changed
Removed the CapData
trans_keysattribute, which was a copy of thecolumn_groupskeys and would be modified by the oldCapData.plotmethod.trans_keysmade it difficult to create aCapDataobject without using theload_datafunction.Replaces all uses of
viewandrviewwithlocandfloc.Updated
locandflocto always return a DataFrame. Previously these would sometimes return a Series.load_datanow checks if any individual files were loaded when loading multiple files from a directory.Adds underlay curve of unfiltered power to the linked timeseries created when calling
scatter_hvwithtimeseries=True.Changes selected points on scatter plot and linked timeseries produced by
scatter_hvto red.Tolerances may now be fractions eg ‘- 3.5’
The plotting methods
scatter_hv,scatter_filters, andtimeseries_filtersdo not require a column labeled ‘index’ with string datetimes in thedataDataFrame anymore. Also, the index of thedataDataFrame does not need to be named ‘Timeseries’.Removes the
add_index_colkwarg option fromutil.reindex.
0.12.0 - 2023-08-27
Added
Added a user guide section to the documentation with an overview and bifacial tests section.
Added verbose kwarg to the DataLoader load method, which prints which files have been loaded
DataLoader load method has new kwarg print_errors
DataLoader load method stores list of paths of files that fail to load in failed_to_load attribute
CapData method to save column_groups dictionary to excel
Github action to build and publish to PyPI on tags like v* pushed from master
Changed
Updates to make pvcaptest compatible with pvlib 0.10 and scipy 1.11
Update to make pvcaptest compatible with bokeh v3.0.0, change
plot_widthandplot_heighttowidthandheightMake bokeh v3 minimum version
Drop support for python 3.7
Drop to_numeric from io.file_reader
CapData.column_groups is instance of ColumnGroups now when group_columns is a callable
Changed defaults for the CapData plot method to single column
0.11.2 - 2023-04-20
Added
Adds CI testing across python 3.7 to 3.11 on OSX, Linux, and Windows using Github actions.
Changed
Re-organized project root directory to place captest package under a src directory, see PR #83.
Re-organized the extras for pip installation into optional, test, docs, and all. Updated the installation section of the docs to reflect change.
Updated installation instructions with links to pandas and conda docs for more information on environments.
Re-organized installation instructions.
Changed instructions on creating a conda env for pvcaptest to directly download the env yaml file from the repository rather than the whole repository.
Clean up RTD configuration, particularly added project directory to PYTHONPATH in the docs build environment, so the docs build against checked out version instead of installed version from conda.
Updates to documentation to add new modules, remove history section of releases, and remove references to Travis CI.
Fixed
Cleaned up issues in tests found after re-implementing CI on other platforms.
0.11.1 - 2023-04-09
Added
Added new dependencies - colorcet, param
Added openpyxl as an optional dependency
Loads bokeh as holoviews extension in captest imports so user doesn’t need to
Changed
Removed use of hvplot, replaced with holoviews to avoid adding unnecessary dependency. PR #73.
Fixed
Typo in the import check of panel
0.11.0 - 2023-04-07 [YANKED]
Added
Added columngroups module with a ColumnGroups class that extends python dictionaries to include each column group as an attribute and repr is formatted for easy reading.
Created the
locandfloccallables for CapData, which allow easier access to columns of thedataanddata_filteredattributes, repsectively. Will replaceviewandrviewmethod.Added
read_jsonfunction to util module.Added
read_yamlfunction to util module.Added the io module with functions to load data and return instances of CapData containing the loaded data.
Added the ReportingIrradiance class for calculations of a reporting irradiance that is between the 40th and 60th percentile.
ReportingIrradiance.plotincludes a dashboard type view of the selected and possible reporting irradiance values and method to save possible reporting conditions table to csv.Added the
spatial_uncertandexpanded_uncertmethods. Improvements and testing needed.
Changed
Moved group_columns method, series_type, and type definitions from the capdata module to the columngroups module and changed group_columns from a CapData method to a function that returns a ColumnGroups instance.
Completely refactored the algorithim to determine the reporting irradiance when
irr_balis set to True. Now an instance of the new ReportingIrradiance class is created and used to determine the reporting irradiance.Updated the examples to reflect the changes to the API for data loading, column grouping, selection (loc and floc vs view and rview), and balanced reporting irradiance.
Changed the
scatter_hvmethod to be more flexible and not require temperature or wind regression columns.
Removed
Removed the value checking functionality of the group_columns function. Data quality is outside the scope of the pvcaptest project.
Removed the
load_data,load_das, andload_pvsystmethods from the CapData class. Replaced with io module.
0.10.0 - 2021-07-25
Added
Added the filter_missing CapData method to remove missing data from specified columns. By default removes only intervals that contain missing data in the regression variable columns.
Added option to filter_irr method to specify using the reporting irradiance in the CapData object as the reference irradiance.
Added option to the filter_time method to drop the specified time period instead of dropping all other times.
Added option to filter_clearsky method to keep time periods with unstable irradiance.
Added new attributes to CapData: removed, kept, filter_counts. The update_summary decorator now stores the index of points removed, the index of points remaining after each filter, and the number of times any filter has been run for each filter applied.
Adds new plotting method, scatter_filters, which shows which filtering step removed which time intervals of data in a plot of irradiance vs. power.
New plotting method, timeseries_filters, which shows which fitlering step removed which time intervals of data in a plot of power vs. time.
New plotting function, overlay_scatters, that overlays irradiance vs. power scatter plots of the data remaining after the last filtering step of the two CapData objects passed to the function.
New get_filtering_table method that returns a DataFrame documenting the which time intervals are removed by which filter and which time intervals remain after all filtering.
Adds the run_test function, which applies the passed list of CapData filtering methods to the CapData object passed.
Adds the points_summary method, which prints the number of points remaining after all filtering, the length of the test period, the average points remaining after filtering per day, if enough points have been collected, if more points are needed how many, and how many days left if the rate of points holds.
Changed
Updated filter_pvsyst method to handle inverter output variables that have underscores or spaces like ‘IL Pmin’ and ‘IL_Pmin’.
load_das method no longer drops columns and rows that contain no data
Format of hover tooltip in plots produced by plot method now includes comma separator for thousands.
Changes captest to pvcaptest in documentation.
get_reg_cols method default changed to get and rename the columns defined in the
regression_colsattribute rather than expecting regression variables/columns to be identified by the keys ‘power’, ‘poa’, ‘t_amb’, and ‘w_vel’ in theregression_colsattribute.
0.9.0 - 2020-08-16
Changed
Updated clear sky functions which rely on pandas
index.tz_localizeto use nonexistent argument rather than errors argument, which was deprecated in pandas v1.0.Made Pandas v1.0 or greater a requirement for pvcaptest.
Change to test against python v3.7* and v3.8*
Updated installation instructions.
0.8.0 - 2020-04-13
Added
Added a filter_power method to the CapData class.
Added a filter_days method to the CapData class.
Changed
Allow get_reg_cols to accept a single regression variable as a string. Previously required passing list with at least two entries.
Fixed bug in filter_clearksy that applied filter to data rather than data_filtered attribute.
Added option to plot method to use column names for hover labels instead of abbreviated column names.
Improved formatting of the filtering summary output. See issue #12 for details.
Cleaned up source code by correcting linter errors.
0.7.0 - 2020-03-08
Added
New filter_shade method separate from the filter_pvsyst method.
captest_results method warns when it automatically attempts to correct for W vs kW.
Changed
Filter_pvsyst method filters on IL Pmin, IL Pmax, IL Vmin, and IL Vmax and warns if any of the four are missing. Previously failed if any of the four were missing.
cp_results returns a warning if the regression formulas of the passed CapData objects do not match instead of warning and continuing.
Updates to make captest compatible with pvlib 0.7.0
Editing of the complete capacity test example to use new names and improve explanations of features.
Names were changed to remove ambiguous abbreviations:
flt - filter; API changes in many places
cntg_eoy - wrap_year_end; API change
cp_results - captest_results; API change
res_summary - captest_results_check_pvalues; API change
reg_fml - regression_formula; API change
irrRC_balanced - irr_rc_balanced; API change
df_beg - df_start
ix_ser - ix_series
mnth - month
months_boy - months_year_start
months_eoy - months_year_end
loop_cnt - loop_count
cprat - cap_ratio
cprat_cpval - cap_ratio_check_pvalues
trans - column_groups; API change
set_translation - group_columns
trans_report - column_type_report
set_trans argument of load_data - group_columns
review_trans - review_column_groups
set_reg_trans - set_regression_cols
reg_trans - regression_cols
update_reg_trans argument of agg_sensors - update_regression_cols
reg_cpt - fit_regression
ols_model - regression_results
Removed
Removed the inv_trans_dict function. This was intended for use within the module and was unused.
0.6.0 - 2019-09-15
Added
Setup Travis CI to test pull requests and test and deploy to pypi for tags on master.
Setup project documentation hosted by Read the Docs using sphinx, nbshpinx, napolean, recommonmark, AutoStructify
Changed
Versioning changed from manual update in __version.py file to using versioneer to update version number from git tag.
Updated this file to follow the Keep a Changelog formatting conventions.
Moved repository to an organization github account from my personal github account.
Examples moved from root/examples directory to docs/examples. Executed versions of the examples display on read the docs.
All examples can be launched through binder in live notebooks.
The environment file has been updated to work for binder and Read the Docs.
0.5.3 - 2019-05-12
Changed
Update name and location of conda environment yml file, so there is a single file and it works with binder.
Removed binder directory.
Update readme to reflect changes to conda environment.yml
Minor updates to example.
Minor documentation string updates.
0.5.1 - 2019-05-01
Added
Addition of clear sky modeling using pvlib library. See new example notebook ‘Clear Sky Examples’.
Added a new method,
predict_capacitiesfor calculating reporting conditions and predicted outputs by month.New example notebook demonstrating use of
rep_condandpredict_capacities.Add warning when filter removes all data.
Changed
Changed Holoviews dependency to >= v1.11. DatLink added in v1.11 is required for scatter_hv method.
Expanded docstring for the load_data method to more clearly explain how the method joins multiple files (by row).
Update installation directions in README.
Updated conda environment file (conda_env.yml) to match updated dependencies.
Moved all filtering and regression functionality from CapTest class into the CapData class and replace CapTest class with functions for results comparing CapData objects.
Significant refactor of the rep_cond function. Removed any time filtering and prediction from rep_cond. Rep_cond acts on filtered data in the df_flt attribute.
agg_sensorsmethod updated to be more explicit and flexible.Changed
filter_sensorsto filter based on percent difference between all combinations of pairs of sensors measuring the same environmental factor. Corrected bug where standard deviation filter could not detect outliers with more than two, but still a small number of sensors.Adjusted bounds check of columns of data when importing so that translation dictionary names would not have ‘valuesError’ added to them.
Made printout of bounds check results optional when loading data.
Adjusted the type_defs and sub_type_defs, so that translation dictionary keys are more accurate for PVsyst data.