Data frame classement par 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

Pierre Chemla
Messages : 9
Enregistré le : 03 Juil 2015, 14:57

Data frame classement par heure.

Messagepar Pierre Chemla » 02 Aoû 2015, 11:41

Bonjour a tous,

J'ai besoin de votre aide svp
J'ai une data frame classe par date et heure. Je voudrais obtenir une nouvelle data frame avec par exemple toutes les lignes de 9h a 10h.

Voir meme si cela est possible obtenir les sous data frame de demi heure en demi heure ( 9h-9h30 puis 9h30-10h....)

> temp2
Time High Low Open Close Volume NoOfTicks RelTime
1 2010-06-10 09:31:28 34.370 34.190 34.370 34.190 1402 6 4.273504e-05
2 2010-06-10 09:35:44 34.080 34.070 34.080 34.070 312 2 1.457265e-02
3 2010-06-10 09:48:33 34.050 34.050 34.050 34.050 100 1 4.756410e-02
4 2010-06-10 09:53:32 34.250 34.250 34.250 34.250 100 1 6.034188e-02
5 2010-06-10 09:54:52 34.248 34.248 34.248 34.248 700 1 6.376068e-02
6 2010-06-10 10:01:46 34.290 34.290 34.290 34.290 100 1 8.145299e-02
7 2010-06-10 10:49:58 34.100 34.100 34.100 34.100 100 1 2.050427e-01
8 2010-06-10 11:33:56 34.340 34.310 34.340 34.310 5206 8 3.143162e-01
9 2010-06-10 13:49:54 34.500 34.500 34.500 34.500 100 1 6.664103e-01
10 2010-06-10 13:54:47 34.490 34.490 34.490 34.490 200 2 6.789316e-01
11 2010-06-10 13:57:15 34.500 34.500 34.500 34.500 100 1 6.852564e-01
12 2010-06-10 14:28:33 34.610 34.610 34.610 34.610 100 1 7.655128e-01
13 2010-06-10 14:34:06 34.660 34.660 34.660 34.660 400 1 7.797436e-01
14 2010-06-10 14:37:13 34.760 34.760 34.760 34.760 200 1 7.877350e-01
15 2010-06-10 15:33:10 34.900 34.900 34.900 34.900 1000 1 9.311966e-01
16 2010-06-11 09:30:16 34.800 34.330 34.330 34.700 2372 6 0.000000e+00
17 2010-06-11 09:32:20 34.570 34.570 34.570 34.570 400 1 5.982906e-03
18 2010-06-11 10:06:42 34.832 34.832 34.832 34.832 185 1 9.410256e-02
19 2010-06-11 10:10:10 35.000 35.000 35.000 35.000 250 1 1.029915e-01
20 2010-06-11 11:03:16 34.704 34.680 34.704 34.680 250 2 2.385043e-01
21 2010-06-11 12:14:27 34.788 34.780 34.780 34.788 502 4 4.215385e-01
22 2010-06-11 12:33:03 34.670 34.670 34.670 34.670 200 1 4.693590e-01
23 2010-06-11 14:36:52 34.710 34.710 34.710 34.710 100 1 7.868376e-01
24 2010-06-11 15:05:26 34.901 34.901 34.901 34.901 200 1 8.600855e-01
25 2010-06-11 15:34:19 35.090 35.090 35.090 35.090 100 1 9.341453e-01
>

Merci d'avance

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: Data frame classement par heure.

Messagepar Florent Aubry » 03 Aoû 2015, 07:43

Essaie la fonction cut.POSIXt. Elle devrait répondre à ton problème.

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: Data frame classement par heure.

Messagepar Navarre Julien » 03 Aoû 2015, 08:15

Bonjour, pour obtenir un sous dataframe des demi heures tu peux utiliser cut avec la fonction dlply du package plyr et l'opérateur d'extraction.
Le découpage est automatique de demie heure en demie heure à partir de la minute minimale

Code : Tout sélectionner

library(plyr)
dlply(temp2, .(cut(Time, "30 min")), "[")

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: Data frame classement par heure.

Messagepar Florent Aubry » 03 Aoû 2015, 08:33

Bonjour, pour faire plus simplement :

Code : Tout sélectionner

resultat <- cbind( temp2, DEMI.HEURE=cut( temp2$Time, "30 min"))

si Time est de la classe POSIXlt, sinon transformer initialement la chaine de caractères par as.POSIXlt.

Pierre Chemla
Messages : 9
Enregistré le : 03 Juil 2015, 14:57

Re: Data frame classement par heure.

Messagepar Pierre Chemla » 04 Aoû 2015, 07:40

Merci de vos reponses,

Je dois en faites calculer la valeur V=Max(close)-Min(close) par exemple sur 30 min ou 1h ......
Je dois donc obtenir sur une journee un vecteur de valeurs V ( Pour chaque 30 min par exemple).

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: Data frame classement par heure.

Messagepar Florent Aubry » 04 Aoû 2015, 08:09

Une fois le temps transformé en facteur, il suffit d'utiliser une fonction qui calcule les 'summary statistics' en fonction de ce facteur. Il en existe plusieurs qui répondent à des besoins différents, par exemple dans les packages par défaut, aggregate

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: Data frame classement par heure.

Messagepar Navarre Julien » 04 Aoû 2015, 08:24

Bonjour,

si j'ai bien compris voilà ce que ça peut donner :
On découpe par demie heure et ensuite dans chacun de ces groupes on soustrait la valeur minimale de close à sa valeur maximale :

Dans un premier temps

Code : Tout sélectionner

library(dplyr)
tmp <-
  temp2 %>%
  mutate(timegroup = as.POSIXct(cut(Time, "30 min"))) %>%
  group_by(timegroup) %>%
  summarise(V = max(Close) - min(Close))


Ensuite c'est juste une idée de mise en forme, comme vous avez parlé d'un vecteur par jour :

Code : Tout sélectionner

library(tidyr)
tmp %>%
  separate(timegroup, c("date", "time"), sep = " ") %>%
  mutate(label = paste0("[", time, ";", lead(time), "[")) %>%
  split(.$date) %>%
  lapply(function(x) with(x, structure(V, .Names = label)))

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: Data frame classement par heure.

Messagepar Florent Aubry » 04 Aoû 2015, 08:44

Julien

Désolé mais je pense qu'on peut faire les mêmes opérations en utilisant les opérateurs de base de R, avec une syntaxe beaucoup moins opaque que celle de la suite de packages plyr. Par exemple, l'opérateur by qui donnera une liste de valeurs construites par la fonction passée en argument FUN :

Code : Tout sélectionner

by( resultat, INDICES=resultat$DEMI.HEURE, FUN=..., simplify=FALSE)


Je ne nie pas que dplyr peut être utile dans certains cas mais de mon expérience, le gain en performance obtenu ne justifie que rarement l'augmentation de complexité de l'écriture. Par exemple :

Code : Tout sélectionner

aggregate( Close ~ DEMI.HEURE, resultat, FUN=function( x) max( x) - min( x))
fait la même chose que

Code : Tout sélectionner

tmp <-
  temp2 %>%
  mutate(timegroup = as.POSIXct(cut(Time, "30 min"))) %>%
  group_by(timegroup) %>%
  summarise(V = max(Close) - min(Close))

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: Data frame classement par heure.

Messagepar Navarre Julien » 04 Aoû 2015, 10:55

Salut Florent,

je n'ai pas prétendu que dplyr pouvait faire des choses qu'on ne puisse pas faire avec les fonctions de base de R et certes son utilisation n'est pas justifiable par le gain de performance vu la taille des données. Pour ma part je l'utilise car dplyr apporte une syntaxe claire pour la manipulation de données. C'est d'ailleurs son but premier avant la performance :

Identify the most important data manipulation tools needed for data analysis and make them easy to use from R.


Je ne vois pas ce que tu trouves opaque dans une suite de verbes explicites sur ce qu'ils font et qui s'enchainent avec des pipes (%>%).
Tout ça sans jamais répéter le nom de la variable, en pouvant utiliser ou non l'évaluation non standard, sans variables temporaires dans lesquelles on peut vite se perdre, sans effet de bord et avec en bonus un gain en performance.
En se penchant sur dplyr on comprend vite son fonctionnement et il n'y a vraiment rien d'opaque là dedans. Pour moi c'est un gain de temps à l’exécution mais surtout lors de la rédaction du code.

Si on compare exactement les 2 codes, il ne faut pas oublier l'utilisation de la variable temporaire "résultat", c'est donc :

Code : Tout sélectionner

aggregate(Close ~ DEMI.HEURE,
  cbind(temp2, DEMI.HEURE = cut(temp2$Time, "30 min")),
  FUN = function(x) max(x) - min(x))


qui fait la même chose que :

Code : Tout sélectionner

temp2 %>%
  mutate(timegroup = cut(Time, "30 min")) %>%
  group_by(timegroup) %>%
  summarise(V = max(Close) - min(Close))


Alors on peut penser différemment mais à mes yeux il n'y a aucune hésitation sur quelle syntaxe est la plus opaque.

Cela fait plusieurs fois que la remarque sur l'utilisation des packages est faite et je ne comprends pas ce qui vous dérange la dedans.

C'est vrai que parfois la syntaxe de package peut dérouter les nouveaux utilisateurs qui se retrouvent confronter à une solution qui est (en apparence) totalement différente des bases de R. Mais si on s'efforce de donner des réponses en base R, alors on ne fait rien découvrir à personne. J'ai découvert le package plyr grâce à une réponse donnée ici, la ligne de code m'est apparue comme incompréhensible au premier abord, ça m'a forcé à chercher à comprendre son fonctionnement et maintenant dans certaines situations je n'abandonnerai les fonctions de plyr pour aucune fonction de base (même si je pourrai très bien le faire).

On peut très bien proposer plusieurs solutions avec ou sans packages ou avec différents packages, chacun prendra la solution qu'il préfère, mais je ne crois pas qu'on puisse justifier les réponses avec des fonctions de base par "tu n'as pas besoin de charger tel package" lorsque ce n'est ni disproportionné ni incident ou "la syntaxe de ce package est trop compliquée" quand son but est justement de la faciliter. A moins que vous ne soyez des hipsters de R et que vous pensez que le package est trop mainstream ! :)

Maintenant, libre à vous d'utiliser ce qu'il vous plait.

Julien

Pierre Chemla
Messages : 9
Enregistré le : 03 Juil 2015, 14:57

Re: Data frame classement par heure.

Messagepar Pierre Chemla » 04 Aoû 2015, 11:52

Merci a tous pour votre aide.
Cela m'a beaucoup aide

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: Data frame classement par heure.

Messagepar Florent Aubry » 04 Aoû 2015, 12:16

Julien

"On peut très bien proposer plusieurs solutions avec ou sans packages ou avec différents packages, chacun prendra la solution qu'il préfère", là-dessus nous sommes d'accord. Maintenant, chacun est libre de considérer que la syntaxe est plus ou moins simple et a le droit de le dire. Pour terminer, je pense qu'il faudrait une traduction claire de ta dernière phrase "A moins que vous ne soyez des hipsters de R et que vous pensez que le package est trop mainstream !"

Amicalement

Florent

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Data frame classement par heure.

Messagepar Gabriel Terraz » 04 Aoû 2015, 13:56

Salut,

Il me semble que l'utilisation de tapply est plus simple que aggregate car cela évite l'utilisation du dataframe "resultat".

Code : Tout sélectionner

DEMI.HEURE <- cut(as.POSIXlt(temp2$Time) , "30 min")
tapply(temp2$Close , factor(DEMI.HEURE) , function(x) diff(range(x)))


Pour cet exemple je rejoins la remarque de Florent, l'utilisation d'un package nécessite l'apprentissage d'une nouvelle syntaxe qui n'est pas forcément utile (dans ce cas là), même si à "long" terme cela peut-être un bon investissement.

Amicalement,

Gabriel

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Re: Data frame classement par heure.

Messagepar Florent Aubry » 04 Aoû 2015, 14:12

Gabriel

Absolument d'accord. J'utilise plutôt by mais c'est simplement un wrapper de tapply. J'avais suggéré l'utilisation d'une variable intermédiaire au cas où tu voulais garder trace du facteur généré mais si tu n'en as pas besoin, ton écriture eest meilleure. Tu peux encore simplifier l'écriture par :

Code : Tout sélectionner

tapply( temp2$Close , cut( as.POSIXlt( temp2$Time) , "30 min") , function( x) diff( range( x)))


factor( cut (... est inutile car cut renvoie un facteur.

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Data frame classement par heure.

Messagepar Gabriel Terraz » 04 Aoû 2015, 14:17

En l’occurrence j'avais mis factor pour éliminer les modalités vides du facteur, ce n'était donc pas une erreur !


Retourner vers « Questions en cours »

Qui est en ligne

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