-
Notifications
You must be signed in to change notification settings - Fork 4
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
Local frequency analysis #20
Conversation
…ass-Data-in-frequency_analysis.local
…s-Data-in-frequency_analysis.local
…s-Data-in-frequency_analysis.local
Welcome, new contributor! It appears that this is your first Pull Request. To give credit where it's due, we ask that you add your information to the
Please make sure you've read our contributing guide. We look forward to reviewing your Pull Request shortly ✨ |
Je vois plusieurs améliorations potentielles qui pourraient être faites à Pour que mes changements soient le plus explicite possible et qu'on puisse facilement les commenter, je partirais une nouvelle branche à partir de cette PR. Qu'en pensez-vous ? |
@RondeauG Oui je suis d'accord avec ton plan de match. On est bien conscient qu'il y a des optimisations à faire autant au niveau du code python qu'au niveau de la réutilisation des librairies existantes. N'hésites pas à contacter @TC-FF pour toute question sur les fonctionnalités du code. J'ai commencé à monter un notebook (non complété) dans ce pull request pour voir plus en détails le genre d'opérations qu'on voudrait faire et éventuellement, pour ajouter à la doc |
Alright, excellent. Je vais tenter de faire le maximums de changements d'ici la réunion de septembre. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Still working on my PR, but I think that I spotted an error in the code.
.sum() | ||
.where(ds.get_bool_over_tolerence(tolerence, "Volumes"), drop=True) | ||
) | ||
self.rm_season("Volumes") | ||
# Transform tp hm³ | ||
# TODO add start and end and clear other attributes | ||
grouped_ds = ( | ||
grouped_ds | ||
* xr.apply_ufunc( | ||
conversion_factor_to_hm3, | ||
grouped_ds["timestep"], | ||
input_core_dims=[[]], | ||
vectorize=True, | ||
) | ||
* (dates[1] - dates[0]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As it is written right now, I think that you basically sum twice. The first time is at Line 508 (and would result in biased results if there are NaNs, so .mean()
is more robust), and the second time is at Line 522 when you multiply the results by the number of days.
.sum() | |
.where(ds.get_bool_over_tolerence(tolerence, "Volumes"), drop=True) | |
) | |
self.rm_season("Volumes") | |
# Transform tp hm³ | |
# TODO add start and end and clear other attributes | |
grouped_ds = ( | |
grouped_ds | |
* xr.apply_ufunc( | |
conversion_factor_to_hm3, | |
grouped_ds["timestep"], | |
input_core_dims=[[]], | |
vectorize=True, | |
) | |
* (dates[1] - dates[0]) | |
.mean() | |
.where(ds.get_bool_over_tolerence(tolerence, "Volumes"), drop=True) | |
) | |
self.rm_season("Volumes") | |
# Transform tp hm³ | |
# TODO add start and end and clear other attributes | |
grouped_ds = ( | |
grouped_ds | |
* xr.apply_ufunc( | |
conversion_factor_to_hm3, | |
grouped_ds["timestep"], | |
input_core_dims=[[]], | |
vectorize=True, | |
) | |
* (dates[1] - dates[0] + 1) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's say I have: ds2.streamflow.isel(time=slice(0,5)).values
array([[4.56, 4.25, 3.99, 3.77, 3.62]], dtype=float32)
Daily volumes: ds2.streamflow.isel(time=slice(0,5)).values * 60*60*24
array([[393984., 367200., 344736., 325728., 312768.]], dtype=float32)
Sum: ds2.streamflow.isel(time=slice(0,5)).values * 60*60*24).sum()
1744416.0 m³
, or 1.744416 hm³
. This should be the right answer, no?
However, ds_fa_vol = ds_fa.calculate_volume(tolerence=0.15, dates=[1, 5])
6.97766418
, which is 1.744416 * (5 - 1)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@TC-FF Qu'en penses-tu ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@RondeauG Il faut vraiment mettre en place des tests unitaires ! Mais en effet, c'est un bug. Les résultats des pointes ont étés (un peu) validés, mais pas du tout ceux des volumes.
Pour la correction, je pense que ce serait mieux de laisser sum() plutôt que de faire mean() * (dates[1] - dates[0] + 1).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Est-ce qu'il n'y a pas un danger avec la combinaison de .sum()
et tolerance
? Si tu as 15% de données manquantes pour une année donnée, la somme risque d'être pas mal biaisée.
EDIT: Cela dit, facile d'ajouter les deux options.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour la tolérance, ça me semble ok, comme c'est par année, si on dépasse, l'année n'est pas inclue. Mais en effet si l'on est sous la tolérance, est-ce qu'on veut pondérer selon le nb de valeurs manquante ? Dans un cas de datas fixes, je dirais oui, dans un cas de dates variable, ¸a me semble moins nécessaire.
Je viens de terminer de regarder
L'équivalent est possible aussi pour les volumes.
|
Oui, ça me semble une bonne idée de ne plus avoir Data. J'avais un inconfort avec puisqu'il aurait fallu encore la redéfinir pour les analyses fréquentielles régionales et que ça pouvait devenir mélangeant. Pour ce qui est des fonctionnalités de Local, on voulait couvrir : les périodes de retour, les critères d'ajustement (AIC, BIC, AICC, etc.), les quantiles, les méthodes d'ajustement des paramètres (max vraisemblance, L-moments, etc.), etc. @TC-FF avait aussi commencé une fonction pour visualiser le fit avec hvplot qui pourrait être ajoutée. Idéalement, on pourrait aussi ajouter une dimension aléatoire. Par exemple, on peut vouloir faire une analyse fréquentielle sur le vent, auquel cas on aurait une dimension de direction (NNE, SSE, etc.). Idéalement, dans le résultat final, on aurait nos résultats pour chaque direction dans ce cas. Aussi, il y avait l'argument |
…cy_analysis.local # Conflicts: # environment.yml # setup.py # xhydro/__init__.py
67e875e
to
7b4fb8a
Compare
11ee11a
to
b479682
Compare
for more information, see https://pre-commit.ci
This PR was replaced by #27. |
Pull Request Checklist:
number
) and pull request (:pull:number
) has been added.What kind of change does this PR introduce?
Does this PR introduce a breaking change?
No
Other information:
A few things are missing in order to complete this pull request :