参见下面从传感器获取的数据矩阵,只是 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是传感器的名称,垂直的是通过定时器方式从传感器获取的数据。
现在我想用反复试验的方法来分析这些数据,我定义了一些概念来解释我想要的:
来源
来源是我得到的所有原始数据
进入
一个条目是一组所有 A 到 K 传感器,以垂直第一行为例:该条目是
25 0 25 66 41 47 40 12 69 76 1
规则
规则是带有断言值返回的“假设”函数,目前仅返回“真”或“假”。例如,我假设传感器 A、E 和 F 值在同一个条目中永远不会相同,如果一个条目的 A=E=F 为真,则将触发违规,并且此规则函数将返回假。
橙子:
范围是用于选择垂直条目的功能,例如前 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”作为输入参数,甚至稍后使用正则表达式字符串。这太复杂了,简直让我不知所措,更不用说我可能需要持久规则的唯一 ID、数据存储问题、规则自嵌套组合问题……
我的问题是:
谢谢任何提示。
如果我理解正确的话,我可能不会冒险使用 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}]
这里做了一些假设(例如,相等是规则中唯一使用的运算符)并且遗漏了一些功能(例如,将您的输入解析为list
我dict
使用的,但我希望您可以自己解决这个问题。
当然,可能存在比这更简单的基于 Numpy 的解决方案,我只是暂时没有想到(现在很晚了,我要睡觉了 ;)),但无论如何希望这能对你有所帮助。
编辑:
哎呀,错过了其他东西(忘记在发布之前添加它) - 我只测试了l
(给定范围内)的第一个元素..您只需将其粘贴在另一个for
循环中,而不是使用那个硬编码0
索引。