3.1. Traitement de données en Python#
Marc BUFFAT, dpt mécanique, UDCB Lyon 1
%matplotlib inline
import os,sys
import numpy as np
import matplotlib.pyplot as plt
from validation.validation import check_function,liste_functions,info_etudiant
from validation.valide_markdown import test_markdown
from validation import lissajous
from IPython.display import Markdown, display
def printmd(string):
display(Markdown(string))
try: NUMERO_ETUDIANT
except NameError: NUMERO_ETUDIANT = None
# test si numero étudiant spécifier
if type(NUMERO_ETUDIANT) is not int :
printmd("**ERREUR:**numéro d'étudiant non spécifié!!!")
NOM,PRENOM,NUMERO_ETUDIANT = info_etudiant()
# parametres spécifiques
_uid_ = NUMERO_ETUDIANT
_precis_ = 1.0e-5
printmd("**Login étudiant {} {} uid={}**".format(NOM,PRENOM,_uid_))
# generation des données
T0,X0,Y0,_p_,_q_=lissajous.create_Lissajous(_uid_)
fichier= "mon_fichier.dat"
entete = " donnees t,x,y pour uid={}".format(_uid_)
np.savetxt(fichier,np.transpose([T0,X0,Y0]),header=entete)
printmd("**Mise sur fichier des données dans : {}**".format(fichier))
3.1.1. Objectif#
On veut traiter des données stockées dans un fichier mon_fichier.dat contenant la valeur de 2 quantités X et Y périodique en fonction du temps t sur une période T.
Ces valeurs sont stockées par colonne suivant la structure ci dessous:
# titre
t0 x0 y0
t1 x1 y1
.......
La valeur de t dans ce fichier n’est pas forcement triée et les données X,Y sont bruitées.
L’objectif de cette étude est d’analyser ces données \(X_i,Y_i\) en fonction du temps t et d’en déduire leurs pulsations, puis les paramêtres de Lissajous p et q.
On demandera aussi d’écrire un compte rendu monCR.tex
au format \(\LaTeX\) et de fournir la version au format pdf dans monCR.pdf
echo "nbre de lignes et taille du fichier:"
wc mon_fichier.dat
echo "contenu du fichier:"
head mon_fichier.dat
3.1.2. Création d’une bibliotheque pour traiter les données#
En utilisant le canevas python fourni, créer une bibliothèque de fonctions python dans le fichier bibliothèque mabib.py pour traiter les informations stockées dans un fichier de données.
On écrira les fonctions suivantes
lecture(fichier):
écrire une fonction lecture(fichier) qui lit les données dans fichier et renvoie les tableaux T,X,Y
Verification: la taille des tableaux doit correspondre au nombre de lignes du fichier - 1. On appelle donc la fonction et on peut afficher la taille des tableaux renvoyés
tri_bulles(T,X,Y):
Pour trier les données suivant T, écrire une fonction tri_bulle(T,X,Y) qui trie sur place les 3 tableaux T,X,Y passées en argument, le trie s’éffectuant par rapport au premier tableau T.
Les valeurs des tableaux passés en argument sont donc modifiées et la fonction ne renvoie rien.
Vous devez implémenter un algorithme de trie bulle dans cette fonction et ne pas utiliser la fonction sort de numpy.
spectre(T,U):
Pour un signal discret 𝑈 échantillonné à des temps 𝑇, écrire une fonction spectre(T,U) qui calcul et trace le spectre d’un signal. On utilisera la fonction fft de la bibliothéque numpy.
analyse_spectral(T,U):
Pour un signal discret 𝑈 échantillonné à des temps 𝑇, écrire une fonction analyse_spectrale(T,U) qui retourne l’amplitude, la phase et la frequence fondamentale du signal. On utilisera la fonction fft de la bibliothéque numpy
pour le signal \(u=2 \cos{t}\) sur \([0,2\pi]\) , l’amplitude est égale à 2, la phase à 0., et la fréquence \(f=\frac{1}{2\pi}\approx 0.159155 \)
ecriture(fichier,T,X,Y):
Ecrire une fonction ecriture qui ecrit dans un fichier la courbe de lissajous filtrée avec le format suivant:
# courbe lissajous N=zz
t0 x0 y0
t1 x1 y1
....
### Travail demandé:
Accéder à l’interface jupyterlab, en cliquant sur le lien suivant:
et se déplacer dans le répertoire de travail:
MGC2367M/TPI1_traitement_de_donnees
éditer le fichier mabib.py
pour chaque fonction:
on écrira le code python de la fonction
un exemple de vérification de la fonction (a la fin du fichier)
executer le code python dans une fenêtre
pour lister les tests des fonctions de la bibliothéque
test_exo -l S220
pour valider une fonction func par rapport à un exo
test_exo mabib.py exo func
3.1.3. Validation bibliothéque#
Enfin, une fois les vérifications faites on passera les tests de validation suivants
valider les fonctions dans le terminal à l’aide de test_exo
test_exo mabib.py exo220 lecture test_exo mabib.py exo221 tri_bulles test_exo mabib.py exo222 analyse_spectral test_exo mabib.py exo223 ecriture
3.1.4. Analyse des données#
en utilisant la bibliothéque précédente:
lire les données T,X,Y
trier des donnees suivant T
calcul des modes principaux (valeurs X1,Y1 en T)
détermination des coefficients entiers p et q
tracée de la courbe de lissajous
sauvegarder le résultat dans un fichier lissajous.dat
3.1.4.1. comparer le signal et son mode principal (2 points)#
calculer les valeurs X1 et Y1 des modes principaux de X et Y
tracer le spectre de T,X et T,Y
déterminer les modes principaux et les valeurs de p,q de X,Y
calculer le signal X1,Y1 non bruité
tracer T,X et T,X1 sur un meme graphe
from mabib import lecture,tri_bulles,spectre,analyse_spectral
## BEGIN SOLUTION
## END SOLUTION
3.1.4.2. calculer les 2 coefficients de Lissajous (1 point)#
calculer les 2 valeurs entieres p et q
p=0
q=0
## BEGIN SOLUTION
## END SOLUTION
print("coefficients de Lissajous p={} q={}".format(p,q))
assert (p==_p_ and q==_q_)
3.1.4.3. Tracer de la courbe de lissajous Y fonction de X#
tracer sur un meme figure Y fonction de X et Y1 fonction de X1
## BEGIN SOLUTION
## END SOLUTION
3.1.5. Compte rendu#
Ecrire votre analyse et votre conclusion dans le compte rendu en insistant sur
Description de la méthode d’analyse
Résultat de l’analyse
Conclusion
Le compte rendu est à écrire dans le fichier CompteRendu.md
Génération de la version HTML du Compte Rendu (avec mise en page)
Exécution de la commande ci-dessous pour générer le fichier html
Visualisation du Compte Rendu (version html)
Cliquez sur le lien suivant après exécution de la commande
# génération de la version html du CR
!genereTPhtml CompteRendu
# test sur les commentaires (a executer)
assert(test_markdown('CompteRendu.md',None,minm=200,maxe=0.25))
3.1.6. FIN#