如何计算一分钟数据集的 15 分钟标准差?

How to compute 15-min standard deviations of a minutely dataset?

提问人:zemone 提问时间:8/15/2019 更新时间:8/20/2019 访问量:76

问:

我有一个数组,射线时间,它是一小时的分数,例如,[0, 0.1, 0.2... 0.9, 1.0]。 我还有另一个浮点数列表,这是我的速度 vr。每个数据时间对应于一个速度列表,作为高度的函数。

我正在尝试从这个速度数据集中计算出 15 分钟的速度标准偏差,并保留它,以便在每个高度级别执行 std(所以我应该有一个标准偏差数组,每个高度一个)。

Raytimes 是时间 [0, 0.1, 0.2... 0.9, 1.0]。 VR 是 2500 个 float64 号码的 108 个列表。2500 个数字对应于在每个高度(在固定高度网格上)测量的速度。 我不知道如何分离数据块,以便我可以只在第一、第二、第三和第四个 15 分钟间隔上计算 std。 然后,我需要计算每个特定高度水平的 std。

for i in raytimes:
    if raytimes[i] < 0.25:
        w1 = w1.append(vr)
    if raytimes[i] > 0.25 & raytimes < 0.5:
        w2 = w2.append(vr)
    if raytimes[i] > 0.5 & raytimes < 0.75:
        w3 = w3.append(vr)
    if raytimes[i] < 1:
        w4 = w4.append(vr)
sigma_w1 = std(w1)
sigma_w2 = std(w2)
etc...

问题是在我上面的代码中,我附加了整个 vr 矩阵。如何仅附加与 15 分钟块内的时间相对应的 vr 列表? 然后如何计算保持高度网格的 std,以便沿每个高度计算 std?我最终应该得到相同的数组大小 2500。

python 列表 std

评论

1赞 G. Anderson 8/15/2019
您应该使用 而不是 .就像现在一样,您的最后一个条件独立于您之前的条件。您还会忽略数字正好位于其中一个边界上的情况,例如,您没有任何或if...elif...elif...elseif...if...if...if<=>=
1赞 Simon Notley 8/15/2019
你能再解释一下这两个数组吗?Raytimes 只是一个长度为 11 的 1 维数组,对吧?那么你有一个包含速度测量值的阵列 vr?你说它们对应于特定的时间和高度,但你没有告诉我们你如何判断每个 vr 元素来自哪个时间,你根本没有解释高度来自哪里。数字 108 只是出现在句子的中间,这是怎么回事?
0赞 zemone 8/15/2019
感谢您的 elif 提示 - 会做。是的,射线时间是长度为 108 的一维列表。Vr 是一个 108 维的浮点数列表,每个浮点数的长度为 2500。高度是长度为 2500 的列表,其值永远不会更改。因此,每个时间、每个高度都有一个 vr。我希望这能澄清一下?
1赞 Simon Notley 8/16/2019
好的,所以你已经在 108 个不同的时间、2500 个不同的高度测量了速度?如果以 108 的步长从 0 到 1,你怎么会有 0.1 倍的光线时间?我一会儿会给你写一个答案,但仅供参考,数据是如何以这种格式获得的?这种类型的科学计算通常使用 numpy 数组或 pandas 数据帧而不是列表,因为它们可以更轻松地解决像您这样的问题。
0赞 zemone 8/17/2019
我同意这是一种残酷的代码编写方式 - 必须有一个更优雅的解决方案,我可以根据时间对 VR 进行分组,然后在每个高度计算 STD......

答:

1赞 Simon Notley 8/16/2019 #1

这是一个答案的开始,我可以根据你的反馈进行完善。请注意,这并不是实际转换数据的好方法,我只是想演示如何将代码移动到给出您想要的答案的东西。在这里,我假设您想要一个按高度和 15 分钟时间分组的 SD;所以这是 10000 个结果。如果您真的想要 SD over height 或其他一些分组功能,请在评论中告诉我。我还从你上面所说的中假设 vr 是一个列表列表。具体来说,长度为 108 的列表长度为 2500。如果这不正确,请发表评论。

编辑 - 我意识到你如何使用我无意中复制的 for 循环存在一个根本性错误。您使用 i 作为索引,但 i 是项目的实际值。如果需要项目的位置,则需要使用 enumerate。请参阅下面的示例,我将 i 作为索引,将 t 设置为射线时间的值。

编辑 2 - 方法保持不变,但我实际上已经运行了这段代码,所以我纠正了你和我在上一次迭代中犯的所有各种错误。您能否尝试使用您的数据并确认输出正确,然后我们可以查看您需要如何呈现输出。

编辑 3 - 添加了四个结果列表以按要求保存输出

from statistics import pstdev
#remove these lines, these are just test data
raytimes=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
heights=[1,2]
vr=[[4,3],[5,3],[3,5],[4,1],[8,2],[2,3],[1,4],[9,5],[7,3],[6,7],[3,8]]
#initialise empty arrays
w1 = []
w2 = []
w3 = []
w4 = []
r1 = []
r2 = []
r3 = []
r4 = []


for j, h in enumerate(heights):
    for i, t in enumerate(raytimes):
        if raytimes[i] < 0.25:
            w1.append(vr[i][j])
        elif 0.25 < raytimes[i] < 0.5:
            w2.append(vr[i][j])
        elif 0.5 < raytimes[i] < 0.75:
            w3.append(vr[i][j])
        else:
            w4.append(vr[i][j])
    print(w1,w2,w3,w4)
    print("First Period - Height: ", str(h), " SD: ", str(pstdev(w1)))
    r1.append(pstdev(w1))
    print("Second Period - Height: ", str(h), " SD: ", str(pstdev(w2)))
    r2.append(pstdev(w2))
    print("Third Period - Height: ", str(h), " SD: ", str(pstdev(w3)))
    r3.append(pstdev(w3))
    print("Fourth Period - Height: ", str(h), " SD: ", str(pstdev(w4)))
    r4.append(pstdev(w4))
    w1 = []
    w2 = []
    w3 = []
    w4 = []

评论

0赞 zemone 8/17/2019
谢谢,这当然让我更接近了!回答您的问题:射线时间为 108;我使用的例子(0.1,0.2)只是一个例子。它实际上更像是(0.01、0.019 等)。我需要 SD 超过高度。数组 w1、w2 等当前为 1x67473。我需要将每条“射线”分开,以便我可以在每个高度进行 std。W1 应该是一个数组数组,每个数组具有与 VR [1x2500] 相同的结构。我应该为 w1 到 w4 分别有 ~27 个数组,每个数组的长度为 2500。然后,我需要为每个高度 (2500x) 取 27 个数字的 std,以获得 std 作为高度的函数。
0赞 zemone 8/17/2019
更新的代码: w1 = [] w2 = [] w3 = [] w4 = [] for j,h in enumerate(Height): for i,t in enumerate(raytimes): if raytimes[i] <= 0.25: w1.append(float(vr[i][j])) elif (raytimes[i] > 0.25) & (raytimes[i] <= 0.5): w2.append(float(vr[i][j])) elif (raytimes[i] > 0.5) & (raytimes[i] <= 0.75): w3.append(float(vr[i][j])) else: w4.append(浮点数(vr[i][j]))
0赞 zemone 8/17/2019
但是,我无法弄清楚如何分离 w1。我试过concantenate,但没有运气。我想分配 w1[X] = append(vr[i][j]),其中 X 是每条新光线
1赞 Simon Notley 8/17/2019
好的,好消息是,我在回答中试图做的事情似乎符合您的要求。坏消息是,因为我忘了清除每个环之间的 w1、w2、w3 等,它们只会越来越长,这不是我的本意。我本来打算用它打印 10000 行,每行对应一个高度,用于你的四个时期之一,我认为这就是你想要的。我会试着重新审视我的答案。现在你正在取得进展,我真的建议你看看 numpy 数组而不是列表,因为我认为它们会符合你的耳朵或更好地思考。
1赞 Simon Notley 8/19/2019
我再次更新了我的答案。在这个阶段,我可能不会费心切换到numpy,因为差异会非常小。但是,您可能需要考虑在数据库(或 pandas)中处理此类数据,这在 Python 中为您提供类似数据库的结构。最大的优点是数据实际上有意义地附加到标签上,因此您可以简单地根据标签查询数据(例如,“按高度以 15 分钟块的形式给我数据的 SD”,而不必自己处理索引等。
1赞 Simon Notley 8/20/2019 #2

好的,我们可以做到。所以你的预期输出是一个 2500 长的 4 长列表,对吧?总共 10000 个值?我认为您遇到的问题是您正在尝试分配列表范围之外的值,您不能以这种方式增长列表。

编辑 - 哎呀,这不应该是一个答案。误以为是手机上的评论框。没关系

评论

0赞 zemone 8/20/2019
是的,没错!那么我如何使用这种数据格式来增加列表呢?我试图弄清楚如何 (1) 在每个高度计算 SD,这样我在每个高度级别都剩下一个 SD,给我留下一个 1x2500 列表(对于每个 15 分钟的时间间隔)。然后我需要 (2) 存储此数据,我们将其称为 w1_sd (1x2500),以便稍后可以输出到文本文件(我可以这样做)。
1赞 Simon Notley 8/20/2019
你的回答实际上与我的建议略有不同。在列表列表中,4 个 2500 个列表与 2500 个 4 个列表不同,但无论如何,它都是可行的。您是否特别需要为每个 2500 个单独的文本文件?有什么理由要先将它们放在列表中吗?我们可以在遍历数据时写出每个值。
0赞 zemone 8/20/2019
就是这样,谢谢!你帮了我很多忙。我将阅读有关熊猫以及如何正确地做到这一点。非常感谢!!