Skip to content

[WIP] Nonlinear#517

Draft
martin-springer wants to merge 52 commits into
masterfrom
nonlinear
Draft

[WIP] Nonlinear#517
martin-springer wants to merge 52 commits into
masterfrom
nonlinear

Conversation

@martin-springer

Copy link
Copy Markdown
Collaborator
  • Code changes are covered by tests
  • Code changes have been evaluated for compatibility/integration with TrendAnalysis
  • New functions added to __init__.py
  • API.rst is up to date, along with other sphinx docs pages
  • Example notebooks are rerun and differences in results scrutinized
  • Updated changelog

cdeline and others added 30 commits March 5, 2026 11:00
* add keyword 'label' to degradation_timeseries_plot, enabling 'left' and 'center' labeling options.

* Update changelog, add pytests, update sphinx documentation

* fix flake8 grumbles

* update pytests to include axes limits

* fix flake8 grumbles

* add 'label' input option to `degradation_year_on_year`. Fixes #459

* add pytests and update changelog.

* flake8 grumbles

* Minor updates to setup.py (constrain scipy<1.16) and refactor degradation_test

* Custom fix for Pandas < 2.0.0 which can't average two columns of timestamps.

* flake8 grumbles

* keep TZ-aware timestamps.  Update pytests to specifically test _avg_timestamp_old_Pandas

* flake8 grumbles

* try to UTC localize the pytest...

* Add .asfreq() to get pytests to agree

* switch to calendar.timegm to hopefully remove TZ issues..

* regardless of uncertainty_method, return calc_info{'YoY_values')

* update _right dt labels to correct _left labels in degradation_year_on_year

* update _avg_timestamp_old_Pandas to allow for numeric index instead of timestamp

* add left label option to degradation_year_on_year

* update degradation_year_on_year, index set to either left, center or right. Consistent with #394 - multi_yoy

* update return for default = none uncertainty option

* degradation_year_on_year - go back to single return when uncertainty_value = None to avoid breaking pytests.

* add multi-year aggregation of slopes in degradation_year_on_year

* add multi_yoy kwarg in degradation_year_on_year to toggle the multi-YoY function.

* update plotting for detailed=True, allow usage_of_points > 2

* flake8 grumbles

* update plotting detailed=True for  (even) and (odd) number of points coloring

* To allow multi_yoy=True in plotting.degradation_timeseries_plot, resample.mean() the YoY_values.

* flake8 grumbles

* Add warning to degradation_timeseries_plot when multi_YoY=True

* update to warning message in plotting.degradation_timeseries_plot

* fix flake8 grumbles

* nbval fixes from qnguyen345-bare_except_error

* Add pandas 3.0 futurewarning handling

* Try again to solve pandas3.0 futurewarning

* attempt 3 to fix nbval

* Add infer_objects to remove futurewarning

* minor inline comment update

* update plotting tests to be relative value, update ordering of module import in plotting.py, per Copilot review.

* update inline comments and whatsnew docs

* Clean up inline comments per Copilot review

* added multi-YoY pytest - still need to catch warnings

* Add a warnings.catch_warnings to the plotting pytest

* flake8 grumbles

* add multi-YoY=True pytest

* updated changelog

* update changelog

* implement copilot suggestions

* linting

* use s instead of ns for pandas 3 compatibility

* update pandas version comparison

* set matplotlib non-gui backend for tests

* set dtype resolution based on pandas version

* linting import order

* boost degradation.py test coverage

* update changelog

* exclude coverage reports with suffixes

* Update rdtools/degradation.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* remove label=None handling, rely on default 'right' behavior

* refactor dt_center  tz handling for old pandas

* simplify _avg_timestamp_old_Pandas

* degradation_timeseries_plot: change rolling median min_periods to rolling_days / 4.

* remove degradation_timeseries_plot(label=) and just default to center=True

* update sensor_analysis() and clearsky_analysis() docstrings to discuss passing `label=right` kwargs

* flake8 updates

* Initial commit - multi-YoY notebook

* pretty-print notebook dataframes with tabulate.

* update notebook requirements to silence pandas warnings

* add multi-yoy nb to tutorials

* fix nblink path

* Change the yoy_values index to be named 'dt'.  Add new illustrations at the end of the multi-YoY notebook.

---------

Co-authored-by: Michael Deceglie <mdeceglie@users.noreply.github.com>
Co-authored-by: martin-springer <martinspringer.ms@gmail.com>
Co-authored-by: Martin Springer <97482055+martin-springer@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* add keyword 'label' to degradation_timeseries_plot, enabling 'left' and 'center' labeling options.

* Update changelog, add pytests, update sphinx documentation

* fix flake8 grumbles

* update pytests to include axes limits

* fix flake8 grumbles

* add 'label' input option to `degradation_year_on_year`. Fixes #459

* add pytests and update changelog.

* flake8 grumbles

* Minor updates to setup.py (constrain scipy<1.16) and refactor degradation_test

* Custom fix for Pandas < 2.0.0 which can't average two columns of timestamps.

* flake8 grumbles

* keep TZ-aware timestamps.  Update pytests to specifically test _avg_timestamp_old_Pandas

* flake8 grumbles

* try to UTC localize the pytest...

* Add .asfreq() to get pytests to agree

* switch to calendar.timegm to hopefully remove TZ issues..

* regardless of uncertainty_method, return calc_info{'YoY_values')

* update _right dt labels to correct _left labels in degradation_year_on_year

* update _avg_timestamp_old_Pandas to allow for numeric index instead of timestamp

* add left label option to degradation_year_on_year

* update degradation_year_on_year, index set to either left, center or right. Consistent with #394 - multi_yoy

* update return for default = none uncertainty option

* degradation_year_on_year - go back to single return when uncertainty_value = None to avoid breaking pytests.

* add multi-year aggregation of slopes in degradation_year_on_year

* add multi_yoy kwarg in degradation_year_on_year to toggle the multi-YoY function.

* update plotting for detailed=True, allow usage_of_points > 2

* flake8 grumbles

* update plotting detailed=True for  (even) and (odd) number of points coloring

* To allow multi_yoy=True in plotting.degradation_timeseries_plot, resample.mean() the YoY_values.

* flake8 grumbles

* Add warning to degradation_timeseries_plot when multi_YoY=True

* update to warning message in plotting.degradation_timeseries_plot

* fix flake8 grumbles

* nbval fixes from qnguyen345-bare_except_error

* Add pandas 3.0 futurewarning handling

* Try again to solve pandas3.0 futurewarning

* attempt 3 to fix nbval

* Add infer_objects to remove futurewarning

* minor inline comment update

* update plotting tests to be relative value, update ordering of module import in plotting.py, per Copilot review.

* update inline comments and whatsnew docs

* Clean up inline comments per Copilot review

* added multi-YoY pytest - still need to catch warnings

* Add a warnings.catch_warnings to the plotting pytest

* flake8 grumbles

* add multi-YoY=True pytest

* updated changelog

* update changelog

* implement copilot suggestions

* linting

* use s instead of ns for pandas 3 compatibility

* update pandas version comparison

* set matplotlib non-gui backend for tests

* set dtype resolution based on pandas version

* linting import order

* boost degradation.py test coverage

* add tests for error handling in analysis_chain

* update changelog

* update changelog

* exclude coverage reports with suffixes

* Update rdtools/degradation.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* remove label=None handling, rely on default 'right' behavior

* refactor dt_center  tz handling for old pandas

* simplify _avg_timestamp_old_Pandas

* degradation_timeseries_plot: change rolling median min_periods to rolling_days / 4.

* remove degradation_timeseries_plot(label=) and just default to center=True

* update sensor_analysis() and clearsky_analysis() docstrings to discuss passing `label=right` kwargs

* flake8 updates

* Initial commit - multi-YoY notebook

* pretty-print notebook dataframes with tabulate.

* update notebook requirements to silence pandas warnings

* add multi-yoy nb to tutorials

* fix nblink path

* Change the yoy_values index to be named 'dt'.  Add new illustrations at the end of the multi-YoY notebook.

* clean up pending changelog

---------

Co-authored-by: cdeline <chris.deline@nrel.gov>
Co-authored-by: Michael Deceglie <mdeceglie@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…lti-YoY detection (#490)

* Initial plan

* Replace broad except ValueError with explicit duplicate-index check in degradation_timeseries_plot

Co-authored-by: cdeline <23244088+cdeline@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: cdeline <23244088+cdeline@users.noreply.github.com>
* initial pyproject.toml implementation

* changelog
* initial pyproject.toml implementation

* changelog

* update URLs

* change NREL to NLR

* linting

* changelog

* update PVDAQ citation in notebooks
* initial pixi implementation

* add note on how to re-run notebooks with pixi

* pixi version compatibility

* update pixi lock file

* pixi updates

* add libomp as requirement for macOS users

* use correct package name

* convert notebooks to html without re-running

* re-run notbooks to account for updated warning message formatting

* Revert "re-run notbooks to account for updated warning message formatting"

This reverts commit 7be2426.
* updated degradation_timeseries_plot as version2 for now

* fix flake8 grumbles

* avoid pandas error "ValueError: Other Series must have a name"

* Redo degradation_timeseries_plot - include in median if dt_center is within rolling window.

* remove label= functionality. Update Multi-year_on_year_example.ipynb

* Re-run Multi-year_on_year_example.ipynb, check for text changes.

* update analysis_chains to remove `label=`. Update whatsnew

* simplify multi-YoY timeseries plotting by filtering to slopes <= 2 years, removing warning.

* update whatsnew

* code cleanup

* Revision of degradation_timeseries_plot

* Bug fixes

* Update notebooks to include `center=True`

* Update nbval to include new notebook

* add new kwarg to TrendAnalysis.plot_degradation_timeseries

* Update plotting.py timeseries plot docstring.  Also set pd.rolling(min_periods=rolling_days//4)

* fix copilot documentation review recommendations; add plotting pytests

* add min_periods_divisor argument

* update pvdaq_system_4 url (#513)

* update pvdaq_system_4 url

* changelog

* revert unnecessary changes in notebooks

* update changelog

* re-run notebooks

---------

Co-authored-by: Michael Deceglie <Michael.Deceglie@nrel.gov>
Co-authored-by: martin-springer <martin.springer@nrel.gov>
Co-authored-by: Martin Springer <97482055+martin-springer@users.noreply.github.com>
@codecov-commenter

codecov-commenter commented Jun 30, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 89.28571% with 24 lines in your changes missing coverage. Please review.
✅ Project coverage is 96.14%. Comparing base (37e38e2) to head (5ab1830).

Files with missing lines Patch % Lines
rdtools/degradation.py 84.55% 21 Missing ⚠️
rdtools/plotting.py 95.31% 3 Missing ⚠️
Additional details and impacted files
@@               Coverage Diff               @@
##           release_321     #517      +/-   ##
===============================================
- Coverage        96.62%   96.14%   -0.49%     
===============================================
  Files               12       12              
  Lines             2342     2566     +224     
===============================================
+ Hits              2263     2467     +204     
- Misses              79       99      +20     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@martin-springer martin-springer changed the title Nonlinear [WIP] Nonlinear Jul 1, 2026
@martin-springer martin-springer marked this pull request as draft July 1, 2026 20:37
martin-springer and others added 5 commits July 1, 2026 17:06
Changelog v3.2.1.rst:
- Correct PR references: :pull:`488` -> :pull:`491` for the
  pyproject migration; :pull:`492` -> :pull:`493` for pixi
  adoption and related entries (NREL->NLR entry kept at #492);
  :pull:`494` -> :pull:`497` for the filterpy replacement
  (landed as direct commits on release_321).
- Remove duplicated arch/xgboost/pvlib minimum-version bumps
  already documented in v3.1.1.rst.

Documentation:
- Remove duplicate git clone line in developer_notes.rst.
- Remove duplicate sentence in index.rst.
- Revert historical rewrite `NLR's` -> `NREL's` South Table
  Mountain campus in v2.0.0.rst (STM is NREL's campus and v2.0.0
  predates the NLR migration).

Example notebooks:
- `pixi run -e notebooks lab` -> `pixi run lab` in all five
  example notebooks; there is no `notebooks` environment defined
  in pyproject.toml (only a `notebooks` feature, which the
  default environment already includes).

Repository hygiene:
- Remove committed developer-local `.pixi.lnk` Windows shortcut.
- Add `*.lnk` to `.gitignore` to prevent future accidental
  commits of machine-specific shortcut files.
Base automatically changed from release_321 to master July 8, 2026 18:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants