Numpy / Pandas关联2个不同长度的数组

时间:2018-07-23 20:50:46

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

我正在尝试为长度不相同的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 datpoints之间变化。虽然我要匹配的功能是标准的。附加图片“ a”。还有其他与这些模式匹配的首选模块吗?

enter image description here

2 个答案:

答案 0 :(得分:2)

参加聚会的时间不算太晚,但是由于这是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 DataFrame具有rolling()方法,该方法采用数组长度长度(window)作为参数。从rolling()返回的对象具有将函数用作参数的apply()方法。例如,您可以使用scipy.stats中的Pearson Correlation coefficient来计算pearsonr

示例输出

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])

enter image description here

带有问题中的示例数据

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

答案 1 :(得分:1)

由于需要成对的数据进行计算,因此您基本上无法计算不同长度的向量之间的相关系数。可以对最短向量进行插值以使其长度相同,但这可能会极大地改变结果,具体取决于插值方法。