2017-10-21 2 views
0

Ich versuche, die Varianz für ein GroupedData-Objekt in PySpark2 zu berechnen. Betrachtet man http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.GroupedData, sehe ich keine integrierten Funktionen zur Berechnung der Varianz.Berechne Varianz auf GroupedData

Gibt es eine effiziente Methode zur Berechnung der Varianz für ein GroupedData-Objekt in PySpark2?

Hier ist Beispielcode, wie ich den Mittelwert berechnen würde, min und max auf einem GroupedData Objekt, aber ich bin nicht sicher, wie die Varianz zu berechnen:

from pyspark.sql import * 
from pyspark.sql.session import SparkSession 

spark = SparkSession.builder.getOrCreate() 

columns = ['a', 'b'] 
vals = [('x', 3), ('x', 5), ('y', 1), ('y', 8), ('y', 4), ('z', 5), ('z', 7), ('z', 4), ('z', 9)] 

df = spark.createDataFrame(vals, columns) 

df.groupBy('a').agg(avg('b'), min('b'), max('b')).show() 

Der Datenrahmen df wie folgt aussieht:

+---+---+ 
| a| b| 
+---+---+ 
| x| 3| 
| x| 5| 
| y| 1| 
| y| 8| 
| y| 4| 
| z| 5| 
| z| 7| 
| z| 4| 
| z| 9| 
+---+---+ 

ich möchte eine neue Datenrahmen ähnlich dem folgenden erstellen, um die Varianz zeigt:

+---+--------+ 
| a| b_var| 
+---+--------+ 
| x| 1.0000| 
| y| 8.2222| 
| z| 3.6875| 
+---+--------+ 

Antwort

2

Die eingebauten Funktionen sind here; Es gibt zwei Methoden var_pop und var_samp im pyspark.sql.functions Berechnungsmodul Varianz und Stichprobenvarianz bzw. was Sie brauchen, ist die VAR_POP Funktion:

import pyspark.sql.functions as F 

(df.groupBy("a").agg(
    F.round(F.var_pop("b"), 2).alias("var_pop_b"), 
    F.round(F.var_samp("b"), 2).alias("var_samp_b") 
)).show() 
+---+---------+----------+ 
| a|var_pop_b|var_samp_b| 
+---+---------+----------+ 
| x|  1.0|  2.0| 
| z|  3.69|  4.92| 
| y|  8.22|  12.33| 
+---+---------+----------+