2016-10-12 9 views
0

平均を差し引き、各列のstddevで割ることで、スパークデータフレーム内の複数の列の値を正規化しようとしています。私は私がこれを行うことができると信じてDataFrame APIのみで複数の列の値を正規化する

+------------------------------+------------------------------+ 
|(A - (avg(A)/stddev_pop(A)))|(B - (avg(B)/stddev_pop(B)))| 
+------------------------------+------------------------------+ 
|     -1.414213562|     -1.414213562| 
|     -0.707106781|     -0.707106781| 
|        0|        0| 
|     0.707106781|     0.707106781| 
|     1.414213562|     1.414213562| 
+------------------------------+------------------------------+ 

:私は願ってい

+------------------------------+------------------------------+ 
|(A - (avg(A)/stddev_pop(A)))|(B - (avg(B)/stddev_pop(B)))| 
+------------------------------+------------------------------+ 
|       null|       null| 
+------------------------------+------------------------------+ 

:私は結果を与える

from pyspark.sql import Row 
from pyspark.sql.functions import stddev_pop, avg 

df = spark.createDataFrame([Row(A=1, B=6), Row(A=2, B=7), Row(A=3, B=8), 
          Row(A=4, B=9), Row(A=5, B=10)]) 

exprs = [x - (avg(x))/stddev_pop(x) for x in df.columns]  
df.select(exprs).show() 

:ここでのコードは、私がこれまで持っていますStandardScaler mllibのクラスですが、可能ならばデータフレームAPIだけを使ってこれを行うことを好むでしょう。

答え hereのおかげで
+0

可能な重複[各グループのスパークSQLでのzスコアを作成する方法](http://stackoverflow.com/questions/ 36807937/how-to-create-z-score-in-spark-sql-for-each-group) –

+0

@LostInOverflow確かに近いですが、私の使用例では複数の列を正規化する必要がありました – MarkNS

答えて

0

、私はこの思い付いた:

from pyspark.sql.functions import stddev_pop, avg, broadcast 

cols = df.columns  
stats = (df.groupBy().agg(
     *([stddev_pop(x).alias(x + '_stddev') for x in cols] + 
      [avg(x).alias(x + '_avg') for x in cols]))) 

df = df.join(broadcast(stats)) 

exprs = [(df[x] - df[x + '_avg'])/df[x + '_stddev'] for x in cols] 
df.select(exprs).show() 

+------------------------+------------------------+ 
|((A - A_avg)/A_stddev)|((B - B_avg)/B_stddev)| 
+------------------------+------------------------+ 
|  -1.414213562373095|  -1.414213562373095| 
|  -0.7071067811865475|  -0.7071067811865475| 
|      0.0|      0.0| 
|  0.7071067811865475|  0.7071067811865475| 
|  1.414213562373095|  1.414213562373095| 
+------------------------+------------------------+ 
関連する問題