2015-07-02 1 views
7

Mam dwa kody fragmentu w następujący sposób.Pandy: dlaczego pandas.Series.std() różni się od numpy.std()

import numpy 
numpy.std([766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346]) 
0 

i

import pandas as pd 
pd.Series([766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346]).std(ddof=0) 
10.119288512538814 

To ogromna różnica.

Czy mogę zapytać, dlaczego?

+1

To wygląda jak błąd w pand mi możesz wysyłać [problem] (https://github.com/pydata/pandas/issues)? – EdChum

+0

Już zgłoszone i odebrane tutaj: https://github.com/pydata/pandas/issues/10489 – joris

+0

Z dyskusji w numerze: możliwe rozwiązanie, dopóki nie zostanie naprawiony, to upewnić się, że masz zainstalowane wąskie gardło. – joris

Odpowiedz

2

Ta kwestia jest już obecnie przedmiotem dyskusji (link); problem wydaje się być algorytmem do obliczania odchylenia standardowego, które jest używane przez pandas, ponieważ nie jest tak stabilny numerycznie jak ten używany przez numpy.

Łatwo obejść, to najpierw zastosować .values do serii, a następnie zastosować std do tych wartości; w tym przypadku numpy'sstd jest stosowany:

pd.Series([766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346, 766897346]).values.std() 

co daje wartość oczekiwaną 0.

+0

Zauważyłem wcześniej różnicę algorytmu. Tutaj nie sądzę, że to jest przyczyną. Jeśli chcesz uzyskać wynik "0", licznik powinien wynosić "0". Więc bez znaczenia numpy lub pandy, wynik powinien być taki sam, "0", ponieważ ich różnica dotyczy tylko mianownika. Myślę, że tutaj jest to błąd. – Tony

+0

To błąd, zgadzam się. Właśnie dlatego zamieściłem link do wątku, w którym jest omawiany i przedstawiłem obejście. Czego jeszcze oczekiwałeś od odpowiedzi na to pytanie, które zaakceptowałbyś? :) Błąd jest oparty na używanym algorytmie (wariancja i odchylenie standardowe są ze sobą ściśle powiązane). – Cleb

+0

Nie sądzę, że błąd dotyczy algorytmu. Dla numpy, std jest nieobciążony przez 1/n. W przypadku pand, std jest stronniczy o 1/(n - 1). To jest różnica ich algorytmu. Tutaj wynik z pandy wynosi 0. Dla tego interesującego 0, bez względu na to, który algorytm powinien być taki sam. Możesz to zobaczyć? Bo jeśli A * 1/(n - 1) = 0, to A * 1/n = 0. Zgaduję więc, że może tam być jakaś głupia robota, ale przykro mi, że nie mam czasu do namierzenia. W każdym razie, wielkie dzięki za życzliwą pomoc. – Tony