1: using System;

2: using System.Collections.Generic;

3: using System.IO;

4: using System.Text;

5: using System.Windows.Forms;

6: namespace ReadData

` 7: {`

8: public partial class Form1 : Form

` 9: {`

10: static readonly StringBuilder outData = new StringBuilder();

11: readonly List<double> a = new List<double>(); // the 2 input TSs

12: readonly List<double> b = new List<double>();

13: public Form1()

` 14: {`

` 15: InitializeComponent();`

` 16: }`

17: void Form1_Load(object sender, EventArgs e)

` 18: {`

` 19: LoadData();`

20: int totalFound = 0;

21: double lastDiff = 0;

22: bool haveEntry = false;

23: const int window = 100; // how many values we use to estimate mean and stdDev

24: for (int i = window; i <= a.Count; i++)

25: //for (int i = 144; i < 145; i++) // one sample only, for testing

` 26: {`

27: double meanA = GetMean(a, i - window, i);

28: double meanB = GetMean(b, i - window, i);

29: double stdA = GetStd(a, i - window, i, meanA);

30: double stdB = GetStd(b, i - window, i, meanB);

31: double aNorm = (a[i - 1] - meanA) / stdA;

32: double bNorm = (b[i - 1] - meanB) / stdB;

33: double diff = aNorm - bNorm;

34: double absDiff = Math.Abs(diff);

35: if (haveEntry && ((lastDiff > 1 && diff <> -1)))

` 36: {`

37: Console.WriteLine("==== Exit index " + i);

38: haveEntry = false;

` 39: }`

40: //outData.AppendLine(i + ", " + diff); // for writing to file

41: // outData.AppendLine(diff.ToString()); // for writing to file

42: outData.AppendLine(string.Format("{0:d4}", i-window+1) + " " + diff); // for writing to file

43: if (absDiff > 15)

` 44: {`

` 45: totalFound++;`

46: Console.WriteLine("Found at index " + i + " diff " + diff);

47: if (absDiff < Math.Abs(lastDiff) && !haveEntry)

` 48: {`

49: Console.WriteLine("==== Entry index " + i);

50: haveEntry = true;

` 51: }`

` 52: }`

` 53: lastDiff = diff;`

` 54: }`

55: Console.WriteLine("total found " + totalFound);

` 56: WriteData();`

` 57: }`

58: static void WriteData()

` 59: {`

60: const string fileout = "out.csv";

61: if (File.Exists(fileout))

` 62: {`

` 63: File.Delete(fileout);`

` 64: }`

65: using (StreamWriter sw = new StreamWriter(fileout))

` 66: {`

` 67: sw.Write(outData.ToString());`

` 68: }`

` 69: }`

70: static double GetStd(IList<double> array, int start, int limit, double mean)

` 71: {`

72: double sum = 0;

73: for (int i = start; i < limit; i++)

` 74: {`

` 75: sum += (array[i] - mean) * (array[i] - mean);`

` 76: }`

` 77: sum = Math.Sqrt(sum);`

` 78: sum /= (limit - start);`

79: return sum;

` 80: }`

81: static double GetMean(IList<double> array, int start, int limit)

` 82: {`

83: double sum = 0;

84: for (int i = start; i < limit; i++)

` 85: {`

` 86: sum += array[i];`

` 87: }`

` 88: sum /= (limit - start);`

89: return sum;

` 90: }`

91: /// <summary>

92: /// Assume input file has 2 columns, one for each TS we want to track.

93: /// </summary>

94: void LoadData()

` 95: {`

96: using (StreamReader sr = new StreamReader("5m-db.csv"))

` 97: {`

98: string newData;

` 99: a.Clear();`

` 100: b.Clear();`

101: while (sr.Peek() != -1)

` 102: {`

` 103: newData = sr.ReadLine();`

104: string[] line = newData.Split(',');

105: a.Add(double.Parse(line[0]));

106: b.Add(double.Parse(line[1]));

` 107: }`

108: Console.WriteLine("Loaded " + a.Count + " data points.");

` 109: }`

` 110: }`

` 111: }`