Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1. def filtro(self, df, uid):
  2. """Filter forecasted values
  3. Check acceptable values, replacing when it isn't
  4. """
  5. import statistics
  6. if uid == 215:
  7. lower_limit = 10
  8. upper_limit = 3000
  9. elif uid == 216:
  10. lower_limit = 10
  11. upper_limit = 1000
  12. else:
  13. print('filtro nao aplicado')
  14. return(df)
  15. # Loop para todas as colunas, exceto 'data'
  16. for col in df.loc[:, df.columns != 'data']:
  17. # A ideia é corregir um crescimento exponencial
  18. # diminuindo mais quanto maior for o valor
  19. # e menos qto menor for o valor (filtro socialista)
  20. x = df[col].values
  21. mediana = statistics.median(abs(x))
  22. despad = statistics.stdev(abs(x))
  23. # Porcentagem para redução de toda a amostra
  24. # (deve ficar sempre menor que 1 e positivo)
  25. if mediana < despad:
  26. p = mediana/despad
  27. else:
  28. p = despad/mediana
  29. # Coeficiente para aumentar a velocidade de queda da exponencial
  30. # (para fazer valores grandes diminuírem mais do que os menores)
  31. a = 8 # o suficiente para 5 dias
  32. # Coeficiente para redução proporcional
  33. # (uma exponencial para cortar o efeito de outra)
  34. coef = 1/(np.exp(a*abs(x)/despad)) + 0.01
  35. # Cálculo do novo valor (verifica necessidade de tirar outliers)
  36. if max(abs(x)) > upper_limit:
  37. x2 = p*coef*x
  38. else:
  39. x2 = x
  40. df[col] = x2
  41. return(df)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement