Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def filtro(self, df, uid):
- """Filter forecasted values
- Check acceptable values, replacing when it isn't
- """
- import statistics
- if uid == 215:
- lower_limit = 10
- upper_limit = 3000
- elif uid == 216:
- lower_limit = 10
- upper_limit = 1000
- else:
- print('filtro nao aplicado')
- return(df)
- # Loop para todas as colunas, exceto 'data'
- for col in df.loc[:, df.columns != 'data']:
- # A ideia é corregir um crescimento exponencial
- # diminuindo mais quanto maior for o valor
- # e menos qto menor for o valor (filtro socialista)
- x = df[col].values
- mediana = statistics.median(abs(x))
- despad = statistics.stdev(abs(x))
- # Porcentagem para redução de toda a amostra
- # (deve ficar sempre menor que 1 e positivo)
- if mediana < despad:
- p = mediana/despad
- else:
- p = despad/mediana
- # Coeficiente para aumentar a velocidade de queda da exponencial
- # (para fazer valores grandes diminuírem mais do que os menores)
- a = 8 # o suficiente para 5 dias
- # Coeficiente para redução proporcional
- # (uma exponencial para cortar o efeito de outra)
- coef = 1/(np.exp(a*abs(x)/despad)) + 0.01
- # Cálculo do novo valor (verifica necessidade de tirar outliers)
- if max(abs(x)) > upper_limit:
- x2 = p*coef*x
- else:
- x2 = x
- df[col] = x2
- return(df)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement