Created
August 8, 2019 15:17
-
-
Save viniroger/d61f434f58be975fd0d9dc4aab5aa07c to your computer and use it in GitHub Desktop.
Ideas for extreme value filter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment