我有一个不规则的时间序列事件(帖子)使用xts,我想计算在滚动的每周窗口(或每两周,或3天等)发生的事件的数量.数据如下所示:
postid
2010-08-04 22:28:07 867
2010-08-04 23:31:12 891
2010-08-04 23:58:05 901
2010-08-05 08:35:50 991
2010-08-05 13:28:02 1085
2010-08-05 14:14:47 1114
2010-08-05 14:21:46 1117
2010-08-05 15:46:24 1151
2010-08-05 16:25:29 1174
2010-08-05 23:19:29 1268
2010-08-06 12:15:42 1384
2010-08-06 15:22:06 1403
2010-08-07 10:25:49 1550
2010-08-07 18:58:16 1596
2010-08-07 21:15:44 1608
Run Code Online (Sandbox Code Playgroud)
应该产生类似的东西
nposts
2010-08-05 00:00:00 10
2010-08-06 00:00:00 9
2010-08-07 00:00:00 5
Run Code Online (Sandbox Code Playgroud)
为期2天的窗口.我已研究过rollapply,apply.rolling从PerformanceAnalytics等,他们都承担一定的时间序列数据.我尝试将所有时间都改变到帖子发生的那一天,并使用类似于ddply每天分组的东西,这让我很接近.但是,用户可能不会每天发布,因此时间序列仍然是不规则的.我可以用0填补空白,但这可能会使我的数据大量膨胀,而且已经非常大了.
我该怎么办?
在动物园包中有一个名为rollmean的函数,它可以让你移动平均值.所述rollmean(x,3)将采取先前,当前和下一值(即4,6和2)在下面的表中.这显示在第二列中.
x rollmean ma3
4
6 4.0
2 4.3
5 3.0 4.0
2 6.3 4.3
12 6.0 3.0
4 6.0 6.3
2 6.0
Run Code Online (Sandbox Code Playgroud)
我想完成相同的工作,但是通过平均排除第四行中的前三个值.这显示在第三列中.谁能告诉我有助于实现这一目标的功能名称?
我希望得到a startDate和之间的日期顺序endDate加1个月startDate.即,如果startDate是2013-01-31并且endDate是2013-07-31,我希望看到这样的日期:
"2013-01-31""2013-02-28""2013-03-31""2013-04-30""2013-05-31""2013-06-30""2013-07-31"
我试过了 seq.Date(as.Date("2013-01-31"),by="month",length.out=7).但是这段代码的输出是这样的
> seq.Date(as.Date("2013-01-31"),by="month",length.out=7)
[1] "2013-01-31" "2013-03-03" "2013-03-31" "2013-05-01" "2013-05-31" "2013-07-01" "2013-07-31"
Run Code Online (Sandbox Code Playgroud)
那么,获得正确输出的最简单的解决方案是什么?
有没有办法我们可以NA用一个有限数量的前锋填充一个zoo或一个xts对象NA.换句话说,NA最多连续3次填充s NA,然后将NAs从第4个值保持到有效数字.
像这样的东西.
library(zoo)
x <- zoo(1:20, Sys.Date() + 1:20)
x[c(2:4, 6:10, 13:18)] <- NA
x
2014-09-20 2014-09-21 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26
1 NA NA NA 5 NA NA
2014-09-27 2014-09-28 2014-09-29 2014-09-30 2014-10-01 2014-10-02 2014-10-03
NA NA NA 11 12 NA NA
2014-10-04 2014-10-05 2014-10-06 2014-10-07 2014-10-08 2014-10-09
NA NA NA NA 19 20
Run Code Online (Sandbox Code Playgroud)
期望的输出,将是变量n = 3的东西
2014-09-20 2014-09-21 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26
1 …Run Code Online (Sandbox Code Playgroud) 在 R 中,您可以使用指定的窗口计算滚动平均值,该窗口每次可以移动指定的量。
但是,也许我只是没有在任何地方找到它,但您似乎无法在 Pandas 或其他 Python 库中找到它?
有谁知道解决这个问题的方法?我会给你一个例子来说明我的意思:
这里我们有双周数据,我正在计算两个月移动平均线,该移动平均线移动 1 个月,即 2 行。
所以在 RI 中会做类似的事情:two_month__movavg=rollapply(mydata,4,mean,by = 2,na.pad = FALSE)
Python 中没有等价物吗?
编辑1:
DATE A DEMAND ... AA DEMAND A Price
0 2006/01/01 00:30:00 8013.27833 ... 5657.67500 20.03
1 2006/01/01 01:00:00 7726.89167 ... 5460.39500 18.66
2 2006/01/01 01:30:00 7372.85833 ... 5766.02500 20.38
3 2006/01/01 02:00:00 7071.83333 ... 5503.25167 18.59
4 2006/01/01 02:30:00 6865.44000 ... 5214.01500 17.53
Run Code Online (Sandbox Code Playgroud) 我试图计算滚动的20期历史波动率.我拿每日回报:
ret<-ROC(data1)
Run Code Online (Sandbox Code Playgroud)
然后我使用rollapply为每列获得20天的HV:
vol<-rollapply(ret,20,sd,by.column=T,fill=NA)
Run Code Online (Sandbox Code Playgroud)
问题是vol中的观察开始在十天之后出现,这是我指定的错误20.
为了演示,这里有数据样本:
0.000000000, 0.005277045, 0.023622047, 0.002564103,-0.002557545, -0.020512821,
0.007853403,-0.012987013, 0.007894737, 0.015665796, 0.000000000, -0.002570694,
0.002577320, -0.015424165, 0.002610966, 0.010416667, 0.002577320, 0.015424165,
0.000000000, -0.002531646, -0.002538071, 0.030534351, 0.014814815, -0.007299270,
-0.009803922, -0.012376238, 0.002506266, -0.015000000,-0.002538071, 0.002544529
Run Code Online (Sandbox Code Playgroud)
假设上面的数据存储在x中,然后:
rollapply(x,20,sd,fill=NA)
Run Code Online (Sandbox Code Playgroud)
将在第10行而不是20处产生第一次观察.此外,sd也是错误的.
我应该在这里遗漏一些东西......
我在数据框和动物园对象之间切换很困难,特别是保留有意义的列名,以及单变量和多变量情况之间的不一致:
library(zoo)
#sample data, two species counts over time
t = as.Date(c("2012-01-01", "2012-01-02", "2012-01-03", "2012-01-04"))
n1 = c(4, 5, 9, 7) #counts of Lepisma saccharina
n2 = c(2, 6, 0, 11) #counts of Thermobia domestica
df = data.frame(t, n1, n2)
colnames(df) <- c("Date", "Lepisma saccharina", "Thermobia domestica")
#converting to zoo loses column names in univariate case...
> z1 <- read.zoo(df[,1:2]) #time series for L. saccharina
> colnames(z1)
NULL
> colnames(z1) <- c("Lepisma saccharina") #can't even set column name manually
Error …Run Code Online (Sandbox Code Playgroud) 我有10000多行的动物园对象.
> head(tt)
A B
2007-01-04 0.005945924 0.0021167475
2007-01-05 -0.004201991 -0.0080020024
2007-01-08 0.001740897 0.0045804104
2007-01-09 0.000000000 -0.0008163931
2007-01-10 -0.004503531 0.0032615812
2007-01-11 -0.005841138 0.0043863282
Run Code Online (Sandbox Code Playgroud)
我尝试了以下行的变体,但无济于事.
rollapply(tt, 21, function(x) cor(x[,1],x[,2]))
Run Code Online (Sandbox Code Playgroud)
每个条目都给出1的相关性,看起来它正在从相关矩阵的对角线上取下1.
2013-11-25 1 1
2013-11-26 1 1
2013-11-27 1 1
2013-11-29 1 1
2013-12-02 1 1
2013-12-03 1 1
Run Code Online (Sandbox Code Playgroud)
我真正想要的是-0.4649,如下所示
> cor(tt)
A B
A 1.0000000 -0.4649881
B -0.4649881 1.0000000
Run Code Online (Sandbox Code Playgroud) summary(DF)
>fx_code date fx_spot fx_fwd implied_fx_vol
AUD : 171 Min. :2000-01-31 Min. : 0.394 Min. :-320.000 Min. : 1.000
BRL : 171 1st Qu.:2003-07-31 1st Qu.: 1.623 1st Qu.: -2.615 1st Qu.: 7.180
CAD : 171 Median :2007-02-28 Median : 6.117 Median : 6.070 Median : 9.842
CHF : 171 Mean :2007-02-28 Mean : 449.477 Mean : 63.569 Mean :10.656
CLP : 171 3rd Qu.:2010-09-30 3rd Qu.: 43.475 3rd Qu.: 64.055 3rd Qu.:12.809
COP : 171 Max. :2014-03-31 Max. :12360.000 …Run Code Online (Sandbox Code Playgroud) 伙计们,通常在你这样做的时候:
tmp = zoo(rnorm(100), 1:100)
rollapply(tmp, 10, function(x) quantile(x, 0.05), align="right")
Run Code Online (Sandbox Code Playgroud)
非常正确的rollapply是从10个元素可用的那一刻开始计算该值.
不幸的是,我需要的东西尽可能多地使用尽可能多的数据用于第10次观察,实际上是一个不断增长的数据窗口,直到有足够的数据来使用滑动窗口,例如1,1:2,1:3,1:4等直到我们至少有10个元素,然后像往常一样滑动窗口.
有没有比一个丑陋的for循环更好的方法呢?