Qual a melhor maneira de se fazer um filtro pra armazenar o valor de uma equação a partir de 3 condições. Ex condição A maior que 100, condição B >26 e <27 e condição C >95 ??
Filtro para equação
Olá @leorocha,
Pelo que entendi, precisa armazenar o valor True se essas condições forem verdadeiras e False se forem falsas, correto?
Se for isso, a sintaxe fica assim:
True if A.Value > 100 and B.Value >26 and B.Value <27 and C.Value > 95 else False
Eu estou precisando armazenar uma variável de eficiência se a temperatura estiver entre 26 e 27°C e a rotação maior que 95 e a pressão barométrica maior do que 100. Se todas as condições forem atendidas armazena o valor atual e se não for imagino que deveria não armazenar nada. E ir ligando os pontos.
Veja esse exemplo:
(2 *3.14 * e.Value ** 2) if( (p.Value > 100) and (r.Value > 95) and (t.Value > 26) and (t.Value < 27)) else e.Value
Dessa forma será armazenado o valor da equação (2 *3.14 * e.Value ** 2) quando as condições forem verdadeiras, senão grava o valor “puro” da variável.
Outra opção seria:
(2 *3.14 * e.Value ** 2) if( (p.Value > 100) and (r.Value > 95) and (t.Value > 26) and (t.Value < 27)) else 0
Gravando zero, quando as condições não estão ok.
É importante definir qual é o trigger ou evento que vai disparar esse cálculo e valores iniciais para as variáveis.
Os prints podem te ajudar a entender melhor:
Qualquer dúvida nos avise.
Outra opção é criar um método no arquivo:
C:\ProgramData\Elipse Software\EpmServer\Scripts\ExpressionInitialization.py
E chamar esse método no EPM Studio.
*É preciso reiniciar o EPM Server, para que o arquivo ExpressionInitialization.py seja carregado com alterações.
Exemplo:
def eficiencia(e, t, r, p):
if (p.Value > 100) and (r.Value > 95) and (t.Value > 26) and (t.Value < 27):
return 2 * 3.14 * e.Value ** 2
else
return e.Value
Obrigado Lucas. Consegui implementar, estou precisando de mais uma orientação, se puder ajudar fico agradecido. No exemplo abaixo se as condições forem atendidas ele me retorna o valor “puro” da variável,
(2 *3.14 * e.Value ** 2) if( (p.Value > 100) and (r.Value > 95) and (t.Value > 26) and (t.Value < 27)) else e.Value
Com a ideia de filtro que estou querendo aplicar para registra o valor somente se atender as condições se não atender será registra o valor anterior .
O nome dessa equação é fi, e estou colocando assim:
(2 *3.14 * e.Value ** 2) if( (p.Value > 100) and (r.Value > 95) and (t.Value > 26) and (t.Value < 27)) else fi.Value
Resumindo: tenho uma expressão para calcular a eficiência, chamada ef, e estou fazendo uma expressão de filtro pois gostaria de calcular somente se as condições forem verdadeiras se não forem permanece o valor anterior. Depois do else coloquei a própria equação que estou calculando pra voltar o valor anterior. Será se funciona ??
Ex:
ef.Value if( (p.Value > 100) and (r.Value > 95) and (t.Value > 26) and (t.Value < 27)) else fi.Value
Entendi que você deseja calcular uma expressão se as condições forem verdadeiras, senão, não realiza o cálculo e mantém o valor anterior.
Se o nome da sua ExpressionVariable é fi, insira ela na lista de InputVariables, dessa forma ela retorna o valor anterior ou o valor calculado, em uma expressão assim:
(2 *3.14 * fi.Value ** 2) if( (p.Value > 100) and (r.Value > 95) and (t.Value > 26) and (t.Value < 27)) else fi.Value