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. :D

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 :

Code : Tout sélectionner

composer require dcvn/moving-average

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