![](/img/trans.png)
[英]I want to extract all decimal numbers from a string in python 3, how can I do that without using regex?
[英]How do I check for correlation using Decimal numbers/data with python 3
感谢您的时间。
我正在编写一些代码来检查多组数据之间的相关性。 当我使用原始数据时(我真的不确定它在那时的格式),它工作得很好,但是在使用Decimal模块通过某些方程式运行数据之后,数据集在测试时不会显示用于相关
我觉得非常愚蠢和新lol,我相信这是一个非常容易解决的问题。
这是我写的一个小程序来演示我的意思。
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
我怎么做到这样我可以在运行我的方程后使用数据?
抱歉这个愚蠢的问题,谢谢你的时间。 我希望你们一切顺利,节日快乐!
Pandas不会将数据识别为数值。 以下是将数据转换为float的方法。
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
Pandas对Decimal类型没有任何特殊支持,因此它被视为“对象”类型。 这意味着像.corr
这样只对数字列进行操作的方法不会将十进制值列视为数字。 许多numpy和scipy函数也不能在Decimals上正常运行,因为在数学运算中Decimal对象不能与普通浮点数组合。 (看起来像scipy.stats.pearsonr
不起作用,但scipy.stats.spearmanr
确实如此。)
对于numpy / pandas中的大多数数值运算,您需要将数据转换为浮点数。
除了描述如何为相关性提供浮点值的其他精细答案之外,您输入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这样的人来说,邪恶迅速下降。
请考虑一下:
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')]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.