Различные std в pandas против numpy

Стандартное отклонение отличается от pandas и numpy. Почему и какой из них правильный? (относительная разница составляет 3,5%, которая не должна исходить из округления, это, на мой взгляд, высоко).

Пример

import numpy as np
import pandas as pd
from StringIO import StringIO

a='''0.057411
0.024367
 0.021247
-0.001809
-0.010874
-0.035845
0.001663
0.043282
0.004433
-0.007242
0.029294
0.023699
0.049654
0.034422
-0.005380'''


df = pd.read_csv(StringIO(a.strip()), delim_whitespace=True, header=None)

df.std()==np.std(df) # False
df.std() # 0.025801
np.std(df) # 0.024926

(0.024926 - 0.025801) / 0.024926 # 3.5% relative difference

Я использую следующие версии:

pandas: '0.14.0' NumPy: '1.8.1'

Ответ 1

В двух словах ни один из них не является "неправильным". Pandas использует несмещенную оценку (N-1 в знаменателе), тогда как Numpy по умолчанию не делает.

Чтобы заставить их вести себя одинаково, перейдите ddof=1 в numpy.std().

Для дальнейшего обсуждения см.

Ответ 2

Чтобы pandas выполняли то же самое, что и numpy, вы можете передать параметр ddof=0, поэтому df.std(ddof=0).

Это короткое видео объясняет, почему n-1 может быть предпочтительнее для сэмплов. https://www.youtube.com/watch?v=Cn0skMJ2F3c