From e4636c2313aea19b2070021de118e031fd8f4197 Mon Sep 17 00:00:00 2001 From: MigAP Date: Wed, 25 Nov 2020 10:39:45 +0100 Subject: [PATCH] add fft of the raw data --- module3/exo3/exercice_python_fr.org | 89 ++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 14 deletions(-) diff --git a/module3/exo3/exercice_python_fr.org b/module3/exo3/exercice_python_fr.org index 9550a36..4ff1861 100644 --- a/module3/exo3/exercice_python_fr.org +++ b/module3/exo3/exercice_python_fr.org @@ -20,16 +20,17 @@ of each weekly period. * Tasks ** TODO Faire une FFT pour essayer de trouver un modèle pour l'évolution lente (filter contribution périodique) -* Téléchargement des données -** Téléchargement +** TODO Rajouter des titres et légendes aux figures. +* Lecture des données brutes +** Lecture ou téléchargement Les données ont été téléchargées le 2020-11-16. Le lien de téléchargement utilisé est le suivant : #+name: data-url https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv - On vérifie si les données - sont pas localement, si ce n'est pas le cas on les télécharge. + On télécharge les données si celles-ci ne sont pas disponibles + localement. #+BEGIN_SRC python :results silent :var data_url=data-url :session data_file ="weekly_in_situ_co2_mlo.csv" @@ -63,12 +64,22 @@ table[:5] | 1958-04-26 | 316.48 | | 1958-05-03 | 316.95 | -** Conversion des données et affichage +** TODO COMMENT Vérification des dates +Nous faisons encore une vérification: nos dates doivent être séparées d'exactement une semaine. +#+BEGIN_SRC python :results output :session +#dates = [date for date, _ in converted_data] +#for date1, date2 in zip(dates[:-1], dates[1:]): +# if date2-date1 != datetime.timedelta(weeks=1): +# print(f"Il y a {date2-date1} entre {date1} et {date2}") +#+END_SRC + +#+RESULTS: +* Traitement et affichage des données. +** Converstion des string en valeurs numériques. Les données dans =table= sont des string. On va convertir la première colonne en objets =datetime= de Python, et la deuxième colonne en =float=. -coucou = datetime.datetime.strptime(tutu, "%Y-%m-%d") #+begin_src python :results silent :session :exports both import datetime convertedData = [(datetime.datetime.strptime(yearWeekDay, "%Y-%m-%d"), float(co2)) for yearWeekDay, co2 in table] @@ -77,6 +88,7 @@ coucou = datetime.datetime.strptime(tutu, "%Y-%m-%d") concentration = [concentration for dates, concentration in convertedData] #+end_src +** Affichage des données. Ensuite on convertit les dates dans un format qui peut être utilisé pour l'affichage des données, et on affiche les données brutes. @@ -97,14 +109,63 @@ pour l'affichage des données, et on affiche les données brutes. #+RESULTS: [[file:rawData.png]] +On remarque sur la figure la supperposition de deux phénomènes : +1. Un oscillation périodique "rapide" de faible amplitude. +2. Une croissance lente avec une forme qui ressemble à un début de + parabole. +** /Zoom/ sur l'affichage des données -** TODO COMMENT Vérification des dates -Nous faisons encore une vérification: nos dates doivent être séparées d'exactement une semaine. -#+BEGIN_SRC python :results output :session -dates = [date for date, _ in converted_data] -for date1, date2 in zip(dates[:-1], dates[1:]): - if date2-date1 != datetime.timedelta(weeks=1): - print(f"Il y a {date2-date1} entre {date1} et {date2}") -#+END_SRC +Effectuons un /zoom/ sur une période de temps plus courte caractériser +les oscillations rapides observés précédément. + +#+begin_src python :results file :session :var matplot_lib_filename="zoomRawData.png" :exports both + # Window's size where we want to zoom. + windowSize = 150; + plotDatesZoom = pltDates.date2num(dates[:windowSize]) + + plt.figure(figsize=(10,5)) + plt.plot_date(plotDatesZoom,concentration[:windowSize]) + plt.tight_layout() + + plt.savefig(matplot_lib_filename) + matplot_lib_filename +#+end_src + +#+RESULTS: +[[file:zoomRawData.png]] + +Sur cette figure on met plus en évidence les oscillations rapides sur +le niveau de concentration de CO2. D'après la figure, dans un premier +temps supposer que les oscillations ont une période de un ans. +* Analyse fréquentielle de la variation de la concentration de CO2. +On possède des données toutes les semaines. + +#+begin_src python :results file :session :var matplot_lib_filename="dataFFT.png" :exports both + import numpy as np + + # Conversion of the data to numpy array + co2 = np.array(concentration) + # Concentration FFT + concentrationFFT = np.fft.fft(co2) + # We take the norm of the FFT + concentrationFFTNorm = np.absolute(concentrationFFT) + + # Frequency axis + N = co2.shape[0] # Number of samples + Te = 1 # Sampling interval + t = np.arange(N) # time reference + + freq = np.arange(N)/(N*Te) + #freq = np.fft.fftfreq(N) + + + plt.figure(figsize=(10,5)) + plt.plot(freq,concentrationFFTNorm) + plt.tight_layout() + + plt.savefig(matplot_lib_filename) + matplot_lib_filename +#+end_src #+RESULTS: +[[file:dataFFT.png]] -- 2.18.1