Pyspark - рейтинговый столбец, заменяющий рейтинг связей на Среднее значение рейтинга - PullRequest
1 голос
/ 23 мая 2019

Рассмотрим набор данных с рейтингом

 +--------+----+-----------+--------------+
 |    colA|colB|colA_rank  |colA_rank_mean|
 +--------+----+-----------+--------------+
 |      21|  50|          1|             1|
 |       9|  23|          2|           2.5|
 |       9|  21|          3|           2.5|
 |       8|  21|          4|             3|        
 |       2|  21|          5|           5.5|      
 |       2|   5|          6|           5.5|       
 |       1|   5|          7|           7.5|     
 |       1|   4|          8|           7.5|     
 |       0|   4|          9|            11|    
 |       0|   3|         10|            11|  
 |       0|   3|         11|            11| 
 |       0|   2|         12|            11|
 |       0|   2|         13|            11|
 +--------+----+-----------+--------------+

colA_rank - это нормальное ранжирование, тогда как с colA_rank_mean я хотел бы разрешить связи, заменив ранжирование средним рангом связей. Это достижимо с помощью одного прохода и определенного метода ранжирования?

В настоящее время я думаю о 2 проходах, но, похоже, для этого потребуется упорядочить набор данных дважды на colA, один без раздела и один с разделом.

#Step 1: normal rank
df = df.withColumn("colA_rank",F.row_number().over(Window.orderBy("colA")))
#Step 2 : solve ties :
df = df.withColumn("colA_rank_mean",F.mean(colA_rank).over(Window.partitionBy("colA"))
...