如何使用Python 3检查十进制数/数据之间的相关性?

11

感谢您的时间。

我正在编写一些代码,检查多组数据之间的相关性。当我使用原始数据时(那时我真的不确定它的格式),它的表现很好,但是在我使用Decimal模块运行数据后,数据集在进行相关性测试时不会出现。

我感到非常愚蠢和新手,我相信这是一个非常简单的修复。

这是我编写的一个小程序,用于演示我的意思。

from decimal import Decimal
import numpy as np
import pandas as pd

a = [Decimal(2.3), Decimal(1.5), Decimal(5.7), Decimal(4.6), Decimal(5.5), Decimal(1.5)]
b = [Decimal(2.1), Decimal(1.2), Decimal(5.3), Decimal(4.4), Decimal(5.3), Decimal(1.7)]

h = [2.3,1.5,5.7,4.6,5.5,1.5]
j = [2.1,1.2,5.3,4.4,5.3,1.7]

corr_data1 = pd.DataFrame({'A': a, 'B': b}) 

corr_data2 = corr_data1.corr()
print(corr_data2)

corr_data3 = pd.DataFrame({'H': h, 'J': j})

corr_data4 = corr_data3.corr()
print(corr_data4)

列表A和B以及H和F的数据完全相同,唯一的区别在于A和B是十进制格式的数字,而H和F不是。

当程序运行时,A和B返回:

Empty DataFrame
Columns: []
Index: []

并且 H & J 返回:

          H         J
H  1.000000  0.995657
J  0.995657  1.000000

我如何做到在运行方程式后使用数据?

对不起,问题有点愚蠢,谢谢你花时间回答。祝大家假期愉快!


1
实际上,在我审查过的所有用户提出的第一个问题中,你的问题写得最好,示例代码也最多。赞一个好问题的交流方式。 - Jon Doe
我认为numpy或pandas本身不支持Decimal类型。Pandas将您的数组视为对象数组。如果您希望pandas将它们视为数字,则需要转换为浮点数。 - BrenBarn
您的Decimal对象列表将被转换为object类型的DataFramenumpy数组。 corr_data1.dtypes。某些数学操作适用于对象数组,但有时会碰壁。corr就是其中之一。corr.data1._get_numeric_data()无法获取任何数据。 - hpaulj
3个回答

4

Pandas无法将数据识别为数字值。以下是如何将您的数据转换为浮点数。

corr_data1.astype(float).corr()

#           A         B
# A  1.000000  0.995657
# B  0.995657  1.000000

这种方法应该可以工作,但实际上并没有。

pd.to_numeric(corr_data1['A'], errors='coerce')

# 0   NaN
# 1   NaN
# 2   NaN
# 3   NaN
# 4   NaN
# 5   NaN

3
Pandas没有专门支持Decimal类型,因此将其视为“object”类型。这意味着像`.corr`这样仅对数字列操作的方法不会将Decimal值列视为数字。许多numpy和scipy函数也无法正确地操作Decimals,因为Decimal对象无法与普通浮点数结合在数学运算中。(似乎`scipy.stats.pearsonr`不起作用,但`scipy.stats.spearmanr`可以。) 对于numpy/pandas中的大多数数值操作,您需要将数据转换为浮点数。

1
除了其他优秀的答案描述了你需要浮点数来进行相关性计算,你输入 Decimal 值的策略是有问题的。
a = [Decimal(2.3), Decimal(1.5), Decimal(5.7), Decimal(4.6), 
     Decimal(5.5), Decimal(1.5)]

产出:

[Decimal('2.29999999999999982236431605997495353221893310546875'), 
 Decimal('1.5'),  
 Decimal('5.70000000000000017763568394002504646778106689453125'), 
 Decimal('4.5999999999999996447286321199499070644378662109375'), 
 Decimal('5.5'), 
 Decimal('1.5')]

这很遗憾,因为您费尽心思输入了精确的十进制表示,但Python将它们作为浮点文字,并在它们到达Decimal()构造函数的安全港之前,强加了二进制浮点的丑陋不准确性。对于一些幸运的值,如1.5,没有问题。float完美地表示它们。但对于像2.3这样的其他值,邪恶迅速降临。
考虑以下替代方案:
a = [Decimal('2.3'), Decimal('1.5'), Decimal('5.7'), Decimal('4.6'), 
     Decimal('5.5'), Decimal('1.5')]

或者由于这太笨重:

a = [Decimal(x) for x in '2.3,1.5,5.7,4.6,5.5,1.5'.split(',')]

两者都可以给您所需的整洁、精确的小数:

[Decimal('2.3'),
 Decimal('1.5'),
 Decimal('5.7'),
 Decimal('4.6'),
 Decimal('5.5'),
 Decimal('1.5')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接