【问题标题】:How to compute 15-min standard deviations of a minutely dataset?如何计算分钟数据集的 15 分钟标准差?
【发布时间】:2019-08-14 20:02:34
【问题描述】:

我有一个数组,raytimes,它是一小时的一小部分,例如 [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。 然后我需要计算每个特定高度级别的标准。

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 分钟块内的时间相对应的 vrs 列表? 然后我如何计算保持高度网格的标准,所以标准是沿着每个高度计算的?我最终应该得到相同的数组大小 2500。

【问题讨论】:

  • 您应该使用if...elif...elif...else 而不是if...if...if...if。就像现在一样,您的最后一个条件独立于您之前的条件。您还会忽略数字恰好位于边界之一的情况,例如,您没有任何 &lt;=&gt;=
  • 你能再解释一下这两个数组吗? Raytimes 只是长度为 11 的一维数组,对吗?那么你有一个包含速度测量值的数组 vr 吗?你谈论它们对应于特定的时间和高度,但你没有告诉我们你如何知道每个 vr 元素来自哪个时间,你根本没有解释高度来自哪里。数字 108 只是出现在句子的中间,这是什么意思?
  • 感谢 elif 提示 - 会的。是的,raytimes 是一个长度为 108 的一维列表。Vr 是一个 108 维的浮点列表,每个长度为 2500。高度是一个长度为 2500 的列表,它的值永远不会改变。因此,在每个高度,每次都有一个 vr。我希望澄清一下?
  • 好的,那么您已经在 2500 个不同的高度测量了 108 个不同时间的速度?如果它以 0.1 的步长从 0 变为 1,那么你的光线时间如何有 108 次?我稍后会给你写一个答案,但只是为了我的信息,数据是如何以这种格式获得的?这种类型的科学计算通常使用 numpy 数组或 pandas 数据帧而不是列表,因为它们更容易解决像您这样的问题。
  • 我同意这是一种粗暴的方式来编写代码 - 必须有一个更优雅的解决方案,我可以根据时间对 VR 进行分组,然后计算每个高度的 STD....

标签: python list std


【解决方案1】:

这是我可以根据您的反馈改进的答案的开头。请注意,这并不是真正转换数据的好方法,我只是想演示如何将您的代码移向给出您想要的答案的东西。在这里,我假设您想要一个按高度和 15 分钟周期分组的 SD;所以这是 10000 个结果。如果您真的想要 SD 超过高度或其他一些分组功能,请在 cmets 中告诉我。我还从您上面所说的假设 vr 是列表列表。特别是长度为 2500 的列表中长度为 108 的列表。如果这不正确,请发表评论。

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

编辑 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 = []

【讨论】:

  • 谢谢,这确实让我更接近了!回答你的问题:raytimes 是 108;我使用的示例 (0.1, 0.2) 只是一个示例。它实际上更像(0.01、0.019 等)。我需要SD超过高度。数组 w1、w2 等当前为 1x67473。我需要将每个“射线”分开,以便我可以在每个高度获取标准。 w1 应该是一个数组数组,每个数组的结构都与 vr [1x2500] 相同。对于 w1 到 w4,我应该有大约 27 个数组,每个数组的长度为 2500。然后我需要为每个高度(2500x)取 27 个数字的 std,以获得作为高度函数的 std。
  • 更新代码:w1 = [] w2 = [] w3 = [] w4 = [] for j,h in enumerate(Height): for i,t in enumerate(raytimes): if raytimes[ i] 0.25) & (raytimes[i] 0.5) & (raytimes[i]
  • 但是我不知道如何分离出 w1.我尝试连接但没有运气。我想分配 w1[X] = append(vr[i][j]) 其中 X 是每条新射线
  • 好的,好消息是我在回答中尝试做的似乎符合您的要求。坏消息是,因为我忘记在每个循环之间清除 w1、w2、w3 等,它们会变得越来越长,这不是我的本意。我打算从这里打印 10000 行,每行一个高度,四个周期之一,我认为这就是你想要的。我会尝试重新审视我的答案。现在你正在取得进展,我真的建议你查看 numpy 数组而不是列表,因为我认为它们会符合你的耳朵或思考得更好。
  • 我再次更新了我的答案。在这个阶段我可能不会费心切换到 numpy,因为差异会非常小。但是,您可能需要考虑在数据库(或 pandas,它在 Python 中为您提供类似数据库的结构)中处理此类数据。最大的优势是数据实际上是有意义地附加到标签上的,因此您可以简单地根据标签查询数据(例如,“按高度给我十五分钟块中的数据的 SD”,而不必处理自己索引等。
【解决方案2】:

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

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

【讨论】:

  • 是的,没错!那么如何使用这种数据格式来增加列表呢?我试图弄清楚如何(1)计算每个高度的 SD,所以我在每个高度级别都留下一个 SD,留下一个 1x2500 列表(每 15 分钟的时间间隔)。然后我需要 (2) 存储这些数据,我们称之为 w1_sd (1x2500),这样我可以稍后输出到文本文件(我可以这样做)。
  • 您的回答实际上与我的建议略有不同。在列表列表中,2500 的 4 列表与 4 的 2500 列表不同,但无论如何,它都是可行的。您是否特别需要为每个 2500 个单独的文本文件?有什么理由要先将它们保存在列表中吗?我们可以在遍历数据时写出每个值。
  • 就是这样,谢谢!你帮了很多忙。我将阅读熊猫以及如何正确完成这一切。非常感谢!
猜你喜欢
  • 2019-09-28
  • 2023-04-03
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多