2014-09-06 21 views
5

Kolejna aktualizacja: rozwiązana (patrz komentarze i moja odpowiedź).Pandy: dlaczego pandas.Series.std() różni się od numpy.std()

Aktualizacja: to właśnie próbuję wyjaśnić.

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

Odpowiedź: wyjaśnia Bessel's correction, N-1 zamiast N w mianowniku wzoru standardowego odchylenia. Chciałbym, żeby Pandy stosowały tę samą konwencję co numpy.


Istnieje powiązana dyskusja here, ale ich sugestie również nie działają.

Mam dane na temat wielu różnych restauracji. Oto moja dataframe (wyobrazić więcej niż jedna restauracja, ale efekt jest odtwarzany tylko z jednym):

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

Pytanie: r.mi.groupby('restaurant_id')['price'].mean() powraca cena oznacza dla każdej restauracji. Chcę uzyskać standardowe odchylenia. Jednak r.mi.groupby('restaurant_id')['price'].std()zwraca nieprawidłowe wartości.

Jak widać, dla uproszczenia wyodrębniłem tylko jedną restaurację z czterema przedmiotami. Chcę znaleźć standardowe odchylenie ceny. Wystarczy, aby upewnić się, że:

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

możemy uzyskać takie same (poprawnie) wartości z

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

Oczywiście np.std(df) nie jest rozwiązaniem, gdy mam (Oczywiście, lekceważenie średnią restauracji id). więcej niż jedna restauracja. Używam więc groupby.

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

Co ?! 7.228416 nie jest 6.259992.

Spróbujmy jeszcze raz.

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

To samo.

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

To samo.

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

To samo.

Jednak to działa:

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

Pytanie: czy istnieje właściwy sposób agregowania z dataframe, więc będę się nowy cykl czasu z odchylenia standardowe dla każdej restauracji?

+7

'pd.Series ([7,20,22,22]). Std (ddof = 0)' byłby taki sam jak 'np.std' –

+0

OK, rozwiązany. Chyba muszę pomyśleć, którego chcę użyć. – osa

Odpowiedz

12

Rozumiem.Pandy domyślnie używają Bessel's correction - czyli standardowej formuły odchyleń z N-1 zamiast N w mianowniku. Jak behzad.nouri zauważył w komentarzach,

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