Как проверить, между каким пороговым уровнем находится значение? - PullRequest
2 голосов
/ 07 марта 2019

У меня есть фрейм данных, в котором столбцы выглядят так (1400 уникальных contextID с и 28 различных IndicatorID с):

ContextID   IndicatorID threshold_values    AlarmLevel  actual_values
7289972        204511   -6.10904                 -1         0
7289972        204511   -12.1848                 -2         0
7289972        204511   -18.2606                 -3         0
7289972        204511   18.19404                  1         0
7289972        204511   24.2698                   2         0
7289972        204511   30.34557                  3         0
7289972        204512   89.94568                  1        64.114
7289972        204512   104.2932                  2        64.114
7289972        204512   118.6407                  3        64.114
7289972        204512   32.55574                 -1        64.114
7289972        204512   18.20825                 -2        64.114
7289972        204512   3.860765                 -3        64.114
7289998        204511   -6.10904                 -1           1
7289998        204511   -12.1848                 -2           1
7289998        204511   -18.2606                 -3           1
7289998        204511   18.19404                  1           1
7289998        204511   24.2698                   2           1
7289998        204511   30.34557                  3           1
7289998        204512   89.94568                  1        64.111
7289998        204512   104.2932                  2        64.111
7289998        204512   118.6407                  3        64.111
7289998        204512   32.55574                 -1        64.111
7289998        204512   18.20825                 -2        64.111
7289998        204512   3.860765                 -3        64.111

Столбец actual_values - это реальное значение, считываемоедатчик машины.Столбцы threshold_values содержат различные пороговые значения, определенные для различных индикаторов (в столбце IndicatorID), в зависимости от того, какой сигнал тревоги будет подан, если значение пересекает определенный предел.

Пример: Если значение в actual_values находится между threshold_values, определенным для уровня тревоги -1 и +1, продукт не является дефектным.Но, если значение лежит в диапазоне от -1 до -2, сигнал тревоги -1 (поскольку он превысил пороговое значение, определенное для -1) должен быть повышен, а если значение находится в диапазоне от +1 до +2, сигнал тревоги+1 должен быть поднят, и так далее.В конце самый большой уровень тревоги должен быть назначен на ContextID, то есть, если один индикатор поднял тревогу +1, а второй индикатор поднял тревогу -2, уровень тревоги -2 должен рассматриватьсябольше и назначен в качестве окончательного сигнала тревоги для этого ContextID (предпочтительно в новом столбце).

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

Я пытаюсь реализовать ее, используя 2 различных цикла for, один для всех ContextID с и другой для IndicatorID с,но почему-то мне не удается придумать логику, которая может решить эту задачу.

Буду благодарен за помощь и руководство.

Спасибо

Редактировать 1:

Пример:

ContextID   IndicatorID threshold_values    AlarmLevel  actual_values   thresh_high alarm_high  insideThresh
7291899 204515  0.708226    -3  0.949486    0.742542    -2  FALSE
7291899 204515  0.742542    -2  0.949486    0.76        -1  FALSE
7291899 204515  0.76        -1  0.949486    0.914122     1  FALSE
7291899 204515  0.914122    1   0.949486    0.948438     2  FALSE
7291899 204515  0.948438    2   0.949486    0.982754     3  TRUE
7291899 204515  0.982754    3   0.949486    610.9839    -3  FALSE

thresh_value из 610.9839 принадлежит другому IndicatorID (204516), но это значение используется для вычисления аварийного сигналауровень IndicatorID (204515)

1 Ответ

2 голосов
/ 07 марта 2019

Конечно, есть способ сделать это.Возможно, лучшие способы, чем приведенные ниже, но это будет работать.

Инициализация данных:

import pandas as pd
import numpy as np

thresh = [-6.10904,
-12.1848,
-18.2606,
18.19404,
24.2698,
30.34557,
89.94568,
104.2932,
118.6407,
32.55574,
18.20825,
3.860765]

df = pd.DataFrame({'ContextID':[1]*12+[2]*12,
                   'IndicatorID':[5]*6+[6]*6+[7]*6+[8]*6,
                   'threshold_values':thresh*2,
                   'AlarmLevel':[-1, -2, -3, 1, 2, 3, 3, 2, 1, -1, -2, -3]*2,
                   'actual_values':[-17]*6+[64.114]*6+[26]*6+[64.111]*6})

Я упростил ContextID и IndicatorID, я также добавил некоторые ложные значения для actual_values, потому что вашивсе в пределах допустимого.Мы хотим увидеть, что происходит, когда они выходят за пределы надлежащего диапазона.

df = df.sort_values(['ContextID', 'IndicatorID', 'AlarmLevel'])
df['thresh_high'] = df.groupby(['ContextID', 'IndicatorID'])['threshold_values'].shift(-1)
df['alarm_high'] = df.groupby(['ContextID', 'IndicatorID'])['AlarmLevel'].shift(-1)
df['thresh_high'] = df.thresh_high.fillna(np.Inf)
df['alarm_high'] = df.alarm_high.fillna(4)
df['insideThresh'] = (df.actual_values < df.thresh_high) & (df.actual_values > df.threshold_values)

Мы сортируем информационный кадр, а затем создаем thresh_high и alarm_high, которые являются сдвинутыми версиями threshold_values и * 1012.*

Затем мы создаем столбец, который просто показывает, находится ли фактическое значение между пороговыми значениями.

alarms = df.loc[df.insideThresh == True] \
            .groupby(['ContextID', 'IndicatorID', 'insideThresh'])['AlarmLevel'] \
            .apply(lambda x: x.min()+1 if x.min() < 0 else x.min()

)

Наконец, мы фильтруем кадр данных только по временам, когда actual_values сидел в порогах, а затем группируем по ContextId, IndicatorID и insideThresh (это последнеене очень нужно).Мы берем уровень тревоги и применяем пользовательскую функцию, сообщающую ему, что если минимум уровня тревоги, с которого он был взломан, является отрицательным, поднимем уровень до 1, в противном случае возьмем минимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...