Cet exercice fait suite au cours sur les tableaux statiques
Exercice: calculer une moyenne glissante
Les courbes de données issues du monde réel sont souvent bruitées. Pour simuler ce type de données, nous allons créer une liste de valeurs cumulées aléatoires.

courbes de données brutes et donnees filtrees
Pour créer et afficher ces valeurs cumulées, nous créons la liste signal2
qui est produite à partir de valeurs aléatoires (signal0
), puis cumulées dans signal2
:
import numpy as np
from numpy.random import randn
import matplotlib.pyplot as plt
plt.clf()
signal0 = (randn(800))*2
plt.plot(signal0,color='silver',label='Signal aleatoire')
plt.grid(True,which='both')
plt.legend(loc='best')
plt.title('Signal avec bruit')
signal2 = np.cumsum(randn(800))
plt.plot(signal2,color='red',label='Signal cumulé')
plt.grid(True,which='both')
plt.legend(loc='best')
plt.show()
Etapes du traitement: Fonction lissage
- On fait une copie par valeur de
signal2
(liste des valeurs d’origine) danssignal_filtre
(liste dont les termes seront remplacés par la valeur moyennée):
signal_filtre = signal2.copy()
-
On choisit une certaine largeur de liste pour les valeurs dont on fait la moyenne. Par exemple largeur = 10.
-
Au rang i, dans la liste bruitée
signal2
: On prélève les valeurs entre les rangs i−largeur//2 et i+largeur//2 que l’on stocke dans un tableau STATIQUE appelésignal
. Ce tableau conserve la même taille pendant tout l’exercice. (ici, largeur = 10):
signal = signal2[i-largeur//2:i+largeur//2]
- On calcule la moyenne de valeurs de
signal
avec la fonctionmoyenne
vue dans l’exercice précédent.

moyenne sur l'ensemble des valeurs de `signal`
signal_filtre[i] = moyenne(signal)
- On place la valeur moyenne dans
signal_filtre[i]

signal filtre contient 10 valeur identiques contigües, il n'y a plus de bruit
- On répète l’opération pour tous les index
i
compris entrelargeur//2,len(signal2)-largeur//2)
:
for i in range(largeur//2,len(signal2)-largeur//2):
Puis on affiche les graphique de signal2
(inchangé) et celle du signal après traitement (courbe lissée).
Nous allons suivre ces étapes:
1. Ecrire le script de la fonction moyenne
def moyenne(signal):
s = 0
b = len(signal)
for ... in ...:
s += ...
return s / b
2. Créer une fonction lissage
, qui prend en paramètres une liste L
et une largeur v
, et retourne une liste de valeurs filtrées par une moyenne glissante sur v
valeurs.
def lissage(L,largeur):
signal_filtre = L.copy()
for i in range(largeur//2,len(L)-largeur//2):
signal = L[i-largeur//2:...]
# signal est le petit tableau de dimension largeur
# copié de L entre les indices i-largeur//2 et i+largeur//2
# on fait la moyenne glissante de signal
# puis on stocke dans signal_filtre
signal_filtre[i] = moyenne(...)
return ...
3. Placer les valeurs filtrées dans une liste signal_apres_traitement
: signal_apres_traitement = lissage(signal2,10)
4. Afficher les 2 courbes, signal2
et signal_apres_traitement
Voir ici pour le tuto sur le tracé de graphiques.