提问人:zemone 提问时间:8/15/2019 更新时间:8/20/2019 访问量:76
如何计算一分钟数据集的 15 分钟标准差?
How to compute 15-min standard deviations of a minutely dataset?
问:
我有一个数组,射线时间,它是一小时的分数,例如,[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。
答:
这是一个答案的开始,我可以根据你的反馈进行完善。请注意,这并不是实际转换数据的好方法,我只是想演示如何将代码移动到给出您想要的答案的东西。在这里,我假设您想要一个按高度和 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 = []
评论
好的,我们可以做到。所以你的预期输出是一个 2500 长的 4 长列表,对吧?总共 10000 个值?我认为您遇到的问题是您正在尝试分配列表范围之外的值,您不能以这种方式增长列表。
编辑 - 哎呀,这不应该是一个答案。误以为是手机上的评论框。没关系
评论
if...elif...elif...else
if...if...if...if
<=
>=