Pandas: por qué pandas.Series.std () es diferente de numpy.std ()

Otra actualización: resuelta (ver comentarios y mi propia respuesta).

Actualización: esto es lo que estoy tratando de explicar.

>>> pd.Series([7,20,22,22]).std() 7.2284161474004804 >>> np.std([7,20,22,22]) 6.2599920127744575 

Respuesta: esto se explica por la corrección de Bessel , N-1 lugar de N en el denominador de la fórmula de desviación estándar. Ojalá Pandas usara la misma convención que numpy.


Hay una discusión relacionada aquí , pero sus sugerencias tampoco funcionan.

Tengo datos sobre muchos restaurantes diferentes. Aquí está mi dataframe (imagine más de un restaurante, pero el efecto se reproduce con solo uno):

 >>> df restaurant_id price id 1 10407 7 3 10407 20 6 10407 22 13 10407 22 

Pregunta: r.mi.groupby('restaurant_id')['price'].mean() devuelve el precio significa para cada restaurante. Quiero obtener las desviaciones estándar. Sin embargo, r.mi.groupby('restaurant_id')['price'].std() devuelve valores incorrectos .

Como puede ver, para simplificar, solo he extraído un restaurante con cuatro artículos. Quiero encontrar la desviación estándar del precio. Solo por asegurar:

 >>> np.mean([7,20,22,22]) 17.75 >>> np.std([7,20,22,22]) 6.2599920127744575 

Podemos obtener los mismos valores (correctos) con

 >>> np.mean(df) restaurant_id 10407.00 price 17.75 dtype: float64 >>> np.std(df) restaurant_id 0.000000 price 6.259992 dtype: float64 

(Por supuesto, no np.std(df) cuenta el ID de restaurante medio). Obviamente, np.std(df) no es una solución cuando tengo más de un restaurante. Así que estoy usando groupby .

 >>> df.groupby('restaurant_id').agg('std') price restaurant_id 10407 7.228416 

¡¿Qué?! 7.228416 no es 6.259992.

Intentemoslo de nuevo.

 >>> df.groupby('restaurant_id').std() 

La misma cosa.

 >>> df.groupby('restaurant_id')['price'].std() 

La misma cosa.

 >>> df.groupby('restaurant_id').apply(lambda x: x.std()) 

La misma cosa.

Sin embargo, esto funciona:

 for id, group in df.groupby('restaurant_id'): print id, np.std(group['price']) 

Pregunta : ¿hay una forma adecuada de agregar el dataframe, por lo que obtendré una nueva serie de tiempo con las desviaciones estándar para cada restaurante?

Veo. Pandas está usando la corrección de Bessel por defecto, es decir, la fórmula de desviación estándar con N-1 lugar de N en el denominador. Como ha señalado behzad.nouri en los comentarios,

 pd.Series([7,20,22,22]).std(ddof=0)==np.std([7,20,22,22])