每个点都有时间序列的点之间的相关性下降

2024-03-05

我正在研究如何快速实现计算点(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) 以及所有点。我不需要计算对角点之间的相关性,而只需要计算定义方向上的相关性。

所有点都具有相同数量的时间点,因此以相同的频率和相同的开始和结束时间对它们进行采样。


我想我有点明白你想要什么。

corr_df = df.unstack(level=[1,2,3])["Velocity"].corr()

相关矩阵可以排序。

corr_df.sort_index(level=0, inplace=True)

0 代表 X,1 代表 Y,2 代表 Z。

您说您想要相关性大于 0.80 的点数。

corr_df_x = corr_df.sort_index(level=0)
corr_df_y = corr_df.sort_index(level=1)
corr_df_z = corr_df.sort_index(level=2)

然后您创建一个连续计数 > 0.8 的系列。这是与列中第一点的比较:

x_df = (df.iloc[:,0].sort_index(level=0)  
       .groupby(df.iloc[:,0].gt(0.8).sort_index(level=0)
       .ne(df.iloc[:,0].gt(0.8).sort_index(level=0).shift())
       .cumsum())
       .transform(lambda x: np.arange(1,len(x)+1)[::-1]))
x_df = x_df.where(df.sort_index(level=0).iloc[:,0].gt(0.8),0)

因此 x_df 将按 X 排序,对于每个点,它将显示从该点到 x 方向大于 0.8 的点数,包括当前点。我认为你需要合并,但我不确定 100% 你想要什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个点都有时间序列的点之间的相关性下降 的相关文章

随机推荐