gpt4 book ai didi

r - 时间序列作为data.table中的 `ts`列?

转载 作者:行者123 更新时间:2023-12-03 13:48:51 25 4
gpt4 key购买 nike

我有多组时间序列数据,希望能帮助您找到将其放入R并使用R分析它们的最佳方法。我对data.table非常熟悉,但对支持时间序列分析的R的ts类却不太熟悉。

特别是,我想知道在这种情况下如何使用 ts ts是否存在限制(例如,集合一组ts对象的问题),使其适合在此处使用。

数据

有大量的商店。对于每个商店,我每天都有多个数据点,例如以美元为单位的销售额,以交易次数为单位的销售额和商店流量(进入商店的人数)。 (实际上,我有一个带有列商店ID,日期以及该商店和日期的数据的表。)

我一直在使用一个data.table,每个商店有一行,将每个商店的数据聚合成几个月,然后将每个月的值存储在单独的命名列中(例如jan14_dollars,feb14_dollars ...),但这很笨拙由于很多原因,尤其是当我想查看几周或四分之一时。

我在想解决这个问题的正确方法是让列的类型为ts,因此每一行都只是store, dollars_ts, transactions_ts, traffic_ts,但(a)如何将数据转换为该格式,以及(b)可以将ts组合为整数的方式给我我想要的结果? 如果您只能回答(a)或(b),但不能同时回答两个,请回答。

我无法提供现实的数据集,但您可以像这样生成一个随机的数据集:

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

分析

我想回答“有多少家商店的美元销售额出现正增长?”之类的问题。和“美元/交易的变化与流量的变化之间有关系吗?”并将数据分为多个时间段,并比较各个时间段的答案(例如,今年第一季度与去年第一季度)。

可以使用 ts 回答这些问题吗?如果是这样,我如何将这些数据放入一组适当的列中,或者我应该使用 data.table之外的某种结构?

请展示如何组织数据,然后如何使用数据回答以下示例问题:“与2014年1月相比,2014年1月有多少家商店的美元销售额出现正增长?”以及“过去3个月中每笔交易的总体趋势是什么?”

最佳答案

您在这里问了很多问题。我建议您花时间阅读data.table可以进行的所有涉及联接和汇总数据的事情。这是一个示例,说明您如何在第一季度获得每家商店的同比增长。

#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

关于r - 时间序列作为data.table中的 `ts`列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24958364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com