Commit e4636c23 authored by MigAP's avatar MigAP

add fft of the raw data

parent 1c3e9759
...@@ -20,16 +20,17 @@ ...@@ -20,16 +20,17 @@
of each weekly period. of each weekly period.
* Tasks * Tasks
** TODO Faire une FFT pour essayer de trouver un modèle pour l'évolution lente (filter contribution périodique) ** 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 ** TODO Rajouter des titres et légendes aux figures.
** Téléchargement * 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 Les données ont été téléchargées le 2020-11-16. Le lien de
téléchargement utilisé est le suivant : téléchargement utilisé est le suivant :
#+name: data-url #+name: data-url
https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv 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 On télécharge les données si celles-ci ne sont pas disponibles
sont pas localement, si ce n'est pas le cas on les télécharge. localement.
#+BEGIN_SRC python :results silent :var data_url=data-url :session #+BEGIN_SRC python :results silent :var data_url=data-url :session
data_file ="weekly_in_situ_co2_mlo.csv" data_file ="weekly_in_situ_co2_mlo.csv"
...@@ -63,12 +64,22 @@ table[:5] ...@@ -63,12 +64,22 @@ table[:5]
| 1958-04-26 | 316.48 | | 1958-04-26 | 316.48 |
| 1958-05-03 | 316.95 | | 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 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 colonne en objets =datetime= de Python, et la deuxième colonne en
=float=. =float=.
coucou = datetime.datetime.strptime(tutu, "%Y-%m-%d")
#+begin_src python :results silent :session :exports both #+begin_src python :results silent :session :exports both
import datetime import datetime
convertedData = [(datetime.datetime.strptime(yearWeekDay, "%Y-%m-%d"), float(co2)) for yearWeekDay, co2 in table] 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") ...@@ -77,6 +88,7 @@ coucou = datetime.datetime.strptime(tutu, "%Y-%m-%d")
concentration = [concentration for dates, concentration in convertedData] concentration = [concentration for dates, concentration in convertedData]
#+end_src #+end_src
** Affichage des données.
Ensuite on convertit les dates dans un format qui peut être utilisé 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. 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. ...@@ -97,14 +109,63 @@ pour l'affichage des données, et on affiche les données brutes.
#+RESULTS: #+RESULTS:
[[file:rawData.png]] [[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 Effectuons un /zoom/ sur une période de temps plus courte caractériser
Nous faisons encore une vérification: nos dates doivent être séparées d'exactement une semaine. les oscillations rapides observés précédément.
#+BEGIN_SRC python :results output :session
dates = [date for date, _ in converted_data] #+begin_src python :results file :session :var matplot_lib_filename="zoomRawData.png" :exports both
for date1, date2 in zip(dates[:-1], dates[1:]): # Window's size where we want to zoom.
if date2-date1 != datetime.timedelta(weeks=1): windowSize = 150;
print(f"Il y a {date2-date1} entre {date1} et {date2}") plotDatesZoom = pltDates.date2num(dates[:windowSize])
#+END_SRC
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: #+RESULTS:
[[file:dataFFT.png]]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment