0
Date  Time_GMTTime_IST Current 
11/15/2016 5:12:27 10:42:27 26.61 
11/15/2016 5:12:28 10:42:28 42.27 
11/15/2016 5:12:29 10:42:29 25.48 
11/15/2016 5:12:30 10:42:30 24.24 
11/15/2016 5:12:31 10:42:31 25.91 
11/15/2016 5:12:32 10:42:32 27.75 
11/15/2016 5:12:33 10:42:33 24.46 
11/15/2016 5:12:34 10:42:34 24.32 
11/15/2016 5:12:35 10:42:35 24.81 
11/15/2016 5:12:36 10:42:36 27.36 
11/15/2016 5:12:37 10:42:37 28.2 
11/15/2016 5:12:38 10:42:38 28.29 
11/15/2016 5:12:39 10:42:39 26.52 
11/15/2016 5:12:40 10:42:40 32.58 
11/15/2016 5:12:41 10:42:41 24.24 
11/15/2016 5:12:42 10:42:42 24.36 
11/15/2016 5:12:43 10:42:43 26.48 
11/15/2016 5:12:44 10:42:44 28.76 
11/15/2016 5:12:45 10:42:45 24.51 
11/15/2016 5:12:46 10:42:46 23.93 
11/15/2016 5:12:47 10:42:47 25.23 
11/15/2016 5:12:48 10:42:48 27.9 
11/15/2016 5:12:49 10:42:49 27.84 
11/15/2016 5:12:50 10:42:50 27.31 
11/15/2016 5:12:51 10:42:51 29.17 
11/15/2016 5:12:52 10:42:52 24 
11/15/2016 5:12:53 10:42:53 32.51 
11/15/2016 5:12:54 10:42:54 26.63 
11/15/2016 5:12:55 10:42:55 22.34 
11/15/2016 5:12:56 10:42:56 29.14 
11/15/2016 5:12:57 10:42:57 46.62 
11/15/2016 5:12:58 10:42:58 48.85 
11/15/2016 5:12:59 10:42:59 30.59 
11/15/2016 5:13:00 10:43:00 30.68 
11/15/2016 5:13:01 10:43:01 30.82 
11/15/2016 5:13:02 10:43:02 31.64 
11/15/2016 5:13:03 10:43:03 43.91 

Выше приведен пример данных, данные продолжается в течение days.I должны найти депрессию тока, как показано на image. Если ток идет ниже 30 ампер в течение длительного времени, я должен обнаружить эту долинную депрессию. Я работаю над этим некоторое время, и я не могу думать о какой-либо логике, которая может найти решение в точности. Любое предложение приветствуется. Также принят подход машинного обучения.Нахождение долины в зашумленных данных

+0

Я не уверен, что 100% вы просите нас сделать. Что вы подразумеваете под «долгое время». Определяет длительное время как 'n'. Я бы сделал, чтобы начать: создать жадную версию: перебрать всю коллекцию, если мы находимся на элементе 'a_i', чтобы проверить все (n) элементы вокруг него, и если они монотонно уменьшаются до' a_i', тогда вы получите себе долину. Из жадной версии (если она слишком медленная) вы можете попробовать разделить и победить подход. – MaLiN2223

+0

Я сделал это, и он работал на предопределенные временные рамки. Но в моей проблеме длительное время начинается с 15 минут, т.е. 900 секунд, до тех пор, пока капля может продолжаться, и именно поэтому я застрял. @ MaLiN2223 –

ответ

4

Вы могли бы просто использовать перемещаемого окно среднего подход:

  1. Выберите соответствующую ширину окна (в вашем случае, дельта между записями составляет один второй каждый, поэтому выбранный ширин будет в размерах секунд)

  2. итерации по вашему currents колонку и вычислить среднее значение currents по отношению к выбранной ширине окну

  3. Проверить, когда она падает ниже порога или поднимает над ним, в зависимости от его предыдущего состояния

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

Rolling window and state changes

Код я использовал для создания этого образа является:

import matplotlib 
import matplotlib.pyplot as plt 

c = [26.61, 42.27, 25.48, 24.24, 25.91, 27.75, 24.46, 24.32, 24.81, 27.36, 28.2, 28.29, 26.52, 32.58, 24.24, 24.36, 26.48, 28.76, 24.51, 23.93, 25.23, 27.9, 27.84, 27.31, 29.17, 24, 32.51, 26.63, 22.34, 29.14, 46.62, 48.85, 30.59, 30.68, 30.82, 31.64, 43.91] 

if __name__ == '__main__': 
    # Choose window width and threshold 
    window = 5 
    thres = 27.0 

    # Iterate and collect state changes with regard to previous state 
    changes = [] 
    rolling = [None] * window 
    old_state = None 
    for i in range(window, len(c) - 1): 
     slc = c[i - window:i + 1] 
     mean = sum(slc)/float(len(slc)) 
     state = 'good' if mean > thres else 'bad' 

     rolling.append(mean) 
     if not old_state or old_state != state: 
      print('Changed to {:>4s} at position {:>3d} ({:5.3f})'.format(state, i, mean)) 
      changes.append((i, state)) 
      old_state = state 

    # Plot results and state changes 
    plt.figure(frameon=False, figsize=(10, 8)) 
    currents, = plt.plot(c, ls='--', label='Current') 
    rollwndw, = plt.plot(rolling, lw=2, label='Rolling Mean') 
    plt.axhline(thres, xmin=.0, xmax=1.0, c='grey', ls='-') 
    plt.text(40, thres, 'Threshold: {:.1f}'.format(thres), horizontalalignment='right') 
    for c, s in changes: 
     plt.axvline(c, ymin=.0, ymax=.7, c='red', ls='-') 
     plt.text(c, 41.5, s, color='red', rotation=90, verticalalignment='bottom') 
    plt.legend(handles=[currents, rollwndw], fontsize=11) 
    plt.grid(True) 
    plt.savefig('local/plot.png', dpi=72, bbox_inches='tight') 
0

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

  1. Пикап окно и вычислять сглаженные данные, например, с MA (скользящее среднее значение) с использованием свертки.
  2. Вычислить остатки от исходных данных и сглаженных данных.
  3. Точки долины - это последовательные точки, где остаточные значения малы.

    import numpy as np 
    Import pandas as pd # read data in data frame df 
    w_sz = 3 # window size 
    ma = np.convolve(df.Current, np.ones(w_sz)/w_sz, mode='same') 
    resid = df.Current - ma 
    threshold = 1 #0.1 
    prob_val = np.where(abs(resid)<=threshold) 
    val_indices = np.where(np.diff(prob_val) != 1)[1]+1 
    import matplotlib.pyplot as plt 
    plt.plot(df.Current) 
    plt.plot(ma) 
    plt.plot(resid) 
    plt.axhline(0) 
    plt.plot(val_indices, np.zeros(len(val_indices)), 'o', color='red') 
    plt.legend(['Current', 'MA-smoothed', 'Residual'], loc='upper center'); 
    plt.show() 
    

enter image description here Есть 3 долины, показанная на рисунке, между каждыми 2 последовательными красными точками. Кажется, что есть только одна красная точка для первой долины, но на самом деле есть две последовательные точки, а длина долины - одна. Мы также можем отфильтровать небольшие долины.

+0

Разве это не перспективный подход?Таким образом, индекс для долины кажется немного смещенным при сравнении красных маркеров с исходными данными «Текущий» (или они указывают первый индекс скользящей средней). – jbndlr

+0

@jbndlr yes kind off, так как скользящее среднее работает в окне, на границах окна, будут некоторые нарушения (например, MA стабилизируется немного после стабилизации данных), но мы можем изменить поведение в соответствии с нашими либо путем изменения аргумента 'mode' в' convolution', либо путем использования меньших окон или, наконец, выполнения некоторой последующей обработки после возврата индексов). Но я думаю, что этот сдвиг может иметь определенный смысл, поскольку мы не сразу реагируем на стабилизацию данных, скорее ожидая когда-нибудь, чтобы более уверенно относиться к стабилизации. –

+0

Этот сдвиг поможет нам избавиться от небольших долин, поскольку это сделает их еще меньшими. –

 Смежные вопросы

  • Нет связанных вопросов^_^