Pandas: Warum pandas.Series.std () anders ist als numpy.std ()
Ein weiteres Update: behoben (siehe Kommentare und meine eigene Antwort).
Update: Das versuche ich zu erklären.
>>> pd.Series([7,20,22,22]).std()
7.2284161474004804
>>> np.std([7,20,22,22])
6.2599920127744575
Antwort: Dies wird erklärt durch Bessels Korrektur, N-1
anstattN
im Nenner der Standardabweichungsformel. Ich wünschte, Pandas hätten die gleiche Konvention wie Numpy verwendet.
Es gibt eine ähnliche DiskussionHie, aber ihre Vorschläge funktionieren auch nicht.
Ich habe Daten über viele verschiedene Restaurants. Hier ist mein Datenrahmen (stellen Sie sich mehr als ein Restaurant vor, aber der Effekt wird mit nur einem reproduziert):
>>> df
restaurant_id price
id
1 10407 7
3 10407 20
6 10407 22
13 10407 22
Frage:r.mi.groupby('restaurant_id')['price'].mean()
Retourenpreis bedeutet für jedes Restaurant. Ich möchte die Standardabweichungen erhalten. Jedoch,r.mi.groupby('restaurant_id')['price'].std()
gibt falsche Werte zurück.
ie Sie sehen, habe ich der Einfachheit halber nur ein Restaurant mit vier Elementen extrahiert. Ich möchte die Standardabweichung des Preises ermitteln. Nur um sicher zugehen
>>> np.mean([7,20,22,22])
17.75
>>> np.std([7,20,22,22])
6.2599920127744575
Wir können mit @ die gleichen (richtigen) Werte erhalt
>>> np.mean(df)
restaurant_id 10407.00
price 17.75
dtype: float64
>>> np.std(df)
restaurant_id 0.000000
price 6.259992
dtype: float64
(Ignorieren Sie natürlich die durchschnittliche Restaurant-ID.) Offensichtlichnp.std(df)
ist keine Lösung, wenn ich mehr als ein Restaurant habe. Also benutze ichgroupby
.
>>> df.groupby('restaurant_id').agg('std')
price
restaurant_id
10407 7.228416
Was?! 7.228416 ist nicht 6.259992.
Lass es uns erneut versuchen
>>> df.groupby('restaurant_id').std()
Gleiche Sache
>>> df.groupby('restaurant_id')['price'].std()
Gleiche Sache
>>> df.groupby('restaurant_id').apply(lambda x: x.std())
Gleiche Sache
Das funktioniert jedoch:
for id, group in df.groupby('restaurant_id'):
print id, np.std(group['price'])
Frag: Gibt es eine geeignete Möglichkeit, den Datenrahmen zu aggregieren, sodass ich für jedes Restaurant eine neue Zeitreihe mit den Standardabweichungen erhalte?