我正在研究如何快速实现计算点(X、Y、Z 中)之间的相关性,并在给定搜索方向的情况下测量相关性何时低于某个阈值。我之前提出过一个相关问题计算点之间的相关性,其中每个点都有一个时间序列 https://stackoverflow.com/questions/70390466/calculating-correlation-between-points-where-each-points-has-a-timeseries但我认为我需要重新表述这个问题以使其更清楚。
我有平面上点速度的时间历史,例如 XZ 平面,我想量化用于模拟(CFD 模拟)的分辨率。为此,我想计算点之间的速度时程之间的皮尔逊相关系数,并且我想测量给定轴(例如沿 X 轴)的点数,直到相关性降至某个阈值以下(对于示例 0.8)。
我现在将所有数据都存储在 DataFrame 中,其头部如下所示:
Velocity X Y Z Time
0 -12.125850 2.036 0 1.172 10.42
1 -12.516033 2.036 0 1.164 10.42
2 -11.816067 2.028 0 1.172 10.42
3 -10.722124 2.020 0 1.180 10.42
4 -10.628474 2.012 0 1.188 10.42
...
我想要作为输出在某些方向上的点数,只是作为一个例子
X Y Z CorrDropNrPointsX CorrDropNrPointsZ
0 2.036 0 1.172 5 12
1 2.036 0 1.164 7 21
2 2.028 0 1.172 4 18
3 2.020 0 1.180 12 19
4 2.012 0 1.188 5 22
...
在我当前的实现中,我经常最终使用循环,例如 .iterrows() ,这需要很长时间,因为我的 DataFrame 中可以轻松拥有 300 000 行,所以我需要加快速度。
我现在使用线来检测某个方向沿轴的点数
df_lines = df[[loop_axis]].drop_duplicates()
但平面上的点不一定完全对齐(可能存在 1-e4 m 数量级的微小数值差异,这可能会导致这种方法出现错误,有时这些点可能会结束,因为平面正好穿过几何图形,如果碰巧,点集应该被视为彼此独立,例如对于阈值距离 D_L ~ 1-e2 m。
我之前得到的解决方案非常强大,可以使用以下方法计算所有点之间的相关性
df["cc"] = df.groupby(["X", "Y", "Z"]).cumcount()
df.set_index(["cc","X", "Y", "Z"], inplace=True)
df.unstack(level=[1,2,3])["Velocity"].corr()
然而我意识到这些点在加载时不一定以正确的方式排序,所以这需要完成,对于最终的数据帧,我仍然最终循环遍历行或列来测量相关性何时低于某个阈值。这种方法的另一个问题是,它会计算所有点之间的相关性,因此它将计算 corr(P1,P2) 和 corr(P2,P1) 以及所有点。我不需要计算对角点之间的相关性,而只需要计算定义方向上的相关性。
所有点都具有相同数量的时间点,因此以相同的频率和相同的开始和结束时间对它们进行采样。