Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. public class ZScoreOutput
  2. {
  3. public List<double> input;
  4. public List<int> signals;
  5. public List<double> avgFilter;
  6. public List<double> filtered_stddev;
  7. }
  8.  
  9. public static class ZScore
  10. {
  11. public static ZScoreOutput StartAlgo(List<double> input, int lag, double threshold, double influence)
  12. {
  13. // init variables!
  14. int[] signals = new int[input.Count];
  15. double[] filteredY = new List<double>(input).ToArray();
  16. double[] avgFilter = new double[input.Count];
  17. double[] stdFilter = new double[input.Count];
  18.  
  19. var initialWindow = new List<double>(filteredY).Skip(0).Take(lag).ToList();
  20.  
  21. avgFilter[lag - 1] = Mean(initialWindow);
  22. stdFilter[lag - 1] = StdDev(initialWindow);
  23.  
  24. for (int i = lag; i < input.Count; i++)
  25. {
  26. if (Math.Abs(input[i] - avgFilter[i - 1]) > threshold * stdFilter[i - 1])
  27. {
  28. signals[i] = (input[i] > avgFilter[i - 1]) ? 1 : -1;
  29. filteredY[i] = influence * input[i] + (1 - influence) * filteredY[i - 1];
  30. }
  31. else
  32. {
  33. signals[i] = 0;
  34. filteredY[i] = input[i];
  35. }
  36.  
  37. // Update rolling average and deviation
  38. var slidingWindow = new List<double>(filteredY).Skip(i - lag).Take(lag+1).ToList();
  39.  
  40. var tmpMean = Mean(slidingWindow);
  41. var tmpStdDev = StdDev(slidingWindow);
  42.  
  43. avgFilter[i] = Mean(slidingWindow);
  44. stdFilter[i] = StdDev(slidingWindow);
  45. }
  46.  
  47. // Copy to convenience class
  48. var result = new ZScoreOutput();
  49. result.input = input;
  50. result.avgFilter = new List<double>(avgFilter);
  51. result.signals = new List<int>(signals);
  52. result.filtered_stddev = new List<double>(stdFilter);
  53.  
  54. return result;
  55. }
  56.  
  57. private static double Mean(List<double> list)
  58. {
  59. // Simple helper function!
  60. return list.Average();
  61. }
  62.  
  63. private static double StdDev(List<double> values)
  64. {
  65. double ret = 0;
  66. if (values.Count() > 0)
  67. {
  68. double avg = values.Average();
  69. double sum = values.Sum(d => Math.Pow(d - avg, 2));
  70. ret = Math.Sqrt((sum) / (values.Count() - 1));
  71. }
  72. return ret;
  73. }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement