【问题标题】:calculate the z score for each row in the column of a dataframe using scala / spark使用 scala / spark 计算数据框列中每一行的 z 分数
【发布时间】:2020-06-13 14:59:22
【问题描述】:

我有一个数据框:

val DF = {spark.read.option("header", value = true).option("delimiter", ";").csv(path_file)}

val cord = DF.select("time","longitude", "latitude","speed")

我想计算速度列每一行的z分数(x-mean)/std。我计算平均值和标准差:

val std = DF.select(col("speed").cast("double")).as[Double].rdd.stdev()
val mean = DF.select(col("speed").cast("double")).as[Double].rdd.mean()

如何计算每行列速度的z分数并得到这个结果:

+----------------+----------------+-   
|A               |B               |speed    |   z score      
+----------------+----------------+---------------------+
|17/02/2020 00:06|      -7.1732833|   50    |    z score     

|17/02/2020 00:16|      -7.1732833|   40    |    z score   

|17/02/2020 00:26|      -7.1732833|   30    |    z score

如何为每一行计算它。

【问题讨论】:

  • 用你的平均值和标准来计算每一行的分数是否有意义?还是要计算每一行从第一行到当前行的均值和标准差?
  • 我想用相同的平均值和标准计算每一行的 z 分数,像这样 (50-mean/std) 和 (40-mean/std) .... ......
  • 我明白了。然后使用df.withColumn("z test", col("speed") - mean / std)
  • 谢谢它对我有用。

标签: scala apache-spark hypothesis-test


【解决方案1】:

执行此操作的最佳方法是:

df.withColumn("z score", col("speed") - mean / std)

如问题所示计算平均值和标准差。

如果这有帮助,请告诉我!

【讨论】:

    【解决方案2】:

    您可以避免使用 Hive 聚合函数中的窗口函数和 STDDEV_POP 的两个单独的 RDD 操作:

    val DF = {spark.read.option("header", value = true).option("delimiter", ";").csv(path_file)}
    
    val cord = DF.select($"time",$"longitude", $"latitude",$"speed".cast("double"))
    
    val result = cord
      .withColumn("mean",avg($"speed").over())
      .withColumn("stddev",callUDF("stddev_pop",$"speed").over())
      .withColumn("z-score",($"speed"-$"mean")/$"stddev") 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-21
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多