Существует ли функция python для поиска нескольких идентичных значений в строке в наборе данных временных рядов?

#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 минут из этого времени начала, вы получите свой реальный интервал начала, когда датчик начал повторяться.

Могут быть способы получше, но это тот, который я бы попробовал, если бы это была моя проблема.