我有一些代码并且不明白为什么应用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)
下一行基本上应该只在pandas数据框中执行相同的操作
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 :(得分:2)
默认情况下,numpy使用总体标准偏差,正如您所记录的那样,其除数为N
,其中N
是值的数量。如果您有完整的数据集,则使用此选项。
pandas版本正在计算样本标准差。它有一个N-1
的除数,当你有一个较大集合的数据子集时使用。这可以通过np.std(a, ddof=1)
numpy实现。
例如,如果您想测量您所在城市的鞋码标准偏差,您可以使用样本标准偏差。测量每个人的大小是不可行的,因此您使用的是从街上的人那里获得的100个鞋码测量样本。在这种情况下,您使用(希望是随机的)数据样本来建模更大的集合。在大多数情况下,我会说样本标准差是你想要的。
如果您不希望将结果推广到整个城市,而是想要找到100个尺寸的样本的标准偏差,那么您将使用人口标准偏差。