微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – pandas和numpy之间std的不同结果

我试图从平均值中减去列中的每个元素并除以标准偏差.我以两种不同的方式(numeric_data1和numeric_data2)完成了它:

import pandas as pd
data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv")
numeric_data = data.drop("color", 1)
numeric_data1 = ((numeric_data - numeric_data.mean()) /
                 numeric_data.std())
numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) /
                 np.std(numeric_data, axis=0))

type(numeric_data1)  # -> pandas.core.frame.DataFrame
type(numeric_data2)  # -> pandas.core.frame.DataFrame

两者都是熊猫数据帧,它们应该具有相同的结果.但是,我得到了不同的结果:

numeric_data2 == numeric_data1  # -> False

我认为问题源于numpy和pandas如何处理数字精度:

numeric_data.mean() == np.mean(numeric_data, axis=0)      # -> True
numeric_data.std(axis=0) == np.std(numeric_data, axis=0)  # -> False

对于平均的numpy和熊猫给了我同样的东西,但对于标准偏差,我得到了一些不同的结果.

我的评估是正确还是我犯了一些错误

解决方法:

在计算标准差时,重要的是您是使用较小的样本量估计整个人口的标准差,还是计算整个人口的标准差.

如果它是较大总体的较小样本,则需要所谓的样本标准差.事实证明,当你将平方差的平方和平均值除以观察数量时,你最终会得到一个有偏差的估计量.我们通过除以观察数量一个来校正它.我们使用参数ddof = 1作为样本标准差来控制,或者ddof = 0作为总体标准差.

事实是,如果您的样本量很大,则无关紧要.但你会看到微小的差异.

使用pandas.DataFrame.std调用中的自由度参数:

import pandas as pd
data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv")
numeric_data = data.drop("color", 1)
numeric_data1 = ((numeric_data - numeric_data.mean()) /
                 numeric_data.std(ddof=0))  # <<<
numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) /
                 np.std(numeric_data, axis=0))

np.isclose(numeric_data1, numeric_data2).all()  # -> True

或者在np.std电话中:

import pandas as pd
data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv")
numeric_data = data.drop("color", 1)
numeric_data1 = ((numeric_data - numeric_data.mean()) /
                 numeric_data.std())
numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) /
                 np.std(numeric_data, axis=0, ddof=1))  # <<<

np.isclose(numeric_data1, numeric_data2).all()  # -> True

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐