Pearsonr:TypeError:没有找到与指定签名和转换匹配的循环,用于 ufunc add

Posted

技术标签:

【中文标题】Pearsonr:TypeError:没有找到与指定签名和转换匹配的循环,用于 ufunc add【英文标题】:Pearsonr: TypeError: No loop matching the specified signature and casting was found for ufunc add 【发布时间】:2020-09-06 19:08:05 【问题描述】:

我有一个名为“df”的时间序列 Pandas 数据框。它具有一列和以下形状:(2000, 1)。下面的数据框的头部显示了它的结构:

            Weight
Date    
2004-06-01  1.9219
2004-06-02  1.8438
2004-06-03  1.8672
2004-06-04  1.7422
2004-06-07  1.8203

目标

我正在尝试使用“for-loop”来计算“权重”变量在不同时间范围或时滞上的百分比变化之间的相关性。这样做是为了评估在不同时间段内饲养牲畜的影响。

循环可以在下面找到:

from scipy.stats.stats import pearsonr

# Loop for producing combinations of different timelags and holddays 
# and calculating the pearsonr correlation and p-value of each combination 

for timelags in [1, 5, 10, 25, 60, 120, 250]:
    for holddays in [1, 5, 10, 25, 60, 120, 250]:
        weight_change_lagged = df.pct_change(periods=timelags)
        weight_change_future = df.shift(-holddays).pct_change(periods=holddays)

        if (timelags >= holddays):
            indepSet=range(0, weight_change_lagged.shape[0], holddays)
        else:
            indepSet=range(0, weight_change_lagged.shape[0], timelags)

        weight_change_lagged = weight_change_lagged.iloc[indepSet]
        weight_change_future = weight_change_future.iloc[indepSet]

        not_na = (weight_change_lagged.notna() & weight_change_future.notna()).values

        (correlation, p-value)=pearsonr(weight_change_lagged[not_na], weight_change_future[not_na])
        print('%4i %4i %7.4f %7.4f' % (timelags, holddays, correlation, p-value))

循环执行良好,但是在计算 pearsonr 相关性和 p 值时失败,即在此部分:

(correlation, p-value)=pearsonr(weight_change_lagged[not_na], weight_change_future[not_na])

它会产生这个错误:

TypeError:没有循环匹配指定的签名和强制转换是 为 ufunc 添加找到

有人知道如何解决我的问题吗?我looked through the forums 并没有找到符合我确切要求的答案。

【问题讨论】:

这个pearsonr 来自哪里?听起来参数有一个无法使用的dtype,即使使用像add 这样的简单操作也是如此。试试np.array(weight_change_lagged[not_na]) 并报告它的dtypeshape 它来自 Scipy 统计数据:docs.scipy.org/doc/scipy-0.14.0/reference/generated/…。尝试您的建议后会报告 【参考方案1】:

通过随机修补,我设法解决了我的问题:

scipy 的 pearsonr 包只接受数组或类似数组的输入。这意味着:

输入变量的 Numpy 数组有效。 Pandas 系列的输入变量有效。

但是,变量的完整 Pandas Dataframes,即使它们包含一列,也不起作用。

所以,我将有问题的代码段编辑如下:

# Define an object containing observations that are not NA
not_na = (weight_change_lagged.notna() & weight_change_future.notna()).values

# Remove na values before inputting the data into the peasonr function (not within the function as I had done):
weight_change_lagged = weight_change_lagged[not_na]
weight_change_future = weight_change_future[not_na]

# Input Pandas Series of the Future and Lagged Variables into the function
(correlation, p-value)=pearsonr(weight_change_lagged['Weight'], weight_change_future['Weight'])

只需稍作修改,代码就可以顺利执行。

注意:

如果你使用双方括号,如下所示,你输入的是pandas数据框而不是系列,pearsonr函数会报错:

weight_change_future[['Weight']]

感谢所有尝试提供帮助的人,您的问题引导我找到答案。

【讨论】:

【参考方案2】:

就我而言,这不是数据类型问题,而是因为维度错误。感谢文章https://programmersought.com/article/67803965109/

【讨论】:

嗨。也许您可以澄清一下-您遇到了与 OP 相同的问题,但出于不同的原因?如果是这样,这可能是一个有价值的附加答案,即使有一个公认的答案,它也可以帮助其他人。此外,由于互联网链接不一定是永久性的,因此如果您能总结一下您从链接中学到的知识,将会很有帮助(您也可以留下链接)。

以上是关于Pearsonr:TypeError:没有找到与指定签名和转换匹配的循环,用于 ufunc add的主要内容,如果未能解决你的问题,请参考以下文章

SciPy PearsonR ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

TypeError:没有'new'就不能调用类构造函数MixinStrategy

Node.js:在没有返回记录的 SQL 查询中:TypeError:无法读取未定义的属性

Webpack - TypeError:$ 不是函数

TypeError:无法读取未定义的属性“cwd”

TypeError: this.props.sendKitchen 不是一个函数……为啥?