Примените исправление только к некоторым точкам данных во временных рядах, что определяется быстрым падением значений - PullRequest
0 голосов
/ 04 мая 2018

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

Вы можете увидеть эффект на прикрепленной фигуре: утром свет усиливается, а затем, когда значения достигают 2,0, они резко падают. У меня есть поправочные коэффициенты, которые я могу применить. У меня проблемы с выяснением того, как определить, какие точки исправить, а затем применить исправление

Рисунок с данными

До сих пор я использовал np.diff и np.argwhere, чтобы вычислить разницу между последовательными точками и определить номера начальной и конечной строк для каждого из этих внезапных падений и восстановлений. Теперь я застрял на том, как взять эту информацию и использовать ее для применения данных коррекции между этими номерами строк.

 array = abs(np.diff(MS9dataWB7, axis=0)) >= 1.2  

возвращает массив np true и false для np.diff> = 1.2

 result = np.argwhere(array)  

возвращает номера строк, где условие истинно

Я ценю любую помощь.

1 Ответ

0 голосов
/ 06 мая 2018

с небольшим набором образцов данных было бы очень полезно. В будущем, пожалуйста, постарайтесь опубликовать минимальный проверяемый фрагмент примера кода, который воспроизводит проблему - таким образом, мы можем протестировать наши собственные недоделанные идеи, прежде чем публиковать их:).

Вы на правильном пути, но я думаю, у вас есть пара вопросов для рассмотрения. Общий план состоит в том, чтобы определить точки, которые необходимо исправить, а затем добавить срок исправления. Вы сделали первый шаг, используя np.diff (). Тем не менее, это будет только найти первую точку, которая изменится на 1,2. Непосредственно смежная точка справа также должна быть исправлена, но разница между первыми двумя «плохими» точками больше не равна 1,2. Таким образом, вы пропустите определение второго и последующих пунктов. Затем в последней «плохой» точке дня вы в конечном итоге отметите первую «хорошую» точку как плохую (потому что abs (diff) снова> 1,2, когда она отскакивает вверх), и вы будете слишком корректировать " хорошая точка зрения.

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

import numpy as np
import pandas as pd

devicedatetime = pd.date_range('2018-05-01', '2018-05-03', freq='1H')
df = pd.DataFrame(devicedatetime, columns=['datetime'])
df['elapsedtime'] = df['datetime'] - df['datetime'].iloc[0]
df['elapsedseconds'] = df['elapsedtime'] / pd.Timedelta('1s')
df['data'] =  1 + np.sin(2*np.pi * df['elapsedseconds']/86400.0)
df.head()

Теперь у меня есть фрейм данных pandas с моими исходными временными метками и примерами данных. Столбцы elapsed time и elapsedseconds существуют только для облегчения расчета поддельных данных. Вы можете построить результат, используя

df.plot('datetime', `data')

Следующим шагом является выявление «плохих» точек. Я создам массив логических значений на основе моих условий тестирования. Если взглянуть на ваши данные просто, вы увидите, что вы хотите просматривать данные только со временем> 17:00 и менее 05:00. В качестве сети безопасности вы также можете добавить условие, которое проверяет само значение данных.

bad_data = (df['datetime'].dt.hour > 17) | (df['datetime'].dt.hour < 5) 

Теперь я могу вычислить скорректированные значения данных. Моя поправка состояла в том, чтобы просто добавить 3 к значению.

df['fixeddata'] = np.where(bad_data, df['data'] + 3, df['data'])
df.plot(x='datetime', y=['data', 'fixeddata'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...