2017-03-01 58 views
2

我有一些代码,不明白为什么应用np.std会提供两种不同的结果。不同的结果np.std()在熊猫和独立版本中使用时

import numpy as np 
import pandas as pd 
a = np.array([ 1.5, 6. , 7. , 4.5]) 
print 'mean value is:', a.mean() 
print 'standard deviation is:', np.std(a) 

下一页线应该基本上做同样的只是在一个数据帧大熊猫

base = datetime.datetime(2000, 1, 1) 
arr = np.array([base + datetime.timedelta(days=i) for i in xrange(4)]) 
index_date = pd.Index(arr, name = 'dates') 
data_gas = pd.DataFrame(a, index_date, columns=['value'], dtype=float) 
mean_pandas = data_gas.resample('M').mean() 
standard_deviation = data_gas.resample('M').apply(np.std) 
print mean_pandas 
print standard_deviation 

从np.std的文档,我可以读:“...默认情况下ddof是零。” (ddof = delta自由度)。

np.std(a)提供除数为N(=数值)的标准差,...resample('M').apply(np.std)表示除数为N减1时的标准偏差。造成这种差异的原因是什么?

+0

你能分享你在每种情况下获得的价值吗? –

+0

np.std(a)导致2.0767和standard_deviation送出2.3979 – paulchen

+0

所以如果我理解正确,你的问题是“为什么'.apply(np.std)'使用ddof = 1计算,尽管'np.std'本身使用ddof = 0?”。这是正确的解释吗? –

回答

1

默认情况下,numpy使用总体标准偏差,正如您注意的那样,除数为N,其中N是值的数量。如果你有一个完整的数据集,就使用它。

熊猫版本正在计算样本标准偏差。这有一个N-1的除数,当你有一个更大集合的数据子集时使用它。这可以通过np.std(a, ddof=1)在numpy中实现。

作为一个例子,如果您想测量城市中的鞋号的标准偏差,则可以使用样本标准偏差。衡量每个人的体型是不可行的,所以你使用了从街上的人身上取下的100个鞋号的样本。在这种情况下,您正在使用您的(希望随机的)数据样本来建模一个更大的集合。在大多数情况下,我会说样本标准偏差是你想要的。

如果您不想将结果推广到整个城市,而是想要找到这个100个尺寸的样本的标准偏差,则可以使用总体标准偏差。

+0

非常感谢。我认为你的答案中最重要的两个句子是:Divisor'N'与一个完整的数据集一起使用。当你从一个更大的集合中获得数据的子集时,使用'N-1'(这对我来说最终是真的;我想计算好几个月的月平均值的样本标准偏差......)再次感谢。 – paulchen