【问题标题】:Numpy/Pandas correlate 2 arrays of different lengthNumpy/Pandas 关联 2 个不同长度的数组
【发布时间】:2018-07-23 20:50:45
【问题描述】:

我正在尝试计算 2 个长度不同的数据集的相关系数。以下代码仅适用于等长数组。

import numpy as np
from scipy.stats.stats import pearsonr

a = [0, 0.4, 0.2, 0.4, 0.2, 0.4, 0.2, 0.5]
b = [25, 40, 62, 58, 53, 54]

print pearsonr(a, b)

在我的情况下,b 向量长度可以在 50 到 100 个数据点之间变化。虽然我要匹配的功能是标准的。附上a 的图片。是否有其他首选模块可以匹配此类模式?

【问题讨论】:

  • 要计算相关系数,您必须知道a 中的点如何与b 中的点匹配。那么如果b 的大小不同,你怎么知道a 中的哪些点映射到b?这似乎更像是一个数学问题而不是一个 numpy 问题。
  • 我同意。我现在已经添加了相关标签。我希望如果有人用 python/numpy 解决同样的问题。

标签: python numpy math pattern-matching pearson-correlation


【解决方案1】:

晚会有点晚了,但由于这是 Google 的最高结果,我会为这个问题提供一个可能的答案:

import pandas as pd
from scipy.stats import pearsonr 
import numpy as np 


a = [ 0, 0.4, 0.2, 0.4, 0.2, 0.45, 0.2, 0.52, 0.52, 0.4, 0.21, 0.2, 0.4, 0.51]
b = [ 0.4, 0.2, 0.5]


df = pd.DataFrame(dict(x=a))

CORR_VALS = np.array(b)
def get_correlation(vals):
    return pearsonr(vals, CORR_VALS)[0]

df['correlation'] = df.rolling(window=len(CORR_VALS)).apply(get_correlation)

说明

pandas DataFrames 具有 rolling() 方法,该方法将数组长度 (window) 作为参数。从rolling() 返回的对象具有将函数作为参数的apply() 方法。例如,您可以使用来自 scipy.stats 的 pearsonr 计算 Pearson Correlation coefficient

示例输出

In [2]: df['correlation'].values
Out[2]:
array([        nan,         nan, -0.65465367,  0.94491118, -0.94491118,
        0.98974332, -0.94491118,  0.9923356 , -0.18898224, -0.75592895,
       -0.44673396,  0.1452278 ,  0.78423011,  0.16661846])

用问题中的示例数据

In [1]: df
Out[1]:
     x  correlation
0  0.0          NaN
1  0.4          NaN
2  0.2          NaN
3  0.4          NaN
4  0.2          NaN
5  0.4     0.527932
6  0.2    -0.159167
7  0.5     0.189482

【讨论】:

    【解决方案2】:

    您基本上无法计算不同长度向量之间的相关系数,因为您需要配对数据进行计算。您可以对最短的向量进行插值,以使它们具有相同的长度,但这可能会显着改变结果,具体取决于插值方法。

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2021-06-10
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 2013-09-05
      相关资源
      最近更新 更多