#python #pandas #time-series #error-detection
#python #pandas #временные ряды #обнаружение ошибок
Вопрос:
Я работаю с большим набором данных временных рядов, агрегированным каждую минуту 2020 года. Набор данных получает значения от датчиков, которые контролируют оборудование на тепловой электростанции. Датчики измеряют такие значения, как температура, давление, ток и т.д., и обновляют набор данных при каждом чтении.
Я пытаюсь обнаружить ошибки в наборе данных, вызванные датчиками. Один из типов ошибок от датчиков возникает, когда входные данные от датчиков зависают на определенном значении. Например, один из датчиков температуры сообщал значение 71,46 в течение 20 минут подряд, когда мы знаем, что оно должно колебаться. Я пытаюсь найти эти ошибки в моем текущем наборе данных и, надеюсь, обучить модель проверке повторяющихся значений в будущих наборах данных.
В идеале я хотел бы иметь возможность находить временные окна в наборе данных, где вы видите, что значение повторяется 5 или более раз подряд. подряд.
Данные представлены в виде фрейма временных данных pandas, а ядро — python 3.6. Дайте мне знать, если у вас есть какие-либо предложения.
Комментарии:
1. Вы можете поэкспериментировать с
.duplicated()
2. Привет! Ваш вопрос звучит как более подходящий для перекрестной проверки ( stats.stackexchange.com ), чем для переполнения стека — он запрашивает предложения по методам и поэтому может дать вам лучшие ответы там
Ответ №1:
Я думаю, что простым способом выяснить, совпадают ли 5 последовательных значений, может быть вычисление скользящего среднего с использованием размера окна 5 для всех ваших значений, а затем проверка разницы между значениями в соседних строках? Не уверен, что это слишком упрощенно? Но если значение скользящего среднего в строке x
совпадает с значением в строке x 1
, чем вы повторяете одно и то же значение? Конечно, если так случится, что новое значение, поступающее в окно, точно совпадает с первым значением, которое выходит из окна, тогда это не выделит его.
Это можно сделать как таковое:
roller = df.rolling(5).mean()
diff_table = roller - roller.shift(1)
И теперь проблема заключается в поиске строк / ячеек, в diff_table
которых находится любое значение в строке 0
, что легко:
has_repeat = np.isclose(diff_table, 0).any(axis=1)
Найти время начала и окончания, когда это происходит, немного сложнее, но если ваши временные метки находятся в индексе в вашей таблице, вы можете создать a Series
с тем же индексом и иметь значения 1
и 0
в зависимости от того, были ли какие-либо столбцы в diff_table
данной строке 0
(т. Е. Имели повторение5 значений). Снова вычитая смежные значения в этом ряду, вы можете определить, является ли это началом интервала (например 1
, ( 1-0
) или концом интервала -1
( 0 -(-1)
), в зависимости от того, какие значения вы выбрали).
Это может помочь определить начало времени, когда скользящее среднее стало постоянным. Итак, если вы затем вычтете 5 минут из этого времени начала, вы получите свой реальный интервал начала, когда датчик начал повторяться.
Могут быть способы получше, но это тот, который я бы попробовал, если бы это была моя проблема.