2016-10-12 5 views
0

평균을 빼고 각 열의 stddev로 나눠서 스파크 데이터 프레임의 여러 열 값을 표준화하려고합니다. 나는 내가 함께 할 수 있다고 생각DataFrame API 만 사용하여 Spark DataFrame의 여러 열 값 정규화

+------------------------------+------------------------------+ 
|(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| 
+------------------------------+------------------------------+ 

: I가 바라고 있어요

+------------------------------+------------------------------+ 
|(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| 
+------------------------+------------------------+ 
관련 문제