[RESOLU] Calculer moyenne de chaque ligne sur la dernière heure

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Theo Boudard
Messages : 19
Enregistré le : 06 Jan 2021, 15:32

[RESOLU] Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Theo Boudard » 14 Avr 2021, 07:03

Bonjour,

J'ai un df qui se caractérise par une colonne Date (JJ/MM/AAAA HH:MM:SS) et une colonne de valeurs (des débits). Je cherche à créer une nouvelle colonne dans mon df où chaque ligne de cette nouvelle colonne correspond à la moyenne des valeurs de débit sur la dernière heure. (en lien avec ce questionnement plus global : viewtopic.php?f=3&t=10337)

L'idée est donc pour chaque ligne de connaitre la moyenne des débits sur la dernière heure. (et non pas de faire la moyenne pour chaque heure)

Bonne journée,
Théo Boudard

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Pierre-Yves Berrard » 14 Avr 2021, 07:51

Bonjour,

Si je comprends bien, le résultat devrait être le suivant ?

Code : Tout sélectionner

donnees <- data.frame(
  heure = as.POSIXct(c("2021-04-14 09:40", "2021-04-14 09:50", "2021-04-14 10:30", "2021-04-14 11:00")),
  debit = c(10, 100, 1000, 10),
  resultat = c(10, 55, 370, 505)
)

donnees
#>                 heure debit resultat
#> 1 2021-04-14 09:40:00    10       10
#> 2 2021-04-14 09:50:00   100       55
#> 3 2021-04-14 10:30:00  1000      370
#> 4 2021-04-14 11:00:00    10      505   
PY

Theo Boudard
Messages : 19
Enregistré le : 06 Jan 2021, 15:32

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Theo Boudard » 14 Avr 2021, 07:57

Bonjour,
C'est exactement ça. Comme dans votre exemple il n'y a pas nécessairement de régularité au niveau du nombre de valeurs par heure.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Pierre-Yves Berrard » 14 Avr 2021, 08:00

Pas facile à réaliser a priori, parce que les groupes sur lesquels on voudrait calculer la moyenne se chevauchent...
PY

Theo Boudard
Messages : 19
Enregistré le : 06 Jan 2021, 15:32

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Theo Boudard » 14 Avr 2021, 08:06

Oui en effet ça fait un moment que je tente des trucs mais ça n'aboutit pas.

J'avais une piste mais je n'ai pas réussi, peut être que quelqu'un saura :
J'ai modifié légèrement mon df de sorte que le pas de temps soit fixe, soit une ligne toute les 2mn. Il y aurait donc peut être moyen de dire a R de faire la moyenne sur les 30 lignes précédentes (30*2mn=1h). C'est une idée mais je n'ai pas réussi a la concrétiser si jamais quelqu'un a une solution ..

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Serge Rapenne » 14 Avr 2021, 08:07

Bonjour,

si la série temporelle est irrégulière, c'est effectivement coton !
Je ne vois pas d'autre solution que de compléter la série pour la rendre régulière (peut être avec la fonction complete du package dplyr) puis de calculer des moyennes glissantes par ex avec la fonction roll_mean du package RccpRoll

mes 2 centimes

Serge

Theo Boudard
Messages : 19
Enregistré le : 06 Jan 2021, 15:32

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Theo Boudard » 14 Avr 2021, 08:12

Je vais regarder un peu ce que permet cette fonction, ça peut être la solution.
Merci,
Théo Boudard

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Pierre-Yves Berrard » 14 Avr 2021, 08:43

Un début d'idée (qui ne nécessiterait pas de modifier les données initiales) :

Pour chaque ligne, on cherche à calculer le nombre de lignes précédentes à prendre en compte pour calculer la moyenne.

Dans notre exemple, la durée à la précédente occurence en minutes est :

Code : Tout sélectionner

tps_dernier <- c(10, 40, 30)
(j'ai exclu la première occurence qui est un peu particulière)

Le résultat voulu se calcule par :

Code : Tout sélectionner

vapply(
  seq_along(tps_dernier),
  function(n) {
    precedents <- rev(tps_dernier[1:n])
    sum(cumsum(precedents) < 60)
  },
   FUN.VALUE = integer(1)
)
#> [1] 1 2 1   

Cette étape préliminaire devrait être exceptionnellement longue à s'exécuter sur un gros jeu de données.
PY

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Serge Rapenne » 14 Avr 2021, 09:01

je n'ai pas le temps de tester mais qq choses comme ça ne devrait pas être trop loin d'une solution possible :

Code : Tout sélectionner

library(dplyr)
library(RcppRoll)
 
  donnees<-donnees %>% complete(heure=seq.POSIXt(min(donnees$heure),max(donnees$heure),"2 min")) %>%
    mutate(resultat=roll_meanr(debit,n=30,na.rm=T)) %>% filter(!is.na(debit))


Serge

Theo Boudard
Messages : 19
Enregistré le : 06 Jan 2021, 15:32

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Theo Boudard » 14 Avr 2021, 09:40

Merci beaucoup pour votre aide, je vais regarder ça.

Bonne journée,
Théo

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Logez Maxime » 14 Avr 2021, 09:53

Bonjour,

une possibilité avec les fonctions de base en recherchant pour chaque valeur les lignes qui correspondent à l'intervalle ]h-60 min;h].

Code : Tout sélectionner

donnees <- data.frame(
  heure = as.POSIXct(c("2021-04-14 09:40", "2021-04-14 09:50", "2021-04-14 10:30", "2021-04-14 11:00")),
  debit = c(10, 100, 1000, 10),
  resultat = c(10, 55, 370, 505)
)

res <- numeric(nrow(donnees))
for (i in seq_along(res))
  res[i] <- mean(donnees$debit[donnees$heure <= (donnees$heure[i]) & donnees$heure > donnees$heure[i]-3600])
donnees$resultat <- res
C'est pas forcément souhaitable comme méthode si tu as une longue série de données.
Si tu as une très longue série de données tu peux aussi paralléliser ce calcul.
Après il y a la question de la représentativité de telles moyennes. Des fois tu as une valeur en fin et en début d'une heure, d'autre fois tu as plus de valeurs, etc.

Cordialement,
Maxime

Theo Boudard
Messages : 19
Enregistré le : 06 Jan 2021, 15:32

Re: Calculer moyenne de chaque ligne sur la dernière heure

Messagepar Theo Boudard » 19 Avr 2021, 08:15

Bonjour,
Pour ce qui est de la représentativité de ces moyennes j'ai réglé le problème puisque ce que je voulais en fait c'était des sommes et non des moyennes, j'ai donc juste remplacé mean par sum et ça fonctionne très bien, un peu long en effet mais largement raisonnable.
Merci a tous pour votre aide.

Bonne semaine,
Théo Boudard


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité