gpt4 book ai didi

R:根据一天中的时间有效地对数据框进行子集化

转载 作者:行者123 更新时间:2023-12-04 11:28:44 24 4
gpt4 key购买 nike

我有一个大型 (150,000x7) 数据框,我打算将其用于金融市场的回溯测试和实时分析。数据代表投资工具每隔 5 分钟的状况(尽管确实存在漏洞)。它看起来像这样(但更长):

        pTime     Time  Price       M1       M2        M3        M4
1 1212108300 20:45:00 1.5518 12.21849 -0.37125 4.50549 -31.00559
2 1212108900 20:55:00 1.5516 11.75350 -0.81792 -1.53846 -32.12291
3 1212109200 21:00:00 1.5512 10.75070 -1.47438 -8.24176 -34.35754
4 1212109500 21:05:00 1.5514 10.23529 -1.06044 -8.46154 -33.24022
5 1212109800 21:10:00 1.5514 9.74790 -1.02759 -10.21978 -33.24022
6 1212110100 21:15:00 1.5513 9.31092 -1.17076 -11.97802 -33.79888
7 1212110400 21:20:00 1.5512 8.84034 -1.28428 -13.62637 -34.35754
8 1212110700 21:25:00 1.5509 8.07843 -1.63715 -18.24176 -36.03352
9 1212111000 21:30:00 1.5509 7.39496 -1.49198 -20.65934 -36.03352
10 1212111300 21:35:00 1.5512 7.65266 -1.03717 -18.57143 -34.35754

数据已预加载到 R 中,但在我的回溯测试期间,我需要按两个条件对其进行子集化:

第一个标准是滑动窗口,以避免窥视 future 。窗口必须是这样的,回溯测试中每个新的 5 分钟间隔将整个窗口向 future 移动 5 分钟。这部分我可以这样做:
require(zoo)
zooser <- zoo(x=tser$Close, order.by=as.POSIXct(tser$pTime, origin="1970-01-01"))
window(zooser, start=A, end=B)

第二个标准是另一个滑动窗口,但它是通过 time of day 滑动的。并且只包含在 N 内的那些条目输入时间的分钟 在任何一天。

示例:如果窗口大小为 2 hours ,输入时间为 12:00PM那么窗口必须包含所有带有 Time 的行之间 10:00AM2:00PM
这是我无法弄清楚的部分。

编辑:我的数据中有漏洞,连续两行的间隔可能超过 5 分钟。数据看起来像这样(非常放大)
enter image description here

当窗口穿过这些间隙时,窗口内的点数应有所不同。

以下是我的 MySQL 代码,它执行我想在 R 中执行的操作(相同的表结构):
SET @qTime = Time(FROM_UNIXTIME(SAMP_endTime));

SET @inc = -1;
INSERT INTO MetIndListBuys (pTime,ArrayPos,M1,M2,M3,M4)
SELECT pTime,@inc:=@inc+1,M1,M2,M3,M4
FROM mergebuys USE INDEX (`y`) WHERE pTime BETWEEN SAMP_startTime AND SAMP_endTime
AND TIME_TO_SEC(TIMEDIFF(Time,@qTime))/3600 BETWEEN 0-HourSpan AND HourSpan
;

最佳答案

1) DF是问题中显示的数据框,然后像您所做的那样从中创建一个动物园对象,并将其分成几天给出 zs .然后lapply您的功能 f到每组连续的 w每个组成部分(即每天)的点数。例如,如果您想一次将您的函数应用于 2 小时的数据,并且您的数据定期间隔为 5 分钟数据,则 w = 24(因为两小时内有 24 个五分钟周期)。在这种情况下 f每次调用时都会将 24 行数据作为矩阵传递。还有 align已设置为 "right"下面,但它可以交替设置为 align="center"和条件给出 ix可以改成双面等。欲了解更多关于rollapply见:?rollapply

library(zoo)
z <- zoo(DF[-2], as.POSIXct(DF[,1], origin = "1970-01-01"))
w <- 3 # replace this with 24 to handle two hours at a time with five min data
f <- function(x) {
tt <- x[, 1]
ix <- tt[w] - tt <= w * 5 * 60 # RHS converts w to seconds
x <- x[ix, -1]
sum(x) # replace sum with your function
}
out <- rollapply(z, w, f, by.column = FALSE, align = "right")

使用问题中的数据框,我们得到:
> out
$`2008-05-30`
2008-05-30 02:00:00 2008-05-30 02:05:00 2008-05-30 02:10:00 2008-05-30 02:15:00
-66.04703 -83.92148 -95.93558 -100.24924
2008-05-30 02:20:00 2008-05-30 02:25:00 2008-05-30 02:30:00 2008-05-30 02:35:00
-108.15038 -121.24519 -134.39873 -140.28436

顺便说一句,一定要阅读 this post .

2) 这也可以按照以下方式完成,其中 wf如上:
n <- nrow(DF)
m <- as.matrix(DF[-2])
sapply(w:n, function(i) { m <- m[seq(length = w, to = i), ]; f(m) })

更换 sapplylapply如果需要的话。此外,这可能看起来比第一个解决方案更短,但是一旦您添加代码来定义 f,它就没有太大不同。和 w (出现在第一个但不是第二个)。

如果白天没有漏洞,而只有几天之间的漏洞,那么可以简化这些解决方案。

关于R:根据一天中的时间有效地对数据框进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554188/

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