0

次のようなデータフレームがあります。

|SEQ_ID |TIME_STAMP             |RESULT          |
+-------+-----------------------+----------------+
|3879859|2021-08-31 19:54:53.88 |25.9485244750994|
|3879859|2021-08-31 21:16:06.228|35.9163284302007|
|3879859|2021-08-31 22:28:46.306|41.9778823852006|
|3879859|2021-08-31 22:28:46.306|41.9778823852006|
|3879859|2021-08-31 23:12:08.058|39.9112701415998|
|3879859|2021-08-31 23:17:35.796|33.0476760864009|
|3879859|2021-08-31 23:47:17.383|60.2846145630007|
|3879859|2021-09-01 00:00:26.722|67.0690536499006|
|3879859|2021-09-01 00:00:26.722|67.0690536499006|
|3879859|2021-09-01 00:02:07.825|67.8424835205007|

pyspark での通常のパーセンタイル計算には、次を使用します。

df.groupBy('SEQ_ID')\
.agg(f.expr('percentile(RESULT, 0.25)').alias('Q1'),
     f.expr('percentile(RESULT, 0.50)').alias('Median'),
     f.expr('percentile(RESULT, 0.75)').alias('Q3'))\

しかし、それは によってグループ化されたすべてのデータを取りますSEQ_ID。その上の行を使用して、各行の Q1、中央値、および Q3 を計算したいと考えています。

|SEQ_ID |TIME_STAMP             |RESULT          |Q1   |Median|Q3   |
+-------+-----------------------+----------------+-----+------+-----+
|3879859|2021-08-31 19:54:53.88 |25.9485244750994|
|3879859|2021-08-31 21:16:06.228|35.9163284302007|
|3879859|2021-08-31 22:28:46.306|41.9778823852006|
|3879859|2021-08-31 22:28:46.306|41.9778823852006|
|3879859|2021-08-31 23:12:08.058|39.9112701415998|
|3879859|2021-08-31 23:17:35.796|33.0476760864009|
|3879859|2021-08-31 23:47:17.383|60.2846145630007|
|3879859|2021-09-01 00:00:26.722|67.0690536499006|
|3879859|2021-09-01 00:00:26.722|67.0690536499006|
|3879859|2021-09-01 00:02:07.825|67.8424835205007|

したがって、Q1最初の行の と は次Medianの ようになります。Q325.948524475099425.948524475099435.9163284302007

そのようなウィンドウを定義すると

w=Window.partitionBy('SEQ_ID').orderBy(col('TIME_STAMP').asc()).rangeBetween(Window.unboundedPreceding,0)

次のコードは機能しますか?:

df.groupBy('SEQ_ID')\
.agg(f.expr('percentile(Pad_Wear, 0.25)').alias('Q1'),
     f.expr('percentile(Pad_Wear, 0.50)').alias('Median'),
     f.expr('percentile(Pad_Wear, 0.75)').alias('Q3')).over(w)
4

1 に答える 1