Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generic season index - no season is length 0 #1845

Merged
merged 19 commits into from
Aug 1, 2024
Merged

Generic season index - no season is length 0 #1845

merged 19 commits into from
Aug 1, 2024

Conversation

aulemahal
Copy link
Collaborator

@aulemahal aulemahal commented Jul 18, 2024

Pull Request Checklist:

  • This PR addresses an already opened issue (for bug fixes / features)
    • This PR fixes #xyz
  • Tests for the changes have been added (for bug fixes / features)
    • (If applicable) Documentation has been added / updated (for bug fixes / features)
  • CHANGELOG.rst has been updated (with summary of main changes)
    • Link to issue (:issue:number) and pull request (:pull:number) has been added

What kind of change does this PR introduce?

  • Implements generic.season, a generic index function for computing the start/end/length of seasons. Based on run_length.season but with units management and the comparison.
  • Divide run_length.season into season_start, season_end, plus the existing season_length. The idea of grouping code together was good, but it added a lot of unnecessary computations when only one facet is needed (i.e. most cases). I think I was able to divide it elegantly, using only one magic fast path.
  • Rewrite frost_free_season_start and frost_free_season_end. Those were not respecting the "season" definition. Now they do.

Does this PR introduce a breaking change?

frost_free_season_start and frost_free_season_end have changed. Their notion of "season" is not more strict. I think the difference not significative for most cases. No tests needed a change, but again our tests are very simple.

All season length indicators will now return 0 when no season is found (no start). Previously, when no start was found we returned 0 when an end was found and nan otherwise. I think the idea was to assume that neither end nor start meant the data was probably wrong. But that's the job of the missing checks, not the run_length helper. Thus I applied the more logical rule : no season == 0 length.

I have reverted some changes of #1796, I'm sorry. I'm trying to generalize the indicators and it made more sense that all aspects of the same "growing season" were using the same exact arguments.

Other information:

This allows indices to use run length function that return a DataArray after being called with a DataArray. This "type preservation" will be quite handy in my next PR, stay tuned!

Sadly, this branch is based off #1838 because I need both for PC.

Ugh

The amount of copied docstring text and signatures is ridiculous. I really want to remove all those one-liner indices and only keep the indicators. But I fear this would be too breaking of a change as it would remove elements from the API.
Right now, we have inconsistent indicators with inconsistent documentation because everything was copy-pasted by hand with incremental changes that were not always ported back to the other indices.

@aulemahal aulemahal changed the base branch from main to generic-spell-stats July 18, 2024 22:41
@github-actions github-actions bot added the indicators Climate indices and indicators label Jul 18, 2024
@aulemahal aulemahal changed the title Generic season index - fix frost free seasons - no season is length 0 Generic season index - no season is length 0 Jul 18, 2024
Base automatically changed from generic-spell-stats to main July 26, 2024 16:46
xclim/indices/generic.py Outdated Show resolved Hide resolved
Copy link
Collaborator

@Zeitsperre Zeitsperre left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

CHANGELOG.rst Outdated Show resolved Hide resolved
CHANGELOG.rst Outdated Show resolved Hide resolved
xclim/indices/_threshold.py Show resolved Hide resolved
xclim/indices/_threshold.py Show resolved Hide resolved
xclim/indices/_threshold.py Show resolved Hide resolved
xclim/indices/run_length.py Outdated Show resolved Hide resolved
xclim/indices/run_length.py Outdated Show resolved Hide resolved
xclim/indices/run_length.py Outdated Show resolved Hide resolved
xclim/indices/run_length.py Outdated Show resolved Hide resolved
xclim/indices/run_length.py Outdated Show resolved Hide resolved
@github-actions github-actions bot added the approved Approved for additional tests label Aug 1, 2024
xclim/indices/_threshold.py Outdated Show resolved Hide resolved
xclim/indices/run_length.py Outdated Show resolved Hide resolved
Co-authored-by: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com>
xclim/indices/_threshold.py Outdated Show resolved Hide resolved
Copy link
Contributor

@coxipi coxipi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well done!

xclim/indices/run_length.py Show resolved Hide resolved
@coveralls
Copy link

coveralls commented Aug 1, 2024

Coverage Status

coverage: 89.262% (-0.08%) from 89.343%
when pulling 986a6d8 on generic-season
into 1a5ddad on main.

Copy link
Collaborator

@Zeitsperre Zeitsperre left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@aulemahal aulemahal merged commit ade41d7 into main Aug 1, 2024
34 checks passed
@aulemahal aulemahal deleted the generic-season branch August 1, 2024 20:53
aulemahal added a commit that referenced this pull request Oct 10, 2024
<!--Please ensure the PR fulfills the following requirements! -->
<!-- If this is your first PR, make sure to add your details to the
AUTHORS.rst! -->
### Pull Request Checklist:
- [ ] This PR addresses an already opened issue (for bug fixes /
features)
    - This PR fixes #xyz
- [x] Tests for the changes have been added (for bug fixes / features)
- [x] (If applicable) Documentation has been added / updated (for bug
fixes / features)
- [x] CHANGELOG.rst has been updated (with summary of main changes)
- [x] Link to issue (:issue:`number`) and pull request (:pull:`number`)
has been added

### What kind of change does this PR introduce?

Implements `resample_map`. This function is meant for all
`da.resample(...).map(...)` calls. These, `flox` cannot improve
automatically so we use some flox logic to help. The idea is to map the
resample-map construct on each block in parallel. This is possible by
first rechunking the array so that chunks boundary fit with resampling
period boundaries (this is a flox function).

The main improvement should come from the fact that `map_blocks` hides
much of the complexity to `dask`, so the resulting graph is much
lighter. I still have to better test the performance of this. My goal
would be to have some short text in xclim's doc that highlights when the
option is useful and when it is not. The option is activated through
`set_options`.

The current function works only when the input object is of the same
type as the output one. So some functions couldn't be wrapped with this
yet. The most important untouched code for the moment is the missing
checks where I think this could help a lot.

### Does this PR introduce a breaking change?
It should not. This is completely optional.

### Other information:
In progress, I still need to prove the performance boost.

This depends on #1845 because I need all improvements for PC.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Approved for additional tests indicators Climate indices and indicators
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants