6
votes

Série temporelle en tant que colonne `TS` dans les données.

J'ai plusieurs ensembles de données de séries chronologiques et j'aimerais aider à déterminer la meilleure façon de les obtenir dans R. Je suis assez familier avec les données.table mais pas si familière avec R 'CODE> TS Code> Analyse de la série chronologique de la classe.

en particulier, je souhaite savoir comment utiliser TS code> dans cette situation strong> ou s'il existe des limitations dans TS code> (telle Comme problèmes d'agrégation d'un ensemble de ts code> objets) qui le rendent appropriés à utiliser ici. p>

les données h3>

Il existe un grand nombre de magasins. Pour chaque magasin, j'ai plusieurs points de données pour chaque jour, tels que le volume des ventes en dollars, le volume des ventes en nombre de transactions et le trafic de stockage (nombre de personnes entrant dans le magasin). (En fait, ce que j'ai est une table avec des colonnes ID, la date et les données de ce magasin et de cette date.) P>

Ce que j'ai fait est d'utiliser une donnée avec une ligne par magasin, Agrégation des données en magasin en mois et stockez les valeurs de chaque mois dans une colonne nommée séparée (par exemple JAN14_DOLLARS, FEB14_DOLLARS ...) Mais cela est difficile à manifester pour beaucoup de raisons, en particulier lorsque je souhaite examiner des semaines ou des quartiers. P>

Je pensais que la bonne façon de gérer cela était d'avoir des colonnes de type TS code> de sorte que chaque ligne serait simplement être Store, Dollars_Ts, transactions_TS, trafic_ts Code > Mais (a) Comment puis-je obtenir les données dans ce format et (b) que vous pouvez TS code> être combinée la manière dont les entiers peuvent me donner les résultats que je veux? si vous ne pouvez répondre que (a) ou (b) mais pas les deux, veuillez répondre à ce que vous pouvez. strong> p>

Je ne peux pas fournir un ensemble de données réaliste, mais vous pouvez générer un ensemble de données réalistes, mais vous pouvez générer un Alénable un à jouer avec comme ceci: P>

require("data.table")

storeData <- CJ(store = toupper(letters), date = seq(as.Date('2012-01-01'), as.Date('2014-01-01'), by="day"))
storeData$dollars = sample(100:100000, nrow(storeData), replace = TRUE)/100
storeData$transactions <- sample(0:1000, nrow(storeData), replace = TRUE)
storeData$traffic  <- storeData$transactions + sample(0:1000, nrow(storeData), replace = TRUE)

head(storeData)
   store       date  dollars transactions traffic
1:     A 2012-01-01   48.60          409     990
2:     A 2012-01-02  996.89           36     428
3:     A 2012-01-03   69.35          647    1103
4:     A 2012-01-04  334.56          953     973
5:     A 2012-01-05  692.99          958    1753
6:     A 2012-01-06  973.32          724    1086


10 commentaires

Qu'en est-il des exemples de données si vous voulez que quelqu'un réponde réellement à ces exemples de questions?


@beginner Les données réelles sont exclusives, bien sûr, et je n'ai pas trouvé de jeu de données public qui correspond aux besoins, donc j'ai ajouté du code pour générer un ensemble de données aléatoires. Bien sûr, il n'y aura pas de tendances ni de corrélations dans cet ensemble, mais vous pouvez passer par les mouvements.


@OldPro Rolling joint bien fonctionner pour ce type d'analyse. J'ai récemment écrit un article de blog, vous trouverez peut-être utile gormanalysis.com/?p=176


@Bengorman j'ai lu votre message mais je ne vois pas comment il aide avec l'agrégation ou la conversion vers TS SÉRIE TIME DE LA CLASSE OU COMMANDER UNE ANNÉE MENSUELLE DANS LA CROISSANCE INDIVIDUELLE.


trop large - casser aux petites questions facilement digestibles imo


@eddi La question principale est que je puisse utiliser la classe ts dans cette situation et si oui, comment?


@OldPro La réponse principale est alors simplement «Oui, de même manière que vous utilisez d'autres données», mais ce n'est pas ce que vous recherchez, n'est-ce pas? Vous avez probablement un ou plusieurs problèmes spécifiques que vous avez rencontrés et que je suggère de commencer par (idéalement simple).


@eddi Vous n'avez pas répondu "Comment". Le premier problème est comment puis-je obtenir l'exemple data.frame converti en 4 colonnes et 1 ligne par magasin comme expliqué dans la question.


Je ne vois aucun objet ts dans votre message, aucun exemple de paires d'entrée / sortie, aucune tentative de ne doit rien, sauf des résultats très généraux.


@eddi déplace cela pour discuter. chat.stackoverflow.com/rooms/info/58299/...


3 Réponses :


7
votes

Vous posez beaucoup de questions ici. Je vous recommande de passer du temps à lire sur toutes les données de données. La carte peut faire impliquer des jointures et agréger les données. Voici un exemple de la façon dont vous obtiendriez l'année au cours de la croissance de chaque magasin au cours du premier trimestre.

#get the first day of the first month for your binning
minDate<-min(storeData$date); month(minDate)<-1; day(minDate)<-1

#get the first day of the last month for your binning
maxDate<-max(storeData$date); month(maxDate)<-12; day(maxDate)<-1

#Build some bins
yearly<-data.table(leftBound=seq.Date(minDate,maxDate,by="year"))
quarterly<-data.table(leftBound=seq.Date(minDate,maxDate,by="3 months"))
monthly<-data.table(leftBound=seq.Date(minDate,maxDate,by="month"))

#Example for quarterly data
quarterly[, rollDate:=leftBound]
storeData[, rollDate:=date]

setkey(quarterly,"rollDate")
setkey(storeData,"rollDate")

temp<-quarterly[storeData, roll=TRUE] #associate each (store, date) pair with a quarter

#create a "join table" containing each quarter for each store
jt<-CJ(leftBound=quarterly$leftBound, store=unique(storeData$store))
setkey(temp,"leftBound","store")

dt<-temp[jt, allow.cartesian=TRUE]
dt[, `:=`(year=year(leftBound), quarter=quarter(leftBound))]

qSummary<-dt[,list(dollars=sum(dollars, na.rm=TRUE), 
         transactions=sum(transactions, na.rm=TRUE), 
         traffic=sum(traffic, na.rm=TRUE)),
   by=list(year,quarter,store)] #Summarize the data by quarter

#Get year/year growth for Q1
qSummary[,list(dollarGrowth = dollars[which(year==2014 & quarter==1)] / dollars[which(year==2013 & quarter==1)]), by=store]

 #First five rows...
    store dollarGrowth
 1:     A    0.0134860
 2:     B    0.0137215
 3:     C    0.0188249
 4:     D    0.0163887
 5:     E    0.0037576


2 commentaires

Ceci est une information utile et intéressante, Ben et le long des lignes de ce que j'avais fait (bien que ce que vous avez fait est plus systématique et organisé), mais ce que je veux vraiment savoir, c'est si le TS La classe peut être utilisée dans mon étui à utiliser pour donner le type de résultats que je recherche, et dans l'affirmative, comment faire cela se produire.


@Oldpro juste assez. Je ne suis certes pas très familier avec TS dans la bonne chance.




4
votes

Vous voudrez peut-être examiner le package code> zoo code>. Ce paquet utilise la classe zoo code> capable de gérer très bien les séries de temps irrégulières. Il possède également une classe zooreg code> analogue à la classe ts code>, mais pour cette réponse, nous nous allons coller avec zoo code>.

ici est une solution rapide: p>

Step0: chargement du package et des données: strong> p> xxx pré>

Notez que j'utilise un données.frame code> au lieu de data.Table code> et la construction de données est légèrement différente. Avec votre niveau d'expertise, je suis sûr que vous pouvez le manipuler facilement. P>

STEP1: Conversion des données en série de temps forte> p>

maintenant, en principe, vous pouvez convertir ceci en zoo code> ou zooreg code> class maintenant: p> xxx pré>

mais note que chaque jour aura plusieurs entrées correspondant à Différents magasins, cela crée un problème avec plusieurs entrées sur la série chronologique. P>

Comme dans notre cas, nous n'aurons pas plus d'une entrée par jour par magasin, nous voulons garder les informations pour chaque magasin séparé. Nous avons donc divisé les données en magasin: p> xxx pré>

Nous sommes maintenant prêts à convertir les données en séries de temps: p> xxx pré>

Cela donne une liste de données de la série chronologique pour tous les magasins. P>

Step3: analyse strong> p>

Maintenant que vous avez des données de série chronologique pour tous les magasins, agrégant est tout droit: p>

Vous pouvez regrouper un champ spécifique pour n'importe quel magasin de trimestre ou mois: p> xxx pré>

Vous pouvez agréger tous les champs de n'importe quel magasin Quartier ou mois: P>

storeDataZooList <- lapply(storeDataList,
                           function(storeData) zoo(storeData[,-1], order.by=st.dates))


1 commentaires

@OldPro: J'ai remarqué que vous avez donné au crédit de Bounty, mais que vous n'avez pas accepté la réponse. Toute question restante que je puisse aider avec ??