2017-09-06 63 views
1

我是新的python和pandas用戶。我想從平均值中減去列中的每個元素,併除以標準偏差。我以兩種不同的方式(numeric_data1和numeric_data2)做到了這一點。這兩個結果在熊貓和numpy之間的區別

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 

他們都是熊貓數據框,我認爲他們都應該給我同樣的結果。但是,我得到不同的結果。

numeric_data2 == numeric_data1 ---> False 

我覺得問題源於numpy和pandas如何處理數字精度。

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

對於平均numpy的和熊貓給了我同樣的事情,但對於標準差,我有點不同的結果。

我的評估是否正確?還是我犯了一些錯誤?

回答

2

在計算標準差時,無論您是估算整個人口的標準偏差,還是計算整個人口的標準偏差,這都很重要。

如果它是較大人口的較小樣本,則需要稱爲樣本標準差。事實證明,當您將平均差的平方和除以觀測值的數量時,最終會得到一個有偏差的估計量。我們通過除以觀察值的數量除以1來校正。我們用樣本標準偏差的參數ddof=1或總體標準偏差的ddof=0來控制。

事實是,如果您的樣本量很大,這並沒有多大關係。但是你會看到很小的差異。

使用自由度的說法在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) 
#                  VVVVVV 
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 

還是在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 
+0

能否請您解釋一下嗎? – psimeson

+0

查看[numpy.std]的文檔(https://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html),請參閱ddof default = zero和[pandas.DataFrame.std ](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.std.html)請參閱ddof default = one。 –

+0

感謝@ScottBoston它是有道理的。我不知道關於ddof – psimeson