2016-11-28 4 views
1

Ich bin neu in Python, und ich versuche, die Std eines kreisförmigen Daten (Windrichtungen) die Daten durch einige Merkmale gruppieren. Hier ist ein Satz der df, die ich benutze.groupby anwenden nicht geben erwartetes Ergebnis

Profile bin  inflow_direction 
0 1  51  331.7 
1 1  51  332.8 
2 1  51  334.1 
3 1  51  335.4 
4 1  51  336.4 
5 1  66  337.3 
6 1  66  337.5 
7 1  66  337.6 
8 1  66  337.7 
9 1  66  337.6 

Ich brauche die Std für jede Gruppe von bin innerhalb jedes Profils. Ich habe die std Funktion wie folgt definiert:

def circstd(j) : samples = np.radians (j) return scipy.stats.circstd(samples, high=6.283185307179586, low=0, axis=None)

wenn ich Gruppe:

df.groupby(['Profile','bin']).apply(circstd) 

Die aus ist:

idscng_f bin 
1   51  0.567811 

      66  0.671470 

Aber ich erwartete

idscng_f bin 
1   51  0.0296 

      66  0.0025 

Was ist das Problem hier?

+0

versuchen, die Spalte angibt, auf dem die Aktion ausgeführt werden soll? + Die Umwandlung in Radianten auf derselben Stufe kompliziert die Dinge. Teilen Sie diese beiden Dinge auf, bringen Sie sie zur Arbeit, verstehen Sie sie und fusionieren Sie sie dann wieder zusammen, wenn Sie möchten –

+0

Wie kann ich - mit der Gruppe nach - die Spalte angeben, in der die Aktion ausgeführt werden soll? – ydopico

+0

siehe Methode 1 auf die Antwort von @Nickil Maveli unten. –

Antwort

1

Verwenden np.std nach Winkel von Grad in Bogenmaß konvertieren:

def simple_circstd(j) : 
    return np.std(np.radians(j))['inflow_direction'] 

Perform Groupby:

df.groupby(['Profile','bin']).apply(simple_circtd) 

Ausgabe erhalten Resultierende:

Profile bin 
1  51  0.029650 
     66  0.002367 
dtype: float64 
+0

Sie meinen die Präzision. Es verliert seine Genauigkeit meist nach 3/4-Dezimalstellen. –

+0

Das Ergebnis für die Methode 1 gibt mir ein anderes Ergebnis. idscng_f ist 1 51 1.490116e-08 66 2.367480e-03 dtype: FLOAT64 Die zweite Methode gibt mir das Ergebnis benötigt, aber ich frage mich, ob es für andere Winkel arbeiten, da sie Kreisdaten. – ydopico

+0

Oh, der Grund, warum ich "np.nonzero" eingeschlossen habe, war, weil ich Nullwerte für andere Elemente und nur einen endlichen Wert für die von Ihnen bereitgestellten Dummy-Daten erhielt. Muss nicht der Fall mit dem echten sein. Ich lösche es, wenn es falsche Ergebnisse liefert. Und ja, der zweite Ansatz würde funktionieren, da er im Grunde von Grad nach Grad konvertiert und "Std" auf dem kreisförmigen Array berechnet. –

1

Sie können die SeriesGroupBy Objekt angeben, zu verwenden, apply() an .

df.groupby(['Profile','bin'])["inflow_direction"].apply(circstd) wird die Arbeit tun.

Ausgabe:

Profile bin 
1  51  0.029650 
     66  0.002367 
Name: inflow_direction, dtype: float64 
+0

Schön! Auch dies gibt das richtige Ergebnis. Mir ist noch nie in den Sinn gekommen. –

Verwandte Themen