pandas groupby данные временных рядов в соответствии с результатом функции

Я анализирую данные временных рядов энергосистем и пытаюсь найти непрерывные точки данных, которые выходят за пределы определенного порогового значения.

В настоящее время я использую формулу excel построчно, чтобы сделать это вручную, но когда я пытаюсь найти более эффективные методы, я понял, что это можно сделать в функции python pandas groupby.

Однако, что касается примеров, которые я прочитал, функция groupby группирует строки только в том случае, если они имеют одинаковую метку. Что я хотел бы сделать, так это передать определенную функцию в groupby, которая могла бы проверить, является ли значение => 3, а затем сгруппировать эти значения, проиндексированные по времени начала и окончания нарушения порогового значения => 3.

Вход:

+-------+---------+------+
| Index |  Time   | Value|
+-------+---------+------+
|     0 | 00:00:01|   3  |
|     1 | 00:00:02|   4  |
|     2 | 00:00:03|   5  |
|     3 | 00:00:04|   2  |
|     4 | 00:00:05|   6  |
|     5 | 00:00:06|   7  |
|     6 | 00:00:07|   1  |
|     7 | 00:00:08|   9  |
+-------+---------+------+

Выход:

+-------+-----------+----------+--------+
| Index | TimeStart | TimeEnd  | Value  |
+-------+-----------+----------+--------+
|     0 | 00:00:01  | 00:00:03 |  3,4,5 |
|     1 | 00:00:05  | 00:00:06 |  6,7   |
|     2 | 00:00:08  | 00:00:08 |  9     |
+-------+-----------+----------+--------+

person Emman D.    schedule 29.10.2017    source источник


Ответы (1)


  • Создайте маску, где меньше 3
  • Совокупная сумма для создания групп, где больше или равно 3
  • отфильтровать df по маске, затем groupby
  • Используйте agg для одновременной передачи нескольких функций
  • Переименовать столбцы

mask = df.Value.lt(3)
grp = mask.cumsum()

d1 = df[~mask].groupby(grp[~mask]).agg(dict(
    Time=['first', 'last'],
    Value=lambda x: ','.join(map(str, x))
))

d1.columns = ['TimeStart', 'TimeEnd', 'Value']

d1

      TimeStart   TimeEnd  Value
Value                           
0      00:00:01  00:00:03  3,4,5
1      00:00:05  00:00:06    6,7
2      00:00:08  00:00:08      9
person piRSquared    schedule 29.10.2017
comment
Вау, спасибо большое! Я не знаю о функциях, которые вы использовали, таких как cumsum и mask, это выходит за рамки моих текущих знаний о python. Буду копать глубже в них. Еще раз спасибо. - person Emman D.; 29.10.2017