Resultado diferente para std entre pandas y numpy

Estoy tratando de restar cada elemento de la columna de su media y dividir por la desviación estándar. Lo hice de dos maneras diferentes ( numeric_data1 y numeric_data2 ):

 import pandas as pd data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv") numeric_data = data.drop("color", 1) numeric_data1 = ((numeric_data - numeric_data.mean()) / numeric_data.std()) numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) / np.std(numeric_data, axis=0)) type(numeric_data1) # -> pandas.core.frame.DataFrame type(numeric_data2) # -> pandas.core.frame.DataFrame 

Ambos son marcos de datos de pandas y deberían tener el mismo resultado. Sin embargo, obtengo diferentes resultados:

 numeric_data2 == numeric_data1 # -> False 

Creo que el problema se deriva de cómo los números y los pandas manejan la precisión numérica:

 numeric_data.mean() == np.mean(numeric_data, axis=0) # -> True numeric_data.std(axis=0) == np.std(numeric_data, axis=0) # -> False 

Para el mal genio y los pandas me dieron lo mismo, pero para la desviación estándar, obtuve resultados poco diferentes.

¿Mi evaluación es correcta o estoy cometiendo un error?

Al calcular la desviación estándar, importa si está estimando la desviación estándar de una población completa con una muestra más pequeña de esa población o si está calculando la desviación estándar de toda la población.

Si es una muestra más pequeña de una población más grande, necesita lo que se denomina desviación estándar de la muestra . Resulta que cuando divides la sum de las diferencias al cuadrado de la media por el número de observaciones, terminas con un estimador sesgado. Lo corregimos dividiendo por uno menos que el número de observaciones. Esto lo controlamos con el argumento ddof=1 para la desviación estándar de la muestra o ddof=0 para la desviación estándar de la población.

La verdad es que no importa mucho si el tamaño de su muestra es grande. Pero verás pequeñas diferencias.

Use el argumento de los grados de libertad en su llamada pandas.DataFrame.std :

 import pandas as pd data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv") numeric_data = data.drop("color", 1) numeric_data1 = ((numeric_data - numeric_data.mean()) / numeric_data.std(ddof=0)) # <<< numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) / np.std(numeric_data, axis=0)) np.isclose(numeric_data1, numeric_data2).all() # -> True 

O en la llamada np.std :

 import pandas as pd data = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv") numeric_data = data.drop("color", 1) numeric_data1 = ((numeric_data - numeric_data.mean()) / numeric_data.std()) numeric_data2 = ((numeric_data - np.mean(numeric_data, axis=0)) / np.std(numeric_data, axis=0, ddof=1)) # <<< np.isclose(numeric_data1, numeric_data2).all() # -> True