如何使用带有 python 3 的十进制数/数据检查相关性
Posted
技术标签:
【中文标题】如何使用带有 python 3 的十进制数/数据检查相关性【英文标题】:How do I check for correlation using Decimal numbers/data with python 3 【发布时间】:2017-05-03 11:11:53 【问题描述】:感谢您的宝贵时间。
我正在编写一些代码来检查多组数据之间的相关性。当我使用原始数据时效果很好(老实说,我不确定当时它是哪种格式),但是在我使用 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
如何制作它,以便在通过我的方程式运行数据后利用这些数据?
抱歉这个愚蠢的问题,感谢您抽出宝贵时间。希望你们一切都好,节日快乐!
【问题讨论】:
实际上,在我审查过的用户提出的所有第一个问题中,你有一个写得最好的问题,其中包含最多的示例代码。一个很好沟通的问题的道具。 我不认为 numpy 或 pandas 支持 Decimal 类型。 Pandas 将您的数组视为对象数组。如果您希望熊猫将它们视为数字,我认为您需要转换为浮点数。 您的Decimal
对象列表将转换为object
dtype DataFrame
或numpy
数组。 corr_data1.dtypes
。一些数学运算适用于对象数组,但它是命中注定的。 corr
就是其中之一。 corr.data1._get_numeric_data()
空了。
【参考方案1】:
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
【讨论】:
【参考方案2】:Pandas 对 Decimal 类型没有任何特殊支持,因此将其视为“对象”类型。这意味着像 .corr
这样只对数字列进行操作的方法不会将小数列视为数字。许多 numpy 和 scipy 函数也无法在 Decimals 上正常运行,因为 Decimal 对象不能与数学运算中的普通浮点数组合。 (看起来scipy.stats.pearsonr
不起作用,但scipy.stats.spearmanr
起作用。)
对于 numpy/pandas 中的大多数数值运算,您需要将数据转换为浮点数。
【讨论】:
【参考方案3】:除了描述您将如何需要浮点值进行相关性的其他很好的答案之外,您输入 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 将它们视为 float
文字,并在它们到达安全港之前将二进制浮点的丑陋不精确性强加于它们Decimal()
构造函数。对于一些幸运值,比如1.5,是没有问题的。 float
代表他们在现场。对于 2.3 等其他版本,Evil 迅速下降。
请考虑:
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')]
【讨论】:
以上是关于如何使用带有 python 3 的十进制数/数据检查相关性的主要内容,如果未能解决你的问题,请参考以下文章