Ищете лучшее предложение для механизма проб и ошибок в python? - PullRequest
1 голос
/ 01 июня 2011

См. Ниже матрицу данных, полученную от датчиков, только числа INT, ничего особенного.

    A   B   C   D   E   F   G   H   I   J   K
1   25  0   25  66  41  47  40  12  69  76  1
2   17  23  73  97  99  39  84  26  0   44  45
3   34  15  55  4   77  2   96  92  22  18  71
4   85  4   71  99  66  42  28  41  27  39  75
5   65  27  28  95  82  56  23  44  97  42  38
…                                           
10  95  13  4   10  50  78  4   52  51  86  20
11  71  12  32  9   2   41  41  23  31  70  
12  54  31  68  78  55  19  56  99  67  34  94
13  47  68  79  66  10  23  67  42  16  11  96
14  25  12  88  45  71  87  53  21  96  34  41

Горизонтальные от A до K - это имя датчика, а вертикальные - данные от датчика по таймеру.

Теперь я хочу проанализировать эти данные с помощью методов проб и ошибок, я определил некоторые понятия, чтобы объяснить, что я хочу:

o источник

источник - все исходные данные, которые я получаю

o запись

запись - это набор всех датчиков от A до K, например, возьмем вертикальную 1-ую строку: записьis

25  0   25  66  41  47  40  12  69  76  1

o rules

правило - это «предполагаемая» функция с возвращаемым значением assert, пока просто «true» или «false».Например, я предполагаю, что значения датчика A, E и F никогда не будут одинаковыми в одной записи, если одна запись с A = E = F, это приведет к нарушению тигра и эта функция правила вернет false.

o диапазон:

диапазон - это функция для выбора вертикальной записи, например, первые 5 записей

Затем, основная идея:

o   source + range = subsource(s)
o   subsource + rules = valiation(s)

Наконец, я хочу получить список, который может выглядеть следующим образом:

rangeID ruleID violation
1   1   Y
2   1   N
3   1   Y
1   2   N
2   2   N
3   2   Y
1   3   N
2   3   Y
3   3   Y

Но проблема в том, что правило и диапазон, которые я здесь определил, скоро станут очень сложными, если вы посмотрите глубже, у них слишком много возможностей.например, комбинации «A = E = F», можно определить «B = E = F» , «C = E = F» , «C> F» ......

скоро мне понадобится генератор правил / диапазонов, который может принимать эти «основные параметры», такие как «A = E = F», в качестве входного параметра, даже используя строку регулярного выражения позже.Это слишком сложно, просто победил меня, оставь меня в покое, возможно, мне понадобится постоянство правил уникального идентификатора, проблема хранения данных, проблема совмещения собственных правил ...

Итак, мои вопросы:

  1. Кто-нибудь знает, есть ли какой-нибудь модуль / программная подгонка для такого рода метода проб и ошибок или определения правил, которое я хочу?

  2. Кто-нибудь может поделиться мне лучшими правилами / дизайном диапазона, который я описал?

Спасибо за любые подсказки.

Rgs,

KC

Ответы [ 2 ]

1 голос
/ 01 июня 2011

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

l = [\
        {'a':25, 'b':0, 'c':25, 'd':66, 'e':41, 'f':47, 'g':40, 'h':12, 'i':69, 'j':76, 'k':1},\
        {'a':25, 'b':0, 'c':25, 'd':66, 'e':41, 'f':47, 'g':40, 'h':12, 'i':69, 'j':76, 'k':1}\
]
r = ['a=g=i', 'a=b', 'a=c']
res = []

# test all given rules
for n in range(0, len(r)):
        # i'm assuming equality here - you'd have to change this to accept other operators if needed
        c = r[n].split('=')
        vals = []
        # build up a list of values given our current rule
        for e in c:
                vals.append(l[0][e])
        # using len(set(v)) gives us the number of distinct values
        res.append({'rangeID': 0, 'ruleID':n, 'violation':'Y' if len(set(vals)) == 1 else 'N'})

print res

Выход:

[{'violation': 'N', 'ruleID': 0, 'rangeID': 0}, {'violation': 'N', 'ruleID': 1, 'rangeID': 0}, {'violation': 'Y', 'ruleID': 2, 'rangeID': 0}]

http://ideone.com/zbTZr

Здесь сделано несколько допущений (например, равенство является единственным оператором, используемым в ваших правилах) и некоторые функциональные возможности не учтены (например, парсинг вашего ввода для list из dict s, которые я использовал, но я Я надеюсь, что вы можете понять это самостоятельно.

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

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

Woops, пропустил что-то еще (забыл добавить его до публикации) - я проверяю только первый элемент в l (заданный диапазон) .. Вы просто хотите вставить это в другой цикл for вместо использования этого жестко заданного индекса 0.

0 голосов
/ 01 июня 2011

Вы хотите взглянуть на матрицу Numpy для таких структур данных, как матрица и т. Д. В ней представлен список функций, которые работают с матричной манипуляцией.

Что касается генератора правил / диапазонов, я боюсь, что для этого вам придется создать собственный язык, специфичный для домена.

...