Как найти максимальное количество последовательных значений, равное указанному c числу в кадре данных PySpark - PullRequest
0 голосов
/ 16 января 2020

Я работаю на большом фрейме данных Pyspark и не хочу использовать Pandas.

Мне удалось найти скользящее минимальное значение за 2 дня для каждого дня, используя следующий код :

w = (Window()
     .partitionBy('DEVICE_ID2')
     .orderBy(col('DATETIME').cast('long'))
     .rangeBetween(-(24*60*60), 24*60*60))

df5 = df4.withColumn('MIN',F.min('VAL').over(w)).orderBy('ID','DATETIME').withColumn('MIN',F.when(col('DATETIME').rlike(r'\d{4}-\d{2}-\d{2} 00:00:00'),col('MIN')).otherwise(None))

Окно варьируется от -24 часов до + 24 часов после чтения в 00:00:00 каждый день.

Однако теперь я хочу иметь возможность узнать максимальное количество последовательных значений чтения, равное этому минимальному значению в течение каждого 2-дневного периода - показывается в столбце Conse c.

Пример кадра данных:

|        ID|           DATETIME| VAL| MIN|
|         1|2019-08-30 00:00:00|   1|null|
|         1|2019-08-30 02:00:00|   1|null|
|         1|2019-08-30 04:00:00| 262|null|
|         1|2019-08-30 06:00:00|  64|null|
|         1|2019-08-30 08:00:00|  75|null|
|         1|2019-08-30 10:00:00|  58|null|
|         1|2019-08-30 12:00:00|  55|null|
|         1|2019-08-30 14:00:00|  38|null|
|         1|2019-08-30 16:00:00|  29|null|
|         1|2019-08-30 18:00:00|  34|null|
|         1|2019-08-30 20:00:00|   1|null|
|         1|2019-08-30 22:00:00|   1|null|
|         1|2019-08-31 00:00:00|   1|   1|
|         1|2019-08-31 02:00:00|  71|null|
|         1|2019-08-31 04:00:00| 263|null|
|         1|2019-08-31 06:00:00|  51|null|
|         1|2019-08-31 08:00:00|  30|null|
|         1|2019-08-31 10:00:00|  52|null|
|         1|2019-08-31 12:00:00|  39|null|
|         1|2019-08-31 14:00:00|  48|null|
|         1|2019-08-31 16:00:00|  16|null|
|         1|2019-08-31 18:00:00|  58|null|
|         1|2019-08-31 20:00:00|   3|null|
|         1|2019-08-31 22:00:00|   3|null|
|         1|2019-09-01 00:00:00|  45|   3|
|         1|2019-09-01 02:00:00|   5|null|
|         1|2019-09-01 04:00:00| 278|null|
|         1|2019-09-01 06:00:00|  47|null|
|         1|2019-09-01 08:00:00|  25|null|
|         1|2019-09-01 10:00:00|  49|null|
|         1|2019-09-01 12:00:00|  31|null|
|         1|2019-09-01 14:00:00|   8|null|
|         1|2019-09-01 16:00:00|   6|null|
|         1|2019-09-01 18:00:00|  31|null|
|         1|2019-09-01 20:00:00|  24|null|
|         1|2019-09-01 22:00:00|   5|null|
|         1|2019-09-02 00:00:00|   7|   0|
|         1|2019-09-02 02:00:00|   4|null|
|         1|2019-09-02 04:00:00| 260|null|
|         1|2019-09-02 06:00:00|  63|null|
|         1|2019-09-02 08:00:00|  99|null|
|         1|2019-09-02 10:00:00|  85|null|
|         1|2019-09-02 12:00:00|  76|null|
|         1|2019-09-02 14:00:00|  92|null|
|         1|2019-09-02 16:00:00|   0|null|
|         1|2019-09-02 18:00:00|  10|null|
|         1|2019-09-02 20:00:00|  31|null|
|         1|2019-09-02 22:00:00|   1|null|
|         1|2019-09-03 00:00:00|   1|null|

Желаемый результат:

|        ID|           DATETIME| VAL| MIN|CONSEC
|         1|2019-08-30 00:00:00|   1|null|
|         1|2019-08-30 02:00:00|   1|null|
|         1|2019-08-30 04:00:00| 262|null|
|         1|2019-08-30 06:00:00|  64|null|
|         1|2019-08-30 08:00:00|  75|null|
|         1|2019-08-30 10:00:00|  58|null|
|         1|2019-08-30 12:00:00|  55|null|
|         1|2019-08-30 14:00:00|  38|null|
|         1|2019-08-30 16:00:00|  29|null|
|         1|2019-08-30 18:00:00|  34|null|
|         1|2019-08-30 20:00:00|   1|null|
|         1|2019-08-30 22:00:00|   1|null|
|         1|2019-08-31 00:00:00|   1|   1|3
|         1|2019-08-31 02:00:00|  71|null|
|         1|2019-08-31 04:00:00| 263|null|
|         1|2019-08-31 06:00:00|  51|null|
|         1|2019-08-31 08:00:00|  30|null|
|         1|2019-08-31 10:00:00|  52|null|
|         1|2019-08-31 12:00:00|  39|null|
|         1|2019-08-31 14:00:00|  48|null|
|         1|2019-08-31 16:00:00|  16|null|
|         1|2019-08-31 18:00:00|  58|null|
|         1|2019-08-31 20:00:00|   3|null|
|         1|2019-08-31 22:00:00|   3|null|
|         1|2019-09-01 00:00:00|  45|   3|2
|         1|2019-09-01 02:00:00|   5|null|
|         1|2019-09-01 04:00:00| 278|null|
|         1|2019-09-01 06:00:00|  47|null|
|         1|2019-09-01 08:00:00|  25|null|
|         1|2019-09-01 10:00:00|  49|null|
|         1|2019-09-01 12:00:00|  31|null|
|         1|2019-09-01 14:00:00|   8|null|
|         1|2019-09-01 16:00:00|   6|null|
|         1|2019-09-01 18:00:00|  31|null|
|         1|2019-09-01 20:00:00|  24|null|
|         1|2019-09-01 22:00:00|   5|null|
|         1|2019-09-02 00:00:00|   7|   0|1
|         1|2019-09-02 02:00:00|   4|null|
|         1|2019-09-02 04:00:00| 260|null|
|         1|2019-09-02 06:00:00|  63|null|
|         1|2019-09-02 08:00:00|  99|null|
|         1|2019-09-02 10:00:00|  85|null|
|         1|2019-09-02 12:00:00|  76|null|
|         1|2019-09-02 14:00:00|  92|null|
|         1|2019-09-02 16:00:00|   0|null|
|         1|2019-09-02 18:00:00|  10|null|
|         1|2019-09-02 20:00:00|  31|null|
|         1|2019-09-02 22:00:00|   1|null|
|         1|2019-09-03 00:00:00|   1|null|

Возможно ли это?

Большое спасибо

...