Подмодуль Scipy Spatial отклоняет Numpy массив - PullRequest
1 голос
/ 17 февраля 2020

У меня есть датафрейм с именем "df", с 4 столбцами. Три столбца являются независимыми переменными: x1, x2 и x3. И, другая переменная, y, является зависимой переменной

Я хотел бы рассчитать расстояние, "pdist" между зависимой переменной и каждой из зависимых переменных, поэтому я сначала преобразовал каждый столбец в numpy массив выглядит следующим образом:

y = df[["y"]].values
x1 = df[["x1"]].values
x2 = df[["x2"]].values
x3 = df[["x3"]].values

Когда я передаю эти массивы через этот конвейер кодирования, я получаю от Github:

import numpy as np
from scipy.spatial.distance import pdist

def distance_correlation(Xval, Yval, pval=True, nruns=500):    

    X, Y = np.atleast_1d(Xval),np.atleast_1d(Yval)     
    if np.prod(X.shape) == len(X):X = X[:, None]     
    if np.prod(Y.shape) == len(Y):Y = Y[:, None]     
    X, Y = np.atleast_2d(X),np.atleast_2d(Y)    
    n = X.shape[0]     
    if Y.shape[0] != X.shape[0]:raise ValueError('Number of samples must match')     
    a, b = squareform(pdist(X)),squareform(pdist(Y))    
    A = a - a.mean(axis=0)[None, :] - a.mean(axis=1)[:, None] + a.mean()    
    B = b - b.mean(axis=0)[None, :] - b.mean(axis=1)[:, None] + b.mean()     
    dcov2_xy = (A * B).sum() / float(n * n)     
    dcov2_xx = (A * A).sum() / float(n * n)     
    dcov2_yy = (B * B).sum() / float(n * n)     
    dcor = np.sqrt(dcov2_xy) / np.sqrt(np.sqrt(dcov2_xx) * np.sqrt(dcov2_yy))     
    if pval:         
        greater = 0         
        for i in range(nruns):             
            Y_r = copy.copy(Yval)             
            np.random.shuffle(Y_r)          
            if distcorr(Xval, Y_r, pval=False) > dcor:                 
                greater += 1         
        return (dcor, greater / float(nruns))     
    else:         
        return dcor

distance_correlation(x1, y, pval=True, nruns=500)

Я получаю эту ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-32-c720c9df4e97> in <module>
----> 1 distance_correlation(bop_sp500, price, pval=True, nruns=500)

<ipython-input-17-e0b3aea12c32> in distance_correlation(Xval, Yval, pval, nruns)
      9     n = X.shape[0]
     10     if Y.shape[0] != X.shape[0]:raise ValueError('Number of samples must match')
---> 11     a, b = squareform(pdist(X)),squareform(pdist(Y))
     12     A = a - a.mean(axis=0)[None, :] - a.mean(axis=1)[:, None] + a.mean()
     13     B = b - b.mean(axis=0)[None, :] - b.mean(axis=1)[:, None] + b.mean()

~\Anaconda3\lib\site-packages\scipy\spatial\distance.py in pdist(X, metric, *args, **kwargs)
   1997     s = X.shape
   1998     if len(s) != 2:
-> 1999         raise ValueError('A 2-dimensional array must be passed.')
   2000 
   2001     m, n = s

ValueError: A 2-dimensional array must be passed..

Может кто-нибудь определить, где я иду не так? Я знаю, что ошибка возникает из-за способа, которым я создал свои numpy массивы. Но я не знаю, как это исправить.

Пожалуйста, объясните это примерами, которые используют мои определения переменных. Я новичок в Python

1 Ответ

0 голосов
/ 18 февраля 2020

Хорошо, так что мне, наконец, удалось выяснить причину проблемы, с которой я столкнулся:

Массив Numpy, который подавался в вспомогательную функцию, был двумерным массивом.

В то время как вспомогательная функция требовала "Numpy vector"; то есть массив 1d Numpy.

Лучший способ создать его - использовать функцию numpy .ravel () . Следовательно, для моих наборов данных код будет следующим (для простоты я разбил шаги):

# Create Arrays
y = df[["y"]].values
x1 = df[["x1"]].values
x2 = df[["x2"]].values
x3 = df[["x3"]].values

# Ravel Them
y = y.ravel()
x1 = x1.ravel()
x2 = x2.ravel()
x3 = x3.ravel()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...