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

Calculating correlation between points where each points has a timeseries(计算每个点具有时间序列的点之间的相关性)

本文介绍了计算每个点具有时间序列的点之间的相关性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一些建议,如何更快地编写代码来解决我的问题。我正在研究如何计算空间(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()

这篇关于计算每个点具有时间序列的点之间的相关性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:计算每个点具有时间序列的点之间的相关性