Commit e4636c23 authored by MigAP's avatar MigAP

add fft of the raw data

parent 1c3e9759
......@@ -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]]
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