Skip to content

Instantly share code, notes, and snippets.

@viniroger
Created August 8, 2019 15:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save viniroger/d61f434f58be975fd0d9dc4aab5aa07c to your computer and use it in GitHub Desktop.
Save viniroger/d61f434f58be975fd0d9dc4aab5aa07c to your computer and use it in GitHub Desktop.
Ideas for extreme value filter
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