计算每个点具有时间序列的点之间的相关性相关性、序列、时间

2023-09-03 14:14:09 作者:繁华落尽√空城伤

我需要一些建议,如何更快地编写代码来解决我的问题。我正在研究如何计算空间(X,Y,Z)中的点之间的相关性,其中对于每个点,我有随时间变化的速度数据,理想情况下,我希望每个点P1计算与所有其他点的速度相关性。

最后,我希望有一个矩阵,对于每一对坐标(X1,Y1,Z1),(X2,Y2,Z2),我得到皮尔逊相关系数。我不完全确定如何用Python语言最好地组织这项工作。到目前为止,我所做的是定义了不同方向上的点的线,并为每条线计算点之间的相关性。这对分析是有效的,但我最终会执行需要很长时间的循环,我认为只计算所有点之间的相关性会更好。现在,我正在使用Pandas DataFrame和statsModels进行关联(stats.peelsonr(point_X_time.Vx,point_Y_time.Vx)),这是可行的,但我不知道如何有效地将其并行化。

我现在有一个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
时间序列和回归分析有什么本质区别

行数约为300,000行,但如果代码速度更快,行数很容易增加。

推荐答案

解决方案1:

groups = df.groupby(["X", "Y", "Z"])

您按空间中的点对数据进行分组。

然后迭代所有点的组合并计算相关性

import itertools
import numpy as np
for combinations in itertools.combinations(groups.groups.keys(),2):
    first = groups.get_group(combinations[0])["Velocity"]
    second = groups.get_group(combinations[1])["Velocity"]
    if len(first) == len(second):
        print(f"{combinations} {np.corrcoef(first, second)[0,1]:.2f}")

解决方案2:

df["cc"] = df.groupby(["X", "Y", "Z"]).cumcount()
df.set_index(["cc","X", "Y", "Z"])
df.unstack(level=[1,2,3])["Velocity"].corr()