Erreur ====== .. admonition:: Objectifs Cette page de l'ENIBOOK participe à la zone généraliste de deuxième année L'objectif est d’apprendre à générer une courbe d'erreur. Données initiales ................. A partir d'un fichier de données simulées : :download:`donnees_simulees.csv <../_static/code/zg2/donnees_simulees.csv>` .. image:: ../_static/img/zg2/simulated.* **Données produite par simulation avec la méthode d'Euler explicite. Pas de simulation : 0.000001 sec. . Temps de simulation 0.02 sec.** Et à partir d'un fichier de données mesurée : :download:`donnees_brutes.csv <../_static/code/zg2/donnees_brutes.csv>` .. image:: ../_static/img/zg2/raw.* Nous souhaitons produire la courbe d'erreur suivante : .. image:: ../_static/img/zg2/error.* **courbe d'erreur générée avec correction des données brutes : (à compléter: décalage, filtrage...)** Pour cela nous devrons effectuer un certains nombre de traitements sur les séries temporelles grâce au module `time_series.py` time_series.py .............. Suite aux activités des semaines précédentes, vous êtes en mesure de coder l'ensembles des méthode de la classe ``TimeSeries`` nécessaire à la production de la courbe d'erreur. Cependant, pour que nous puissions réaliser une courbe d'erreur en une seul séance, le code de la classe vous est donné : :download:`time_series.py <../_static/code/zg2/time_series.py>` (voir aussi :download:`ts1.csv <../_static/code/zg2/ts1.csv>`, :download:`ts2.csv <../_static/code/zg2/ts2.csv>` et :download:`HCSR04_data4_ressort_2022_03_10.csv <../_static/code/zg2/HCSR04_data4_ressort_2022_03_10.csv>` pour les tests) Voici la description des méthodes de la classe ``TimeSeries``. Vous devez comprendre le code de ces fonctions. Arrondir les réels +++++++++++++++++ L'arithmétique des nombres à virgule flottante pose un certain nombre de problèmes qui sont abordés dans cette page : ``_. la méthode ``def round_data(self, column_number,précision)`` permet de d’arrondir les valeurs d'une colonne de la séries temporelles en appliquant la fonction python `round() `_ sur chacune des données d'une colonne. Cette fonction nous servira à arrondir les dates des séries temporelles pour éviter de générer des points inutile de de la fusion de séries temporelles. Fusionner les séries ++++++++++++++++++++ la méthode ``def fuse(self, ts)`` crée un série temporelle ``ts_out`` qui est la fusion des 2 series ``self`` et ``ts``. La colonne 0 de ``ts_out`` contient toutes les dates des 2 séries. Attention si les dates des deux séries diffèrent, certaines valeur de colonnes seront indéfinies et prendrons la valeur ``"missing"``. Par exemple la fusion de : .. code-block:: python time(s); C1; C2 1.0; 1.0; 0.0 2.0; 2.0; 0.0 3.0; 3.0; 0.0 .. code-block:: python time(s); C3 0.0; 0.0 3.0; 30.0 donnera la serie suivante : .. code-block:: python time(s); C1; C2; C3 0.0; "missing"; "missing"; 0.0 1.0; 1.0; 0.0; "missing" 2.0; 2.0; 0.0, "missing" 3.0; 3.0; 0.0; 30.0 Interpoler ++++++++++ La méthode ``interpolate_missing_data(self)`` permet d'inventer une valeur par interpolation pour chaque donnée manquante. .. code-block:: python time(s); C1; C2; C3 0.0; "missing"; "missing"; 0.0 1.0; 1.0; 0.0; "missing" 2.0; 2.0; 0.0, "missing" 3.0; 3.0; 0.0; 30.0 devient .. code-block:: python time(s); C1; C2; C3 0.0; 1.0; 0.0; 0.0 1.0; 1.0; 0.0; 10.0 2.0; 2.0; 0.0, 20.0 3.0; 3.0; 0.0; 30.0 On interpole en linéarisant par partie. Cette méthode est très rudimentaire mais suffisante pour notre besoin. Il existe des méthodes plus élaborées que vous pourrez découvrir notamment en étudiant le signal. Dupliquer une séries temporelle +++++++++++++++++++++++++++++++ La méthode ``clone(self)`` créer une copie d'une série temporelle. Filtrer les données brutes ++++++++++++++++++++++++++ La méthode ``remove_outliers(self,column_number)`` permet de supprimer des valeurs aberrantes d'une série temporelle. Ici nous avons considéré qu'une valeur était aberrante si elle variait d'un facteur 5 par rapport à la donnée suivante. Là encore la méthode utilisée est très rudimentaire. La fonction ``apply_to_column(self,column_number,f)`` permet d'appliquer n'importe quelle fonction ``f`` à chacune des valeurs d'une colonne. Décaler +++++++ La méthode ``shift(self,time_shift)`` ajoute la valeur ``time_shift`` à toutes les dates de la série temporelle. Cela a pour effet de décaler dans le temps les données. Cela permet par exemple de recaler la mesure expérimentale avant comparaison aux résultats théoriques. Découper ++++++++ La méthode ``truncate(self, t_min, t_max)`` enlève toutes les données ayant une date antérieure à ``t_min`` et postérieure à ``t_max``. Soustraire ++++++++++ La méthode ``compute_error(self, column_number_1,column_number_2,error_label)`` produit une colonne représentant la différence entre 2 colonnes. C'est ce qui produit la courbe d'erreur. Intégrer ++++++++ La méthode ``compute_area(self,column_number)`` calcule l'aire d'une courbe. Ainsi il est possible d'attribuer une "note" à la courbe d'erreur. Ce qui nous permet d'imaginer des algorithmes pour minimiser l'erreur en explorant des valeurs de paramètres Supprimer un colonne ++++++++++++++++++++ La méthode ``pop(self,column_number)`` supprime un colonne de la série. Cela est utile notamment en vue de tracer les courbes. Courbe d'erreur ............... .. todo:: Tracer des courbes d'erreur Ecrire un fichier ``main.py`` qui trace une courbe d'erreur qui a l'aire la plus petite possible en utilisant les fonctionnalités de ``time_series.py``.