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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage