calcul de moyenne mobile sur un énorme nombre de relevés

Eléphanteau du PHP | 42 Messages

23 mars 2022, 14:02

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

Mammouth du PHP | 2703 Messages

23 mars 2022, 14:06


Eléphanteau du PHP | 42 Messages

26 mars 2022, 17:03

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 mars 2022, 10:56

Remplace tes include() par des require()
Et vérifie que tu inclus bien les bons fichiers avec le bon chemin
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 42 Messages

29 mars 2022, 12:15

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 :?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 mars 2022, 12:31

Tu as bien fait l'installation par composer ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 42 Messages

29 mars 2022, 12:41

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

Eléphanteau du PHP | 44 Messages

29 mars 2022, 13:11

Bonjour,
va voir ici composer. :D
L'illogisme n'est que la logique des autres!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 mars 2022, 16:55

Une fois composer installé, il faudra que tu lances la commande :

Code : Tout sélectionner

composer require dcvn/moving-average
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 42 Messages

30 mars 2022, 14:53

Ok, quand j'ai accès au serveur, ce qui n'est pas le cas pour mon hébergement (mutualisé) chez OVH.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

31 mars 2022, 00:25

Tu peux installer composer sur ta machine locale pour développer, et ensuite sur ton serveur de prod, pas besoin de composer
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 42 Messages

31 mars 2022, 10:18

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 avr. 2022, 00:19

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.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 42 Messages

02 avr. 2022, 10:46

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.

Eléphanteau du PHP | 42 Messages

08 avr. 2022, 07:47

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