Page 1 sur 1
calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 23 mars 2022, 14:02
par Blaise032
Bonjour,
J'ai un fichier avec +/- 25 heures de relevés de radioactivité par seconde, soit +/- 90 000 données de nombres entiers normalement inférieurs à 50 (le bruit de fond normal). Je visualise avec jpgraph :
https://1drv.ms/u/s!Armdq6t2CzgHmvQCBywr3L3dMxagjw
Mais du bruit de fond, se dégage une "tendance" visible avec une moyenne mobile, ici avec un tableur sur les 30 dernières minutes (1800 données)
https://1drv.ms/u/s!Armdq6t2CzgHmvQDe62 ... A?e=1KNVE3
Question : comment faire cela en PHP ?
La construction de l'image jpgraph :
Code : Tout sélectionner
<?php
require_once( "../jpgraph/jpgraph.php" );
require_once( "../jpgraph/jpgraph_line.php" );
$cpm = array();
if ( !$fp = fopen( "cpm.25h", "r" ) ) {
echo "Echec de l'ouverture du fichier";
exit;
} else {
while ( !feof( $fp ) ) {
// On récupère une ligne
$ligne = fgets( $fp, 50 );
if ( is_numeric( $ligne ) ) {
$cpm[] = $ligne;
}
}
fclose( $fp ); // On ferme le fichier
}
$largeur = 800;
$hauteur = 400;
// Initialisation du graphique
$graph = new Graph( $largeur, $hauteur );
$graph->setScale( "textlin" );
// Creation des courbes
$courbe = new LinePlot( $cpm );
// Ajout des courbes au graphique
$graph->add( $courbe );
// Ajout du titre du graphique
$graph->title->set( "CPM" );
// Affichage du graphique
$graph->stroke();
?>
Et un fichier de données :
https://drive.google.com/file/d/1B8spXD ... sp=sharing
Bien à vous et merci d'avance,
Blaise
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 23 mars 2022, 14:06
par or 1
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 26 mars 2022, 17:03
par Blaise032
Bonjour,
Je n'arrive pas à mettre en œuvre la fonction.
J'ai téléchargé les fichiers function.php et MovingAverage.php dans le dossier moving_average
Code : Tout sélectionner
include( "../moving_average/functions.php" );
include( "../moving_average/MovingAverage.php" );
$movingAverage = new MovingAverage();
$movingAverage->setPeriod(1800);
$moyenneMobile = $movingAverage->getCalculatedFromArray($cpm);
et j'ai les erreurs suivantes :
( ! ) Fatal error: Uncaught Error: Class "MovingAverage" not found in ... on line ...
( ! ) Error: Class "MovingAverage" not found in ... on line ...
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 29 mars 2022, 10:56
par @rthur
Remplace tes include() par des require()
Et vérifie que tu inclus bien les bons fichiers avec le bon chemin
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 29 mars 2022, 12:15
par Blaise032
Bonjour @rthur et merci pour la réponse
include, require ou même require_once ne changent rien.
Le chemin spécifié est correct car j'ai une erreur si j'en spécifie un mauvais.
Bref, toujours bloqué je suis

Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 29 mars 2022, 12:31
par @rthur
Tu as bien fait l'installation par composer ?
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 29 mars 2022, 12:41
par Blaise032
heu non, je ne connais pas composer (éléphanteau) Peux-tu m'expliquer ?
Là, je teste avec Wampserver sous Windows, la production finale chez OVH.
Mais j'avance un peu car j'ai eu cette dernière erreur : Fatal error: Maximum execution time of 120 seconds exceeded in (...)\moving_average\functions.php on line 14
Devrais-je réduire la voilure ? elle est ambitieuse : +/- 90000 données pour 25 heures que je peux réduire à tâtons pour que cela soit acceptable à PHP. Déjà réduire à 12 heures ?, moins de la moitié actuelle
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 29 mars 2022, 13:11
par GuillaumeLM
Bonjour,
va voir ici
composer.

Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 29 mars 2022, 16:55
par @rthur
Une fois composer installé, il faudra que tu lances la commande :
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 30 mars 2022, 14:53
par Blaise032
Ok, quand j'ai accès au serveur, ce qui n'est pas le cas pour mon hébergement (mutualisé) chez OVH.
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 31 mars 2022, 00:25
par @rthur
Tu peux installer composer sur ta machine locale pour développer, et ensuite sur ton serveur de prod, pas besoin de composer
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 31 mars 2022, 10:18
par Blaise032
Là, @rthur, je ne comprends pas : je dois avoir la même configuration en développement qu'en production.
Composer sert à installer moving-average, non ? Si je ne sais pas l'installer en production, je ne sais pas l'utiliser.
De toute façon, je vais contourner le problème en la calculant à partir de la source. C'est un script Python (sur Rasberry)
Merci à tous pour vos contributions
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 02 avr. 2022, 00:19
par @rthur
Composer sert à télécharger des scripts PHP ainsi que leurs dépendances.
Le principe c'est qu'un script qui va permettre de faire une action précise va avoir besoin d'autres fonctionnalités que d'autres ont déjà développés, et donc plutôt que de tout intégrer dans le 1er script, le développeur se concentre sur sa fonctionnalité et indique (dans le fichier composer.json) les scripts à importer également pour que l'ensemble fonctionne.
De fait tu n'as besoin de composer que sur ta machine de dev pour télécharger et mettre à jour ces scripts tiers.
Et ensuite pour passer en prod, et bah c'est comme d'habitude tu transfères via (S)FTP l'ensemble des fichiers sur ton serveur de prod.
Tu n'as pas besoin de composer en prod.
Re: calcul de moyenne mobile sur un énorme nombre de relevés
Posté : 02 avr. 2022, 10:46
par Blaise032
D'accord.
Là, bien qu'il y ait une ou deux librairies en Python, je l'ai programmée moi-même.
La prochaine étape est de fabriquer le graphe en Python, parce 90000 données pour JPGraph prenant une bonne vingtaine de secondes, qu'est-ce que ce sera avec une deuxième série ! ?
Les visiteurs ne vont pas attendre pour voir le graphe. Le fabriquer en amont est une bonne solution.
Re: calcul de moyenne mobile, sans bibliothèque ou librairie
Posté : 08 avr. 2022, 07:47
par Blaise032
Bonjour
Je reviens ici pour celles et ceux qui font la même recherche que moi et qui rechignent à utiliser une libraire ou une bibliothèque. Voici le code en Python suffisamment documenté pour le transposer en PHP.
Bon développement !
PS : comme l'indentation n'est pas respectée (important dans Python), je partage une copie d'écran :
https://drive.google.com/file/d/1VrR30 ... sp=sharing
Code : Tout sélectionner
def moyenne_mobile(plage): # plage est le nombre de données dont on veut faire la moyenne
i = 0 # pour l'index de la liste
s = 0 # pour la somme
for cpm in cpm_datas: # parcourt la liste / array
if i < plage :
# fait une simple moyenne tout au début des données < à la plage,
# qui n'est pas du tout affinée pour les 1ères valeurs !
# mais on a au moins quelque chose à afficher
s += cpm # s = somme des valeurs
m = s / (i+1)
else :
# mobile
s -= cpm_datas[i-plage] # retire de la somme la valeur juste sous la plage
s += cpm # ajoute à la somme la nouvelle valeur
m = s / plage # moyenne
# fin de if else
m=round(m,1) # arrondit à une décimale
cpm_mm.append(m) # ajoute la valeur à la liste/array des moyennes
i += 1 # incrémente l'index