gpt4 book ai didi

function - 计算连续输赢的大小

转载 作者:行者123 更新时间:2023-11-30 23:54:10 24 4
gpt4 key购买 nike

我正在尝试计算 尺寸 连续输赢,这个问题是earlier question的后续问题当我试图计算连续的长度时,我有。

这是我的数据的样子:

> subRes
Instrument TradeResult.Currency.
1 JPM -3
2 JPM 264
3 JPM 284
4 JPM 69
5 JPM 283
6 JPM -219
7 JPM -91
8 JPM 165
9 JPM -35
10 JPM -294
11 KFT -8
12 KFT -48
13 KFT 125
14 KFT -150
15 KFT -206
16 KFT 107
17 KFT 107
18 KFT 56
19 KFT -26
20 KFT 189
> dput(subRes)
structure(list(Instrument = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("JPM",
"KFT"), class = "factor"), TradeResult.Currency. = c(-3, 264,
284, 69, 283, -219, -91, 165, -35, -294, -8, -48, 125, -150,
-206, 107, 107, 56, -26, 189)), .Names = c("Instrument", "TradeResult.Currency."
), class = "data.frame", row.names = c(NA, 20L))

我的目标:
我想计算每种工具最长的连续输赢的大小。所以,对于 JPM这将是上述数据中的第 2、3、4 和 5 行,得到以下 TradeResult.Currency.值:264 + 284 + 69 +283,总共 900。JPM 最长连续亏损的大小是第 9 行和第 10 行,总结果为 -329 (-35 +-294)。对于 KFT最长连胜大小为 270(107 + 107 + 56,第 16 至 18 行),最长连败大小为 -356(-150 + -206,第 14 和 15 行)。

以下函数给出了 正确 连胜的大小……
WinStreakSize <- function(x){
df.rle <- ifelse(x > 0, 1, 0)
df.rle <- rle(df.rle)
wh <- which(df.rle$lengths == max(df.rle$lengths))
mx <- df.rle$lengths[wh]
suma <- df.rle$lengths[1:wh]
out <- x[(sum(suma) - (suma[length(suma)] - 1)):sum(suma)]
return(sum(out))
}

.. 导致:
> with(subRes, tapply(TradeResult.Currency., Instrument, WinStreakSize)
+ )
JPM KFT
900 270

但是,我似乎无法熟练使用此功能来显示最长连败的大小(因此它会为 JPM 输出 -329,为 KFT 输出 -356),这听起来多么愚蠢。我试图通过多种方式更改该功能,将其剥离并重建它,但我找不到它的原因。

这就是我的意思(调试函数的输出,其中 x 值是拆分后 JPM 的值 subRes ):
Browse[2]>  ifelse(x > 0, 1, 0)
[1] 0 1 1 1 1 0 0 1 0 0
Browse[2]> ifelse(x < 0, 1, 0)
[1] 1 0 0 0 0 1 1 0 1 1
Browse[2]> rle( ifelse(x > 0, 1, 0))
Run Length Encoding
lengths: int [1:5] 1 4 2 1 2
values : num [1:5] 0 1 0 1 0
Browse[2]> rle( ifelse(x < 0, 1, 0))
Run Length Encoding
lengths: int [1:5] 1 4 2 1 2
values : num [1:5] 1 0 1 0 1
Browse[2]> inverse.rle( ifelse(x > 0, 1, 0))
Error in x$lengths : $ operator is invalid for atomic vectors
Browse[2]> rle( !ifelse(x < 0, 1, 0))
Run Length Encoding
lengths: int [1:5] 1 4 2 1 2
values : logi [1:5] FALSE TRUE FALSE TRUE FALSE

因此,更改此函数中的条件不会对函数的输出产生影响。这表明我正在查看函数的错误部分以寻求解决方案,但 ifelse语句是函数的第一个。换句话说,从第 1 行开始,尽管改变了条件,该函数仍使用不正确的输入。

我错过了什么明显的点?

最佳答案

rle(ifelse(x>0,1,0))主要与 rle(ifelse(x<0,1,0)) 相同或 rle(x>0)rle(x<0) ,不同之处在于运行的值不同。但是您从不使用函数中运行的值,所以这无关紧要。当您选择长度而不是值时,很明显您每次都会再次获得相同的结果。

让我稍微简化一下。使用底层函数,我演示了游程长度和总数的计算。考虑到您在问题中的解决方案不准确:JPM 有 2 个最长的负运行。我选择只返回绝对值最大的那个。

MaxStreakSize <- function(x){
# Get the run lengths and values
df.rle <- rle(x>0)
ngroups <- length(df.rle$lengths)
ll <- df.rle$lengths
val <- df.rle$values

# calculate the sums
id <- rep(1:ngroups,ll)
sums <- tapply(x,id,sum)

# find the largest runs for positive (val) and negative (!val)
rmax <- which(ll==max(ll[val]) & val )
rmin <- which(ll==max(ll[!val]) & !val )

out <- list(
"Lose"=c("length"=max(ll[rmin]),
"sum"=min(sums[rmin])),
"Win"=c("length"=max(ll[rmax]),
"sum"=max(sums[rmax]))
)
return(out)
}

在这类问题中,根据组的数量和运行的长度获得某种索引是非常好的。这让生活变得更加轻松。这使我可以使用简单的 tapply 计算总和、均值等。 .在我构建了三个相同长度的向量( llsumsval )之后,我可以轻松地将长度、值和运行的总和联系在一起,并选择我想要的任何内容。

使用 rle(x>0) 的一个优点是您可以将值用作索引,这大大简化了事情。

关于function - 计算连续输赢的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4745039/

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