如何计算分钟数据集的 15 分钟标准差?
How to compute 15-min standard deviations of a minutely dataset?
我有一个数组 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。
这是一个答案的开头,我可以根据您的反馈对其进行完善。请注意,这并不是真正转换数据的好方法,我只是想演示如何将您的代码移动到可以提供您想要的答案的地方。在这里,我假设您想要一个按身高和 15 分钟周期分组的 SD;所以这是 10000 个结果。如果您真的想要 SD over height 或其他一些分组功能,请在评论中告诉我。根据你上面所说的,我还假设 vr 是一个列表列表。特别是长度为 108 的列表和长度为 2500 的列表。如果不正确,请发表评论。
编辑 - 我意识到您使用我无意中复制的 for 循环的方式存在根本性错误。您使用 i 作为索引,但 i 是项目的实际值。如果你想要项目的位置,你需要使用枚举。请参阅下面的示例,我已将 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 个值?我认为你遇到的问题是你试图在列表范围之外分配值,你不能那样增加列表。
编辑 - 糟糕,这不应该是一个答案。误认为是手机上的评论框。没关系
我有一个数组 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。
这是一个答案的开头,我可以根据您的反馈对其进行完善。请注意,这并不是真正转换数据的好方法,我只是想演示如何将您的代码移动到可以提供您想要的答案的地方。在这里,我假设您想要一个按身高和 15 分钟周期分组的 SD;所以这是 10000 个结果。如果您真的想要 SD over height 或其他一些分组功能,请在评论中告诉我。根据你上面所说的,我还假设 vr 是一个列表列表。特别是长度为 108 的列表和长度为 2500 的列表。如果不正确,请发表评论。
编辑 - 我意识到您使用我无意中复制的 for 循环的方式存在根本性错误。您使用 i 作为索引,但 i 是项目的实际值。如果你想要项目的位置,你需要使用枚举。请参阅下面的示例,我已将 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 个值?我认为你遇到的问题是你试图在列表范围之外分配值,你不能那样增加列表。
编辑 - 糟糕,这不应该是一个答案。误认为是手机上的评论框。没关系