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 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 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> 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>
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?
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
3 Réponses :
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
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 code > 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 code> dans la bonne chance.
Timeprojection Code> est un package intéressant, mais il suffit de réduire les dates à des pièces de date plus simples (par exemple, jour de la semaine). Pas vraiment ce que je cherche.
Vous voudrez peut-être examiner le package code> zoo code>. Ce paquet utilise la classe ici est une solution rapide: p> Notez que j'utilise un maintenant, en principe, vous pouvez convertir ceci en 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> Nous sommes maintenant prêts à convertir les données en séries de temps: p> 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> Vous pouvez agréger tous les champs de n'importe quel magasin Quartier ou mois: P> 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>.
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>
zoo code> ou
zooreg code> class maintenant: p>
storeDataZooList <- lapply(storeDataList,
function(storeData) zoo(storeData[,-1], order.by=st.dates))
@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 ??
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 CODE> 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 code> 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 code> ts code> dans votre message, aucun exemple de paires d'entrée / sortie, aucune tentative de ne doit B> rien, sauf des résultats très généraux.
@eddi déplace cela pour discuter. chat.stackoverflow.com/rooms/info/58299/...