2015-07-02 14 views
7

Ho ottenuto due codice snippet come segue.Panda: perché pandas.Series.std() è molto diverso da numpy.std()

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

e

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

Questa è una differenza enorme.

Posso chiedere perché?

+1

Questo appare come un bug in panda mi puoi pubblicare un [problema] (https://github.com/pydata/panda/problemi)? – EdChum

+0

Già segnalato e risposto qui: https://github.com/pydata/pandas/issues/10489 – joris

+0

Dalla discussione nel problema: una soluzione possibile fino a quando non viene risolta è assicurarsi di avere il collo di bottiglia installato. – joris

risposta

2

Questo problema è già in discussione (link); il problema sembra essere l'algoritmo per calcolare la deviazione standard utilizzata da pandas in quanto non è numericamente stabile come quella utilizzata da numpy.

Una soluzione semplice sarebbe quella di applicare .values alla serie prima e quindi applicare std a questi valori; in questo caso numpy'sstd viene utilizzato:

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

che ti dà il valore atteso 0.

+0

Ho notato la differenza dell'algoritmo prima. Qui, non penso che sia la causa. Se vuoi ottenere il risultato '0', il numeratore dovrebbe essere '0'. Quindi, indipendentemente da numpy o panda, il risultato dovrebbe essere lo stesso, '0', poiché la loro differenza riguarda solo il denominatore. Quindi penso che sia un bug. – Tony

+0

È un bug, sono d'accordo. Ecco perché ho pubblicato il link al thread in cui è discusso e presentato il work-around. Cos'altro ti aspettavi da una risposta a questa domanda che accettavi? :) Il bug si basa sull'algoritmo che viene utilizzato (varianza e deviazione standard sono strettamente collegate). – Cleb

+0

Non penso che il bug si riferisca all'algoritmo. Per numpy, lo std è imparziale di 1/n. Per i panda, lo std è polarizzato di 1/(n - 1). Questa è la differenza del loro algoritmo. Quindi, qui il risultato dei panda è 0. Per questo interessante 0, indipendentemente dall'algoritmo, dovrebbero essere uguali. Potete vederlo? Perché se A * 1/(n - 1) = 0, allora A * 1/n = 0. Quindi immagino ci possa essere qualche bug stupido lì dentro ma mi dispiace non avere il tempo di rintracciare. Comunque, grazie mille per il tuo gentile aiuto. – Tony

Problemi correlati