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?
'pd.Series ([7,20,22,22]). Std (ddof = 0)' byłby taki sam jak 'np.std' –
OK, rozwiązany. Chyba muszę pomyśleć, którego chcę użyć. – osa